From c53d8e343e50d4cf7ea9a6a81258848c2d893bfb Mon Sep 17 00:00:00 2001 From: Jenkins <jenkins@review.openstack.org> Date: Thu, 3 May 2012 10:48:26 -0700 Subject: [PATCH 1/1] Initial fork out of Nova. --- .gitignore | 24 + .gitreview | 4 + .mailmap | 81 + Authors | 211 + HACKING.rst | 213 + LICENSE | 176 + MANIFEST.in | 37 + README.rst | 21 + babel.cfg | 2 + bin/cinder-all | 70 + bin/cinder-api | 47 + bin/cinder-manage | 635 + bin/cinder-rootwrap | 74 + bin/cinder-scheduler | 51 + bin/cinder-volume | 49 + bin/clear_rabbit_queues | 80 + cinder/__init__.py | 42 + cinder/api/__init__.py | 17 + cinder/api/auth.py | 103 + cinder/api/openstack/__init__.py | 143 + cinder/api/openstack/auth.py | 65 + cinder/api/openstack/common.py | 380 + cinder/api/openstack/compute/__init__.py | 23 + .../openstack/compute/schemas/atom-link.rng | 141 + .../compute/schemas/v1.1/extension.rng | 11 + .../compute/schemas/v1.1/extensions.rng | 6 + .../compute/schemas/v1.1/metadata.rng | 9 + cinder/api/openstack/compute/versions.py | 244 + .../api/openstack/compute/views/__init__.py | 0 .../api/openstack/compute/views/versions.py | 94 + cinder/api/openstack/extensions.py | 395 + cinder/api/openstack/urlmap.py | 297 + cinder/api/openstack/volume/__init__.py | 62 + .../api/openstack/volume/contrib/__init__.py | 39 + .../volume/contrib/types_extra_specs.py | 152 + .../openstack/volume/contrib/types_manage.py | 91 + cinder/api/openstack/volume/extensions.py | 33 + cinder/api/openstack/volume/snapshots.py | 170 + cinder/api/openstack/volume/types.py | 76 + cinder/api/openstack/volume/versions.py | 83 + cinder/api/openstack/volume/views/__init__.py | 16 + cinder/api/openstack/volume/views/versions.py | 36 + cinder/api/openstack/volume/volumes.py | 263 + cinder/api/openstack/wsgi.py | 1123 ++ cinder/api/openstack/xmlutil.py | 908 + cinder/api/sizelimit.py | 54 + cinder/common/__init__.py | 15 + cinder/common/memorycache.py | 64 + cinder/common/policy.py | 222 + cinder/compat/__init__.py | 15 + cinder/compat/flagfile.py | 188 + cinder/compute/__init__.py | 0 cinder/compute/aggregate_states.py | 44 + cinder/context.py | 138 + cinder/db/__init__.py | 23 + cinder/db/api.py | 1335 ++ cinder/db/base.py | 40 + cinder/db/migration.py | 35 + cinder/db/sqlalchemy/__init__.py | 17 + cinder/db/sqlalchemy/api.py | 1499 ++ cinder/db/sqlalchemy/migrate_repo/README | 4 + cinder/db/sqlalchemy/migrate_repo/__init__.py | 0 cinder/db/sqlalchemy/migrate_repo/manage.py | 4 + cinder/db/sqlalchemy/migrate_repo/migrate.cfg | 20 + .../migrate_repo/versions/001_austin.py | 627 + .../migrate_repo/versions/002_bexar.py | 236 + .../versions/002_postgresql_downgrade.sql | 20 + .../versions/002_sqlite_downgrade.sql | 388 + .../versions/003_add_label_to_networks.py | 42 + .../versions/003_sqlite_downgrade.sql | 111 + .../versions/004_add_zone_tables.py | 66 + .../versions/005_add_instance_metadata.py | 81 + .../006_add_provider_data_to_volumes.py | 54 + .../versions/006_sqlite_downgrade.sql | 113 + .../versions/007_add_ipv6_to_fixed_ips.py | 70 + .../versions/007_sqlite_downgrade.sql | 79 + .../versions/008_add_instance_types.py | 85 + .../versions/009_add_instance_migrations.py | 70 + .../versions/010_add_os_type_to_instances.py | 45 + .../versions/011_live_migration.py | 85 + .../versions/012_add_ipv6_flatmanager.py | 90 + .../versions/012_sqlite_upgrade.sql | 195 + .../versions/013_add_flavors_to_migrations.py | 43 + .../versions/013_sqlite_downgrade.sql | 69 + .../014_add_instance_type_id_to_instances.py | 74 + .../015_add_auto_assign_to_floating_ips.py | 35 + .../versions/015_sqlite_downgrade.sql | 62 + .../versions/016_make_quotas_key_and_value.py | 213 + .../017_make_instance_type_id_an_integer.py | 87 + .../018_rename_server_management_url.py | 35 + .../019_add_volume_snapshot_support.py | 82 + .../020_add_snapshot_id_to_volumes.py | 40 + .../versions/020_sqlite_downgrade.sql | 119 + .../versions/021_rename_image_ids.py | 38 + .../versions/022_set_engine_mysql_innodb.py | 64 + .../versions/023_add_vm_mode_to_instances.py | 42 + .../versions/024_add_block_device_mapping.py | 92 + .../versions/025_add_uuid_to_instances.py | 45 + .../versions/026_add_agent_table.py | 89 + .../027_add_provider_firewall_rules.py | 65 + .../028_add_instance_type_extra_specs.py | 76 + .../versions/029_add_zone_weight_offsets.py | 41 + .../migrate_repo/versions/030_multi_nic.py | 146 + .../versions/030_sqlite_downgrade.sql | 377 + .../031_fk_fixed_ips_virtual_interface_id.py | 59 + .../versions/031_sqlite_downgrade.sql | 48 + .../versions/031_sqlite_upgrade.sql | 48 + .../versions/032_add_root_device_name.py | 42 + .../migrate_repo/versions/033_ha_network.py | 42 + .../versions/033_sqlite_downgrade.sql | 193 + .../034_change_instance_id_in_migrations.py | 46 + .../versions/035_secondary_dns.py | 39 + .../036_change_flavor_id_in_migrations.py | 79 + .../versions/037_instances_drop_admin_pass.py | 42 + .../038_add_uuid_to_virtual_interfaces.py | 45 + .../versions/038_sqlite_downgrade.sql | 63 + .../versions/039_add_instances_accessip.py | 49 + .../versions/040_add_uuid_to_networks.py | 45 + .../041_add_config_drive_to_instances.py | 36 + .../042_add_volume_types_and_extradata.py | 122 + .../versions/042_sqlite_downgrade.sql | 129 + .../migrate_repo/versions/043_add_vsa_data.py | 84 + .../versions/044_update_instance_states.py | 52 + .../versions/045_add_network_priority.py | 44 + .../versions/046_add_instance_swap.py | 49 + .../047_remove_instances_fk_from_vif.py | 61 + .../versions/047_sqlite_downgrade.sql | 46 + .../versions/047_sqlite_upgrade.sql | 45 + .../versions/048_add_zone_name.py | 33 + .../versions/049_add_instances_progress.py | 44 + .../050_add_disk_config_to_instances.py | 37 + .../versions/050_sqlite_downgrade.sql | 207 + .../051_add_vcpu_weight_to_instance_types.py | 34 + .../versions/052_kill_export_devices.py | 65 + ...connection_info_to_block_device_mapping.py | 38 + .../versions/053_sqlite_downgrade.sql | 87 + .../versions/054_add_bw_usage_data_cache.py | 64 + .../versions/055_convert_flavor_id_to_str.py | 112 + .../versions/056_add_s3_images.py | 60 + .../versions/057_add_sm_driver_tables.py | 113 + .../versions/058_rename_managed_disk.py | 37 + .../059_split_rxtx_quota_into_network.py | 61 + .../versions/059_sqlite_downgrade.sql | 137 + .../versions/059_sqlite_upgrade.sql | 87 + .../060_remove_network_fk_from_vif.py | 62 + .../versions/060_sqlite_downgrade.sql | 45 + .../versions/060_sqlite_upgrade.sql | 44 + .../061_add_index_to_instance_uuid.py | 29 + .../062_add_instance_info_cache_table.py | 70 + .../versions/063_add_instance_faults_table.py | 60 + ...instance_id_to_uuid_in_instance_actions.py | 80 + .../065_add_index_to_instance_project_id.py | 31 + .../066_preload_instance_info_cache_table.py | 31 + ...7_add_pool_and_interface_to_floating_ip.py | 41 + .../versions/067_sqlite_downgrade.sql | 69 + .../versions/068_add_instance_attribute.py | 36 + .../versions/068_sqlite_downgrade.sql | 219 + .../versions/069_block_migration.py | 50 + .../versions/070_sqlite_downgrade.sql | 103 + .../versions/070_sqlite_upgrade.sql | 99 + .../versions/070_untie_nova_network_models.py | 100 + .../versions/071_add_host_aggregate_tables.py | 108 + .../versions/072_add_dns_table.py | 77 + .../versions/072_mysql_upgrade.sql | 13 + .../migrate_repo/versions/073_add_capacity.py | 49 + .../versions/074_change_flavor_local_gb.py | 130 + .../versions/074_sqlite_upgrade.sql | 313 + ...75_convert_bw_usage_to_store_network_id.py | 97 + .../versions/076_remove_unique_constraints.py | 84 + .../versions/076_sqlite_upgrade.sql | 61 + .../versions/077_convert_to_utf8.py | 61 + .../versions/078_add_rpc_info_to_zones.py | 46 + .../versions/078_sqlite_downgrade.sql | 35 + .../079_add_zone_name_to_instances.py | 30 + ...dd_hypervisor_hostname_to_compute_nodes.py | 30 + .../versions/081_drop_instance_id_bw_cache.py | 69 + .../migrate_repo/versions/082_zone_to_cell.py | 35 + .../migrate_repo/versions/083_quota_class.py | 61 + .../versions/084_quotas_unlimited.py | 43 + .../085_add_index_to_fixed_ips_by_address.py | 31 + .../versions/086_set_engine_mysql_innodb.py | 44 + .../087_add_uuid_to_bw_usage_cache.py | 56 + ...ance_id_to_uuid_in_block_device_mapping.py | 81 + .../versions/088_sqlite_downgrade.sql | 97 + .../versions/088_sqlite_upgrade.sql | 97 + .../versions/089_add_volume_id_mappings.py | 116 + .../versions/090_modify_volume_id_datatype.py | 239 + .../versions/090_sqlite_downgrade.sql | 226 + .../versions/090_sqlite_upgrade.sql | 226 + .../091_convert_volume_ids_to_uuid.py | 145 + .../migrate_repo/versions/__init__.py | 0 cinder/db/sqlalchemy/migration.py | 129 + cinder/db/sqlalchemy/models.py | 1063 + cinder/db/sqlalchemy/session.py | 156 + cinder/exception.py | 938 + cinder/flags.py | 356 + cinder/locale/bs/LC_MESSAGES/nova.po | 8201 ++++++++ cinder/locale/cs/LC_MESSAGES/nova.po | 8251 ++++++++ cinder/locale/da/LC_MESSAGES/nova.po | 8203 ++++++++ cinder/locale/de/LC_MESSAGES/nova.po | 8208 ++++++++ cinder/locale/en_AU/LC_MESSAGES/nova.po | 8209 ++++++++ cinder/locale/en_GB/LC_MESSAGES/nova.po | 8209 ++++++++ cinder/locale/es/LC_MESSAGES/nova.po | 8220 ++++++++ cinder/locale/fr/LC_MESSAGES/nova.po | 8251 ++++++++ cinder/locale/it/LC_MESSAGES/nova.po | 8210 ++++++++ cinder/locale/ja/LC_MESSAGES/nova.po | 8196 ++++++++ cinder/locale/ko/LC_MESSAGES/nova.po | 8207 ++++++++ cinder/locale/nova.pot | 7463 +++++++ cinder/locale/pt_BR/LC_MESSAGES/nova.po | 8208 ++++++++ cinder/locale/ru/LC_MESSAGES/nova.po | 8304 ++++++++ cinder/locale/tl/LC_MESSAGES/nova.po | 8200 ++++++++ cinder/locale/tr/LC_MESSAGES/nova.po | 8202 ++++++++ cinder/locale/uk/LC_MESSAGES/nova.po | 8199 ++++++++ cinder/locale/zh_CN/LC_MESSAGES/nova.po | 8064 ++++++++ cinder/locale/zh_TW/LC_MESSAGES/nova.po | 8207 ++++++++ cinder/log.py | 416 + cinder/manager.py | 205 + cinder/notifier/__init__.py | 14 + cinder/notifier/api.py | 133 + cinder/notifier/capacity_notifier.py | 81 + cinder/notifier/list_notifier.py | 71 + cinder/notifier/log_notifier.py | 34 + cinder/notifier/no_op_notifier.py | 19 + cinder/notifier/rabbit_notifier.py | 46 + cinder/notifier/test_notifier.py | 25 + cinder/openstack/__init__.py | 15 + cinder/openstack/common/README | 13 + cinder/openstack/common/__init__.py | 15 + cinder/openstack/common/cfg.py | 1298 ++ cinder/openstack/common/exception.py | 147 + cinder/openstack/common/importutils.py | 45 + cinder/openstack/common/iniparser.py | 126 + cinder/openstack/common/local.py | 37 + cinder/policy.py | 90 + cinder/quota.py | 234 + cinder/rootwrap/__init__.py | 16 + cinder/rootwrap/filters.py | 147 + cinder/rootwrap/volume.py | 45 + cinder/rootwrap/wrapper.py | 60 + cinder/rpc/__init__.py | 227 + cinder/rpc/amqp.py | 405 + cinder/rpc/common.py | 220 + cinder/rpc/impl_fake.py | 185 + cinder/rpc/impl_kombu.py | 713 + cinder/rpc/impl_qpid.py | 563 + cinder/scheduler/__init__.py | 27 + cinder/scheduler/api.py | 72 + cinder/scheduler/chance.py | 83 + cinder/scheduler/driver.py | 164 + cinder/scheduler/host_manager.py | 36 + cinder/scheduler/manager.py | 204 + cinder/scheduler/simple.py | 144 + cinder/service.py | 429 + cinder/test.py | 295 + cinder/testing/README.rst | 66 + cinder/testing/__init__.py | 0 cinder/testing/fake/__init__.py | 1 + cinder/testing/runner.py | 372 + cinder/tests/__init__.py | 84 + cinder/tests/api/__init__.py | 19 + cinder/tests/api/openstack/__init__.py | 19 + cinder/tests/api/openstack/common.py | 58 + cinder/tests/api/openstack/fakes.py | 234 + cinder/tests/api/openstack/test_common.py | 526 + cinder/tests/api/openstack/test_faults.py | 208 + cinder/tests/api/openstack/test_wsgi.py | 833 + cinder/tests/api/openstack/test_xmlutil.py | 722 + cinder/tests/api/openstack/volume/__init__.py | 19 + .../api/openstack/volume/contrib/__init__.py | 19 + .../volume/contrib/test_types_extra_specs.py | 202 + .../volume/contrib/test_types_manage.py | 103 + .../openstack/volume/extensions/__init__.py | 15 + .../openstack/volume/extensions/foxinsocks.py | 94 + .../api/openstack/volume/test_extensions.py | 156 + .../tests/api/openstack/volume/test_router.py | 105 + .../api/openstack/volume/test_snapshots.py | 214 + .../tests/api/openstack/volume/test_types.py | 146 + .../api/openstack/volume/test_volumes.py | 290 + cinder/tests/api/test_auth.py | 58 + cinder/tests/api/test_sizelimit.py | 51 + cinder/tests/api/test_wsgi.py | 67 + cinder/tests/db/__init__.py | 20 + cinder/tests/db/fakes.py | 47 + cinder/tests/declare_flags.py | 23 + cinder/tests/fake_flags.py | 34 + cinder/tests/fake_utils.py | 112 + cinder/tests/integrated/__init__.py | 22 + cinder/tests/integrated/api/__init__.py | 20 + cinder/tests/integrated/api/client.py | 217 + cinder/tests/integrated/integrated_helpers.py | 130 + cinder/tests/integrated/test_extensions.py | 42 + cinder/tests/integrated/test_login.py | 31 + cinder/tests/integrated/test_volumes.py | 181 + cinder/tests/integrated/test_xml.py | 52 + cinder/tests/monkey_patch_example/__init__.py | 33 + .../tests/monkey_patch_example/example_a.py | 29 + .../tests/monkey_patch_example/example_b.py | 30 + cinder/tests/notifier/__init__.py | 16 + .../tests/notifier/test_capacity_notifier.py | 59 + cinder/tests/notifier/test_list_notifier.py | 84 + cinder/tests/policy.json | 25 + cinder/tests/rpc/__init__.py | 19 + cinder/tests/rpc/common.py | 239 + cinder/tests/rpc/test_common.py | 147 + cinder/tests/rpc/test_fake.py | 33 + cinder/tests/rpc/test_kombu.py | 350 + cinder/tests/rpc/test_kombu_ssl.py | 58 + cinder/tests/rpc/test_qpid.py | 340 + cinder/tests/runtime_flags.py | 23 + cinder/tests/scheduler/__init__.py | 19 + cinder/tests/scheduler/fakes.py | 62 + cinder/tests/scheduler/test_scheduler.py | 322 + cinder/tests/test_SolidFireSanISCSIDriver.py | 186 + cinder/tests/test_api.py | 75 + cinder/tests/test_compat_flagfile.py | 175 + cinder/tests/test_context.py | 70 + cinder/tests/test_db_api.py | 331 + cinder/tests/test_exception.py | 126 + cinder/tests/test_flags.py | 146 + cinder/tests/test_iscsi.py | 116 + cinder/tests/test_log.py | 218 + cinder/tests/test_migrations.conf | 9 + cinder/tests/test_migrations.py | 296 + cinder/tests/test_misc.py | 184 + cinder/tests/test_netapp.py | 927 + cinder/tests/test_nexenta.py | 281 + cinder/tests/test_notifier.py | 133 + cinder/tests/test_nova_rootwrap.py | 133 + cinder/tests/test_policy.py | 189 + cinder/tests/test_quota.py | 316 + cinder/tests/test_service.py | 221 + cinder/tests/test_skip_examples.py | 47 + cinder/tests/test_test.py | 44 + cinder/tests/test_test_utils.py | 29 + cinder/tests/test_utils.py | 1188 ++ cinder/tests/test_versions.py | 59 + cinder/tests/test_volume.py | 501 + cinder/tests/test_volume_types.py | 167 + cinder/tests/test_volume_types_extra_specs.py | 130 + cinder/tests/test_wsgi.py | 92 + cinder/tests/utils.py | 25 + cinder/utils.py | 1678 ++ cinder/version.py | 38 + cinder/volume/__init__.py | 25 + cinder/volume/api.py | 371 + cinder/volume/driver.py | 709 + cinder/volume/iscsi.py | 160 + cinder/volume/manager.py | 331 + cinder/volume/netapp.py | 676 + cinder/volume/nexenta/__init__.py | 33 + cinder/volume/nexenta/jsonrpc.py | 84 + cinder/volume/nexenta/volume.py | 282 + cinder/volume/san.py | 897 + cinder/volume/volume_types.py | 125 + cinder/volume/xensm.py | 237 + cinder/wsgi.py | 374 + contrib/openstack-config | 65 + contrib/redhat-eventlet.patch | 16 + doc/.gitignore | 3 + doc/Makefile | 97 + doc/README.rst | 55 + doc/ext/__init__.py | 0 doc/ext/nova_autodoc.py | 12 + doc/ext/nova_todo.py | 101 + doc/find_autodoc_modules.sh | 20 + doc/generate_autodoc_index.sh | 46 + doc/source/_ga/layout.html | 17 + doc/source/_static/.gitignore | 0 doc/source/_static/.placeholder | 0 doc/source/_static/basic.css | 416 + doc/source/_static/default.css | 230 + doc/source/_static/jquery.tweet.js | 154 + doc/source/_static/tweaks.css | 218 + doc/source/_templates/.gitignore | 0 doc/source/_templates/.placeholder | 0 doc/source/_theme/layout.html | 95 + doc/source/_theme/theme.conf | 5 + doc/source/conf.py | 234 + doc/source/devref/addmethod.openstackapi.rst | 56 + doc/source/devref/aggregates.rst | 65 + doc/source/devref/api.rst | 270 + doc/source/devref/architecture.rst | 52 + doc/source/devref/auth.rst | 276 + doc/source/devref/cloudpipe.rst | 166 + doc/source/devref/database.rst | 63 + doc/source/devref/development.environment.rst | 152 + doc/source/devref/down.sh | 7 + doc/source/devref/fakes.rst | 85 + doc/source/devref/filter_scheduler.rst | 258 + doc/source/devref/gerrit.rst | 16 + doc/source/devref/glance.rst | 28 + doc/source/devref/il8n.rst | 34 + doc/source/devref/index.rst | 86 + doc/source/devref/interfaces | 17 + doc/source/devref/jenkins.rst | 41 + doc/source/devref/launchpad.rst | 54 + doc/source/devref/multinic.rst | 39 + doc/source/devref/network.rst | 128 + doc/source/devref/nova.rst | 215 + doc/source/devref/rc.local | 36 + doc/source/devref/rpc.rst | 151 + doc/source/devref/scheduler.rst | 71 + doc/source/devref/server.conf.template | 34 + doc/source/devref/services.rst | 55 + doc/source/devref/threading.rst | 51 + doc/source/devref/unit_tests.rst | 159 + doc/source/devref/up.sh | 7 + doc/source/devref/volume.rst | 66 + doc/source/devref/xensmvolume.rst | 88 + doc/source/image_src/multinic_1.odg | Bin 0 -> 12363 bytes doc/source/image_src/multinic_2.odg | Bin 0 -> 13425 bytes doc/source/image_src/multinic_3.odg | Bin 0 -> 13598 bytes doc/source/images/NOVA_ARCH.png | Bin 0 -> 191332 bytes doc/source/images/NOVA_ARCH.svg | 5854 ++++++ doc/source/images/NOVA_ARCH_200dpi.png | Bin 0 -> 439024 bytes doc/source/images/NOVA_ARCH_66dpi.png | Bin 0 -> 110890 bytes doc/source/images/NOVA_clouds_A_B.png | Bin 0 -> 77007 bytes doc/source/images/NOVA_clouds_A_B.svg | 16342 ++++++++++++++++ doc/source/images/NOVA_clouds_C1_C2.svg | 9763 +++++++++ doc/source/images/NOVA_clouds_C1_C2.svg.png | Bin 0 -> 448574 bytes doc/source/images/Novadiagram.png | Bin 0 -> 52609 bytes doc/source/images/base_scheduler.png | Bin 0 -> 17068 bytes doc/source/images/cloudpipe.png | Bin 0 -> 89812 bytes doc/source/images/fabric.png | Bin 0 -> 125915 bytes doc/source/images/filteringWorkflow1.png | Bin 0 -> 66997 bytes doc/source/images/filteringWorkflow2.png | Bin 0 -> 75288 bytes doc/source/images/multinic_dhcp.png | Bin 0 -> 54531 bytes doc/source/images/multinic_flat.png | Bin 0 -> 40871 bytes doc/source/images/multinic_vlan.png | Bin 0 -> 58552 bytes doc/source/images/nova.compute.api.create.png | Bin 0 -> 50171 bytes doc/source/images/novascreens.png | Bin 0 -> 27949 bytes doc/source/images/novashvirtually.png | Bin 0 -> 39000 bytes doc/source/images/rpc/arch.png | Bin 0 -> 26690 bytes doc/source/images/rpc/arch.svg | 292 + doc/source/images/rpc/flow1.png | Bin 0 -> 40982 bytes doc/source/images/rpc/flow1.svg | 617 + doc/source/images/rpc/flow2.png | Bin 0 -> 30650 bytes doc/source/images/rpc/flow2.svg | 423 + doc/source/images/rpc/rabt.png | Bin 0 -> 44964 bytes doc/source/images/rpc/rabt.svg | 581 + doc/source/images/rpc/state.png | Bin 0 -> 38543 bytes doc/source/images/vmwareapi_blockdiagram.jpg | Bin 0 -> 75363 bytes doc/source/images/zone_aware_overview.png | Bin 0 -> 56142 bytes doc/source/images/zone_aware_scheduler.png | Bin 0 -> 20902 bytes doc/source/images/zone_overview.png | Bin 0 -> 51587 bytes doc/source/index.rst | 67 + doc/source/man/nova-manage.rst | 281 + etc/cinder/api-paste.ini | 51 + etc/cinder/cinder.conf.sample | 673 + etc/cinder/logging_sample.conf | 76 + etc/cinder/policy.json | 15 + openstack-common.conf | 7 + pylintrc | 38 + run_tests.sh | 176 + setup.cfg | 32 + setup.py | 73 + tools/clean-vlans | 25 + tools/clean_file_locks.py | 63 + tools/conf/create_conf.py | 159 + tools/conf/generate_sample.sh | 25 + tools/enable-pre-commit-hook.sh | 42 + tools/hacking.py | 391 + tools/install_venv.py | 248 + tools/pip-requires | 22 + tools/rfc.sh | 150 + tools/test-requires | 11 + tools/with_venv.sh | 4 + tox.ini | 38 + 468 files changed, 247534 insertions(+) create mode 100644 .gitignore create mode 100644 .gitreview create mode 100644 .mailmap create mode 100644 Authors create mode 100644 HACKING.rst create mode 100644 LICENSE create mode 100644 MANIFEST.in create mode 100644 README.rst create mode 100644 babel.cfg create mode 100755 bin/cinder-all create mode 100755 bin/cinder-api create mode 100755 bin/cinder-manage create mode 100755 bin/cinder-rootwrap create mode 100755 bin/cinder-scheduler create mode 100755 bin/cinder-volume create mode 100755 bin/clear_rabbit_queues create mode 100644 cinder/__init__.py create mode 100644 cinder/api/__init__.py create mode 100644 cinder/api/auth.py create mode 100644 cinder/api/openstack/__init__.py create mode 100644 cinder/api/openstack/auth.py create mode 100644 cinder/api/openstack/common.py create mode 100644 cinder/api/openstack/compute/__init__.py create mode 100644 cinder/api/openstack/compute/schemas/atom-link.rng create mode 100644 cinder/api/openstack/compute/schemas/v1.1/extension.rng create mode 100644 cinder/api/openstack/compute/schemas/v1.1/extensions.rng create mode 100644 cinder/api/openstack/compute/schemas/v1.1/metadata.rng create mode 100644 cinder/api/openstack/compute/versions.py create mode 100644 cinder/api/openstack/compute/views/__init__.py create mode 100644 cinder/api/openstack/compute/views/versions.py create mode 100644 cinder/api/openstack/extensions.py create mode 100644 cinder/api/openstack/urlmap.py create mode 100644 cinder/api/openstack/volume/__init__.py create mode 100644 cinder/api/openstack/volume/contrib/__init__.py create mode 100644 cinder/api/openstack/volume/contrib/types_extra_specs.py create mode 100644 cinder/api/openstack/volume/contrib/types_manage.py create mode 100644 cinder/api/openstack/volume/extensions.py create mode 100644 cinder/api/openstack/volume/snapshots.py create mode 100644 cinder/api/openstack/volume/types.py create mode 100644 cinder/api/openstack/volume/versions.py create mode 100644 cinder/api/openstack/volume/views/__init__.py create mode 100644 cinder/api/openstack/volume/views/versions.py create mode 100644 cinder/api/openstack/volume/volumes.py create mode 100644 cinder/api/openstack/wsgi.py create mode 100644 cinder/api/openstack/xmlutil.py create mode 100644 cinder/api/sizelimit.py create mode 100644 cinder/common/__init__.py create mode 100644 cinder/common/memorycache.py create mode 100644 cinder/common/policy.py create mode 100644 cinder/compat/__init__.py create mode 100644 cinder/compat/flagfile.py create mode 100644 cinder/compute/__init__.py create mode 100644 cinder/compute/aggregate_states.py create mode 100644 cinder/context.py create mode 100644 cinder/db/__init__.py create mode 100644 cinder/db/api.py create mode 100644 cinder/db/base.py create mode 100644 cinder/db/migration.py create mode 100644 cinder/db/sqlalchemy/__init__.py create mode 100644 cinder/db/sqlalchemy/api.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/README create mode 100644 cinder/db/sqlalchemy/migrate_repo/__init__.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/manage.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/migrate.cfg create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/001_austin.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/002_bexar.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/002_postgresql_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/002_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/003_add_label_to_networks.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/003_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/004_add_zone_tables.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/005_add_instance_metadata.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/006_add_provider_data_to_volumes.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/006_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/007_add_ipv6_to_fixed_ips.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/007_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/008_add_instance_types.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/009_add_instance_migrations.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/010_add_os_type_to_instances.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/011_live_migration.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/012_add_ipv6_flatmanager.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/012_sqlite_upgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/013_add_flavors_to_migrations.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/013_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/014_add_instance_type_id_to_instances.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/015_add_auto_assign_to_floating_ips.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/015_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/016_make_quotas_key_and_value.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/017_make_instance_type_id_an_integer.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/018_rename_server_management_url.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/019_add_volume_snapshot_support.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/020_add_snapshot_id_to_volumes.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/020_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/021_rename_image_ids.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/022_set_engine_mysql_innodb.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/024_add_block_device_mapping.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/025_add_uuid_to_instances.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/026_add_agent_table.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/027_add_provider_firewall_rules.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/028_add_instance_type_extra_specs.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/029_add_zone_weight_offsets.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/030_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/031_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/031_sqlite_upgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/032_add_root_device_name.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/033_ha_network.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/033_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/034_change_instance_id_in_migrations.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/035_secondary_dns.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/036_change_flavor_id_in_migrations.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/037_instances_drop_admin_pass.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/038_add_uuid_to_virtual_interfaces.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/038_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/039_add_instances_accessip.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/040_add_uuid_to_networks.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/041_add_config_drive_to_instances.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/042_add_volume_types_and_extradata.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/042_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/043_add_vsa_data.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/044_update_instance_states.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/046_add_instance_swap.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/047_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/047_sqlite_upgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/048_add_zone_name.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/050_add_disk_config_to_instances.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/050_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/051_add_vcpu_weight_to_instance_types.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/052_kill_export_devices.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/053_add_connection_info_to_block_device_mapping.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/053_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/054_add_bw_usage_data_cache.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/056_add_s3_images.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/057_add_sm_driver_tables.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/058_rename_managed_disk.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/059_split_rxtx_quota_into_network.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/059_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/059_sqlite_upgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/060_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/060_sqlite_upgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/061_add_index_to_instance_uuid.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/063_add_instance_faults_table.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/065_add_index_to_instance_project_id.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/066_preload_instance_info_cache_table.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/067_add_pool_and_interface_to_floating_ip.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/067_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/068_add_instance_attribute.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/068_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/070_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/070_sqlite_upgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/070_untie_nova_network_models.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/071_add_host_aggregate_tables.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/072_mysql_upgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/073_add_capacity.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/074_change_flavor_local_gb.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/074_sqlite_upgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/075_convert_bw_usage_to_store_network_id.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/076_remove_unique_constraints.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/076_sqlite_upgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/077_convert_to_utf8.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/078_add_rpc_info_to_zones.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/078_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/079_add_zone_name_to_instances.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/080_add_hypervisor_hostname_to_compute_nodes.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/081_drop_instance_id_bw_cache.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/082_zone_to_cell.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/084_quotas_unlimited.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/085_add_index_to_fixed_ips_by_address.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/086_set_engine_mysql_innodb.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/087_add_uuid_to_bw_usage_cache.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/088_change_instance_id_to_uuid_in_block_device_mapping.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/088_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/088_sqlite_upgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/089_add_volume_id_mappings.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/090_modify_volume_id_datatype.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/090_sqlite_downgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/090_sqlite_upgrade.sql create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/091_convert_volume_ids_to_uuid.py create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/__init__.py create mode 100644 cinder/db/sqlalchemy/migration.py create mode 100644 cinder/db/sqlalchemy/models.py create mode 100644 cinder/db/sqlalchemy/session.py create mode 100644 cinder/exception.py create mode 100644 cinder/flags.py create mode 100644 cinder/locale/bs/LC_MESSAGES/nova.po create mode 100644 cinder/locale/cs/LC_MESSAGES/nova.po create mode 100644 cinder/locale/da/LC_MESSAGES/nova.po create mode 100644 cinder/locale/de/LC_MESSAGES/nova.po create mode 100644 cinder/locale/en_AU/LC_MESSAGES/nova.po create mode 100644 cinder/locale/en_GB/LC_MESSAGES/nova.po create mode 100644 cinder/locale/es/LC_MESSAGES/nova.po create mode 100644 cinder/locale/fr/LC_MESSAGES/nova.po create mode 100644 cinder/locale/it/LC_MESSAGES/nova.po create mode 100644 cinder/locale/ja/LC_MESSAGES/nova.po create mode 100644 cinder/locale/ko/LC_MESSAGES/nova.po create mode 100644 cinder/locale/nova.pot create mode 100644 cinder/locale/pt_BR/LC_MESSAGES/nova.po create mode 100644 cinder/locale/ru/LC_MESSAGES/nova.po create mode 100644 cinder/locale/tl/LC_MESSAGES/nova.po create mode 100644 cinder/locale/tr/LC_MESSAGES/nova.po create mode 100644 cinder/locale/uk/LC_MESSAGES/nova.po create mode 100644 cinder/locale/zh_CN/LC_MESSAGES/nova.po create mode 100644 cinder/locale/zh_TW/LC_MESSAGES/nova.po create mode 100644 cinder/log.py create mode 100644 cinder/manager.py create mode 100644 cinder/notifier/__init__.py create mode 100644 cinder/notifier/api.py create mode 100644 cinder/notifier/capacity_notifier.py create mode 100644 cinder/notifier/list_notifier.py create mode 100644 cinder/notifier/log_notifier.py create mode 100644 cinder/notifier/no_op_notifier.py create mode 100644 cinder/notifier/rabbit_notifier.py create mode 100644 cinder/notifier/test_notifier.py create mode 100644 cinder/openstack/__init__.py create mode 100644 cinder/openstack/common/README create mode 100644 cinder/openstack/common/__init__.py create mode 100644 cinder/openstack/common/cfg.py create mode 100644 cinder/openstack/common/exception.py create mode 100644 cinder/openstack/common/importutils.py create mode 100644 cinder/openstack/common/iniparser.py create mode 100644 cinder/openstack/common/local.py create mode 100644 cinder/policy.py create mode 100644 cinder/quota.py create mode 100755 cinder/rootwrap/__init__.py create mode 100755 cinder/rootwrap/filters.py create mode 100755 cinder/rootwrap/volume.py create mode 100755 cinder/rootwrap/wrapper.py create mode 100644 cinder/rpc/__init__.py create mode 100644 cinder/rpc/amqp.py create mode 100644 cinder/rpc/common.py create mode 100644 cinder/rpc/impl_fake.py create mode 100644 cinder/rpc/impl_kombu.py create mode 100644 cinder/rpc/impl_qpid.py create mode 100644 cinder/scheduler/__init__.py create mode 100644 cinder/scheduler/api.py create mode 100644 cinder/scheduler/chance.py create mode 100644 cinder/scheduler/driver.py create mode 100644 cinder/scheduler/host_manager.py create mode 100644 cinder/scheduler/manager.py create mode 100644 cinder/scheduler/simple.py create mode 100644 cinder/service.py create mode 100644 cinder/test.py create mode 100644 cinder/testing/README.rst create mode 100644 cinder/testing/__init__.py create mode 100644 cinder/testing/fake/__init__.py create mode 100644 cinder/testing/runner.py create mode 100644 cinder/tests/__init__.py create mode 100644 cinder/tests/api/__init__.py create mode 100644 cinder/tests/api/openstack/__init__.py create mode 100644 cinder/tests/api/openstack/common.py create mode 100644 cinder/tests/api/openstack/fakes.py create mode 100644 cinder/tests/api/openstack/test_common.py create mode 100644 cinder/tests/api/openstack/test_faults.py create mode 100644 cinder/tests/api/openstack/test_wsgi.py create mode 100644 cinder/tests/api/openstack/test_xmlutil.py create mode 100644 cinder/tests/api/openstack/volume/__init__.py create mode 100644 cinder/tests/api/openstack/volume/contrib/__init__.py create mode 100644 cinder/tests/api/openstack/volume/contrib/test_types_extra_specs.py create mode 100644 cinder/tests/api/openstack/volume/contrib/test_types_manage.py create mode 100644 cinder/tests/api/openstack/volume/extensions/__init__.py create mode 100644 cinder/tests/api/openstack/volume/extensions/foxinsocks.py create mode 100644 cinder/tests/api/openstack/volume/test_extensions.py create mode 100644 cinder/tests/api/openstack/volume/test_router.py create mode 100644 cinder/tests/api/openstack/volume/test_snapshots.py create mode 100644 cinder/tests/api/openstack/volume/test_types.py create mode 100644 cinder/tests/api/openstack/volume/test_volumes.py create mode 100644 cinder/tests/api/test_auth.py create mode 100644 cinder/tests/api/test_sizelimit.py create mode 100644 cinder/tests/api/test_wsgi.py create mode 100644 cinder/tests/db/__init__.py create mode 100644 cinder/tests/db/fakes.py create mode 100644 cinder/tests/declare_flags.py create mode 100644 cinder/tests/fake_flags.py create mode 100644 cinder/tests/fake_utils.py create mode 100644 cinder/tests/integrated/__init__.py create mode 100644 cinder/tests/integrated/api/__init__.py create mode 100644 cinder/tests/integrated/api/client.py create mode 100644 cinder/tests/integrated/integrated_helpers.py create mode 100644 cinder/tests/integrated/test_extensions.py create mode 100644 cinder/tests/integrated/test_login.py create mode 100644 cinder/tests/integrated/test_volumes.py create mode 100644 cinder/tests/integrated/test_xml.py create mode 100644 cinder/tests/monkey_patch_example/__init__.py create mode 100644 cinder/tests/monkey_patch_example/example_a.py create mode 100644 cinder/tests/monkey_patch_example/example_b.py create mode 100644 cinder/tests/notifier/__init__.py create mode 100644 cinder/tests/notifier/test_capacity_notifier.py create mode 100644 cinder/tests/notifier/test_list_notifier.py create mode 100644 cinder/tests/policy.json create mode 100644 cinder/tests/rpc/__init__.py create mode 100644 cinder/tests/rpc/common.py create mode 100644 cinder/tests/rpc/test_common.py create mode 100644 cinder/tests/rpc/test_fake.py create mode 100644 cinder/tests/rpc/test_kombu.py create mode 100644 cinder/tests/rpc/test_kombu_ssl.py create mode 100644 cinder/tests/rpc/test_qpid.py create mode 100644 cinder/tests/runtime_flags.py create mode 100644 cinder/tests/scheduler/__init__.py create mode 100644 cinder/tests/scheduler/fakes.py create mode 100644 cinder/tests/scheduler/test_scheduler.py create mode 100644 cinder/tests/test_SolidFireSanISCSIDriver.py create mode 100644 cinder/tests/test_api.py create mode 100644 cinder/tests/test_compat_flagfile.py create mode 100644 cinder/tests/test_context.py create mode 100644 cinder/tests/test_db_api.py create mode 100644 cinder/tests/test_exception.py create mode 100644 cinder/tests/test_flags.py create mode 100644 cinder/tests/test_iscsi.py create mode 100644 cinder/tests/test_log.py create mode 100644 cinder/tests/test_migrations.conf create mode 100644 cinder/tests/test_migrations.py create mode 100644 cinder/tests/test_misc.py create mode 100644 cinder/tests/test_netapp.py create mode 100644 cinder/tests/test_nexenta.py create mode 100644 cinder/tests/test_notifier.py create mode 100644 cinder/tests/test_nova_rootwrap.py create mode 100644 cinder/tests/test_policy.py create mode 100644 cinder/tests/test_quota.py create mode 100644 cinder/tests/test_service.py create mode 100644 cinder/tests/test_skip_examples.py create mode 100644 cinder/tests/test_test.py create mode 100644 cinder/tests/test_test_utils.py create mode 100644 cinder/tests/test_utils.py create mode 100644 cinder/tests/test_versions.py create mode 100644 cinder/tests/test_volume.py create mode 100644 cinder/tests/test_volume_types.py create mode 100644 cinder/tests/test_volume_types_extra_specs.py create mode 100644 cinder/tests/test_wsgi.py create mode 100644 cinder/tests/utils.py create mode 100644 cinder/utils.py create mode 100644 cinder/version.py create mode 100644 cinder/volume/__init__.py create mode 100644 cinder/volume/api.py create mode 100644 cinder/volume/driver.py create mode 100644 cinder/volume/iscsi.py create mode 100644 cinder/volume/manager.py create mode 100644 cinder/volume/netapp.py create mode 100644 cinder/volume/nexenta/__init__.py create mode 100644 cinder/volume/nexenta/jsonrpc.py create mode 100644 cinder/volume/nexenta/volume.py create mode 100644 cinder/volume/san.py create mode 100644 cinder/volume/volume_types.py create mode 100644 cinder/volume/xensm.py create mode 100644 cinder/wsgi.py create mode 100755 contrib/openstack-config create mode 100644 contrib/redhat-eventlet.patch create mode 100644 doc/.gitignore create mode 100644 doc/Makefile create mode 100644 doc/README.rst create mode 100644 doc/ext/__init__.py create mode 100644 doc/ext/nova_autodoc.py create mode 100644 doc/ext/nova_todo.py create mode 100755 doc/find_autodoc_modules.sh create mode 100755 doc/generate_autodoc_index.sh create mode 100644 doc/source/_ga/layout.html create mode 100644 doc/source/_static/.gitignore create mode 100644 doc/source/_static/.placeholder create mode 100644 doc/source/_static/basic.css create mode 100644 doc/source/_static/default.css create mode 100644 doc/source/_static/jquery.tweet.js create mode 100644 doc/source/_static/tweaks.css create mode 100644 doc/source/_templates/.gitignore create mode 100644 doc/source/_templates/.placeholder create mode 100644 doc/source/_theme/layout.html create mode 100644 doc/source/_theme/theme.conf create mode 100644 doc/source/conf.py create mode 100644 doc/source/devref/addmethod.openstackapi.rst create mode 100644 doc/source/devref/aggregates.rst create mode 100644 doc/source/devref/api.rst create mode 100644 doc/source/devref/architecture.rst create mode 100644 doc/source/devref/auth.rst create mode 100644 doc/source/devref/cloudpipe.rst create mode 100644 doc/source/devref/database.rst create mode 100644 doc/source/devref/development.environment.rst create mode 100644 doc/source/devref/down.sh create mode 100644 doc/source/devref/fakes.rst create mode 100644 doc/source/devref/filter_scheduler.rst create mode 100644 doc/source/devref/gerrit.rst create mode 100644 doc/source/devref/glance.rst create mode 100644 doc/source/devref/il8n.rst create mode 100644 doc/source/devref/index.rst create mode 100644 doc/source/devref/interfaces create mode 100644 doc/source/devref/jenkins.rst create mode 100644 doc/source/devref/launchpad.rst create mode 100644 doc/source/devref/multinic.rst create mode 100644 doc/source/devref/network.rst create mode 100644 doc/source/devref/nova.rst create mode 100644 doc/source/devref/rc.local create mode 100644 doc/source/devref/rpc.rst create mode 100644 doc/source/devref/scheduler.rst create mode 100644 doc/source/devref/server.conf.template create mode 100644 doc/source/devref/services.rst create mode 100644 doc/source/devref/threading.rst create mode 100644 doc/source/devref/unit_tests.rst create mode 100644 doc/source/devref/up.sh create mode 100644 doc/source/devref/volume.rst create mode 100644 doc/source/devref/xensmvolume.rst create mode 100644 doc/source/image_src/multinic_1.odg create mode 100644 doc/source/image_src/multinic_2.odg create mode 100644 doc/source/image_src/multinic_3.odg create mode 100644 doc/source/images/NOVA_ARCH.png create mode 100644 doc/source/images/NOVA_ARCH.svg create mode 100644 doc/source/images/NOVA_ARCH_200dpi.png create mode 100644 doc/source/images/NOVA_ARCH_66dpi.png create mode 100644 doc/source/images/NOVA_clouds_A_B.png create mode 100644 doc/source/images/NOVA_clouds_A_B.svg create mode 100644 doc/source/images/NOVA_clouds_C1_C2.svg create mode 100644 doc/source/images/NOVA_clouds_C1_C2.svg.png create mode 100644 doc/source/images/Novadiagram.png create mode 100644 doc/source/images/base_scheduler.png create mode 100644 doc/source/images/cloudpipe.png create mode 100644 doc/source/images/fabric.png create mode 100644 doc/source/images/filteringWorkflow1.png create mode 100644 doc/source/images/filteringWorkflow2.png create mode 100644 doc/source/images/multinic_dhcp.png create mode 100644 doc/source/images/multinic_flat.png create mode 100644 doc/source/images/multinic_vlan.png create mode 100755 doc/source/images/nova.compute.api.create.png create mode 100644 doc/source/images/novascreens.png create mode 100644 doc/source/images/novashvirtually.png create mode 100644 doc/source/images/rpc/arch.png create mode 100644 doc/source/images/rpc/arch.svg create mode 100644 doc/source/images/rpc/flow1.png create mode 100644 doc/source/images/rpc/flow1.svg create mode 100644 doc/source/images/rpc/flow2.png create mode 100644 doc/source/images/rpc/flow2.svg create mode 100644 doc/source/images/rpc/rabt.png create mode 100644 doc/source/images/rpc/rabt.svg create mode 100644 doc/source/images/rpc/state.png create mode 100644 doc/source/images/vmwareapi_blockdiagram.jpg create mode 100755 doc/source/images/zone_aware_overview.png create mode 100644 doc/source/images/zone_aware_scheduler.png create mode 100755 doc/source/images/zone_overview.png create mode 100644 doc/source/index.rst create mode 100644 doc/source/man/nova-manage.rst create mode 100644 etc/cinder/api-paste.ini create mode 100644 etc/cinder/cinder.conf.sample create mode 100644 etc/cinder/logging_sample.conf create mode 100644 etc/cinder/policy.json create mode 100644 openstack-common.conf create mode 100644 pylintrc create mode 100755 run_tests.sh create mode 100644 setup.cfg create mode 100644 setup.py create mode 100755 tools/clean-vlans create mode 100755 tools/clean_file_locks.py create mode 100644 tools/conf/create_conf.py create mode 100755 tools/conf/generate_sample.sh create mode 100755 tools/enable-pre-commit-hook.sh create mode 100755 tools/hacking.py create mode 100644 tools/install_venv.py create mode 100644 tools/pip-requires create mode 100755 tools/rfc.sh create mode 100644 tools/test-requires create mode 100755 tools/with_venv.sh create mode 100644 tox.ini diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..97cda3c7c --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +*.pyc +*.DS_Store +local_settings.py +CA/ +keeper +instances +keys +build/* +build-stamp +cinder.egg-info +nova.egg-info +.cinder-venv +.nova-venv +.venv +.tox +*.sqlite +*.log +*.mo +tools/conf/cinder.conf* +tools/conf/nova.conf* +cover/* +dist/* +.coverage +covhtml diff --git a/.gitreview b/.gitreview new file mode 100644 index 000000000..eecf93944 --- /dev/null +++ b/.gitreview @@ -0,0 +1,4 @@ +[gerrit] +host=review.openstack.org +port=29418 +project=openstack/cinder.git diff --git a/.mailmap b/.mailmap new file mode 100644 index 000000000..f38c68aeb --- /dev/null +++ b/.mailmap @@ -0,0 +1,81 @@ +# Format is: +# <preferred e-mail> <other e-mail 1> +# <preferred e-mail> <other e-mail 2> +<aaron.lee@rackspace.com> <wwkeyboard@gmail.com> +<anotherjesse@gmail.com> <jesse@dancelamb> +<anotherjesse@gmail.com> <jesse@gigantor.local> +<anotherjesse@gmail.com> <jesse@ubuntu> +<anotherjesse@gmail.com> <jesse@aire.local> +<ant@openstack.org> <amesserl@rackspace.com> +<Armando.Migliaccio@eu.citrix.com> <armando.migliaccio@citrix.com> +<brian.lamar@rackspace.com> <brian.lamar@gmail.com> +<brian.waldon@rackspace.com> <bcwaldon@gmail.com> +<bschott@isi.edu> <bfschott@gmail.com> +<cbehrens@codestud.com> <chris.behrens@rackspace.com> +<chiradeep@cloud.com> <chiradeep@chiradeep-lt2> +<code@term.ie> <github@anarkystic.com> +<code@term.ie> <termie@preciousroy.local> +<corywright@gmail.com> <cory.wright@rackspace.com> +<dan@nicira.com> <danwent@dan-xs3-cs> +<dan@nicira.com> <danwent@gmail.com> +<dtroyer@gmail.com> <dt-github@xr7.org> +<Dave.Walker@canonical.com> <DaveWalker@ubuntu.com> +<derekh@redhat.com> <higginsd@gmail.com> +<devin.carlen@gmail.com> <devcamcar@illian.local> +<doug.hellmann@dreamhost.com> <doug.hellmann@gmail.com> +<dprince@redhat.com> <dan.prince@rackspace.com> +<edouard1.thuleau@orange.com> <thuleau@gmail.com> +<ewan.mellor@citrix.com> <emellor@silver> +<ghe@debian.org> <ghe.rivero@gmail.com> +<itoumsn@nttdata.co.jp> <itoumsn@shayol> +<jake@ansolabs.com> <jake@markupisart.com> +<jake@ansolabs.com> <admin@jakedahn.com> +<jaypipes@gmail.com> <jpipes@serialcoder> +<jeblair@hp.com> <james.blair@rackspace.com> +<jeblair@hp.com> <corvus@inaugust.com> +<jmckenty@gmail.com> <jmckenty@joshua-mckentys-macbook-pro.local> +<jmckenty@gmail.com> <jmckenty@yyj-dhcp171.corp.flock.com> +<jmckenty@gmail.com> <joshua.mckenty@nasa.gov> +<johannes.erdfelt@rackspace.com> <johannes@compute3.221.st> +<john.griffith@solidfire.com> <john.griffith8@gmail.com> +<josh@jk0.org> <josh.kearney@rackspace.com> +<justin@fathomdb.com> <justinsb@justinsb-desktop> +<justin@fathomdb.com> <superstack@superstack.org> +<lorin@nimbisservices.com> <lorin@isi.edu> +<masumotok@nttdata.co.jp> Masumoto<masumotok@nttdata.co.jp> +<masumotok@nttdata.co.jp> <root@openstack2-api> +<matt.dietz@rackspace.com> <matthewdietz@Matthew-Dietzs-MacBook-Pro.local> +<matt.dietz@rackspace.com> <mdietz@openstack> +<mikal@stillhq.com> <michael.still@canonical.com> +<mordred@inaugust.com> <mordred@hudson> +<naveedm9@gmail.com> <naveed.massjouni@rackspace.com> +<rnirmal@gmail.com> <nirmal.ranganathan@rackspace.com> +<rnirmal@gmail.com> <nirmal.ranganathan@rackspace.coom> +<paul@openstack.org> <paul.voccio@rackspace.com> +<paul@openstack.org> <pvoccio@castor.local> +<paul@openstack.org> <paul@substation9.com> +<rconradharris@gmail.com> <rick.harris@rackspace.com> +<rlane@wikimedia.org> <laner@controller> +<sandy.walsh@rackspace.com> <sandy@sandywalsh.com> +<sleepsonthefloor@gmail.com> <root@tonbuntu> +<soren.hansen@rackspace.com> <soren@linux2go.dk> +<throughnothing@gmail.com> <will.wolf@rackspace.com> +<tim.simpson@rackspace.com> <tim.simpson4@gmail.com> +<todd@ansolabs.com> <todd@lapex> +<todd@ansolabs.com> <todd@rubidine.com> +<todd@ansolabs.com> <xtoddx@gmail.com> +<trey.morris@rackspace.com> <treyemorris@gmail.com> +<tushar.vitthal.patil@gmail.com> <tpatil@vertex.co.in> +<ueno.nachi@lab.ntt.co.jp> <nati.ueno@gmail.com> +<ueno.nachi@lab.ntt.co.jp> <nova@u4> +<ueno.nachi@lab.ntt.co.jp> <openstack@lab.ntt.co.jp> +<vishvananda@gmail.com> <root@mirror.nasanebula.net> +<vishvananda@gmail.com> <root@ubuntu> +<vishvananda@gmail.com> <vishvananda@yahoo.com> +<ilyaalekseyev@acm.org> <ialekseev@griddynamics.com> +<ilyaalekseyev@acm.org> <ilya@oscloud.ru> +<reldan@oscloud.ru> <enugaev@griddynamics.com> +<kshileev@gmail.com> <kshileev@griddynamics.com> +<nsokolov@griddynamics.com> <nsokolov@griddynamics.net> +<troy.toman@rackspace.com> <ttcl@mac.com> +<zulcss@ubuntu.com> <chuck.short@canonical.com> diff --git a/Authors b/Authors new file mode 100644 index 000000000..f4bd7344f --- /dev/null +++ b/Authors @@ -0,0 +1,211 @@ +Aaron Lee <aaron.lee@rackspace.com> +Adam Gandelman <adamg@canonical.com> +Adam Johnson <adjohn@gmail.com> +Adrian Smith <adrian_f_smith@dell.com> +Ahmad Hassan <ahmad.hassan@hp.com> +Alex Meade <alex.meade@rackspace.com> +Alexander Sakhnov <asakhnov@mirantis.com> +Alexander Kovalev <akovalev@mirantis.com> +Alvaro Lopez Garcia <aloga@ifca.unican.es> +Andrew Bogott <abogott@wikimedia.org> +Andrew Clay Shafer <acs@parvuscaptus.com> +Andrey Brindeyev <abrindeyev@griddynamics.com> +Andy Smith <code@term.ie> +Andy Southgate <andy.southgate@citrix.com> +Anne Gentle <anne@openstack.org> +Ante KaramatiÄ <ivoks@ubuntu.com> +Anthony Young <sleepsonthefloor@gmail.com> +Antony Messerli <ant@openstack.org> +Armando Migliaccio <Armando.Migliaccio@eu.citrix.com> +Arvind Somya <asomya@cisco.com> +Asbjørn Sannes <asbjorn.sannes@interhost.no> +Ben McGraw <ben@pistoncloud.com> +Ben Swartzlander <bswartz@netapp.com> +Bilal Akhtar <bilalakhtar@ubuntu.com> +Brad Hall <brad@nicira.com> +Brad McConnell <bmcconne@rackspace.com> +Brendan Maguire <B_Maguire@Dell.com> +Brian Elliott <brian.elliott@rackspace.com> +Brian Lamar <brian.lamar@rackspace.com> +Brian Schott <bschott@isi.edu> +Brian Waldon <brian.waldon@rackspace.com> +Chiradeep Vittal <chiradeep@cloud.com> +Chmouel Boudjnah <chmouel@chmouel.com> +Chris Behrens <cbehrens@codestud.com> +Christian Berendt <berendt@b1-systems.de> +Chris Fattarsi <chris.fattarsi@pistoncloud.com> +Christopher MacGown <chris@pistoncloud.com> +Chuck Short <zulcss@ubuntu.com> +Cole Robinson <crobinso@redhat.com> +Cor Cornelisse <cor@hyves.nl> +Cory Wright <corywright@gmail.com> +Dan Prince <dprince@redhat.com> +Dan Wendlandt <dan@nicira.com> +Daniel P. Berrange <berrange@redhat.com> +Dave Lapsley <dlapsley@nicira.com> +Dave Walker <Dave.Walker@canonical.com> +David Pravec <David.Pravec@danix.org> +David Subiros <david.perez5@hp.com> +Dean Troyer <dtroyer@gmail.com> +Deepak Garg <deepak.garg@citrix.com> +Derek Higgins <derekh@redhat.com> +Devdeep Singh <devdeep.singh@citrix.com> +Devendra Modium <dmodium@isi.edu> +Devin Carlen <devin.carlen@gmail.com> +Dina Belova <dbelova@mirantis.com> +Donal Lafferty <donal.lafferty@citrix.com> +Dong-In David Kang <dkang@isi.edu> +Doug Hellmann <doug.hellmann@dreamhost.com> +Duncan McGreggor <duncan@dreamhost.com> +Ed Leafe <ed@leafe.com> +Edouard Thuleau <edouard1.thuleau@orange.com> +Eldar Nugaev <reldan@oscloud.ru> +Eoghan Glynn <eglynn@redhat.com> +Eric Day <eday@oddments.org> +Eric Windisch <eric@cloudscaling.com> +Evan Callicoat <diopter@gmail.com> +Ewan Mellor <ewan.mellor@citrix.com> +François Charlier <francois.charlier@ecindernce.com> +Gabe Westmaas <gabe.westmaas@rackspace.com> +Gabriel Hurley <gabriel@strikeawe.com> +Gary Kotton <garyk@radware.com> +Gaurav Gupta <gaurav@denali-systems.com> +Greg Althaus <galthaus@austin.rr.com> +Hengqing Hu <hudayou@hotmail.com> +Hisaharu Ishii <ishii.hisaharu@lab.ntt.co.jp> +Hisaki Ohara <hisaki.ohara@intel.com> +Ilya Alekseyev <ilyaalekseyev@acm.org> +IonuÈ ArÈÄriÈi <iartarisi@suse.cz> +Isaku Yamahata <yamahata@valinux.co.jp> +Ivan Kolodyazhny <e0ne@e0ne.info> +J. Daniel Schmidt <jdsn@suse.de> +Jake Dahn <jake@ansolabs.com> +James E. Blair <jeblair@hp.com> +Jason Cannavale <jason.cannavale@rackspace.com> +Jason Koelker <jason@koelker.net> +Jay Pipes <jaypipes@gmail.com> +JC Martin <jcmartin@ebaysf.com> +Jesse Andrews <anotherjesse@gmail.com> +Jimmy Bergman <jimmy@sigint.se> +Joe Gordon <jogo@cloudscaling.com> +Joe Heck <heckj@mac.com> +Joel Moore <joelbm24@gmail.com> +Johannes Erdfelt <johannes.erdfelt@rackspace.com> +John Dewey <john@dewey.ws> +John Garbutt <john.garbutt@citrix.com> +John Griffith <john.griffith@solidfire.com> +John Kennedy <john.m.kennedy@intel.com> +John Tran <jtran@attinteractive.com> +Jonathan Bryce <jbryce@jbryce.com> +Jordan Rinke <jordan@openstack.org> +Joseph Suh <jsuh@isi.edu> +Joseph W. Breu <breu@breu.org> +Josh Durgin <joshd@hq.newdream.net> +Josh Kearney <josh@jk0.org> +Josh Kleinpeter <josh@kleinpeter.org> +Joshua Harlow <harlowja@yahoo-inc.com> +Joshua McKenty <jmckenty@gmail.com> +Juan G. Hernando Rivero <ghe@debian.org> +Julien Danjou <julien.danjou@ecindernce.com> +Justin Santa Barbara <justin@fathomdb.com> +Justin Shepherd <jshepher@rackspace.com> +Kei Masumoto <masumotok@nttdata.co.jp> +Keisuke Tagami <tagami.keisuke@lab.ntt.co.jp> +masumoto<masumotok@nttdata.co.jp> +masukotm<masukotm@nttdata.co.jp> +Ken Pepple <ken.pepple@gmail.com> +Kevin Bringard <kbringard@attinteractive.com> +Kevin L. Mitchell <kevin.mitchell@rackspace.com> +Kiall Mac Innes <kiall@managedit.ie> +Kirill Shileev <kshileev@gmail.com> +Koji Iida <iida.koji@lab.ntt.co.jp> +Liam Kelleher <liam.kelleher@hp.com> +Likitha Shetty <likitha.shetty@citrix.com> +Loganathan Parthipan <parthipan@hp.com> +Lorin Hochstein <lorin@nimbisservices.com> +Lvov Maxim <usrleon@gmail.com> +Mandar Vaze <mandar.vaze@vertex.co.in> +Mandell Degerness <mdegerne@gmail.com> +Mark McClain <mark.mcclain@dreamhost.com> +Mark McLoughlin <markmc@redhat.com> +Mark Washenberger <mark.washenberger@rackspace.com> +Maru Newby <mnewby@internap.com> +Masanori Itoh <itoumsn@nttdata.co.jp> +Matt Dietz <matt.dietz@rackspace.com> +Matt Stephenson <mattstep@mattstep.net> +Matthew Hooker <matt@cloudscaling.com> +Michael Basnight <mbasnigh@rackspace.com> +Michael Gundlach <michael.gundlach@rackspace.com> +Michael Still <mikal@stillhq.com> +Mike Lundy <mike@pistoncloud.com> +Mike Milner <mike.milner@canonical.com> +Mike Pittaro <mikeyp@lahondaresearch.org> +Mike Scherbakov <mihgen@gmail.com> +Mikyung Kang <mkkang@isi.edu> +Mohammed Naser <mnaser@vexxhost.com> +Monsyne Dragon <mdragon@rackspace.com> +Monty Taylor <mordred@inaugust.com> +MORITA Kazutaka <morita.kazutaka@gmail.com> +MotoKen <motokentsai@gmail.com> +Muneyuki Noguchi <noguchimn@nttdata.co.jp> +Nachi Ueno <ueno.nachi@lab.ntt.co.jp> +Naveed Massjouni <naveedm9@gmail.com> +Nick Bartos <nick@pistoncloud.com> +Nikhil Komawar <nikhil.komawar@rackspace.com> +Nikolay Sokolov <nsokolov@griddynamics.com> +Nirmal Ranganathan <rnirmal@gmail.com> +Ollie Leahy <oliver.leahy@hp.com> +Pádraig Brady <pbrady@redhat.com> +Paul McMillan <paul.mcmillan@nebula.com> +Paul Voccio <paul@openstack.org> +Peng Yong <ppyy@pubyun.com> +Philip Knouff <philip.knouff@mailtrust.com> +Renier Morales <renierm@us.ibm.com> +Renuka Apte <renuka.apte@citrix.com> +Ricardo Carrillo Cruz <emaildericky@gmail.com> +Rick Clark <rick@openstack.org> +Rick Harris <rconradharris@gmail.com> +Rob Kost <kost@isi.edu> +Robert Esker <esker@netapp.com> +Russell Bryant <rbryant@redhat.com> +Russell Sim <russell.sim@gmail.com> +Ryan Lane <rlane@wikimedia.org> +Ryan Lucio <rlucio@internap.com> +Ryu Ishimoto <ryu@midokura.jp> +Salvatore Orlando <salvatore.orlando@eu.citrix.com> +Sandy Walsh <sandy.walsh@rackspace.com> +Sateesh Chodapuneedi <sateesh.chodapuneedi@citrix.com> +Scott Moser <smoser@ubuntu.com> +Sean Dague <sdague@linux.vnet.ibm.com> +Soren Hansen <soren.hansen@rackspace.com> +Stanislaw Pitucha <stanislaw.pitucha@hp.com> +Stephanie Reese <reese.sm@gmail.com> +Sumit Naiksatam <snaiksat@cisco.com> +Thierry Carrez <thierry@openstack.org> +Tim Simpson <tim.simpson@rackspace.com> +Todd Willey <todd@ansolabs.com> +Tomoe Sugihara <tomoe@midokura.com> +Tomoya Masuko<masukotm@nttdata.co.jp> +Thorsten Tarrach <thorsten@atomia.com> +Trey Morris <trey.morris@rackspace.com> +Troy Toman <troy.toman@rackspace.com> +Tushar Patil <tushar.vitthal.patil@gmail.com> +Unmesh Gurjar <unmesh.gurjar@vertex.co.in> +Vasiliy Shlykov <vash@vasiliyshlykov.org> +Vishvananda Ishaya <vishvananda@gmail.com> +Vivek Y S <vivek.ys@gmail.com> +Vladimir Popovski <vladimir@zadarastorage.com> +Vaddi kiran <vaddi_kiran@persistent.co.in> +William Henry <whenry@redhat.com> +William Kelly <william.kelly@rackspace.com> +William Wolf <throughnothing@gmail.com> +Yaguang Tang <heut2008@gmail.com> +Yoshiaki Tamura <yoshi@midokura.jp> +Youcef Laribi <Youcef.Laribi@eu.citrix.com> +Yun Mao <yunmao@gmail.com> +Yun Shen <Yun.Shen@hp.com> +Yuriy Taraday <yorik.sar@gmail.com> +Zed Shaw <zedshaw@zedshaw.com> +Zhixue Wu <Zhixue.Wu@citrix.com> +Zhongyue Luo <lzyeval@gmail.com> +Ziad Sawalha <github@highbridgellc.com> diff --git a/HACKING.rst b/HACKING.rst new file mode 100644 index 000000000..e9c0162f5 --- /dev/null +++ b/HACKING.rst @@ -0,0 +1,213 @@ +Cinder Style Commandments +======================= + +- Step 1: Read http://www.python.org/dev/peps/pep-0008/ +- Step 2: Read http://www.python.org/dev/peps/pep-0008/ again +- Step 3: Read on + + +General +------- +- Put two newlines between top-level code (funcs, classes, etc) +- Put one newline between methods in classes and anywhere else +- Do not write "except:", use "except Exception:" at the very least +- Include your name with TODOs as in "#TODO(termie)" +- Do not shadow a built-in or reserved word. Example:: + + def list(): + return [1, 2, 3] + + mylist = list() # BAD, shadows `list` built-in + + class Foo(object): + def list(self): + return [1, 2, 3] + + mylist = Foo().list() # OKAY, does not shadow built-in + + +Imports +------- +- Do not import objects, only modules (*) +- Do not import more than one module per line (*) +- Do not make relative imports +- Order your imports by the full module path +- Organize your imports according to the following template + +(*) exceptions are: + +- imports from ``migrate`` package +- imports from ``sqlalchemy`` package +- imports from ``cinder.db.sqlalchemy.session`` module + +Example:: + + # vim: tabstop=4 shiftwidth=4 softtabstop=4 + {{stdlib imports in human alphabetical order}} + \n + {{third-party lib imports in human alphabetical order}} + \n + {{cinder imports in human alphabetical order}} + \n + \n + {{begin your code}} + + +Human Alphabetical Order Examples +--------------------------------- +Example:: + + import httplib + import logging + import random + import StringIO + import time + import unittest + + import eventlet + import webob.exc + + import cinder.api.ec2 + from cinder.api import openstack + from cinder.auth import users + from cinder.endpoint import cloud + import cinder.flags + from cinder import test + + +Docstrings +---------- +Example:: + + """A one line docstring looks like this and ends in a period.""" + + + """A multi line docstring has a one-line summary, less than 80 characters. + + Then a new paragraph after a newline that explains in more detail any + general information about the function, class or method. Example usages + are also great to have here if it is a complex class for function. + + When writing the docstring for a class, an extra line should be placed + after the closing quotations. For more in-depth explanations for these + decisions see http://www.python.org/dev/peps/pep-0257/ + + If you are going to describe parameters and return values, use Sphinx, the + appropriate syntax is as follows. + + :param foo: the foo parameter + :param bar: the bar parameter + :returns: return_type -- description of the return value + :returns: description of the return value + :raises: AttributeError, KeyError + """ + + +Dictionaries/Lists +------------------ +If a dictionary (dict) or list object is longer than 80 characters, its items +should be split with newlines. Embedded iterables should have their items +indented. Additionally, the last item in the dictionary should have a trailing +comma. This increases readability and simplifies future diffs. + +Example:: + + my_dictionary = { + "image": { + "name": "Just a Snapshot", + "size": 2749573, + "properties": { + "user_id": 12, + "arch": "x86_64", + }, + "things": [ + "thing_one", + "thing_two", + ], + "status": "ACTIVE", + }, + } + + +Calling Methods +--------------- +Calls to methods 80 characters or longer should format each argument with +newlines. This is not a requirement, but a guideline:: + + unnecessarily_long_function_name('string one', + 'string two', + kwarg1=constants.ACTIVE, + kwarg2=['a', 'b', 'c']) + + +Rather than constructing parameters inline, it is better to break things up:: + + list_of_strings = [ + 'what_a_long_string', + 'not as long', + ] + + dict_of_numbers = { + 'one': 1, + 'two': 2, + 'twenty four': 24, + } + + object_one.call_a_method('string three', + 'string four', + kwarg1=list_of_strings, + kwarg2=dict_of_numbers) + + +Internationalization (i18n) Strings +----------------------------------- +In order to support multiple languages, we have a mechanism to support +automatic translations of exception and log strings. + +Example:: + + msg = _("An error occurred") + raise HTTPBadRequest(explanation=msg) + +If you have a variable to place within the string, first internationalize the +template string then do the replacement. + +Example:: + + msg = _("Missing parameter: %s") % ("flavor",) + LOG.error(msg) + +If you have multiple variables to place in the string, use keyword parameters. +This helps our translators reorder parameters when needed. + +Example:: + + msg = _("The server with id %(s_id)s has no key %(m_key)s") + LOG.error(msg % {"s_id": "1234", "m_key": "imageId"}) + + +Creating Unit Tests +------------------- +For every new feature, unit tests should be created that both test and +(implicitly) document the usage of said feature. If submitting a patch for a +bug that had no unit test, a new passing unit test should be added. If a +submitted bug fix does have a unit test, be sure to add a new one that fails +without the patch and passes with the patch. + +For more information on creating unit tests and utilizing the testing +infrastructure in OpenStack Cinder, please read cinder/testing/README.rst. + + +openstack-common +---------------- + +A number of modules from openstack-common are imported into the project. + +These modules are "incubating" in openstack-common and are kept in sync +with the help of openstack-common's update.py script. See: + + http://wiki.openstack.org/CommonLibrary#Incubation + +The copy of the code should never be directly modified here. Please +always update openstack-common first and then run the script to copy +the changes across. diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..68c771a09 --- /dev/null +++ b/LICENSE @@ -0,0 +1,176 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 000000000..97278f3f4 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,37 @@ +include HACKING.rst +include LICENSE run_tests.sh +include README.rst +include MANIFEST.in pylintrc Authors +include openstack-common.conf +include babel.cfg tox.ini +graft cinder/CA +graft doc +graft smoketests +graft tools +graft etc +graft contrib +graft plugins +graft cinder/api/openstack/*/schemas +include cinder/auth/*.schema +include cinder/auth/cinderrc.template +include cinder/auth/opendj.sh +include cinder/auth/slap.sh +include cinder/db/sqlalchemy/migrate_repo/migrate.cfg +include cinder/db/sqlalchemy/migrate_repo/README +include cinder/db/sqlalchemy/migrate_repo/versions/*.sql +include cinder/openstack/common/README +include cinder/virt/interfaces.template +include cinder/virt/libvirt*.xml.template +include cinder/virt/cpuinfo.xml.template +include cinder/testing/README.rst +include cinder/tests/db/cinder.austin.sqlite +include cinder/tests/image/*.tar.gz +include cinder/tests/policy.json +include cinder/tests/test_migrations.conf +include cinder/tests/xenapi/vm_rrd.xml +include plugins/xenapi/README +include plugins/xenapi/etc/xapi.d/plugins/objectstore +include plugins/xenapi/etc/xapi.d/plugins/pluginlib_cinder.py +global-exclude *.pyc + +recursive-include cinder/locale * diff --git a/README.rst b/README.rst new file mode 100644 index 000000000..822401a80 --- /dev/null +++ b/README.rst @@ -0,0 +1,21 @@ +The Choose Your Own Adventure README for Cinder +=============================================== + +You have come across a storage service for an open cloud computing service. +It has identified itself as "Cinder." It was abstracted from the Nova project. + +To monitor it from a distance: follow `@openstack <http://twitter.com/openstack>`_ on twitter. + +To tame it for use in your own cloud: read http://docs.openstack.org + +To study its anatomy: read http://cinder.openstack.org + +To dissect it in detail: visit http://github.com/openstack/cinder + +To taunt it with its weaknesses: use http://bugs.launchpad.net/cinder + +To watch it: http://jenkins.openstack.org + +To hack at it: read HACKING + +To cry over its pylint problems: http://jenkins.openstack.org/job/cinder-pylint/violations diff --git a/babel.cfg b/babel.cfg new file mode 100644 index 000000000..15cd6cb76 --- /dev/null +++ b/babel.cfg @@ -0,0 +1,2 @@ +[python: **.py] + diff --git a/bin/cinder-all b/bin/cinder-all new file mode 100755 index 000000000..8bec9bbb3 --- /dev/null +++ b/bin/cinder-all @@ -0,0 +1,70 @@ +#!/usr/bin/env python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack, LLC +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Starter script for All cinder services. + +This script attempts to start all the cinder services in one process. Each +service is started in its own greenthread. Please note that exceptions and +sys.exit() on the starting of a service are logged and the script will +continue attempting to launch the rest of the services. + +""" + +import eventlet +eventlet.monkey_patch() + +import os +import sys + + +possible_topdir = os.path.normpath(os.path.join(os.path.abspath( + sys.argv[0]), os.pardir, os.pardir)) +if os.path.exists(os.path.join(possible_topdir, "cinder", "__init__.py")): + sys.path.insert(0, possible_topdir) + + +from cinder import flags +from cinder import log as logging +from cinder import service +from cinder import utils + + +LOG = logging.getLogger('cinder.all') + +if __name__ == '__main__': + utils.default_flagfile() + flags.FLAGS(sys.argv) + logging.setup() + utils.monkey_patch() + servers = [] + # cinder-api + for api in flags.FLAGS.enabled_apis: + try: + servers.append(service.WSGIService(api)) + except (Exception, SystemExit): + logging.exception(_('Failed to load %s') % '%s-api' % api) + + for binary in ['cinder-volume', 'cinder-scheduler']: + try: + servers.append(service.Service.create(binary=binary)) + except (Exception, SystemExit): + LOG.exception(_('Failed to load %s'), binary) + service.serve(*servers) + service.wait() diff --git a/bin/cinder-api b/bin/cinder-api new file mode 100755 index 000000000..ba28b1a44 --- /dev/null +++ b/bin/cinder-api @@ -0,0 +1,47 @@ +#!/usr/bin/env python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Starter script for Cinder OS API.""" + +import eventlet +eventlet.monkey_patch() + +import os +import sys + + +possible_topdir = os.path.normpath(os.path.join(os.path.abspath( + sys.argv[0]), os.pardir, os.pardir)) +if os.path.exists(os.path.join(possible_topdir, "cinder", "__init__.py")): + sys.path.insert(0, possible_topdir) + + +from cinder import flags +from cinder import log as logging +from cinder import service +from cinder import utils + +if __name__ == '__main__': + utils.default_flagfile() + flags.FLAGS(sys.argv) + logging.setup() + utils.monkey_patch() + server = service.WSGIService('osapi_volume') + service.serve(server) + service.wait() diff --git a/bin/cinder-manage b/bin/cinder-manage new file mode 100755 index 000000000..0cc6d82c8 --- /dev/null +++ b/bin/cinder-manage @@ -0,0 +1,635 @@ +#!/usr/bin/env python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 X.commerce, a business unit of eBay Inc. +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +# Interactive shell based on Django: +# +# Copyright (c) 2005, the Lawrence Journal-World +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of Django nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +""" + CLI interface for cinder management. +""" + +import ast +import errno +import gettext +import json +import math +import netaddr +import optparse +import os +import StringIO +import sys + + +# If ../cinder/__init__.py exists, add ../ to Python search path, so that +# it will override what happens to be installed in /usr/(local/)lib/python... +POSSIBLE_TOPDIR = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), + os.pardir, + os.pardir)) +if os.path.exists(os.path.join(POSSIBLE_TOPDIR, 'cinder', '__init__.py')): + sys.path.insert(0, POSSIBLE_TOPDIR) + +gettext.install('cinder', unicode=1) + +from cinder.compat import flagfile +from cinder import context +from cinder import db +from cinder.db import migration +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import importutils +from cinder import quota +from cinder import rpc +from cinder import utils +from cinder import version +from cinder.volume import volume_types + +FLAGS = flags.FLAGS + + +# Decorators for actions +def args(*args, **kwargs): + def _decorator(func): + func.__dict__.setdefault('options', []).insert(0, (args, kwargs)) + return func + return _decorator + + +def param2id(object_id): + """Helper function to convert various id types to internal id. + args: [object_id], e.g. 'vol-0000000a' or 'volume-0000000a' or '10' + """ + if '-' in object_id: + # FIXME(ja): mapping occurs in nova? + pass + else: + return int(object_id) + + +class ShellCommands(object): + def bpython(self): + """Runs a bpython shell. + + Falls back to Ipython/python shell if unavailable""" + self.run('bpython') + + def ipython(self): + """Runs an Ipython shell. + + Falls back to Python shell if unavailable""" + self.run('ipython') + + def python(self): + """Runs a python shell. + + Falls back to Python shell if unavailable""" + self.run('python') + + @args('--shell', dest="shell", metavar='<bpython|ipython|python >', + help='Python shell') + def run(self, shell=None): + """Runs a Python interactive interpreter.""" + if not shell: + shell = 'bpython' + + if shell == 'bpython': + try: + import bpython + bpython.embed() + except ImportError: + shell = 'ipython' + if shell == 'ipython': + try: + import IPython + # Explicitly pass an empty list as arguments, because + # otherwise IPython would use sys.argv from this script. + shell = IPython.Shell.IPShell(argv=[]) + shell.mainloop() + except ImportError: + shell = 'python' + + if shell == 'python': + import code + try: + # Try activating rlcompleter, because it's handy. + import readline + except ImportError: + pass + else: + # We don't have to wrap the following import in a 'try', + # because we already know 'readline' was imported successfully. + import rlcompleter + readline.parse_and_bind("tab:complete") + code.interact() + + @args('--path', dest='path', metavar='<path>', help='Script path') + def script(self, path): + """Runs the script from the specifed path with flags set properly. + arguments: path""" + exec(compile(open(path).read(), path, 'exec'), locals(), globals()) + + +def _db_error(caught_exception): + print caught_exception + print _("The above error may show that the database has not " + "been created.\nPlease create a database using " + "'cinder-manage db sync' before running this command.") + exit(1) + + +class HostCommands(object): + """List hosts""" + + def list(self, zone=None): + """Show a list of all physical hosts. Filter by zone. + args: [zone]""" + print "%-25s\t%-15s" % (_('host'), + _('zone')) + ctxt = context.get_admin_context() + now = utils.utcnow() + services = db.service_get_all(ctxt) + if zone: + services = [s for s in services if s['availability_zone'] == zone] + hosts = [] + for srv in services: + if not [h for h in hosts if h['host'] == srv['host']]: + hosts.append(srv) + + for h in hosts: + print "%-25s\t%-15s" % (h['host'], h['availability_zone']) + + +class DbCommands(object): + """Class for managing the database.""" + + def __init__(self): + pass + + @args('--version', dest='version', metavar='<version>', + help='Database version') + def sync(self, version=None): + """Sync the database up to the most recent version.""" + return migration.db_sync(version) + + def version(self): + """Print the current database version.""" + print migration.db_version() + + +class VersionCommands(object): + """Class for exposing the codebase version.""" + + def __init__(self): + pass + + def list(self): + print _("%(version)s (%(vcs)s)") % \ + {'version': version.version_string(), + 'vcs': version.version_string_with_vcs()} + + def __call__(self): + self.list() + + +class VolumeCommands(object): + """Methods for dealing with a cloud in an odd state""" + + @args('--volume', dest='volume_id', metavar='<volume id>', + help='Volume ID') + def delete(self, volume_id): + """Delete a volume, bypassing the check that it + must be available.""" + ctxt = context.get_admin_context() + volume = db.volume_get(ctxt, param2id(volume_id)) + host = volume['host'] + + if not host: + print "Volume not yet assigned to host." + print "Deleting volume from database and skipping rpc." + db.volume_destroy(ctxt, param2id(volume_id)) + return + + if volume['status'] == 'in-use': + print "Volume is in-use." + print "Detach volume from instance and then try again." + return + + rpc.cast(ctxt, + db.queue_get_for(ctxt, FLAGS.volume_topic, host), + {"method": "delete_volume", + "args": {"volume_id": volume['id']}}) + + @args('--volume', dest='volume_id', metavar='<volume id>', + help='Volume ID') + def reattach(self, volume_id): + """Re-attach a volume that has previously been attached + to an instance. Typically called after a compute host + has been rebooted.""" + ctxt = context.get_admin_context() + volume = db.volume_get(ctxt, param2id(volume_id)) + if not volume['instance_id']: + print "volume is not attached to an instance" + return + instance = db.instance_get(ctxt, volume['instance_id']) + host = instance['host'] + rpc.cast(ctxt, + db.queue_get_for(ctxt, FLAGS.compute_topic, host), + {"method": "attach_volume", + "args": {"instance_id": instance['id'], + "volume_id": volume['id'], + "mountpoint": volume['mountpoint']}}) + + +class StorageManagerCommands(object): + """Class for mangaging Storage Backends and Flavors""" + + def flavor_list(self, flavor=None): + ctxt = context.get_admin_context() + + try: + if flavor is None: + flavors = db.sm_flavor_get_all(ctxt) + else: + flavors = db.sm_flavor_get(ctxt, flavor) + except exception.NotFound as ex: + print "error: %s" % ex + sys.exit(2) + + print "%-18s\t%-20s\t%s" % (_('id'), + _('Label'), + _('Description')) + + for flav in flavors: + print "%-18s\t%-20s\t%s" % ( + flav['id'], + flav['label'], + flav['description']) + + def flavor_create(self, label, desc): + # TODO(renukaapte) flavor name must be unique + try: + db.sm_flavor_create(context.get_admin_context(), + dict(label=label, + description=desc)) + except exception.DBError, e: + _db_error(e) + + def flavor_delete(self, label): + try: + db.sm_flavor_delete(context.get_admin_context(), label) + + except exception.DBError, e: + _db_error(e) + + def _splitfun(self, item): + i = item.split("=") + return i[0:2] + + def backend_list(self, backend_conf_id=None): + ctxt = context.get_admin_context() + + try: + if backend_conf_id is None: + backends = db.sm_backend_conf_get_all(ctxt) + else: + backends = db.sm_backend_conf_get(ctxt, backend_conf_id) + + except exception.NotFound as ex: + print "error: %s" % ex + sys.exit(2) + + print "%-5s\t%-10s\t%-40s\t%-10s\t%s" % (_('id'), + _('Flavor id'), + _('SR UUID'), + _('SR Type'), + _('Config Parameters'),) + + for b in backends: + print "%-5s\t%-10s\t%-40s\t%-10s\t%s" % (b['id'], + b['flavor_id'], + b['sr_uuid'], + b['sr_type'], + b['config_params'],) + + def backend_add(self, flavor_label, sr_type, *args): + # TODO(renukaapte) Add backend_introduce. + ctxt = context.get_admin_context() + params = dict(map(self._splitfun, args)) + sr_uuid = utils.gen_uuid() + + if flavor_label is None: + print "error: backend needs to be associated with flavor" + sys.exit(2) + + try: + flavors = db.sm_flavor_get(ctxt, flavor_label) + + except exception.NotFound as ex: + print "error: %s" % ex + sys.exit(2) + + config_params = " ".join(['%s=%s' % + (key, params[key]) for key in params]) + + if 'sr_uuid' in params: + sr_uuid = params['sr_uuid'] + try: + backend = db.sm_backend_conf_get_by_sr(ctxt, sr_uuid) + except exception.DBError, e: + _db_error(e) + + if backend: + print 'Backend config found. Would you like to recreate this?' + print '(WARNING:Recreating will destroy all VDIs on backend!!)' + c = raw_input('Proceed? (y/n) ') + if c == 'y' or c == 'Y': + try: + db.sm_backend_conf_update(ctxt, backend['id'], + dict(created=False, + flavor_id=flavors['id'], + sr_type=sr_type, + config_params=config_params)) + except exception.DBError, e: + _db_error(e) + return + + else: + print 'Backend config not found. Would you like to create it?' + + print '(WARNING: Creating will destroy all data on backend!!!)' + c = raw_input('Proceed? (y/n) ') + if c == 'y' or c == 'Y': + try: + db.sm_backend_conf_create(ctxt, + dict(flavor_id=flavors['id'], + sr_uuid=sr_uuid, + sr_type=sr_type, + config_params=config_params)) + except exception.DBError, e: + _db_error(e) + + def backend_remove(self, backend_conf_id): + try: + db.sm_backend_conf_delete(context.get_admin_context(), + backend_conf_id) + + except exception.DBError, e: + _db_error(e) + + +class ConfigCommands(object): + """Class for exposing the flags defined by flag_file(s).""" + + def __init__(self): + pass + + def list(self): + for key, value in FLAGS.iteritems(): + if value is not None: + print '%s = %s' % (key, value) + + @args('--infile', dest='infile', metavar='<path>', + help='old-style flagfile to convert to config') + @args('--outfile', dest='outfile', metavar='<path>', + help='path for output file. Writes config' + 'to stdout if not specified.') + def convert(self, infile, outfile=None): + """Converts a flagfile and prints results to stdout.""" + arg = '--flagfile=%s' % infile + with flagfile.handle_flagfiles_managed([arg]) as newargs: + with open(newargs[0].split('=')[1]) as configfile: + config = configfile.read() + if outfile: + with open(outfile, 'w') as configfile: + configfile.write(config) + else: + print config, + + +class GetLogCommands(object): + """Get logging information""" + + def errors(self): + """Get all of the errors from the log files""" + error_found = 0 + if FLAGS.logdir: + logs = [x for x in os.listdir(FLAGS.logdir) if x.endswith('.log')] + for file in logs: + log_file = os.path.join(FLAGS.logdir, file) + lines = [line.strip() for line in open(log_file, "r")] + lines.reverse() + print_name = 0 + for index, line in enumerate(lines): + if line.find(" ERROR ") > 0: + error_found += 1 + if print_name == 0: + print log_file + ":-" + print_name = 1 + print "Line %d : %s" % (len(lines) - index, line) + if error_found == 0: + print "No errors in logfiles!" + + def syslog(self, num_entries=10): + """Get <num_entries> of the cinder syslog events""" + entries = int(num_entries) + count = 0 + log_file = '' + if os.path.exists('/var/log/syslog'): + log_file = '/var/log/syslog' + elif os.path.exists('/var/log/messages'): + log_file = '/var/log/messages' + else: + print "Unable to find system log file!" + sys.exit(1) + lines = [line.strip() for line in open(log_file, "r")] + lines.reverse() + print "Last %s cinder syslog entries:-" % (entries) + for line in lines: + if line.find("cinder") > 0: + count += 1 + print "%s" % (line) + if count == entries: + break + + if count == 0: + print "No cinder entries in syslog!" + + +CATEGORIES = [ + ('config', ConfigCommands), + ('db', DbCommands), + ('host', HostCommands), + ('logs', GetLogCommands), + ('shell', ShellCommands), + ('sm', StorageManagerCommands), + ('version', VersionCommands), + ('volume', VolumeCommands), +] + + +def lazy_match(name, key_value_tuples): + """Finds all objects that have a key that case insensitively contains + [name] key_value_tuples is a list of tuples of the form (key, value) + returns a list of tuples of the form (key, value)""" + result = [] + for (k, v) in key_value_tuples: + if k.lower().find(name.lower()) == 0: + result.append((k, v)) + if len(result) == 0: + print "%s does not match any options:" % name + for k, _v in key_value_tuples: + print "\t%s" % k + sys.exit(2) + if len(result) > 1: + print "%s matched multiple options:" % name + for k, _v in result: + print "\t%s" % k + sys.exit(2) + return result + + +def methods_of(obj): + """Get all callable methods of an object that don't start with underscore + returns a list of tuples of the form (method_name, method)""" + result = [] + for i in dir(obj): + if callable(getattr(obj, i)) and not i.startswith('_'): + result.append((i, getattr(obj, i))) + return result + + +def main(): + """Parse options and call the appropriate class/method.""" + flagfile = utils.default_flagfile() + + if flagfile and not os.access(flagfile, os.R_OK): + st = os.stat(flagfile) + print "Could not read %s. Re-running with sudo" % flagfile + try: + os.execvp('sudo', ['sudo', '-u', '#%s' % st.st_uid] + sys.argv) + except Exception: + print 'sudo failed, continuing as if nothing happened' + + rpc.register_opts(FLAGS) + + try: + argv = FLAGS(sys.argv) + logging.setup() + except IOError, e: + if e.errno == errno.EACCES: + print _('Please re-run cinder-manage as root.') + sys.exit(2) + raise + script_name = argv.pop(0) + if len(argv) < 1: + print _("\nOpenStack Cinder version: %(version)s (%(vcs)s)\n") % \ + {'version': version.version_string(), + 'vcs': version.version_string_with_vcs()} + print script_name + " category action [<args>]" + print _("Available categories:") + for k, _v in CATEGORIES: + print "\t%s" % k + sys.exit(2) + category = argv.pop(0) + matches = lazy_match(category, CATEGORIES) + # instantiate the command group object + category, fn = matches[0] + command_object = fn() + actions = methods_of(command_object) + if len(argv) < 1: + if hasattr(command_object, '__call__'): + action = '' + fn = command_object.__call__ + else: + print script_name + " category action [<args>]" + print _("Available actions for %s category:") % category + for k, _v in actions: + print "\t%s" % k + sys.exit(2) + else: + action = argv.pop(0) + matches = lazy_match(action, actions) + action, fn = matches[0] + + # For not decorated methods + options = getattr(fn, 'options', []) + + usage = "%%prog %s %s <args> [options]" % (category, action) + parser = optparse.OptionParser(usage=usage) + for ar, kw in options: + parser.add_option(*ar, **kw) + (opts, fn_args) = parser.parse_args(argv) + fn_kwargs = vars(opts) + + for k, v in fn_kwargs.items(): + if v is None: + del fn_kwargs[k] + elif isinstance(v, basestring): + fn_kwargs[k] = v.decode('utf-8') + else: + fn_kwargs[k] = v + + fn_args = [arg.decode('utf-8') for arg in fn_args] + + # call the action with the remaining arguments + try: + fn(*fn_args, **fn_kwargs) + rpc.cleanup() + sys.exit(0) + except TypeError: + print _("Possible wrong number of arguments supplied") + print fn.__doc__ + parser.print_help() + raise + except Exception: + print _("Command failed, please check log for more info") + raise + +if __name__ == '__main__': + main() diff --git a/bin/cinder-rootwrap b/bin/cinder-rootwrap new file mode 100755 index 000000000..537324c6c --- /dev/null +++ b/bin/cinder-rootwrap @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 Openstack, LLC. +# 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. + +"""Root wrapper for Cinder + + Uses modules in cinder.rootwrap containing filters for commands + that cinder is allowed to run as another user. + + To switch to using this, you should: + * Set "--root_helper=sudo cinder-rootwrap" in cinder.conf + * Allow cinder to run cinder-rootwrap as root in cinder_sudoers: + cinder ALL = (root) NOPASSWD: /usr/bin/cinder-rootwrap + (all other commands can be removed from this file) + + To make allowed commands node-specific, your packaging should only + install cinder/rootwrap/{compute,network,volume}.py respectively on + compute, network and volume nodes (i.e. cinder-api nodes should not + have any of those files installed). +""" + +import os +import subprocess +import sys + + +RC_UNAUTHORIZED = 99 +RC_NOCOMMAND = 98 + +if __name__ == '__main__': + # Split arguments, require at least a command + execname = sys.argv.pop(0) + if len(sys.argv) == 0: + print "%s: %s" % (execname, "No command specified") + sys.exit(RC_NOCOMMAND) + + userargs = sys.argv[:] + + # Add ../ to sys.path to allow running from branch + possible_topdir = os.path.normpath(os.path.join(os.path.abspath(execname), + os.pardir, os.pardir)) + if os.path.exists(os.path.join(possible_topdir, "cinder", "__init__.py")): + sys.path.insert(0, possible_topdir) + + from cinder.rootwrap import wrapper + + # Execute command if it matches any of the loaded filters + filters = wrapper.load_filters() + filtermatch = wrapper.match_filter(filters, userargs) + if filtermatch: + obj = subprocess.Popen(filtermatch.get_command(userargs), + stdin=sys.stdin, + stdout=sys.stdout, + stderr=sys.stderr, + env=filtermatch.get_environment(userargs)) + obj.wait() + sys.exit(obj.returncode) + + print "Unauthorized command: %s" % ' '.join(userargs) + sys.exit(RC_UNAUTHORIZED) diff --git a/bin/cinder-scheduler b/bin/cinder-scheduler new file mode 100755 index 000000000..f423bef63 --- /dev/null +++ b/bin/cinder-scheduler @@ -0,0 +1,51 @@ +#!/usr/bin/env python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Starter script for Cinder Scheduler.""" + +import eventlet +eventlet.monkey_patch() + +import gettext +import os +import sys + +# If ../cinder/__init__.py exists, add ../ to Python search path, so that +# it will override what happens to be installed in /usr/(local/)lib/python... +possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), + os.pardir, + os.pardir)) +if os.path.exists(os.path.join(possible_topdir, 'cinder', '__init__.py')): + sys.path.insert(0, possible_topdir) + +gettext.install('cinder', unicode=1) + +from cinder import flags +from cinder import log as logging +from cinder import service +from cinder import utils + +if __name__ == '__main__': + utils.default_flagfile() + flags.FLAGS(sys.argv) + logging.setup() + utils.monkey_patch() + server = service.Service.create(binary='cinder-scheduler') + service.serve(server) + service.wait() diff --git a/bin/cinder-volume b/bin/cinder-volume new file mode 100755 index 000000000..53aa635a6 --- /dev/null +++ b/bin/cinder-volume @@ -0,0 +1,49 @@ +#!/usr/bin/env python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Starter script for Cinder Volume.""" + +import eventlet +eventlet.monkey_patch() + +import os +import sys + +# If ../cinder/__init__.py exists, add ../ to Python search path, so that +# it will override what happens to be installed in /usr/(local/)lib/python... +possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), + os.pardir, + os.pardir)) +if os.path.exists(os.path.join(possible_topdir, 'cinder', '__init__.py')): + sys.path.insert(0, possible_topdir) + + +from cinder import flags +from cinder import log as logging +from cinder import service +from cinder import utils + +if __name__ == '__main__': + utils.default_flagfile() + flags.FLAGS(sys.argv) + logging.setup() + utils.monkey_patch() + server = service.Service.create(binary='cinder-volume') + service.serve(server) + service.wait() diff --git a/bin/clear_rabbit_queues b/bin/clear_rabbit_queues new file mode 100755 index 000000000..d652d6e14 --- /dev/null +++ b/bin/clear_rabbit_queues @@ -0,0 +1,80 @@ +#!/usr/bin/env python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 Openstack, LLC. +# 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. + +"""Admin/debug script to wipe rabbitMQ (AMQP) queues cinder uses. + This can be used if you need to change durable options on queues, + or to wipe all messages in the queue system if things are in a + serious bad way. + +""" + +import datetime +import gettext +import os +import sys +import time + +# If ../cinder/__init__.py exists, add ../ to Python search path, so that +# it will override what happens to be installed in /usr/(local/)lib/python... +POSSIBLE_TOPDIR = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), + os.pardir, + os.pardir)) +if os.path.exists(os.path.join(POSSIBLE_TOPDIR, 'cinder', '__init__.py')): + sys.path.insert(0, POSSIBLE_TOPDIR) + +gettext.install('cinder', unicode=1) + + +from cinder import context +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder import rpc +from cinder import utils + + +delete_exchange_opt = \ + cfg.BoolOpt('delete_exchange', + default=False, + help='delete cinder exchange too.') + +FLAGS = flags.FLAGS +FLAGS.register_cli_opt(delete_exchange_opt) + + +def delete_exchange(exch): + conn = rpc.create_connection() + x = conn.get_channel() + x.exchange_delete(exch) + + +def delete_queues(queues): + conn = rpc.create_connection() + x = conn.get_channel() + for q in queues: + x.queue_delete(q) + +if __name__ == '__main__': + utils.default_flagfile() + args = flags.FLAGS(sys.argv) + logging.setup() + rpc.register_opts(flags.FLAGS) + delete_queues(args[1:]) + if FLAGS.delete_exchange: + delete_exchange(FLAGS.control_exchange) diff --git a/cinder/__init__.py b/cinder/__init__.py new file mode 100644 index 000000000..238c2812e --- /dev/null +++ b/cinder/__init__.py @@ -0,0 +1,42 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +""" +:mod:`cinder` -- Cloud IaaS Platform +=================================== + +.. automodule:: cinder + :platform: Unix + :synopsis: Infrastructure-as-a-Service Cloud platform. +.. moduleauthor:: Jesse Andrews <jesse@ansolabs.com> +.. moduleauthor:: Devin Carlen <devin.carlen@gmail.com> +.. moduleauthor:: Vishvananda Ishaya <vishvananda@gmail.com> +.. moduleauthor:: Joshua McKenty <joshua@cognition.ca> +.. moduleauthor:: Manish Singh <yosh@gimp.org> +.. moduleauthor:: Andy Smith <andy@anarkystic.com> +""" + +import gettext +import logging + + +gettext.install('cinder', unicode=1) +# NOTE(jkoelker) This configures the root logger if it is not already +# configured so messages from logging setup can be written +# to the console +logging.basicConfig(format='%(message)s') diff --git a/cinder/api/__init__.py b/cinder/api/__init__.py new file mode 100644 index 000000000..747015af5 --- /dev/null +++ b/cinder/api/__init__.py @@ -0,0 +1,17 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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/cinder/api/auth.py b/cinder/api/auth.py new file mode 100644 index 000000000..1b8f303e2 --- /dev/null +++ b/cinder/api/auth.py @@ -0,0 +1,103 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 OpenStack, LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +""" +Common Auth Middleware. + +""" + +import webob.dec +import webob.exc + +from cinder import context +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder import wsgi + + +use_forwarded_for_opt = cfg.BoolOpt('use_forwarded_for', + default=False, + help='Treat X-Forwarded-For as the canonical remote address. ' + 'Only enable this if you have a sanitizing proxy.') + +FLAGS = flags.FLAGS +FLAGS.register_opt(use_forwarded_for_opt) +LOG = logging.getLogger(__name__) + + +def pipeline_factory(loader, global_conf, **local_conf): + """A paste pipeline replica that keys off of auth_strategy.""" + pipeline = local_conf[FLAGS.auth_strategy] + if not FLAGS.api_rate_limit: + limit_name = FLAGS.auth_strategy + '_nolimit' + pipeline = local_conf.get(limit_name, pipeline) + pipeline = pipeline.split() + filters = [loader.get_filter(n) for n in pipeline[:-1]] + app = loader.get_app(pipeline[-1]) + filters.reverse() + for filter in filters: + app = filter(app) + return app + + +class InjectContext(wsgi.Middleware): + """Add a 'cinder.context' to WSGI environ.""" + + def __init__(self, context, *args, **kwargs): + self.context = context + super(InjectContext, self).__init__(*args, **kwargs) + + @webob.dec.wsgify(RequestClass=wsgi.Request) + def __call__(self, req): + req.environ['cinder.context'] = self.context + return self.application + + +class CinderKeystoneContext(wsgi.Middleware): + """Make a request context from keystone headers""" + + @webob.dec.wsgify(RequestClass=wsgi.Request) + def __call__(self, req): + user_id = req.headers.get('X_USER') + user_id = req.headers.get('X_USER_ID', user_id) + if user_id is None: + LOG.debug("Neither X_USER_ID nor X_USER found in request") + return webob.exc.HTTPUnauthorized() + # get the roles + roles = [r.strip() for r in req.headers.get('X_ROLE', '').split(',')] + if 'X_TENANT_ID' in req.headers: + # This is the new header since Keystone went to ID/Name + project_id = req.headers['X_TENANT_ID'] + else: + # This is for legacy compatibility + project_id = req.headers['X_TENANT'] + + # Get the auth token + auth_token = req.headers.get('X_AUTH_TOKEN', + req.headers.get('X_STORAGE_TOKEN')) + + # Build a context, including the auth_token... + remote_address = req.remote_addr + if FLAGS.use_forwarded_for: + remote_address = req.headers.get('X-Forwarded-For', remote_address) + ctx = context.RequestContext(user_id, + project_id, + roles=roles, + auth_token=auth_token, + remote_address=remote_address) + + req.environ['cinder.context'] = ctx + return self.application diff --git a/cinder/api/openstack/__init__.py b/cinder/api/openstack/__init__.py new file mode 100644 index 000000000..22ff5de04 --- /dev/null +++ b/cinder/api/openstack/__init__.py @@ -0,0 +1,143 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +""" +WSGI middleware for OpenStack API controllers. +""" + +import routes +import webob.dec +import webob.exc + +from cinder.api.openstack import wsgi +from cinder import log as logging +from cinder import wsgi as base_wsgi + + +LOG = logging.getLogger(__name__) + + +class FaultWrapper(base_wsgi.Middleware): + """Calls down the middleware stack, making exceptions into faults.""" + + @webob.dec.wsgify(RequestClass=wsgi.Request) + def __call__(self, req): + try: + return req.get_response(self.application) + except Exception as ex: + LOG.exception(_("Caught error: %s"), unicode(ex)) + msg_dict = dict(url=req.url, status=500) + LOG.info(_("%(url)s returned with HTTP %(status)d") % msg_dict) + exc = webob.exc.HTTPInternalServerError() + # NOTE(johannes): We leave the explanation empty here on + # purpose. It could possibly have sensitive information + # that should not be returned back to the user. See + # bugs 868360 and 874472 + return wsgi.Fault(exc) + + +class APIMapper(routes.Mapper): + def routematch(self, url=None, environ=None): + if url is "": + result = self._match("", environ) + return result[0], result[1] + return routes.Mapper.routematch(self, url, environ) + + +class ProjectMapper(APIMapper): + def resource(self, member_name, collection_name, **kwargs): + if not ('parent_resource' in kwargs): + kwargs['path_prefix'] = '{project_id}/' + else: + parent_resource = kwargs['parent_resource'] + p_collection = parent_resource['collection_name'] + p_member = parent_resource['member_name'] + kwargs['path_prefix'] = '{project_id}/%s/:%s_id' % (p_collection, + p_member) + routes.Mapper.resource(self, member_name, + collection_name, + **kwargs) + + +class APIRouter(base_wsgi.Router): + """ + Routes requests on the OpenStack API to the appropriate controller + and method. + """ + ExtensionManager = None # override in subclasses + + @classmethod + def factory(cls, global_config, **local_config): + """Simple paste factory, :class:`cinder.wsgi.Router` doesn't have""" + return cls() + + def __init__(self, ext_mgr=None): + if ext_mgr is None: + if self.ExtensionManager: + ext_mgr = self.ExtensionManager() + else: + raise Exception(_("Must specify an ExtensionManager class")) + + mapper = ProjectMapper() + self.resources = {} + self._setup_routes(mapper) + self._setup_ext_routes(mapper, ext_mgr) + self._setup_extensions(ext_mgr) + super(APIRouter, self).__init__(mapper) + + def _setup_ext_routes(self, mapper, ext_mgr): + for resource in ext_mgr.get_resources(): + LOG.debug(_('Extended resource: %s'), + resource.collection) + + wsgi_resource = wsgi.Resource(resource.controller) + self.resources[resource.collection] = wsgi_resource + kargs = dict( + controller=wsgi_resource, + collection=resource.collection_actions, + member=resource.member_actions) + + if resource.parent: + kargs['parent_resource'] = resource.parent + + mapper.resource(resource.collection, resource.collection, **kargs) + + if resource.custom_routes_fn: + resource.custom_routes_fn(mapper, wsgi_resource) + + def _setup_extensions(self, ext_mgr): + for extension in ext_mgr.get_controller_extensions(): + ext_name = extension.extension.name + collection = extension.collection + controller = extension.controller + + if collection not in self.resources: + LOG.warning(_('Extension %(ext_name)s: Cannot extend ' + 'resource %(collection)s: No such resource') % + locals()) + continue + + LOG.debug(_('Extension %(ext_name)s extending resource: ' + '%(collection)s') % locals()) + + resource = self.resources[collection] + resource.register_actions(controller) + resource.register_extensions(controller) + + def _setup_routes(self, mapper): + raise NotImplementedError diff --git a/cinder/api/openstack/auth.py b/cinder/api/openstack/auth.py new file mode 100644 index 000000000..cbc208432 --- /dev/null +++ b/cinder/api/openstack/auth.py @@ -0,0 +1,65 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC. +# 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 os + +import webob.dec +import webob.exc + +from cinder.api.openstack import wsgi +from cinder import context +from cinder import flags +from cinder import log as logging +from cinder import wsgi as base_wsgi + +LOG = logging.getLogger(__name__) +FLAGS = flags.FLAGS +flags.DECLARE('use_forwarded_for', 'cinder.api.auth') + + +class NoAuthMiddleware(base_wsgi.Middleware): + """Return a fake token if one isn't specified.""" + + @webob.dec.wsgify(RequestClass=wsgi.Request) + def __call__(self, req): + if 'X-Auth-Token' not in req.headers: + user_id = req.headers.get('X-Auth-User', 'admin') + project_id = req.headers.get('X-Auth-Project-Id', 'admin') + os_url = os.path.join(req.url, project_id) + res = webob.Response() + # NOTE(vish): This is expecting and returning Auth(1.1), whereas + # keystone uses 2.0 auth. We should probably allow + # 2.0 auth here as well. + res.headers['X-Auth-Token'] = '%s:%s' % (user_id, project_id) + res.headers['X-Server-Management-Url'] = os_url + res.content_type = 'text/plain' + res.status = '204' + return res + + token = req.headers['X-Auth-Token'] + user_id, _sep, project_id = token.partition(':') + project_id = project_id or user_id + remote_address = getattr(req, 'remote_address', '127.0.0.1') + if FLAGS.use_forwarded_for: + remote_address = req.headers.get('X-Forwarded-For', remote_address) + ctx = context.RequestContext(user_id, + project_id, + is_admin=True, + remote_address=remote_address) + + req.environ['cinder.context'] = ctx + return self.application diff --git a/cinder/api/openstack/common.py b/cinder/api/openstack/common.py new file mode 100644 index 000000000..ce2d2bd93 --- /dev/null +++ b/cinder/api/openstack/common.py @@ -0,0 +1,380 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC. +# 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 functools +import os +import re +import urlparse + +import webob +from xml.dom import minidom + +from cinder.api.openstack import wsgi +from cinder.api.openstack import xmlutil +from cinder import flags +from cinder import log as logging +from cinder import quota + + +LOG = logging.getLogger(__name__) +FLAGS = flags.FLAGS + + +XML_NS_V1 = 'http://docs.openstack.org/volume/api/v1' + + +def get_pagination_params(request): + """Return marker, limit tuple from request. + + :param request: `wsgi.Request` possibly containing 'marker' and 'limit' + GET variables. 'marker' is the id of the last element + the client has seen, and 'limit' is the maximum number + of items to return. If 'limit' is not specified, 0, or + > max_limit, we default to max_limit. Negative values + for either marker or limit will cause + exc.HTTPBadRequest() exceptions to be raised. + + """ + params = {} + if 'limit' in request.GET: + params['limit'] = _get_limit_param(request) + if 'marker' in request.GET: + params['marker'] = _get_marker_param(request) + return params + + +def _get_limit_param(request): + """Extract integer limit from request or fail""" + try: + limit = int(request.GET['limit']) + except ValueError: + msg = _('limit param must be an integer') + raise webob.exc.HTTPBadRequest(explanation=msg) + if limit < 0: + msg = _('limit param must be positive') + raise webob.exc.HTTPBadRequest(explanation=msg) + return limit + + +def _get_marker_param(request): + """Extract marker id from request or fail""" + return request.GET['marker'] + + +def limited(items, request, max_limit=FLAGS.osapi_max_limit): + """Return a slice of items according to requested offset and limit. + + :param items: A sliceable entity + :param request: ``wsgi.Request`` possibly containing 'offset' and 'limit' + GET variables. 'offset' is where to start in the list, + and 'limit' is the maximum number of items to return. If + 'limit' is not specified, 0, or > max_limit, we default + to max_limit. Negative values for either offset or limit + will cause exc.HTTPBadRequest() exceptions to be raised. + :kwarg max_limit: The maximum number of items to return from 'items' + """ + try: + offset = int(request.GET.get('offset', 0)) + except ValueError: + msg = _('offset param must be an integer') + raise webob.exc.HTTPBadRequest(explanation=msg) + + try: + limit = int(request.GET.get('limit', max_limit)) + except ValueError: + msg = _('limit param must be an integer') + raise webob.exc.HTTPBadRequest(explanation=msg) + + if limit < 0: + msg = _('limit param must be positive') + raise webob.exc.HTTPBadRequest(explanation=msg) + + if offset < 0: + msg = _('offset param must be positive') + raise webob.exc.HTTPBadRequest(explanation=msg) + + limit = min(max_limit, limit or max_limit) + range_end = offset + limit + return items[offset:range_end] + + +def limited_by_marker(items, request, max_limit=FLAGS.osapi_max_limit): + """Return a slice of items according to the requested marker and limit.""" + params = get_pagination_params(request) + + limit = params.get('limit', max_limit) + marker = params.get('marker') + + limit = min(max_limit, limit) + start_index = 0 + if marker: + start_index = -1 + for i, item in enumerate(items): + if 'flavorid' in item: + if item['flavorid'] == marker: + start_index = i + 1 + break + elif item['id'] == marker or item.get('uuid') == marker: + start_index = i + 1 + break + if start_index < 0: + msg = _('marker [%s] not found') % marker + raise webob.exc.HTTPBadRequest(explanation=msg) + range_end = start_index + limit + return items[start_index:range_end] + + +def get_id_from_href(href): + """Return the id or uuid portion of a url. + + Given: 'http://www.foo.com/bar/123?q=4' + Returns: '123' + + Given: 'http://www.foo.com/bar/abc123?q=4' + Returns: 'abc123' + + """ + return urlparse.urlsplit("%s" % href).path.split('/')[-1] + + +def remove_version_from_href(href): + """Removes the first api version from the href. + + Given: 'http://www.cinder.com/v1.1/123' + Returns: 'http://www.cinder.com/123' + + Given: 'http://www.cinder.com/v1.1' + Returns: 'http://www.cinder.com' + + """ + parsed_url = urlparse.urlsplit(href) + url_parts = parsed_url.path.split('/', 2) + + # NOTE: this should match vX.X or vX + expression = re.compile(r'^v([0-9]+|[0-9]+\.[0-9]+)(/.*|$)') + if expression.match(url_parts[1]): + del url_parts[1] + + new_path = '/'.join(url_parts) + + if new_path == parsed_url.path: + msg = _('href %s does not contain version') % href + LOG.debug(msg) + raise ValueError(msg) + + parsed_url = list(parsed_url) + parsed_url[2] = new_path + return urlparse.urlunsplit(parsed_url) + + +def get_version_from_href(href): + """Returns the api version in the href. + + Returns the api version in the href. + If no version is found, '2' is returned + + Given: 'http://www.cinder.com/123' + Returns: '2' + + Given: 'http://www.cinder.com/v1.1' + Returns: '1.1' + + """ + try: + expression = r'/v([0-9]+|[0-9]+\.[0-9]+)(/|$)' + return re.findall(expression, href)[0][0] + except IndexError: + return '2' + + +def dict_to_query_str(params): + # TODO(throughnothing): we should just use urllib.urlencode instead of this + # But currently we don't work with urlencoded url's + param_str = "" + for key, val in params.iteritems(): + param_str = param_str + '='.join([str(key), str(val)]) + '&' + + return param_str.rstrip('&') + + +def raise_http_conflict_for_instance_invalid_state(exc, action): + """Return a webob.exc.HTTPConflict instance containing a message + appropriate to return via the API based on the original + InstanceInvalidState exception. + """ + attr = exc.kwargs.get('attr') + state = exc.kwargs.get('state') + if attr and state: + msg = _("Cannot '%(action)s' while instance is in %(attr)s %(state)s") + else: + # At least give some meaningful message + msg = _("Instance is in an invalid state for '%(action)s'") + raise webob.exc.HTTPConflict(explanation=msg % locals()) + + +class MetadataDeserializer(wsgi.MetadataXMLDeserializer): + def deserialize(self, text): + dom = minidom.parseString(text) + metadata_node = self.find_first_child_named(dom, "metadata") + metadata = self.extract_metadata(metadata_node) + return {'body': {'metadata': metadata}} + + +class MetaItemDeserializer(wsgi.MetadataXMLDeserializer): + def deserialize(self, text): + dom = minidom.parseString(text) + metadata_item = self.extract_metadata(dom) + return {'body': {'meta': metadata_item}} + + +class MetadataXMLDeserializer(wsgi.XMLDeserializer): + + def extract_metadata(self, metadata_node): + """Marshal the metadata attribute of a parsed request""" + if metadata_node is None: + return {} + metadata = {} + for meta_node in self.find_children_named(metadata_node, "meta"): + key = meta_node.getAttribute("key") + metadata[key] = self.extract_text(meta_node) + return metadata + + def _extract_metadata_container(self, datastring): + dom = minidom.parseString(datastring) + metadata_node = self.find_first_child_named(dom, "metadata") + metadata = self.extract_metadata(metadata_node) + return {'body': {'metadata': metadata}} + + def create(self, datastring): + return self._extract_metadata_container(datastring) + + def update_all(self, datastring): + return self._extract_metadata_container(datastring) + + def update(self, datastring): + dom = minidom.parseString(datastring) + metadata_item = self.extract_metadata(dom) + return {'body': {'meta': metadata_item}} + + +metadata_nsmap = {None: xmlutil.XMLNS_V11} + + +class MetaItemTemplate(xmlutil.TemplateBuilder): + def construct(self): + sel = xmlutil.Selector('meta', xmlutil.get_items, 0) + root = xmlutil.TemplateElement('meta', selector=sel) + root.set('key', 0) + root.text = 1 + return xmlutil.MasterTemplate(root, 1, nsmap=metadata_nsmap) + + +class MetadataTemplateElement(xmlutil.TemplateElement): + def will_render(self, datum): + return True + + +class MetadataTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = MetadataTemplateElement('metadata', selector='metadata') + elem = xmlutil.SubTemplateElement(root, 'meta', + selector=xmlutil.get_items) + elem.set('key', 0) + elem.text = 1 + return xmlutil.MasterTemplate(root, 1, nsmap=metadata_nsmap) + + +def check_snapshots_enabled(f): + @functools.wraps(f) + def inner(*args, **kwargs): + if not FLAGS.allow_instance_snapshots: + LOG.warn(_('Rejecting snapshot request, snapshots currently' + ' disabled')) + msg = _("Instance snapshots are not permitted at this time.") + raise webob.exc.HTTPBadRequest(explanation=msg) + return f(*args, **kwargs) + return inner + + +class ViewBuilder(object): + """Model API responses as dictionaries.""" + + _collection_name = None + + def _get_links(self, request, identifier): + return [{ + "rel": "self", + "href": self._get_href_link(request, identifier), + }, + { + "rel": "bookmark", + "href": self._get_bookmark_link(request, identifier), + }] + + def _get_next_link(self, request, identifier): + """Return href string with proper limit and marker params.""" + params = request.params.copy() + params["marker"] = identifier + prefix = self._update_link_prefix(request.application_url, + FLAGS.osapi_compute_link_prefix) + url = os.path.join(prefix, + request.environ["cinder.context"].project_id, + self._collection_name) + return "%s?%s" % (url, dict_to_query_str(params)) + + def _get_href_link(self, request, identifier): + """Return an href string pointing to this object.""" + prefix = self._update_link_prefix(request.application_url, + FLAGS.osapi_compute_link_prefix) + return os.path.join(prefix, + request.environ["cinder.context"].project_id, + self._collection_name, + str(identifier)) + + def _get_bookmark_link(self, request, identifier): + """Create a URL that refers to a specific resource.""" + base_url = remove_version_from_href(request.application_url) + base_url = self._update_link_prefix(base_url, + FLAGS.osapi_compute_link_prefix) + return os.path.join(base_url, + request.environ["cinder.context"].project_id, + self._collection_name, + str(identifier)) + + def _get_collection_links(self, request, items, id_key="uuid"): + """Retrieve 'next' link, if applicable.""" + links = [] + limit = int(request.params.get("limit", 0)) + if limit and limit == len(items): + last_item = items[-1] + if id_key in last_item: + last_item_id = last_item[id_key] + else: + last_item_id = last_item["id"] + links.append({ + "rel": "next", + "href": self._get_next_link(request, last_item_id), + }) + return links + + def _update_link_prefix(self, orig_url, prefix): + if not prefix: + return orig_url + url_parts = list(urlparse.urlsplit(orig_url)) + prefix_parts = list(urlparse.urlsplit(prefix)) + url_parts[0:2] = prefix_parts[0:2] + return urlparse.urlunsplit(url_parts) diff --git a/cinder/api/openstack/compute/__init__.py b/cinder/api/openstack/compute/__init__.py new file mode 100644 index 000000000..7372b0c97 --- /dev/null +++ b/cinder/api/openstack/compute/__init__.py @@ -0,0 +1,23 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +""" +WSGI middleware for OpenStack Compute API. +""" + +from cinder.api.openstack.compute import versions diff --git a/cinder/api/openstack/compute/schemas/atom-link.rng b/cinder/api/openstack/compute/schemas/atom-link.rng new file mode 100644 index 000000000..edba5eee6 --- /dev/null +++ b/cinder/api/openstack/compute/schemas/atom-link.rng @@ -0,0 +1,141 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + -*- rnc -*- + RELAX NG Compact Syntax Grammar for the + Atom Format Specification Version 11 +--> +<grammar xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:s="http://www.ascc.net/xml/schematron" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> + <start> + <choice> + <ref name="atomLink"/> + </choice> + </start> + <!-- Common attributes --> + <define name="atomCommonAttributes"> + <optional> + <attribute name="xml:base"> + <ref name="atomUri"/> + </attribute> + </optional> + <optional> + <attribute name="xml:lang"> + <ref name="atomLanguageTag"/> + </attribute> + </optional> + <zeroOrMore> + <ref name="undefinedAttribute"/> + </zeroOrMore> + </define> + <!-- atom:link --> + <define name="atomLink"> + <element name="atom:link"> + <ref name="atomCommonAttributes"/> + <attribute name="href"> + <ref name="atomUri"/> + </attribute> + <optional> + <attribute name="rel"> + <choice> + <ref name="atomNCName"/> + <ref name="atomUri"/> + </choice> + </attribute> + </optional> + <optional> + <attribute name="type"> + <ref name="atomMediaType"/> + </attribute> + </optional> + <optional> + <attribute name="hreflang"> + <ref name="atomLanguageTag"/> + </attribute> + </optional> + <optional> + <attribute name="title"/> + </optional> + <optional> + <attribute name="length"/> + </optional> + <ref name="undefinedContent"/> + </element> + </define> + <!-- Low-level simple types --> + <define name="atomNCName"> + <data type="string"> + <param name="minLength">1</param> + <param name="pattern">[^:]*</param> + </data> + </define> + <!-- Whatever a media type is, it contains at least one slash --> + <define name="atomMediaType"> + <data type="string"> + <param name="pattern">.+/.+</param> + </data> + </define> + <!-- As defined in RFC 3066 --> + <define name="atomLanguageTag"> + <data type="string"> + <param name="pattern">[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*</param> + </data> + </define> + <!-- + Unconstrained; it's not entirely clear how IRI fit into + xsd:anyURI so let's not try to constrain it here + --> + <define name="atomUri"> + <text/> + </define> + <!-- Other Extensibility --> + <define name="undefinedAttribute"> + <attribute> + <anyName> + <except> + <name>xml:base</name> + <name>xml:lang</name> + <nsName ns=""/> + </except> + </anyName> + </attribute> + </define> + <define name="undefinedContent"> + <zeroOrMore> + <choice> + <text/> + <ref name="anyForeignElement"/> + </choice> + </zeroOrMore> + </define> + <define name="anyElement"> + <element> + <anyName/> + <zeroOrMore> + <choice> + <attribute> + <anyName/> + </attribute> + <text/> + <ref name="anyElement"/> + </choice> + </zeroOrMore> + </element> + </define> + <define name="anyForeignElement"> + <element> + <anyName> + <except> + <nsName ns="http://www.w3.org/2005/Atom"/> + </except> + </anyName> + <zeroOrMore> + <choice> + <attribute> + <anyName/> + </attribute> + <text/> + <ref name="anyElement"/> + </choice> + </zeroOrMore> + </element> + </define> +</grammar> diff --git a/cinder/api/openstack/compute/schemas/v1.1/extension.rng b/cinder/api/openstack/compute/schemas/v1.1/extension.rng new file mode 100644 index 000000000..b16d8c130 --- /dev/null +++ b/cinder/api/openstack/compute/schemas/v1.1/extension.rng @@ -0,0 +1,11 @@ +<element name="extension" ns="http://docs.openstack.org/common/api/v1.0" + xmlns="http://relaxng.org/ns/structure/1.0"> + <attribute name="alias"> <text/> </attribute> + <attribute name="name"> <text/> </attribute> + <attribute name="namespace"> <text/> </attribute> + <attribute name="updated"> <text/> </attribute> + <element name="description"> <text/> </element> + <zeroOrMore> + <externalRef href="../atom-link.rng"/> + </zeroOrMore> +</element> diff --git a/cinder/api/openstack/compute/schemas/v1.1/extensions.rng b/cinder/api/openstack/compute/schemas/v1.1/extensions.rng new file mode 100644 index 000000000..8538eaf2d --- /dev/null +++ b/cinder/api/openstack/compute/schemas/v1.1/extensions.rng @@ -0,0 +1,6 @@ +<element name="extensions" xmlns="http://relaxng.org/ns/structure/1.0" + ns="http://docs.openstack.org/common/api/v1.0"> + <zeroOrMore> + <externalRef href="extension.rng"/> + </zeroOrMore> +</element> diff --git a/cinder/api/openstack/compute/schemas/v1.1/metadata.rng b/cinder/api/openstack/compute/schemas/v1.1/metadata.rng new file mode 100644 index 000000000..b2f5d702a --- /dev/null +++ b/cinder/api/openstack/compute/schemas/v1.1/metadata.rng @@ -0,0 +1,9 @@ + <element name="metadata" ns="http://docs.openstack.org/compute/api/v1.1" + xmlns="http://relaxng.org/ns/structure/1.0"> + <zeroOrMore> + <element name="meta"> + <attribute name="key"> <text/> </attribute> + <text/> + </element> + </zeroOrMore> + </element> diff --git a/cinder/api/openstack/compute/versions.py b/cinder/api/openstack/compute/versions.py new file mode 100644 index 000000000..d5108c0cf --- /dev/null +++ b/cinder/api/openstack/compute/versions.py @@ -0,0 +1,244 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 datetime + +from lxml import etree + +from cinder.api.openstack.compute.views import versions as views_versions +from cinder.api.openstack import wsgi +from cinder.api.openstack import xmlutil + + +LINKS = { + 'v2.0': { + 'pdf': 'http://docs.openstack.org/' + 'api/openstack-compute/1.1/os-compute-devguide-1.1.pdf', + 'wadl': 'http://docs.openstack.org/' + 'api/openstack-compute/1.1/wadl/os-compute-1.1.wadl', + }, +} + + +VERSIONS = { + "v2.0": { + "id": "v2.0", + "status": "CURRENT", + "updated": "2011-01-21T11:33:21Z", + "links": [ + { + "rel": "describedby", + "type": "application/pdf", + "href": LINKS['v2.0']['pdf'], + }, + { + "rel": "describedby", + "type": "application/vnd.sun.wadl+xml", + "href": LINKS['v2.0']['wadl'], + }, + ], + "media-types": [ + { + "base": "application/xml", + "type": "application/vnd.openstack.compute+xml;version=2", + }, + { + "base": "application/json", + "type": "application/vnd.openstack.compute+json;version=2", + } + ], + } +} + + +class MediaTypesTemplateElement(xmlutil.TemplateElement): + def will_render(self, datum): + return 'media-types' in datum + + +def make_version(elem): + elem.set('id') + elem.set('status') + elem.set('updated') + + mts = MediaTypesTemplateElement('media-types') + elem.append(mts) + + mt = xmlutil.SubTemplateElement(mts, 'media-type', selector='media-types') + mt.set('base') + mt.set('type') + + xmlutil.make_links(elem, 'links') + + +version_nsmap = {None: xmlutil.XMLNS_COMMON_V10, 'atom': xmlutil.XMLNS_ATOM} + + +class VersionTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('version', selector='version') + make_version(root) + return xmlutil.MasterTemplate(root, 1, nsmap=version_nsmap) + + +class VersionsTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('versions') + elem = xmlutil.SubTemplateElement(root, 'version', selector='versions') + make_version(elem) + return xmlutil.MasterTemplate(root, 1, nsmap=version_nsmap) + + +class ChoicesTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('choices') + elem = xmlutil.SubTemplateElement(root, 'version', selector='choices') + make_version(elem) + return xmlutil.MasterTemplate(root, 1, nsmap=version_nsmap) + + +class AtomSerializer(wsgi.XMLDictSerializer): + + NSMAP = {None: xmlutil.XMLNS_ATOM} + + def __init__(self, metadata=None, xmlns=None): + self.metadata = metadata or {} + if not xmlns: + self.xmlns = wsgi.XMLNS_ATOM + else: + self.xmlns = xmlns + + def _get_most_recent_update(self, versions): + recent = None + for version in versions: + updated = datetime.datetime.strptime(version['updated'], + '%Y-%m-%dT%H:%M:%SZ') + if not recent: + recent = updated + elif updated > recent: + recent = updated + + return recent.strftime('%Y-%m-%dT%H:%M:%SZ') + + def _get_base_url(self, link_href): + # Make sure no trailing / + link_href = link_href.rstrip('/') + return link_href.rsplit('/', 1)[0] + '/' + + def _create_feed(self, versions, feed_title, feed_id): + feed = etree.Element('feed', nsmap=self.NSMAP) + title = etree.SubElement(feed, 'title') + title.set('type', 'text') + title.text = feed_title + + # Set this updated to the most recently updated version + recent = self._get_most_recent_update(versions) + etree.SubElement(feed, 'updated').text = recent + + etree.SubElement(feed, 'id').text = feed_id + + link = etree.SubElement(feed, 'link') + link.set('rel', 'self') + link.set('href', feed_id) + + author = etree.SubElement(feed, 'author') + etree.SubElement(author, 'name').text = 'Rackspace' + etree.SubElement(author, 'uri').text = 'http://www.rackspace.com/' + + for version in versions: + feed.append(self._create_version_entry(version)) + + return feed + + def _create_version_entry(self, version): + entry = etree.Element('entry') + etree.SubElement(entry, 'id').text = version['links'][0]['href'] + title = etree.SubElement(entry, 'title') + title.set('type', 'text') + title.text = 'Version %s' % version['id'] + etree.SubElement(entry, 'updated').text = version['updated'] + + for link in version['links']: + link_elem = etree.SubElement(entry, 'link') + link_elem.set('rel', link['rel']) + link_elem.set('href', link['href']) + if 'type' in link: + link_elem.set('type', link['type']) + + content = etree.SubElement(entry, 'content') + content.set('type', 'text') + content.text = 'Version %s %s (%s)' % (version['id'], + version['status'], + version['updated']) + return entry + + +class VersionsAtomSerializer(AtomSerializer): + def default(self, data): + versions = data['versions'] + feed_id = self._get_base_url(versions[0]['links'][0]['href']) + feed = self._create_feed(versions, 'Available API Versions', feed_id) + return self._to_xml(feed) + + +class VersionAtomSerializer(AtomSerializer): + def default(self, data): + version = data['version'] + feed_id = version['links'][0]['href'] + feed = self._create_feed([version], 'About This Version', feed_id) + return self._to_xml(feed) + + +class Versions(wsgi.Resource): + def __init__(self): + super(Versions, self).__init__(None) + + @wsgi.serializers(xml=VersionsTemplate, + atom=VersionsAtomSerializer) + def index(self, req): + """Return all versions.""" + builder = views_versions.get_view_builder(req) + return builder.build_versions(VERSIONS) + + @wsgi.serializers(xml=ChoicesTemplate) + @wsgi.response(300) + def multi(self, req): + """Return multiple choices.""" + builder = views_versions.get_view_builder(req) + return builder.build_choices(VERSIONS, req) + + def get_action_args(self, request_environment): + """Parse dictionary created by routes library.""" + args = {} + if request_environment['PATH_INFO'] == '/': + args['action'] = 'index' + else: + args['action'] = 'multi' + + return args + + +class VersionV2(object): + @wsgi.serializers(xml=VersionTemplate, + atom=VersionAtomSerializer) + def show(self, req): + builder = views_versions.get_view_builder(req) + return builder.build_version(VERSIONS['v2.0']) + + +def create_resource(): + return wsgi.Resource(VersionV2()) diff --git a/cinder/api/openstack/compute/views/__init__.py b/cinder/api/openstack/compute/views/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cinder/api/openstack/compute/views/versions.py b/cinder/api/openstack/compute/views/versions.py new file mode 100644 index 000000000..cb2fd9f4a --- /dev/null +++ b/cinder/api/openstack/compute/views/versions.py @@ -0,0 +1,94 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010-2011 OpenStack LLC. +# 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 copy +import os + + +def get_view_builder(req): + base_url = req.application_url + return ViewBuilder(base_url) + + +class ViewBuilder(object): + + def __init__(self, base_url): + """ + :param base_url: url of the root wsgi application + """ + self.base_url = base_url + + def build_choices(self, VERSIONS, req): + version_objs = [] + for version in VERSIONS: + version = VERSIONS[version] + version_objs.append({ + "id": version['id'], + "status": version['status'], + "links": [ + { + "rel": "self", + "href": self.generate_href(req.path), + }, + ], + "media-types": version['media-types'], + }) + + return dict(choices=version_objs) + + def build_versions(self, versions): + version_objs = [] + for version in sorted(versions.keys()): + version = versions[version] + version_objs.append({ + "id": version['id'], + "status": version['status'], + "updated": version['updated'], + "links": self._build_links(version), + }) + + return dict(versions=version_objs) + + def build_version(self, version): + reval = copy.deepcopy(version) + reval['links'].insert(0, { + "rel": "self", + "href": self.base_url.rstrip('/') + '/', + }) + return dict(version=reval) + + def _build_links(self, version_data): + """Generate a container of links that refer to the provided version.""" + href = self.generate_href() + + links = [ + { + "rel": "self", + "href": href, + }, + ] + + return links + + def generate_href(self, path=None): + """Create an url that refers to a specific version_number.""" + version_number = 'v2' + if path: + path = path.strip('/') + return os.path.join(self.base_url, version_number, path) + else: + return os.path.join(self.base_url, version_number) + '/' diff --git a/cinder/api/openstack/extensions.py b/cinder/api/openstack/extensions.py new file mode 100644 index 000000000..baa9510b6 --- /dev/null +++ b/cinder/api/openstack/extensions.py @@ -0,0 +1,395 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# Copyright 2011 Justin Santa Barbara +# 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 os + +import webob.dec +import webob.exc + +import cinder.api.openstack +from cinder.api.openstack import wsgi +from cinder.api.openstack import xmlutil +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import exception as common_exception +from cinder.openstack.common import importutils +import cinder.policy + + +LOG = logging.getLogger(__name__) +FLAGS = flags.FLAGS + + +class ExtensionDescriptor(object): + """Base class that defines the contract for extensions. + + Note that you don't have to derive from this class to have a valid + extension; it is purely a convenience. + + """ + + # The name of the extension, e.g., 'Fox In Socks' + name = None + + # The alias for the extension, e.g., 'FOXNSOX' + alias = None + + # Description comes from the docstring for the class + + # The XML namespace for the extension, e.g., + # 'http://www.fox.in.socks/api/ext/pie/v1.0' + namespace = None + + # The timestamp when the extension was last updated, e.g., + # '2011-01-22T13:25:27-06:00' + updated = None + + def __init__(self, ext_mgr): + """Register extension with the extension manager.""" + + ext_mgr.register(self) + + def get_resources(self): + """List of extensions.ResourceExtension extension objects. + + Resources define new nouns, and are accessible through URLs. + + """ + resources = [] + return resources + + def get_controller_extensions(self): + """List of extensions.ControllerExtension extension objects. + + Controller extensions are used to extend existing controllers. + """ + controller_exts = [] + return controller_exts + + @classmethod + def nsmap(cls): + """Synthesize a namespace map from extension.""" + + # Start with a base nsmap + nsmap = ext_nsmap.copy() + + # Add the namespace for the extension + nsmap[cls.alias] = cls.namespace + + return nsmap + + @classmethod + def xmlname(cls, name): + """Synthesize element and attribute names.""" + + return '{%s}%s' % (cls.namespace, name) + + +def make_ext(elem): + elem.set('name') + elem.set('namespace') + elem.set('alias') + elem.set('updated') + + desc = xmlutil.SubTemplateElement(elem, 'description') + desc.text = 'description' + + xmlutil.make_links(elem, 'links') + + +ext_nsmap = {None: xmlutil.XMLNS_COMMON_V10, 'atom': xmlutil.XMLNS_ATOM} + + +class ExtensionTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('extension', selector='extension') + make_ext(root) + return xmlutil.MasterTemplate(root, 1, nsmap=ext_nsmap) + + +class ExtensionsTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('extensions') + elem = xmlutil.SubTemplateElement(root, 'extension', + selector='extensions') + make_ext(elem) + return xmlutil.MasterTemplate(root, 1, nsmap=ext_nsmap) + + +class ExtensionsResource(wsgi.Resource): + + def __init__(self, extension_manager): + self.extension_manager = extension_manager + super(ExtensionsResource, self).__init__(None) + + def _translate(self, ext): + ext_data = {} + ext_data['name'] = ext.name + ext_data['alias'] = ext.alias + ext_data['description'] = ext.__doc__ + ext_data['namespace'] = ext.namespace + ext_data['updated'] = ext.updated + ext_data['links'] = [] # TODO(dprince): implement extension links + return ext_data + + @wsgi.serializers(xml=ExtensionsTemplate) + def index(self, req): + extensions = [] + for _alias, ext in self.extension_manager.extensions.iteritems(): + extensions.append(self._translate(ext)) + return dict(extensions=extensions) + + @wsgi.serializers(xml=ExtensionTemplate) + def show(self, req, id): + try: + # NOTE(dprince): the extensions alias is used as the 'id' for show + ext = self.extension_manager.extensions[id] + except KeyError: + raise webob.exc.HTTPNotFound() + + return dict(extension=self._translate(ext)) + + def delete(self, req, id): + raise webob.exc.HTTPNotFound() + + def create(self, req): + raise webob.exc.HTTPNotFound() + + +class ExtensionManager(object): + """Load extensions from the configured extension path. + + See cinder/tests/api/openstack/extensions/foxinsocks/extension.py for an + example extension implementation. + + """ + + def register(self, ext): + # Do nothing if the extension doesn't check out + if not self._check_extension(ext): + return + + alias = ext.alias + LOG.audit(_('Loaded extension: %s'), alias) + + if alias in self.extensions: + raise exception.Error("Found duplicate extension: %s" % alias) + self.extensions[alias] = ext + + def get_resources(self): + """Returns a list of ResourceExtension objects.""" + + resources = [] + resources.append(ResourceExtension('extensions', + ExtensionsResource(self))) + + for ext in self.extensions.values(): + try: + resources.extend(ext.get_resources()) + except AttributeError: + # NOTE(dprince): Extension aren't required to have resource + # extensions + pass + return resources + + def get_controller_extensions(self): + """Returns a list of ControllerExtension objects.""" + controller_exts = [] + for ext in self.extensions.values(): + try: + controller_exts.extend(ext.get_controller_extensions()) + except AttributeError: + # NOTE(Vek): Extensions aren't required to have + # controller extensions + pass + return controller_exts + + def _check_extension(self, extension): + """Checks for required methods in extension objects.""" + try: + LOG.debug(_('Ext name: %s'), extension.name) + LOG.debug(_('Ext alias: %s'), extension.alias) + LOG.debug(_('Ext description: %s'), + ' '.join(extension.__doc__.strip().split())) + LOG.debug(_('Ext namespace: %s'), extension.namespace) + LOG.debug(_('Ext updated: %s'), extension.updated) + except AttributeError as ex: + LOG.exception(_("Exception loading extension: %s"), unicode(ex)) + return False + + return True + + def load_extension(self, ext_factory): + """Execute an extension factory. + + Loads an extension. The 'ext_factory' is the name of a + callable that will be imported and called with one + argument--the extension manager. The factory callable is + expected to call the register() method at least once. + """ + + LOG.debug(_("Loading extension %s"), ext_factory) + + # Load the factory + factory = importutils.import_class(ext_factory) + + # Call it + LOG.debug(_("Calling extension factory %s"), ext_factory) + factory(self) + + def _load_extensions(self): + """Load extensions specified on the command line.""" + + extensions = list(self.cls_list) + + for ext_factory in extensions: + try: + self.load_extension(ext_factory) + except Exception as exc: + LOG.warn(_('Failed to load extension %(ext_factory)s: ' + '%(exc)s') % locals()) + + +class ControllerExtension(object): + """Extend core controllers of cinder OpenStack API. + + Provide a way to extend existing cinder OpenStack API core + controllers. + """ + + def __init__(self, extension, collection, controller): + self.extension = extension + self.collection = collection + self.controller = controller + + +class ResourceExtension(object): + """Add top level resources to the OpenStack API in cinder.""" + + def __init__(self, collection, controller, parent=None, + collection_actions=None, member_actions=None, + custom_routes_fn=None): + if not collection_actions: + collection_actions = {} + if not member_actions: + member_actions = {} + self.collection = collection + self.controller = controller + self.parent = parent + self.collection_actions = collection_actions + self.member_actions = member_actions + self.custom_routes_fn = custom_routes_fn + + +def wrap_errors(fn): + """Ensure errors are not passed along.""" + def wrapped(*args, **kwargs): + try: + return fn(*args, **kwargs) + except webob.exc.HTTPException: + raise + except Exception: + raise webob.exc.HTTPInternalServerError() + return wrapped + + +def load_standard_extensions(ext_mgr, logger, path, package, ext_list=None): + """Registers all standard API extensions.""" + + # Walk through all the modules in our directory... + our_dir = path[0] + for dirpath, dirnames, filenames in os.walk(our_dir): + # Compute the relative package name from the dirpath + relpath = os.path.relpath(dirpath, our_dir) + if relpath == '.': + relpkg = '' + else: + relpkg = '.%s' % '.'.join(relpath.split(os.sep)) + + # Now, consider each file in turn, only considering .py files + for fname in filenames: + root, ext = os.path.splitext(fname) + + # Skip __init__ and anything that's not .py + if ext != '.py' or root == '__init__': + continue + + # Try loading it + classname = "%s%s" % (root[0].upper(), root[1:]) + classpath = ("%s%s.%s.%s" % + (package, relpkg, root, classname)) + + if ext_list is not None and classname not in ext_list: + logger.debug("Skipping extension: %s" % classpath) + continue + + try: + ext_mgr.load_extension(classpath) + except Exception as exc: + logger.warn(_('Failed to load extension %(classpath)s: ' + '%(exc)s') % locals()) + + # Now, let's consider any subdirectories we may have... + subdirs = [] + for dname in dirnames: + # Skip it if it does not have __init__.py + if not os.path.exists(os.path.join(dirpath, dname, + '__init__.py')): + continue + + # If it has extension(), delegate... + ext_name = ("%s%s.%s.extension" % + (package, relpkg, dname)) + try: + ext = importutils.import_class(ext_name) + except common_exception.NotFound: + # extension() doesn't exist on it, so we'll explore + # the directory for ourselves + subdirs.append(dname) + else: + try: + ext(ext_mgr) + except Exception as exc: + logger.warn(_('Failed to load extension %(ext_name)s: ' + '%(exc)s') % locals()) + + # Update the list of directories we'll explore... + dirnames[:] = subdirs + + +def extension_authorizer(api_name, extension_name): + def authorize(context, target=None): + if target is None: + target = {'project_id': context.project_id, + 'user_id': context.user_id} + action = '%s_extension:%s' % (api_name, extension_name) + cinder.policy.enforce(context, action, target) + return authorize + + +def soft_extension_authorizer(api_name, extension_name): + hard_authorize = extension_authorizer(api_name, extension_name) + + def authorize(context): + try: + hard_authorize(context) + return True + except exception.NotAuthorized: + return False + return authorize diff --git a/cinder/api/openstack/urlmap.py b/cinder/api/openstack/urlmap.py new file mode 100644 index 000000000..ac3209854 --- /dev/null +++ b/cinder/api/openstack/urlmap.py @@ -0,0 +1,297 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 paste.urlmap +import re +import urllib2 + +from cinder import log as logging +from cinder.api.openstack import wsgi + + +_quoted_string_re = r'"[^"\\]*(?:\\.[^"\\]*)*"' +_option_header_piece_re = re.compile(r';\s*([^\s;=]+|%s)\s*' + r'(?:=\s*([^;]+|%s))?\s*' % + (_quoted_string_re, _quoted_string_re)) + +LOG = logging.getLogger(__name__) + + +def unquote_header_value(value): + """Unquotes a header value. + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + return value + + +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + :param value: a string with a list header. + :return: :class:`list` + """ + result = [] + for item in urllib2.parse_http_list(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +def parse_options_header(value): + """Parse a ``Content-Type`` like header into a tuple with the content + type and the options: + + >>> parse_options_header('Content-Type: text/html; mimetype=text/html') + ('Content-Type:', {'mimetype': 'text/html'}) + + :param value: the header to parse. + :return: (str, options) + """ + def _tokenize(string): + for match in _option_header_piece_re.finditer(string): + key, value = match.groups() + key = unquote_header_value(key) + if value is not None: + value = unquote_header_value(value) + yield key, value + + if not value: + return '', {} + + parts = _tokenize(';' + value) + name = parts.next()[0] + extra = dict(parts) + return name, extra + + +class Accept(object): + def __init__(self, value): + self._content_types = [parse_options_header(v) for v in + parse_list_header(value)] + + def best_match(self, supported_content_types): + # FIXME: Should we have a more sophisticated matching algorithm that + # takes into account the version as well? + best_quality = -1 + best_content_type = None + best_params = {} + best_match = '*/*' + + for content_type in supported_content_types: + for content_mask, params in self._content_types: + try: + quality = float(params.get('q', 1)) + except ValueError: + continue + + if quality < best_quality: + continue + elif best_quality == quality: + if best_match.count('*') <= content_mask.count('*'): + continue + + if self._match_mask(content_mask, content_type): + best_quality = quality + best_content_type = content_type + best_params = params + best_match = content_mask + + return best_content_type, best_params + + def content_type_params(self, best_content_type): + """Find parameters in Accept header for given content type.""" + for content_type, params in self._content_types: + if best_content_type == content_type: + return params + + return {} + + def _match_mask(self, mask, content_type): + if '*' not in mask: + return content_type == mask + if mask == '*/*': + return True + mask_major = mask[:-2] + content_type_major = content_type.split('/', 1)[0] + return content_type_major == mask_major + + +def urlmap_factory(loader, global_conf, **local_conf): + if 'not_found_app' in local_conf: + not_found_app = local_conf.pop('not_found_app') + else: + not_found_app = global_conf.get('not_found_app') + if not_found_app: + not_found_app = loader.get_app(not_found_app, global_conf=global_conf) + urlmap = URLMap(not_found_app=not_found_app) + for path, app_name in local_conf.items(): + path = paste.urlmap.parse_path_expression(path) + app = loader.get_app(app_name, global_conf=global_conf) + urlmap[path] = app + return urlmap + + +class URLMap(paste.urlmap.URLMap): + def _match(self, host, port, path_info): + """Find longest match for a given URL path.""" + for (domain, app_url), app in self.applications: + if domain and domain != host and domain != host + ':' + port: + continue + if (path_info == app_url + or path_info.startswith(app_url + '/')): + return app, app_url + + return None, None + + def _set_script_name(self, app, app_url): + def wrap(environ, start_response): + environ['SCRIPT_NAME'] += app_url + return app(environ, start_response) + + return wrap + + def _munge_path(self, app, path_info, app_url): + def wrap(environ, start_response): + environ['SCRIPT_NAME'] += app_url + environ['PATH_INFO'] = path_info[len(app_url):] + return app(environ, start_response) + + return wrap + + def _path_strategy(self, host, port, path_info): + """Check path suffix for MIME type and path prefix for API version.""" + mime_type = app = app_url = None + + parts = path_info.rsplit('.', 1) + if len(parts) > 1: + possible_type = 'application/' + parts[1] + if possible_type in wsgi.SUPPORTED_CONTENT_TYPES: + mime_type = possible_type + + parts = path_info.split('/') + if len(parts) > 1: + possible_app, possible_app_url = self._match(host, port, path_info) + # Don't use prefix if it ends up matching default + if possible_app and possible_app_url: + app_url = possible_app_url + app = self._munge_path(possible_app, path_info, app_url) + + return mime_type, app, app_url + + def _content_type_strategy(self, host, port, environ): + """Check Content-Type header for API version.""" + app = None + params = parse_options_header(environ.get('CONTENT_TYPE', ''))[1] + if 'version' in params: + app, app_url = self._match(host, port, '/v' + params['version']) + if app: + app = self._set_script_name(app, app_url) + + return app + + def _accept_strategy(self, host, port, environ, supported_content_types): + """Check Accept header for best matching MIME type and API version.""" + accept = Accept(environ.get('HTTP_ACCEPT', '')) + + app = None + + # Find the best match in the Accept header + mime_type, params = accept.best_match(supported_content_types) + if 'version' in params: + app, app_url = self._match(host, port, '/v' + params['version']) + if app: + app = self._set_script_name(app, app_url) + + return mime_type, app + + def __call__(self, environ, start_response): + host = environ.get('HTTP_HOST', environ.get('SERVER_NAME')).lower() + if ':' in host: + host, port = host.split(':', 1) + else: + if environ['wsgi.url_scheme'] == 'http': + port = '80' + else: + port = '443' + + path_info = environ['PATH_INFO'] + path_info = self.normalize_url(path_info, False)[1] + + # The MIME type for the response is determined in one of two ways: + # 1) URL path suffix (eg /servers/detail.json) + # 2) Accept header (eg application/json;q=0.8, application/xml;q=0.2) + + # The API version is determined in one of three ways: + # 1) URL path prefix (eg /v1.1/tenant/servers/detail) + # 2) Content-Type header (eg application/json;version=1.1) + # 3) Accept header (eg application/json;q=0.8;version=1.1) + + supported_content_types = list(wsgi.SUPPORTED_CONTENT_TYPES) + + mime_type, app, app_url = self._path_strategy(host, port, path_info) + + # Accept application/atom+xml for the index query of each API + # version mount point as well as the root index + if (app_url and app_url + '/' == path_info) or path_info == '/': + supported_content_types.append('application/atom+xml') + + if not app: + app = self._content_type_strategy(host, port, environ) + + if not mime_type or not app: + possible_mime_type, possible_app = self._accept_strategy( + host, port, environ, supported_content_types) + if possible_mime_type and not mime_type: + mime_type = possible_mime_type + if possible_app and not app: + app = possible_app + + if not mime_type: + mime_type = 'application/json' + + if not app: + # Didn't match a particular version, probably matches default + app, app_url = self._match(host, port, path_info) + if app: + app = self._munge_path(app, path_info, app_url) + + if app: + environ['cinder.best_content_type'] = mime_type + return app(environ, start_response) + + environ['paste.urlmap_object'] = self + return self.not_found_application(environ, start_response) diff --git a/cinder/api/openstack/volume/__init__.py b/cinder/api/openstack/volume/__init__.py new file mode 100644 index 000000000..2d9ac302b --- /dev/null +++ b/cinder/api/openstack/volume/__init__.py @@ -0,0 +1,62 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +""" +WSGI middleware for OpenStack Volume API. +""" + +import cinder.api.openstack +from cinder.api.openstack.volume import extensions +from cinder.api.openstack.volume import snapshots +from cinder.api.openstack.volume import types +from cinder.api.openstack.volume import volumes +from cinder.api.openstack.volume import versions +from cinder import log as logging + + +LOG = logging.getLogger(__name__) + + +class APIRouter(cinder.api.openstack.APIRouter): + """ + Routes requests on the OpenStack API to the appropriate controller + and method. + """ + ExtensionManager = extensions.ExtensionManager + + def _setup_routes(self, mapper): + self.resources['versions'] = versions.create_resource() + mapper.connect("versions", "/", + controller=self.resources['versions'], + action='show') + + mapper.redirect("", "/") + + self.resources['volumes'] = volumes.create_resource() + mapper.resource("volume", "volumes", + controller=self.resources['volumes'], + collection={'detail': 'GET'}) + + self.resources['types'] = types.create_resource() + mapper.resource("type", "types", + controller=self.resources['types']) + + self.resources['snapshots'] = snapshots.create_resource() + mapper.resource("snapshot", "snapshots", + controller=self.resources['snapshots'], + collection={'detail': 'GET'}) diff --git a/cinder/api/openstack/volume/contrib/__init__.py b/cinder/api/openstack/volume/contrib/__init__.py new file mode 100644 index 000000000..c49a4c6d3 --- /dev/null +++ b/cinder/api/openstack/volume/contrib/__init__.py @@ -0,0 +1,39 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 Justin Santa Barbara +# 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. + +"""Contrib contains extensions that are shipped with cinder. + +It can't be called 'extensions' because that causes namespacing problems. + +""" + +from cinder import flags +from cinder import log as logging +from cinder.api.openstack import extensions + + +FLAGS = flags.FLAGS +LOG = logging.getLogger(__name__) + + +def standard_extensions(ext_mgr): + extensions.load_standard_extensions(ext_mgr, LOG, __path__, __package__) + + +def select_extensions(ext_mgr): + extensions.load_standard_extensions(ext_mgr, LOG, __path__, __package__, + FLAGS.osapi_volume_ext_list) diff --git a/cinder/api/openstack/volume/contrib/types_extra_specs.py b/cinder/api/openstack/volume/contrib/types_extra_specs.py new file mode 100644 index 000000000..e0c4d595c --- /dev/null +++ b/cinder/api/openstack/volume/contrib/types_extra_specs.py @@ -0,0 +1,152 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 Zadara Storage Inc. +# Copyright (c) 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""The volume types extra specs extension""" + +import webob + +from cinder.api.openstack import extensions +from cinder.api.openstack import wsgi +from cinder.api.openstack import xmlutil +from cinder import db +from cinder import exception +from cinder.volume import volume_types + + +authorize = extensions.extension_authorizer('volume', 'types_extra_specs') + + +class VolumeTypeExtraSpecsTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.make_flat_dict('extra_specs', selector='extra_specs') + return xmlutil.MasterTemplate(root, 1) + + +class VolumeTypeExtraSpecTemplate(xmlutil.TemplateBuilder): + def construct(self): + tagname = xmlutil.Selector('key') + + def extraspec_sel(obj, do_raise=False): + # Have to extract the key and value for later use... + key, value = obj.items()[0] + return dict(key=key, value=value) + + root = xmlutil.TemplateElement(tagname, selector=extraspec_sel) + root.text = 'value' + return xmlutil.MasterTemplate(root, 1) + + +class VolumeTypeExtraSpecsController(object): + """ The volume type extra specs API controller for the OpenStack API """ + + def _get_extra_specs(self, context, type_id): + extra_specs = db.volume_type_extra_specs_get(context, type_id) + specs_dict = {} + for key, value in extra_specs.iteritems(): + specs_dict[key] = value + return dict(extra_specs=specs_dict) + + def _check_body(self, body): + if not body: + expl = _('No Request Body') + raise webob.exc.HTTPBadRequest(explanation=expl) + + def _check_type(self, context, type_id): + try: + volume_types.get_volume_type(context, type_id) + except exception.NotFound as ex: + raise webob.exc.HTTPNotFound(explanation=unicode(ex)) + + @wsgi.serializers(xml=VolumeTypeExtraSpecsTemplate) + def index(self, req, type_id): + """ Returns the list of extra specs for a given volume type """ + context = req.environ['cinder.context'] + authorize(context) + self._check_type(context, type_id) + return self._get_extra_specs(context, type_id) + + @wsgi.serializers(xml=VolumeTypeExtraSpecsTemplate) + def create(self, req, type_id, body=None): + context = req.environ['cinder.context'] + authorize(context) + self._check_type(context, type_id) + self._check_body(body) + specs = body.get('extra_specs') + if not isinstance(specs, dict): + expl = _('Malformed extra specs') + raise webob.exc.HTTPBadRequest(explanation=expl) + db.volume_type_extra_specs_update_or_create(context, + type_id, + specs) + return body + + @wsgi.serializers(xml=VolumeTypeExtraSpecTemplate) + def update(self, req, type_id, id, body=None): + context = req.environ['cinder.context'] + authorize(context) + self._check_type(context, type_id) + self._check_body(body) + if not id in body: + expl = _('Request body and URI mismatch') + raise webob.exc.HTTPBadRequest(explanation=expl) + if len(body) > 1: + expl = _('Request body contains too many items') + raise webob.exc.HTTPBadRequest(explanation=expl) + db.volume_type_extra_specs_update_or_create(context, + type_id, + body) + return body + + @wsgi.serializers(xml=VolumeTypeExtraSpecTemplate) + def show(self, req, type_id, id): + """Return a single extra spec item.""" + context = req.environ['cinder.context'] + authorize(context) + self._check_type(context, type_id) + specs = self._get_extra_specs(context, type_id) + if id in specs['extra_specs']: + return {id: specs['extra_specs'][id]} + else: + raise webob.exc.HTTPNotFound() + + def delete(self, req, type_id, id): + """ Deletes an existing extra spec """ + context = req.environ['cinder.context'] + self._check_type(context, type_id) + authorize(context) + db.volume_type_extra_specs_delete(context, type_id, id) + return webob.Response(status_int=202) + + +class Types_extra_specs(extensions.ExtensionDescriptor): + """Types extra specs support""" + + name = "TypesExtraSpecs" + alias = "os-types-extra-specs" + namespace = "http://docs.openstack.org/volume/ext/types-extra-specs/api/v1" + updated = "2011-08-24T00:00:00+00:00" + + def get_resources(self): + resources = [] + res = extensions.ResourceExtension('extra_specs', + VolumeTypeExtraSpecsController(), + parent=dict( + member_name='type', + collection_name='types')) + resources.append(res) + + return resources diff --git a/cinder/api/openstack/volume/contrib/types_manage.py b/cinder/api/openstack/volume/contrib/types_manage.py new file mode 100644 index 000000000..bb8921a0f --- /dev/null +++ b/cinder/api/openstack/volume/contrib/types_manage.py @@ -0,0 +1,91 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 Zadara Storage Inc. +# Copyright (c) 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""The volume types manage extension.""" + +import webob + +from cinder.api.openstack import extensions +from cinder.api.openstack.volume import types +from cinder.api.openstack import wsgi +from cinder import exception +from cinder.volume import volume_types + + +authorize = extensions.extension_authorizer('volume', 'types_manage') + + +class VolumeTypesManageController(wsgi.Controller): + """ The volume types API controller for the OpenStack API """ + + @wsgi.action("create") + @wsgi.serializers(xml=types.VolumeTypeTemplate) + def _create(self, req, body): + """Creates a new volume type.""" + context = req.environ['cinder.context'] + authorize(context) + + if not body or body == "": + raise webob.exc.HTTPUnprocessableEntity() + + vol_type = body.get('volume_type', None) + if vol_type is None or vol_type == "": + raise webob.exc.HTTPUnprocessableEntity() + + name = vol_type.get('name', None) + specs = vol_type.get('extra_specs', {}) + + if name is None or name == "": + raise webob.exc.HTTPUnprocessableEntity() + + try: + volume_types.create(context, name, specs) + vol_type = volume_types.get_volume_type_by_name(context, name) + except exception.VolumeTypeExists as err: + raise webob.exc.HTTPConflict(explanation=str(err)) + except exception.NotFound: + raise webob.exc.HTTPNotFound() + + return {'volume_type': vol_type} + + @wsgi.action("delete") + def _delete(self, req, id): + """ Deletes an existing volume type """ + context = req.environ['cinder.context'] + authorize(context) + + try: + vol_type = volume_types.get_volume_type(context, id) + volume_types.destroy(context, vol_type['name']) + except exception.NotFound: + raise webob.exc.HTTPNotFound() + + return webob.Response(status_int=202) + + +class Types_manage(extensions.ExtensionDescriptor): + """Types manage support""" + + name = "TypesManage" + alias = "os-types-manage" + namespace = "http://docs.openstack.org/volume/ext/types-manage/api/v1" + updated = "2011-08-24T00:00:00+00:00" + + def get_controller_extensions(self): + controller = VolumeTypesManageController() + extension = extensions.ControllerExtension(self, 'types', controller) + return [extension] diff --git a/cinder/api/openstack/volume/extensions.py b/cinder/api/openstack/volume/extensions.py new file mode 100644 index 000000000..ffe284555 --- /dev/null +++ b/cinder/api/openstack/volume/extensions.py @@ -0,0 +1,33 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 cinder.api.openstack import extensions as base_extensions +from cinder import flags +from cinder import log as logging + + +LOG = logging.getLogger(__name__) +FLAGS = flags.FLAGS + + +class ExtensionManager(base_extensions.ExtensionManager): + def __init__(self): + LOG.audit(_('Initializing extension manager.')) + + self.cls_list = FLAGS.osapi_volume_extension + self.extensions = {} + self._load_extensions() diff --git a/cinder/api/openstack/volume/snapshots.py b/cinder/api/openstack/volume/snapshots.py new file mode 100644 index 000000000..f6d5304ec --- /dev/null +++ b/cinder/api/openstack/volume/snapshots.py @@ -0,0 +1,170 @@ +# Copyright 2011 Justin Santa Barbara +# 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. + +"""The volumes snapshots api.""" + +from webob import exc +import webob + +from cinder.api.openstack import common +from cinder.api.openstack import wsgi +from cinder.api.openstack import xmlutil +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder import volume + + +LOG = logging.getLogger(__name__) + + +FLAGS = flags.FLAGS + + +def _translate_snapshot_detail_view(context, vol): + """Maps keys for snapshots details view.""" + + d = _translate_snapshot_summary_view(context, vol) + + # NOTE(gagupta): No additional data / lookups at the moment + return d + + +def _translate_snapshot_summary_view(context, vol): + """Maps keys for snapshots summary view.""" + d = {} + + # TODO(bcwaldon): remove str cast once we use uuids + d['id'] = str(vol['id']) + d['volume_id'] = str(vol['volume_id']) + d['status'] = vol['status'] + # NOTE(gagupta): We map volume_size as the snapshot size + d['size'] = vol['volume_size'] + d['created_at'] = vol['created_at'] + d['display_name'] = vol['display_name'] + d['display_description'] = vol['display_description'] + return d + + +def make_snapshot(elem): + elem.set('id') + elem.set('status') + elem.set('size') + elem.set('created_at') + elem.set('display_name') + elem.set('display_description') + elem.set('volume_id') + + +class SnapshotTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('snapshot', selector='snapshot') + make_snapshot(root) + return xmlutil.MasterTemplate(root, 1) + + +class SnapshotsTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('snapshots') + elem = xmlutil.SubTemplateElement(root, 'snapshot', + selector='snapshots') + make_snapshot(elem) + return xmlutil.MasterTemplate(root, 1) + + +class SnapshotsController(object): + """The Volumes API controller for the OpenStack API.""" + + def __init__(self): + self.volume_api = volume.API() + super(SnapshotsController, self).__init__() + + @wsgi.serializers(xml=SnapshotTemplate) + def show(self, req, id): + """Return data about the given snapshot.""" + context = req.environ['cinder.context'] + + try: + vol = self.volume_api.get_snapshot(context, id) + except exception.NotFound: + raise exc.HTTPNotFound() + + return {'snapshot': _translate_snapshot_detail_view(context, vol)} + + def delete(self, req, id): + """Delete a snapshot.""" + context = req.environ['cinder.context'] + + LOG.audit(_("Delete snapshot with id: %s"), id, context=context) + + try: + snapshot = self.volume_api.get_snapshot(context, id) + self.volume_api.delete_snapshot(context, snapshot) + except exception.NotFound: + raise exc.HTTPNotFound() + return webob.Response(status_int=202) + + @wsgi.serializers(xml=SnapshotsTemplate) + def index(self, req): + """Returns a summary list of snapshots.""" + return self._items(req, entity_maker=_translate_snapshot_summary_view) + + @wsgi.serializers(xml=SnapshotsTemplate) + def detail(self, req): + """Returns a detailed list of snapshots.""" + return self._items(req, entity_maker=_translate_snapshot_detail_view) + + def _items(self, req, entity_maker): + """Returns a list of snapshots, transformed through entity_maker.""" + context = req.environ['cinder.context'] + + snapshots = self.volume_api.get_all_snapshots(context) + limited_list = common.limited(snapshots, req) + res = [entity_maker(context, snapshot) for snapshot in limited_list] + return {'snapshots': res} + + @wsgi.serializers(xml=SnapshotTemplate) + def create(self, req, body): + """Creates a new snapshot.""" + context = req.environ['cinder.context'] + + if not body: + return exc.HTTPUnprocessableEntity() + + snapshot = body['snapshot'] + volume_id = snapshot['volume_id'] + volume = self.volume_api.get(context, volume_id) + force = snapshot.get('force', False) + msg = _("Create snapshot from volume %s") + LOG.audit(msg, volume_id, context=context) + + if force: + new_snapshot = self.volume_api.create_snapshot_force(context, + volume, + snapshot.get('display_name'), + snapshot.get('display_description')) + else: + new_snapshot = self.volume_api.create_snapshot(context, + volume, + snapshot.get('display_name'), + snapshot.get('display_description')) + + retval = _translate_snapshot_detail_view(context, new_snapshot) + + return {'snapshot': retval} + + +def create_resource(): + return wsgi.Resource(SnapshotsController()) diff --git a/cinder/api/openstack/volume/types.py b/cinder/api/openstack/volume/types.py new file mode 100644 index 000000000..8fea06190 --- /dev/null +++ b/cinder/api/openstack/volume/types.py @@ -0,0 +1,76 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 Zadara Storage Inc. +# Copyright (c) 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +""" The volume type & volume types extra specs extension""" + +from webob import exc + +from cinder.api.openstack import wsgi +from cinder.api.openstack import xmlutil +from cinder import exception +from cinder.volume import volume_types + + +def make_voltype(elem): + elem.set('id') + elem.set('name') + extra_specs = xmlutil.make_flat_dict('extra_specs', selector='extra_specs') + elem.append(extra_specs) + + +class VolumeTypeTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('volume_type', selector='volume_type') + make_voltype(root) + return xmlutil.MasterTemplate(root, 1) + + +class VolumeTypesTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('volume_types') + elem = xmlutil.SubTemplateElement(root, 'volume_type', + selector='volume_types') + make_voltype(elem) + return xmlutil.MasterTemplate(root, 1) + + +class VolumeTypesController(object): + """ The volume types API controller for the OpenStack API """ + + @wsgi.serializers(xml=VolumeTypesTemplate) + def index(self, req): + """ Returns the list of volume types """ + context = req.environ['cinder.context'] + return {'volume_types': volume_types.get_all_types(context).values()} + + @wsgi.serializers(xml=VolumeTypeTemplate) + def show(self, req, id): + """ Return a single volume type item """ + context = req.environ['cinder.context'] + + try: + vol_type = volume_types.get_volume_type(context, id) + except exception.NotFound: + raise exc.HTTPNotFound() + + # TODO(bcwaldon): remove str cast once we use uuids + vol_type['id'] = str(vol_type['id']) + return {'volume_type': vol_type} + + +def create_resource(): + return wsgi.Resource(VolumeTypesController()) diff --git a/cinder/api/openstack/volume/versions.py b/cinder/api/openstack/volume/versions.py new file mode 100644 index 000000000..7dcfdbe6c --- /dev/null +++ b/cinder/api/openstack/volume/versions.py @@ -0,0 +1,83 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC. +# 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 cinder.api.openstack.compute import versions +from cinder.api.openstack.volume.views import versions as views_versions +from cinder.api.openstack import wsgi + + +VERSIONS = { + "v1.0": { + "id": "v1.0", + "status": "CURRENT", + "updated": "2012-01-04T11:33:21Z", + "links": [ + { + "rel": "describedby", + "type": "application/pdf", + "href": "http://jorgew.github.com/block-storage-api/" + "content/os-block-storage-1.0.pdf", + }, + { + "rel": "describedby", + "type": "application/vnd.sun.wadl+xml", + #(anthony) FIXME + "href": "http://docs.rackspacecloud.com/" + "servers/api/v1.1/application.wadl", + }, + ], + "media-types": [ + { + "base": "application/xml", + "type": "application/vnd.openstack.volume+xml;version=1", + }, + { + "base": "application/json", + "type": "application/vnd.openstack.volume+json;version=1", + } + ], + } +} + + +class Versions(versions.Versions): + @wsgi.serializers(xml=versions.VersionsTemplate, + atom=versions.VersionsAtomSerializer) + def index(self, req): + """Return all versions.""" + builder = views_versions.get_view_builder(req) + return builder.build_versions(VERSIONS) + + @wsgi.serializers(xml=versions.ChoicesTemplate) + @wsgi.response(300) + def multi(self, req): + """Return multiple choices.""" + builder = views_versions.get_view_builder(req) + return builder.build_choices(VERSIONS, req) + + +class VolumeVersionV1(object): + @wsgi.serializers(xml=versions.VersionTemplate, + atom=versions.VersionAtomSerializer) + def show(self, req): + builder = views_versions.get_view_builder(req) + return builder.build_version(VERSIONS['v1.0']) + + +def create_resource(): + return wsgi.Resource(VolumeVersionV1()) diff --git a/cinder/api/openstack/volume/views/__init__.py b/cinder/api/openstack/volume/views/__init__.py new file mode 100644 index 000000000..d65c689a8 --- /dev/null +++ b/cinder/api/openstack/volume/views/__init__.py @@ -0,0 +1,16 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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/cinder/api/openstack/volume/views/versions.py b/cinder/api/openstack/volume/views/versions.py new file mode 100644 index 000000000..a4bd164b2 --- /dev/null +++ b/cinder/api/openstack/volume/views/versions.py @@ -0,0 +1,36 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010-2011 OpenStack LLC. +# 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 os + +from cinder.api.openstack.compute.views import versions as compute_views + + +def get_view_builder(req): + base_url = req.application_url + return ViewBuilder(base_url) + + +class ViewBuilder(compute_views.ViewBuilder): + def generate_href(self, path=None): + """Create an url that refers to a specific version_number.""" + version_number = 'v1' + if path: + path = path.strip('/') + return os.path.join(self.base_url, version_number, path) + else: + return os.path.join(self.base_url, version_number) + '/' diff --git a/cinder/api/openstack/volume/volumes.py b/cinder/api/openstack/volume/volumes.py new file mode 100644 index 000000000..9d4b4b5d5 --- /dev/null +++ b/cinder/api/openstack/volume/volumes.py @@ -0,0 +1,263 @@ +# Copyright 2011 Justin Santa Barbara +# 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. + +"""The volumes api.""" + +from webob import exc +import webob + +from cinder.api.openstack import common +from cinder.api.openstack import wsgi +from cinder.api.openstack import xmlutil +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder import volume +from cinder.volume import volume_types + + +LOG = logging.getLogger(__name__) + + +FLAGS = flags.FLAGS + + +def _translate_attachment_detail_view(_context, vol): + """Maps keys for attachment details view.""" + + d = _translate_attachment_summary_view(_context, vol) + + # No additional data / lookups at the moment + + return d + + +def _translate_attachment_summary_view(_context, vol): + """Maps keys for attachment summary view.""" + d = {} + + # TODO(bcwaldon): remove str cast once we use uuids + volume_id = str(vol['id']) + + # NOTE(justinsb): We use the volume id as the id of the attachment object + d['id'] = volume_id + + d['volume_id'] = volume_id + if vol.get('instance'): + d['server_id'] = vol['instance']['uuid'] + if vol.get('mountpoint'): + d['device'] = vol['mountpoint'] + + return d + + +def _translate_volume_detail_view(context, vol): + """Maps keys for volumes details view.""" + + d = _translate_volume_summary_view(context, vol) + + # No additional data / lookups at the moment + + return d + + +def _translate_volume_summary_view(context, vol): + """Maps keys for volumes summary view.""" + d = {} + + # TODO(bcwaldon): remove str cast once we use uuids + d['id'] = str(vol['id']) + d['status'] = vol['status'] + d['size'] = vol['size'] + d['availability_zone'] = vol['availability_zone'] + d['created_at'] = vol['created_at'] + + d['attachments'] = [] + if vol['attach_status'] == 'attached': + attachment = _translate_attachment_detail_view(context, vol) + d['attachments'].append(attachment) + + d['display_name'] = vol['display_name'] + d['display_description'] = vol['display_description'] + + if vol['volume_type_id'] and vol.get('volume_type'): + d['volume_type'] = vol['volume_type']['name'] + else: + # TODO(bcwaldon): remove str cast once we use uuids + d['volume_type'] = str(vol['volume_type_id']) + + d['snapshot_id'] = vol['snapshot_id'] + # TODO(bcwaldon): remove str cast once we use uuids + if d['snapshot_id'] is not None: + d['snapshot_id'] = str(d['snapshot_id']) + + LOG.audit(_("vol=%s"), vol, context=context) + + if vol.get('volume_metadata'): + meta_dict = {} + for i in vol['volume_metadata']: + meta_dict[i['key']] = i['value'] + d['metadata'] = meta_dict + else: + d['metadata'] = {} + + return d + + +def make_attachment(elem): + elem.set('id') + elem.set('server_id') + elem.set('volume_id') + elem.set('device') + + +def make_volume(elem): + elem.set('id') + elem.set('status') + elem.set('size') + elem.set('availability_zone') + elem.set('created_at') + elem.set('display_name') + elem.set('display_description') + elem.set('volume_type') + elem.set('snapshot_id') + + attachments = xmlutil.SubTemplateElement(elem, 'attachments') + attachment = xmlutil.SubTemplateElement(attachments, 'attachment', + selector='attachments') + make_attachment(attachment) + + metadata = xmlutil.make_flat_dict('metadata') + elem.append(metadata) + + +volume_nsmap = {None: xmlutil.XMLNS_VOLUME_V1, 'atom': xmlutil.XMLNS_ATOM} + + +class VolumeTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('volume', selector='volume') + make_volume(root) + return xmlutil.MasterTemplate(root, 1, nsmap=volume_nsmap) + + +class VolumesTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('volumes') + elem = xmlutil.SubTemplateElement(root, 'volume', selector='volumes') + make_volume(elem) + return xmlutil.MasterTemplate(root, 1, nsmap=volume_nsmap) + + +class VolumeController(object): + """The Volumes API controller for the OpenStack API.""" + + def __init__(self): + self.volume_api = volume.API() + super(VolumeController, self).__init__() + + @wsgi.serializers(xml=VolumeTemplate) + def show(self, req, id): + """Return data about the given volume.""" + context = req.environ['cinder.context'] + + try: + vol = self.volume_api.get(context, id) + except exception.NotFound: + raise exc.HTTPNotFound() + + return {'volume': _translate_volume_detail_view(context, vol)} + + def delete(self, req, id): + """Delete a volume.""" + context = req.environ['cinder.context'] + + LOG.audit(_("Delete volume with id: %s"), id, context=context) + + try: + volume = self.volume_api.get(context, id) + self.volume_api.delete(context, volume) + except exception.NotFound: + raise exc.HTTPNotFound() + return webob.Response(status_int=202) + + @wsgi.serializers(xml=VolumesTemplate) + def index(self, req): + """Returns a summary list of volumes.""" + return self._items(req, entity_maker=_translate_volume_summary_view) + + @wsgi.serializers(xml=VolumesTemplate) + def detail(self, req): + """Returns a detailed list of volumes.""" + return self._items(req, entity_maker=_translate_volume_detail_view) + + def _items(self, req, entity_maker): + """Returns a list of volumes, transformed through entity_maker.""" + context = req.environ['cinder.context'] + + volumes = self.volume_api.get_all(context) + limited_list = common.limited(volumes, req) + res = [entity_maker(context, vol) for vol in limited_list] + return {'volumes': res} + + @wsgi.serializers(xml=VolumeTemplate) + def create(self, req, body): + """Creates a new volume.""" + context = req.environ['cinder.context'] + + if not body: + raise exc.HTTPUnprocessableEntity() + + volume = body['volume'] + size = volume['size'] + LOG.audit(_("Create volume of %s GB"), size, context=context) + + kwargs = {} + + req_volume_type = volume.get('volume_type', None) + if req_volume_type: + try: + kwargs['volume_type'] = volume_types.get_volume_type_by_name( + context, req_volume_type) + except exception.NotFound: + raise exc.HTTPNotFound() + + kwargs['metadata'] = volume.get('metadata', None) + + snapshot_id = volume.get('snapshot_id') + if snapshot_id is not None: + kwargs['snapshot'] = self.volume_api.get_snapshot(context, + snapshot_id) + else: + kwargs['snapshot'] = None + + kwargs['availability_zone'] = volume.get('availability_zone', None) + + new_volume = self.volume_api.create(context, + size, + volume.get('display_name'), + volume.get('display_description'), + **kwargs) + + # TODO(vish): Instance should be None at db layer instead of + # trying to lazy load, but for now we turn it into + # a dict to avoid an error. + retval = _translate_volume_detail_view(context, dict(new_volume)) + + return {'volume': retval} + + +def create_resource(): + return wsgi.Resource(VolumeController()) diff --git a/cinder/api/openstack/wsgi.py b/cinder/api/openstack/wsgi.py new file mode 100644 index 000000000..bb309056e --- /dev/null +++ b/cinder/api/openstack/wsgi.py @@ -0,0 +1,1123 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 inspect +from xml.dom import minidom +from xml.parsers import expat +import math +import time + +from lxml import etree +import webob + +from cinder import exception +from cinder import log as logging +from cinder import utils +from cinder import wsgi + + +XMLNS_V1 = 'http://docs.openstack.org/volume/api/v1' + +XMLNS_ATOM = 'http://www.w3.org/2005/Atom' + +LOG = logging.getLogger(__name__) + +# The vendor content types should serialize identically to the non-vendor +# content types. So to avoid littering the code with both options, we +# map the vendor to the other when looking up the type +_CONTENT_TYPE_MAP = { + 'application/vnd.openstack.volume+json': 'application/json', + 'application/vnd.openstack.volume+xml': 'application/xml', +} + +SUPPORTED_CONTENT_TYPES = ( + 'application/json', + 'application/vnd.openstack.volume+json', + 'application/xml', + 'application/vnd.openstack.volume+xml', +) + +_MEDIA_TYPE_MAP = { + 'application/vnd.openstack.volume+json': 'json', + 'application/json': 'json', + 'application/vnd.openstack.volume+xml': 'xml', + 'application/xml': 'xml', + 'application/atom+xml': 'atom', +} + + +class Request(webob.Request): + """Add some OpenStack API-specific logic to the base webob.Request.""" + + def best_match_content_type(self): + """Determine the requested response content-type.""" + if 'cinder.best_content_type' not in self.environ: + # Calculate the best MIME type + content_type = None + + # Check URL path suffix + parts = self.path.rsplit('.', 1) + if len(parts) > 1: + possible_type = 'application/' + parts[1] + if possible_type in SUPPORTED_CONTENT_TYPES: + content_type = possible_type + + if not content_type: + content_type = self.accept.best_match(SUPPORTED_CONTENT_TYPES) + + self.environ['cinder.best_content_type'] = (content_type or + 'application/json') + + return self.environ['cinder.best_content_type'] + + def get_content_type(self): + """Determine content type of the request body. + + Does not do any body introspection, only checks header + + """ + if not "Content-Type" in self.headers: + return None + + allowed_types = SUPPORTED_CONTENT_TYPES + content_type = self.content_type + + if content_type not in allowed_types: + raise exception.InvalidContentType(content_type=content_type) + + return content_type + + +class ActionDispatcher(object): + """Maps method name to local methods through action name.""" + + def dispatch(self, *args, **kwargs): + """Find and call local method.""" + action = kwargs.pop('action', 'default') + action_method = getattr(self, str(action), self.default) + return action_method(*args, **kwargs) + + def default(self, data): + raise NotImplementedError() + + +class TextDeserializer(ActionDispatcher): + """Default request body deserialization""" + + def deserialize(self, datastring, action='default'): + return self.dispatch(datastring, action=action) + + def default(self, datastring): + return {} + + +class JSONDeserializer(TextDeserializer): + + def _from_json(self, datastring): + try: + return utils.loads(datastring) + except ValueError: + msg = _("cannot understand JSON") + raise exception.MalformedRequestBody(reason=msg) + + def default(self, datastring): + return {'body': self._from_json(datastring)} + + +class XMLDeserializer(TextDeserializer): + + def __init__(self, metadata=None): + """ + :param metadata: information needed to deserialize xml into + a dictionary. + """ + super(XMLDeserializer, self).__init__() + self.metadata = metadata or {} + + def _from_xml(self, datastring): + plurals = set(self.metadata.get('plurals', {})) + + try: + node = minidom.parseString(datastring).childNodes[0] + return {node.nodeName: self._from_xml_node(node, plurals)} + except expat.ExpatError: + msg = _("cannot understand XML") + raise exception.MalformedRequestBody(reason=msg) + + def _from_xml_node(self, node, listnames): + """Convert a minidom node to a simple Python type. + + :param listnames: list of XML node names whose subnodes should + be considered list items. + + """ + if len(node.childNodes) == 1 and node.childNodes[0].nodeType == 3: + return node.childNodes[0].nodeValue + elif node.nodeName in listnames: + return [self._from_xml_node(n, listnames) for n in node.childNodes] + else: + result = dict() + for attr in node.attributes.keys(): + result[attr] = node.attributes[attr].nodeValue + for child in node.childNodes: + if child.nodeType != node.TEXT_NODE: + result[child.nodeName] = self._from_xml_node(child, + listnames) + return result + + def find_first_child_named(self, parent, name): + """Search a nodes children for the first child with a given name""" + for node in parent.childNodes: + if node.nodeName == name: + return node + return None + + def find_children_named(self, parent, name): + """Return all of a nodes children who have the given name""" + for node in parent.childNodes: + if node.nodeName == name: + yield node + + def extract_text(self, node): + """Get the text field contained by the given node""" + if len(node.childNodes) == 1: + child = node.childNodes[0] + if child.nodeType == child.TEXT_NODE: + return child.nodeValue + return "" + + def find_attribute_or_element(self, parent, name): + """Get an attribute value; fallback to an element if not found""" + if parent.hasAttribute(name): + return parent.getAttribute(name) + + node = self.find_first_child_named(parent, name) + if node: + return self.extract_text(node) + + return None + + def default(self, datastring): + return {'body': self._from_xml(datastring)} + + +class MetadataXMLDeserializer(XMLDeserializer): + + def extract_metadata(self, metadata_node): + """Marshal the metadata attribute of a parsed request""" + metadata = {} + if metadata_node is not None: + for meta_node in self.find_children_named(metadata_node, "meta"): + key = meta_node.getAttribute("key") + metadata[key] = self.extract_text(meta_node) + return metadata + + +class DictSerializer(ActionDispatcher): + """Default request body serialization""" + + def serialize(self, data, action='default'): + return self.dispatch(data, action=action) + + def default(self, data): + return "" + + +class JSONDictSerializer(DictSerializer): + """Default JSON request body serialization""" + + def default(self, data): + return utils.dumps(data) + + +class XMLDictSerializer(DictSerializer): + + def __init__(self, metadata=None, xmlns=None): + """ + :param metadata: information needed to deserialize xml into + a dictionary. + :param xmlns: XML namespace to include with serialized xml + """ + super(XMLDictSerializer, self).__init__() + self.metadata = metadata or {} + self.xmlns = xmlns + + def default(self, data): + # We expect data to contain a single key which is the XML root. + root_key = data.keys()[0] + doc = minidom.Document() + node = self._to_xml_node(doc, self.metadata, root_key, data[root_key]) + + return self.to_xml_string(node) + + def to_xml_string(self, node, has_atom=False): + self._add_xmlns(node, has_atom) + return node.toxml('UTF-8') + + #NOTE (ameade): the has_atom should be removed after all of the + # xml serializers and view builders have been updated to the current + # spec that required all responses include the xmlns:atom, the has_atom + # flag is to prevent current tests from breaking + def _add_xmlns(self, node, has_atom=False): + if self.xmlns is not None: + node.setAttribute('xmlns', self.xmlns) + if has_atom: + node.setAttribute('xmlns:atom', "http://www.w3.org/2005/Atom") + + def _to_xml_node(self, doc, metadata, nodename, data): + """Recursive method to convert data members to XML nodes.""" + result = doc.createElement(nodename) + + # Set the xml namespace if one is specified + # TODO(justinsb): We could also use prefixes on the keys + xmlns = metadata.get('xmlns', None) + if xmlns: + result.setAttribute('xmlns', xmlns) + + #TODO(bcwaldon): accomplish this without a type-check + if isinstance(data, list): + collections = metadata.get('list_collections', {}) + if nodename in collections: + metadata = collections[nodename] + for item in data: + node = doc.createElement(metadata['item_name']) + node.setAttribute(metadata['item_key'], str(item)) + result.appendChild(node) + return result + singular = metadata.get('plurals', {}).get(nodename, None) + if singular is None: + if nodename.endswith('s'): + singular = nodename[:-1] + else: + singular = 'item' + for item in data: + node = self._to_xml_node(doc, metadata, singular, item) + result.appendChild(node) + #TODO(bcwaldon): accomplish this without a type-check + elif isinstance(data, dict): + collections = metadata.get('dict_collections', {}) + if nodename in collections: + metadata = collections[nodename] + for k, v in data.items(): + node = doc.createElement(metadata['item_name']) + node.setAttribute(metadata['item_key'], str(k)) + text = doc.createTextNode(str(v)) + node.appendChild(text) + result.appendChild(node) + return result + attrs = metadata.get('attributes', {}).get(nodename, {}) + for k, v in data.items(): + if k in attrs: + result.setAttribute(k, str(v)) + else: + node = self._to_xml_node(doc, metadata, k, v) + result.appendChild(node) + else: + # Type is atom + node = doc.createTextNode(str(data)) + result.appendChild(node) + return result + + def _create_link_nodes(self, xml_doc, links): + link_nodes = [] + for link in links: + link_node = xml_doc.createElement('atom:link') + link_node.setAttribute('rel', link['rel']) + link_node.setAttribute('href', link['href']) + if 'type' in link: + link_node.setAttribute('type', link['type']) + link_nodes.append(link_node) + return link_nodes + + def _to_xml(self, root): + """Convert the xml object to an xml string.""" + return etree.tostring(root, encoding='UTF-8', xml_declaration=True) + + +def serializers(**serializers): + """Attaches serializers to a method. + + This decorator associates a dictionary of serializers with a + method. Note that the function attributes are directly + manipulated; the method is not wrapped. + """ + + def decorator(func): + if not hasattr(func, 'wsgi_serializers'): + func.wsgi_serializers = {} + func.wsgi_serializers.update(serializers) + return func + return decorator + + +def deserializers(**deserializers): + """Attaches deserializers to a method. + + This decorator associates a dictionary of deserializers with a + method. Note that the function attributes are directly + manipulated; the method is not wrapped. + """ + + def decorator(func): + if not hasattr(func, 'wsgi_deserializers'): + func.wsgi_deserializers = {} + func.wsgi_deserializers.update(deserializers) + return func + return decorator + + +def response(code): + """Attaches response code to a method. + + This decorator associates a response code with a method. Note + that the function attributes are directly manipulated; the method + is not wrapped. + """ + + def decorator(func): + func.wsgi_code = code + return func + return decorator + + +class ResponseObject(object): + """Bundles a response object with appropriate serializers. + + Object that app methods may return in order to bind alternate + serializers with a response object to be serialized. Its use is + optional. + """ + + def __init__(self, obj, code=None, **serializers): + """Binds serializers with an object. + + Takes keyword arguments akin to the @serializer() decorator + for specifying serializers. Serializers specified will be + given preference over default serializers or method-specific + serializers on return. + """ + + self.obj = obj + self.serializers = serializers + self._default_code = 200 + self._code = code + self._headers = {} + self.serializer = None + self.media_type = None + + def __getitem__(self, key): + """Retrieves a header with the given name.""" + + return self._headers[key.lower()] + + def __setitem__(self, key, value): + """Sets a header with the given name to the given value.""" + + self._headers[key.lower()] = value + + def __delitem__(self, key): + """Deletes the header with the given name.""" + + del self._headers[key.lower()] + + def _bind_method_serializers(self, meth_serializers): + """Binds method serializers with the response object. + + Binds the method serializers with the response object. + Serializers specified to the constructor will take precedence + over serializers specified to this method. + + :param meth_serializers: A dictionary with keys mapping to + response types and values containing + serializer objects. + """ + + # We can't use update because that would be the wrong + # precedence + for mtype, serializer in meth_serializers.items(): + self.serializers.setdefault(mtype, serializer) + + def get_serializer(self, content_type, default_serializers=None): + """Returns the serializer for the wrapped object. + + Returns the serializer for the wrapped object subject to the + indicated content type. If no serializer matching the content + type is attached, an appropriate serializer drawn from the + default serializers will be used. If no appropriate + serializer is available, raises InvalidContentType. + """ + + default_serializers = default_serializers or {} + + try: + mtype = _MEDIA_TYPE_MAP.get(content_type, content_type) + if mtype in self.serializers: + return mtype, self.serializers[mtype] + else: + return mtype, default_serializers[mtype] + except (KeyError, TypeError): + raise exception.InvalidContentType(content_type=content_type) + + def preserialize(self, content_type, default_serializers=None): + """Prepares the serializer that will be used to serialize. + + Determines the serializer that will be used and prepares an + instance of it for later call. This allows the serializer to + be accessed by extensions for, e.g., template extension. + """ + + mtype, serializer = self.get_serializer(content_type, + default_serializers) + self.media_type = mtype + self.serializer = serializer() + + def attach(self, **kwargs): + """Attach slave templates to serializers.""" + + if self.media_type in kwargs: + self.serializer.attach(kwargs[self.media_type]) + + def serialize(self, request, content_type, default_serializers=None): + """Serializes the wrapped object. + + Utility method for serializing the wrapped object. Returns a + webob.Response object. + """ + + if self.serializer: + serializer = self.serializer + else: + _mtype, _serializer = self.get_serializer(content_type, + default_serializers) + serializer = _serializer() + + response = webob.Response() + response.status_int = self.code + for hdr, value in self._headers.items(): + response.headers[hdr] = value + response.headers['Content-Type'] = content_type + if self.obj is not None: + response.body = serializer.serialize(self.obj) + + return response + + @property + def code(self): + """Retrieve the response status.""" + + return self._code or self._default_code + + @property + def headers(self): + """Retrieve the headers.""" + + return self._headers.copy() + + +def action_peek_json(body): + """Determine action to invoke.""" + + try: + decoded = utils.loads(body) + except ValueError: + msg = _("cannot understand JSON") + raise exception.MalformedRequestBody(reason=msg) + + # Make sure there's exactly one key... + if len(decoded) != 1: + msg = _("too many body keys") + raise exception.MalformedRequestBody(reason=msg) + + # Return the action and the decoded body... + return decoded.keys()[0] + + +def action_peek_xml(body): + """Determine action to invoke.""" + + dom = minidom.parseString(body) + action_node = dom.childNodes[0] + + return action_node.tagName + + +class ResourceExceptionHandler(object): + """Context manager to handle Resource exceptions. + + Used when processing exceptions generated by API implementation + methods (or their extensions). Converts most exceptions to Fault + exceptions, with the appropriate logging. + """ + + def __enter__(self): + return None + + def __exit__(self, ex_type, ex_value, ex_traceback): + if not ex_value: + return True + + if isinstance(ex_value, exception.NotAuthorized): + msg = unicode(ex_value) + raise Fault(webob.exc.HTTPForbidden(explanation=msg)) + elif isinstance(ex_value, exception.Invalid): + raise Fault(exception.ConvertedException( + code=ex_value.code, explanation=unicode(ex_value))) + elif isinstance(ex_value, TypeError): + exc_info = (ex_type, ex_value, ex_traceback) + LOG.error(_('Exception handling resource: %s') % ex_value, + exc_info=exc_info) + raise Fault(webob.exc.HTTPBadRequest()) + elif isinstance(ex_value, Fault): + LOG.info(_("Fault thrown: %s"), unicode(ex_value)) + raise ex_value + elif isinstance(ex_value, webob.exc.HTTPException): + LOG.info(_("HTTP exception thrown: %s"), unicode(ex_value)) + raise Fault(ex_value) + + # We didn't handle the exception + return False + + +class Resource(wsgi.Application): + """WSGI app that handles (de)serialization and controller dispatch. + + WSGI app that reads routing information supplied by RoutesMiddleware + and calls the requested action method upon its controller. All + controller action methods must accept a 'req' argument, which is the + incoming wsgi.Request. If the operation is a PUT or POST, the controller + method must also accept a 'body' argument (the deserialized request body). + They may raise a webob.exc exception or return a dict, which will be + serialized by requested content type. + + Exceptions derived from webob.exc.HTTPException will be automatically + wrapped in Fault() to provide API friendly error responses. + + """ + + def __init__(self, controller, action_peek=None, **deserializers): + """ + :param controller: object that implement methods created by routes lib + :param action_peek: dictionary of routines for peeking into an action + request body to determine the desired action + """ + + self.controller = controller + + default_deserializers = dict(xml=XMLDeserializer, + json=JSONDeserializer) + default_deserializers.update(deserializers) + + self.default_deserializers = default_deserializers + self.default_serializers = dict(xml=XMLDictSerializer, + json=JSONDictSerializer) + + self.action_peek = dict(xml=action_peek_xml, + json=action_peek_json) + self.action_peek.update(action_peek or {}) + + # Copy over the actions dictionary + self.wsgi_actions = {} + if controller: + self.register_actions(controller) + + # Save a mapping of extensions + self.wsgi_extensions = {} + self.wsgi_action_extensions = {} + + def register_actions(self, controller): + """Registers controller actions with this resource.""" + + actions = getattr(controller, 'wsgi_actions', {}) + for key, method_name in actions.items(): + self.wsgi_actions[key] = getattr(controller, method_name) + + def register_extensions(self, controller): + """Registers controller extensions with this resource.""" + + extensions = getattr(controller, 'wsgi_extensions', []) + for method_name, action_name in extensions: + # Look up the extending method + extension = getattr(controller, method_name) + + if action_name: + # Extending an action... + if action_name not in self.wsgi_action_extensions: + self.wsgi_action_extensions[action_name] = [] + self.wsgi_action_extensions[action_name].append(extension) + else: + # Extending a regular method + if method_name not in self.wsgi_extensions: + self.wsgi_extensions[method_name] = [] + self.wsgi_extensions[method_name].append(extension) + + def get_action_args(self, request_environment): + """Parse dictionary created by routes library.""" + + # NOTE(Vek): Check for get_action_args() override in the + # controller + if hasattr(self.controller, 'get_action_args'): + return self.controller.get_action_args(request_environment) + + try: + args = request_environment['wsgiorg.routing_args'][1].copy() + except (KeyError, IndexError, AttributeError): + return {} + + try: + del args['controller'] + except KeyError: + pass + + try: + del args['format'] + except KeyError: + pass + + return args + + def get_body(self, request): + try: + content_type = request.get_content_type() + except exception.InvalidContentType: + LOG.debug(_("Unrecognized Content-Type provided in request")) + return None, '' + + if not content_type: + LOG.debug(_("No Content-Type provided in request")) + return None, '' + + if len(request.body) <= 0: + LOG.debug(_("Empty body provided in request")) + return None, '' + + return content_type, request.body + + def deserialize(self, meth, content_type, body): + meth_deserializers = getattr(meth, 'wsgi_deserializers', {}) + try: + mtype = _MEDIA_TYPE_MAP.get(content_type, content_type) + if mtype in meth_deserializers: + deserializer = meth_deserializers[mtype] + else: + deserializer = self.default_deserializers[mtype] + except (KeyError, TypeError): + raise exception.InvalidContentType(content_type=content_type) + + return deserializer().deserialize(body) + + def pre_process_extensions(self, extensions, request, action_args): + # List of callables for post-processing extensions + post = [] + + for ext in extensions: + if inspect.isgeneratorfunction(ext): + response = None + + # If it's a generator function, the part before the + # yield is the preprocessing stage + try: + with ResourceExceptionHandler(): + gen = ext(req=request, **action_args) + response = gen.next() + except Fault as ex: + response = ex + + # We had a response... + if response: + return response, [] + + # No response, queue up generator for post-processing + post.append(gen) + else: + # Regular functions only perform post-processing + post.append(ext) + + # Run post-processing in the reverse order + return None, reversed(post) + + def post_process_extensions(self, extensions, resp_obj, request, + action_args): + for ext in extensions: + response = None + if inspect.isgenerator(ext): + # If it's a generator, run the second half of + # processing + try: + with ResourceExceptionHandler(): + response = ext.send(resp_obj) + except StopIteration: + # Normal exit of generator + continue + except Fault as ex: + response = ex + else: + # Regular functions get post-processing... + try: + with ResourceExceptionHandler(): + response = ext(req=request, resp_obj=resp_obj, + **action_args) + except Fault as ex: + response = ex + + # We had a response... + if response: + return response + + return None + + @webob.dec.wsgify(RequestClass=Request) + def __call__(self, request): + """WSGI method that controls (de)serialization and method dispatch.""" + + LOG.info("%(method)s %(url)s" % {"method": request.method, + "url": request.url}) + + # Identify the action, its arguments, and the requested + # content type + action_args = self.get_action_args(request.environ) + action = action_args.pop('action', None) + content_type, body = self.get_body(request) + accept = request.best_match_content_type() + + # NOTE(Vek): Splitting the function up this way allows for + # auditing by external tools that wrap the existing + # function. If we try to audit __call__(), we can + # run into troubles due to the @webob.dec.wsgify() + # decorator. + return self._process_stack(request, action, action_args, + content_type, body, accept) + + def _process_stack(self, request, action, action_args, + content_type, body, accept): + """Implement the processing stack.""" + + # Get the implementing method + try: + meth, extensions = self.get_method(request, action, + content_type, body) + except (AttributeError, TypeError): + return Fault(webob.exc.HTTPNotFound()) + except KeyError as ex: + msg = _("There is no such action: %s") % ex.args[0] + return Fault(webob.exc.HTTPBadRequest(explanation=msg)) + except exception.MalformedRequestBody: + msg = _("Malformed request body") + return Fault(webob.exc.HTTPBadRequest(explanation=msg)) + + # Now, deserialize the request body... + try: + if content_type: + contents = self.deserialize(meth, content_type, body) + else: + contents = {} + except exception.InvalidContentType: + msg = _("Unsupported Content-Type") + return Fault(webob.exc.HTTPBadRequest(explanation=msg)) + except exception.MalformedRequestBody: + msg = _("Malformed request body") + return Fault(webob.exc.HTTPBadRequest(explanation=msg)) + + # Update the action args + action_args.update(contents) + + project_id = action_args.pop("project_id", None) + context = request.environ.get('cinder.context') + if (context and project_id and (project_id != context.project_id)): + msg = _("Malformed request url") + return Fault(webob.exc.HTTPBadRequest(explanation=msg)) + + # Run pre-processing extensions + response, post = self.pre_process_extensions(extensions, + request, action_args) + + if not response: + try: + with ResourceExceptionHandler(): + action_result = self.dispatch(meth, request, action_args) + except Fault as ex: + response = ex + + if not response: + # No exceptions; convert action_result into a + # ResponseObject + resp_obj = None + if type(action_result) is dict or action_result is None: + resp_obj = ResponseObject(action_result) + elif isinstance(action_result, ResponseObject): + resp_obj = action_result + else: + response = action_result + + # Run post-processing extensions + if resp_obj: + _set_request_id_header(request, resp_obj) + # Do a preserialize to set up the response object + serializers = getattr(meth, 'wsgi_serializers', {}) + resp_obj._bind_method_serializers(serializers) + if hasattr(meth, 'wsgi_code'): + resp_obj._default_code = meth.wsgi_code + resp_obj.preserialize(accept, self.default_serializers) + + # Process post-processing extensions + response = self.post_process_extensions(post, resp_obj, + request, action_args) + + if resp_obj and not response: + response = resp_obj.serialize(request, accept, + self.default_serializers) + + try: + msg_dict = dict(url=request.url, status=response.status_int) + msg = _("%(url)s returned with HTTP %(status)d") % msg_dict + except AttributeError, e: + msg_dict = dict(url=request.url, e=e) + msg = _("%(url)s returned a fault: %(e)s") % msg_dict + + LOG.info(msg) + + return response + + def get_method(self, request, action, content_type, body): + """Look up the action-specific method and its extensions.""" + + # Look up the method + try: + if not self.controller: + meth = getattr(self, action) + else: + meth = getattr(self.controller, action) + except AttributeError: + if (not self.wsgi_actions or + action not in ['action', 'create', 'delete']): + # Propagate the error + raise + else: + return meth, self.wsgi_extensions.get(action, []) + + if action == 'action': + # OK, it's an action; figure out which action... + mtype = _MEDIA_TYPE_MAP.get(content_type) + action_name = self.action_peek[mtype](body) + else: + action_name = action + + # Look up the action method + return (self.wsgi_actions[action_name], + self.wsgi_action_extensions.get(action_name, [])) + + def dispatch(self, method, request, action_args): + """Dispatch a call to the action-specific method.""" + + return method(req=request, **action_args) + + +def action(name): + """Mark a function as an action. + + The given name will be taken as the action key in the body. + + This is also overloaded to allow extensions to provide + non-extending definitions of create and delete operations. + """ + + def decorator(func): + func.wsgi_action = name + return func + return decorator + + +def extends(*args, **kwargs): + """Indicate a function extends an operation. + + Can be used as either:: + + @extends + def index(...): + pass + + or as:: + + @extends(action='resize') + def _action_resize(...): + pass + """ + + def decorator(func): + # Store enough information to find what we're extending + func.wsgi_extends = (func.__name__, kwargs.get('action')) + return func + + # If we have positional arguments, call the decorator + if args: + return decorator(*args) + + # OK, return the decorator instead + return decorator + + +class ControllerMetaclass(type): + """Controller metaclass. + + This metaclass automates the task of assembling a dictionary + mapping action keys to method names. + """ + + def __new__(mcs, name, bases, cls_dict): + """Adds the wsgi_actions dictionary to the class.""" + + # Find all actions + actions = {} + extensions = [] + for key, value in cls_dict.items(): + if not callable(value): + continue + if getattr(value, 'wsgi_action', None): + actions[value.wsgi_action] = key + elif getattr(value, 'wsgi_extends', None): + extensions.append(value.wsgi_extends) + + # Add the actions and extensions to the class dict + cls_dict['wsgi_actions'] = actions + cls_dict['wsgi_extensions'] = extensions + + return super(ControllerMetaclass, mcs).__new__(mcs, name, bases, + cls_dict) + + +class Controller(object): + """Default controller.""" + + __metaclass__ = ControllerMetaclass + + _view_builder_class = None + + def __init__(self, view_builder=None): + """Initialize controller with a view builder instance.""" + if view_builder: + self._view_builder = view_builder + elif self._view_builder_class: + self._view_builder = self._view_builder_class() + else: + self._view_builder = None + + +class Fault(webob.exc.HTTPException): + """Wrap webob.exc.HTTPException to provide API friendly response.""" + + _fault_names = { + 400: "badRequest", + 401: "unauthorized", + 403: "forbidden", + 404: "itemNotFound", + 405: "badMethod", + 409: "conflictingRequest", + 413: "overLimit", + 415: "badMediaType", + 501: "notImplemented", + 503: "serviceUnavailable"} + + def __init__(self, exception): + """Create a Fault for the given webob.exc.exception.""" + self.wrapped_exc = exception + self.status_int = exception.status_int + + @webob.dec.wsgify(RequestClass=Request) + def __call__(self, req): + """Generate a WSGI response based on the exception passed to ctor.""" + # Replace the body with fault details. + code = self.wrapped_exc.status_int + fault_name = self._fault_names.get(code, "computeFault") + fault_data = { + fault_name: { + 'code': code, + 'message': self.wrapped_exc.explanation}} + if code == 413: + retry = self.wrapped_exc.headers['Retry-After'] + fault_data[fault_name]['retryAfter'] = retry + + # 'code' is an attribute on the fault tag itself + metadata = {'attributes': {fault_name: 'code'}} + + xml_serializer = XMLDictSerializer(metadata, XMLNS_V1) + + content_type = req.best_match_content_type() + serializer = { + 'application/xml': xml_serializer, + 'application/json': JSONDictSerializer(), + }[content_type] + + self.wrapped_exc.body = serializer.serialize(fault_data) + self.wrapped_exc.content_type = content_type + _set_request_id_header(req, self.wrapped_exc.headers) + + return self.wrapped_exc + + def __str__(self): + return self.wrapped_exc.__str__() + + +class OverLimitFault(webob.exc.HTTPException): + """ + Rate-limited request response. + """ + + def __init__(self, message, details, retry_time): + """ + Initialize new `OverLimitFault` with relevant information. + """ + hdrs = OverLimitFault._retry_after(retry_time) + self.wrapped_exc = webob.exc.HTTPRequestEntityTooLarge(headers=hdrs) + self.content = { + "overLimitFault": { + "code": self.wrapped_exc.status_int, + "message": message, + "details": details, + }, + } + + @staticmethod + def _retry_after(retry_time): + delay = int(math.ceil(retry_time - time.time())) + retry_after = delay if delay > 0 else 0 + headers = {'Retry-After': '%d' % retry_after} + return headers + + @webob.dec.wsgify(RequestClass=Request) + def __call__(self, request): + """ + Return the wrapped exception with a serialized body conforming to our + error format. + """ + content_type = request.best_match_content_type() + metadata = {"attributes": {"overLimitFault": "code"}} + + xml_serializer = XMLDictSerializer(metadata, XMLNS_V1) + serializer = { + 'application/xml': xml_serializer, + 'application/json': JSONDictSerializer(), + }[content_type] + + content = serializer.serialize(self.content) + self.wrapped_exc.body = content + + return self.wrapped_exc + + +def _set_request_id_header(req, headers): + context = req.environ.get('cinder.context') + if context: + headers['x-compute-request-id'] = context.request_id diff --git a/cinder/api/openstack/xmlutil.py b/cinder/api/openstack/xmlutil.py new file mode 100644 index 000000000..5dfe0c122 --- /dev/null +++ b/cinder/api/openstack/xmlutil.py @@ -0,0 +1,908 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 os.path + +from lxml import etree + +from cinder import utils + + +XMLNS_V10 = 'http://docs.rackspacecloud.com/servers/api/v1.0' +XMLNS_V11 = 'http://docs.openstack.org/compute/api/v1.1' +XMLNS_COMMON_V10 = 'http://docs.openstack.org/common/api/v1.0' +XMLNS_ATOM = 'http://www.w3.org/2005/Atom' +XMLNS_VOLUME_V1 = 'http://docs.openstack.org/volume/api/v1' + + +def validate_schema(xml, schema_name): + if isinstance(xml, str): + xml = etree.fromstring(xml) + base_path = 'cinder/api/openstack/compute/schemas/v1.1/' + if schema_name in ('atom', 'atom-link'): + base_path = 'cinder/api/openstack/compute/schemas/' + schema_path = os.path.join(utils.cinderdir(), + '%s%s.rng' % (base_path, schema_name)) + schema_doc = etree.parse(schema_path) + relaxng = etree.RelaxNG(schema_doc) + relaxng.assertValid(xml) + + +class Selector(object): + """Selects datum to operate on from an object.""" + + def __init__(self, *chain): + """Initialize the selector. + + Each argument is a subsequent index into the object. + """ + + self.chain = chain + + def __repr__(self): + """Return a representation of the selector.""" + + return "Selector" + repr(self.chain) + + def __call__(self, obj, do_raise=False): + """Select a datum to operate on. + + Selects the relevant datum within the object. + + :param obj: The object from which to select the object. + :param do_raise: If False (the default), return None if the + indexed datum does not exist. Otherwise, + raise a KeyError. + """ + + # Walk the selector list + for elem in self.chain: + # If it's callable, call it + if callable(elem): + obj = elem(obj) + else: + # Use indexing + try: + obj = obj[elem] + except (KeyError, IndexError): + # No sense going any further + if do_raise: + # Convert to a KeyError, for consistency + raise KeyError(elem) + return None + + # Return the finally-selected object + return obj + + +def get_items(obj): + """Get items in obj.""" + + return list(obj.items()) + + +class EmptyStringSelector(Selector): + """Returns the empty string if Selector would return None.""" + def __call__(self, obj, do_raise=False): + """Returns empty string if the selected value does not exist.""" + + try: + return super(EmptyStringSelector, self).__call__(obj, True) + except KeyError: + return "" + + +class ConstantSelector(object): + """Returns a constant.""" + + def __init__(self, value): + """Initialize the selector. + + :param value: The value to return. + """ + + self.value = value + + def __repr__(self): + """Return a representation of the selector.""" + + return repr(self.value) + + def __call__(self, _obj, _do_raise=False): + """Select a datum to operate on. + + Returns a constant value. Compatible with + Selector.__call__(). + """ + + return self.value + + +class TemplateElement(object): + """Represent an element in the template.""" + + def __init__(self, tag, attrib=None, selector=None, subselector=None, + **extra): + """Initialize an element. + + Initializes an element in the template. Keyword arguments + specify attributes to be set on the element; values must be + callables. See TemplateElement.set() for more information. + + :param tag: The name of the tag to create. + :param attrib: An optional dictionary of element attributes. + :param selector: An optional callable taking an object and + optional boolean do_raise indicator and + returning the object bound to the element. + :param subselector: An optional callable taking an object and + optional boolean do_raise indicator and + returning the object bound to the element. + This is used to further refine the datum + object returned by selector in the event + that it is a list of objects. + """ + + # Convert selector into a Selector + if selector is None: + selector = Selector() + elif not callable(selector): + selector = Selector(selector) + + # Convert subselector into a Selector + if subselector is not None and not callable(subselector): + subselector = Selector(subselector) + + self.tag = tag + self.selector = selector + self.subselector = subselector + self.attrib = {} + self._text = None + self._children = [] + self._childmap = {} + + # Run the incoming attributes through set() so that they + # become selectorized + if not attrib: + attrib = {} + attrib.update(extra) + for k, v in attrib.items(): + self.set(k, v) + + def __repr__(self): + """Return a representation of the template element.""" + + return ('<%s.%s %r at %#x>' % + (self.__class__.__module__, self.__class__.__name__, + self.tag, id(self))) + + def __len__(self): + """Return the number of child elements.""" + + return len(self._children) + + def __contains__(self, key): + """Determine whether a child node named by key exists.""" + + return key in self._childmap + + def __getitem__(self, idx): + """Retrieve a child node by index or name.""" + + if isinstance(idx, basestring): + # Allow access by node name + return self._childmap[idx] + else: + return self._children[idx] + + def append(self, elem): + """Append a child to the element.""" + + # Unwrap templates... + elem = elem.unwrap() + + # Avoid duplications + if elem.tag in self._childmap: + raise KeyError(elem.tag) + + self._children.append(elem) + self._childmap[elem.tag] = elem + + def extend(self, elems): + """Append children to the element.""" + + # Pre-evaluate the elements + elemmap = {} + elemlist = [] + for elem in elems: + # Unwrap templates... + elem = elem.unwrap() + + # Avoid duplications + if elem.tag in self._childmap or elem.tag in elemmap: + raise KeyError(elem.tag) + + elemmap[elem.tag] = elem + elemlist.append(elem) + + # Update the children + self._children.extend(elemlist) + self._childmap.update(elemmap) + + def insert(self, idx, elem): + """Insert a child element at the given index.""" + + # Unwrap templates... + elem = elem.unwrap() + + # Avoid duplications + if elem.tag in self._childmap: + raise KeyError(elem.tag) + + self._children.insert(idx, elem) + self._childmap[elem.tag] = elem + + def remove(self, elem): + """Remove a child element.""" + + # Unwrap templates... + elem = elem.unwrap() + + # Check if element exists + if elem.tag not in self._childmap or self._childmap[elem.tag] != elem: + raise ValueError(_('element is not a child')) + + self._children.remove(elem) + del self._childmap[elem.tag] + + def get(self, key): + """Get an attribute. + + Returns a callable which performs datum selection. + + :param key: The name of the attribute to get. + """ + + return self.attrib[key] + + def set(self, key, value=None): + """Set an attribute. + + :param key: The name of the attribute to set. + + :param value: A callable taking an object and optional boolean + do_raise indicator and returning the datum bound + to the attribute. If None, a Selector() will be + constructed from the key. If a string, a + Selector() will be constructed from the string. + """ + + # Convert value to a selector + if value is None: + value = Selector(key) + elif not callable(value): + value = Selector(value) + + self.attrib[key] = value + + def keys(self): + """Return the attribute names.""" + + return self.attrib.keys() + + def items(self): + """Return the attribute names and values.""" + + return self.attrib.items() + + def unwrap(self): + """Unwraps a template to return a template element.""" + + # We are a template element + return self + + def wrap(self): + """Wraps a template element to return a template.""" + + # Wrap in a basic Template + return Template(self) + + def apply(self, elem, obj): + """Apply text and attributes to an etree.Element. + + Applies the text and attribute instructions in the template + element to an etree.Element instance. + + :param elem: An etree.Element instance. + :param obj: The base object associated with this template + element. + """ + + # Start with the text... + if self.text is not None: + elem.text = unicode(self.text(obj)) + + # Now set up all the attributes... + for key, value in self.attrib.items(): + try: + elem.set(key, unicode(value(obj, True))) + except KeyError: + # Attribute has no value, so don't include it + pass + + def _render(self, parent, datum, patches, nsmap): + """Internal rendering. + + Renders the template node into an etree.Element object. + Returns the etree.Element object. + + :param parent: The parent etree.Element instance. + :param datum: The datum associated with this template element. + :param patches: A list of other template elements that must + also be applied. + :param nsmap: An optional namespace dictionary to be + associated with the etree.Element instance. + """ + + # Allocate a node + if callable(self.tag): + tagname = self.tag(datum) + else: + tagname = self.tag + elem = etree.Element(tagname, nsmap=nsmap) + + # If we have a parent, append the node to the parent + if parent is not None: + parent.append(elem) + + # If the datum is None, do nothing else + if datum is None: + return elem + + # Apply this template element to the element + self.apply(elem, datum) + + # Additionally, apply the patches + for patch in patches: + patch.apply(elem, datum) + + # We have fully rendered the element; return it + return elem + + def render(self, parent, obj, patches=[], nsmap=None): + """Render an object. + + Renders an object against this template node. Returns a list + of two-item tuples, where the first item is an etree.Element + instance and the second item is the datum associated with that + instance. + + :param parent: The parent for the etree.Element instances. + :param obj: The object to render this template element + against. + :param patches: A list of other template elements to apply + when rendering this template element. + :param nsmap: An optional namespace dictionary to attach to + the etree.Element instances. + """ + + # First, get the datum we're rendering + data = None if obj is None else self.selector(obj) + + # Check if we should render at all + if not self.will_render(data): + return [] + elif data is None: + return [(self._render(parent, None, patches, nsmap), None)] + + # Make the data into a list if it isn't already + if not isinstance(data, list): + data = [data] + elif parent is None: + raise ValueError(_('root element selecting a list')) + + # Render all the elements + elems = [] + for datum in data: + if self.subselector is not None: + datum = self.subselector(datum) + elems.append((self._render(parent, datum, patches, nsmap), datum)) + + # Return all the elements rendered, as well as the + # corresponding datum for the next step down the tree + return elems + + def will_render(self, datum): + """Hook method. + + An overridable hook method to determine whether this template + element will be rendered at all. By default, returns False + (inhibiting rendering) if the datum is None. + + :param datum: The datum associated with this template element. + """ + + # Don't render if datum is None + return datum is not None + + def _text_get(self): + """Template element text. + + Either None or a callable taking an object and optional + boolean do_raise indicator and returning the datum bound to + the text of the template element. + """ + + return self._text + + def _text_set(self, value): + # Convert value to a selector + if value is not None and not callable(value): + value = Selector(value) + + self._text = value + + def _text_del(self): + self._text = None + + text = property(_text_get, _text_set, _text_del) + + def tree(self): + """Return string representation of the template tree. + + Returns a representation of the template rooted at this + element as a string, suitable for inclusion in debug logs. + """ + + # Build the inner contents of the tag... + contents = [self.tag, '!selector=%r' % self.selector] + + # Add the text... + if self.text is not None: + contents.append('!text=%r' % self.text) + + # Add all the other attributes + for key, value in self.attrib.items(): + contents.append('%s=%r' % (key, value)) + + # If there are no children, return it as a closed tag + if len(self) == 0: + return '<%s/>' % ' '.join([str(i) for i in contents]) + + # OK, recurse to our children + children = [c.tree() for c in self] + + # Return the result + return ('<%s>%s</%s>' % + (' '.join(contents), ''.join(children), self.tag)) + + +def SubTemplateElement(parent, tag, attrib=None, selector=None, + subselector=None, **extra): + """Create a template element as a child of another. + + Corresponds to the etree.SubElement interface. Parameters are as + for TemplateElement, with the addition of the parent. + """ + + # Convert attributes + attrib = attrib or {} + attrib.update(extra) + + # Get a TemplateElement + elem = TemplateElement(tag, attrib=attrib, selector=selector, + subselector=subselector) + + # Append the parent safely + if parent is not None: + parent.append(elem) + + return elem + + +class Template(object): + """Represent a template.""" + + def __init__(self, root, nsmap=None): + """Initialize a template. + + :param root: The root element of the template. + :param nsmap: An optional namespace dictionary to be + associated with the root element of the + template. + """ + + self.root = root.unwrap() if root is not None else None + self.nsmap = nsmap or {} + self.serialize_options = dict(encoding='UTF-8', xml_declaration=True) + + def _serialize(self, parent, obj, siblings, nsmap=None): + """Internal serialization. + + Recursive routine to build a tree of etree.Element instances + from an object based on the template. Returns the first + etree.Element instance rendered, or None. + + :param parent: The parent etree.Element instance. Can be + None. + :param obj: The object to render. + :param siblings: The TemplateElement instances against which + to render the object. + :param nsmap: An optional namespace dictionary to be + associated with the etree.Element instance + rendered. + """ + + # First step, render the element + elems = siblings[0].render(parent, obj, siblings[1:], nsmap) + + # Now, recurse to all child elements + seen = set() + for idx, sibling in enumerate(siblings): + for child in sibling: + # Have we handled this child already? + if child.tag in seen: + continue + seen.add(child.tag) + + # Determine the child's siblings + nieces = [child] + for sib in siblings[idx + 1:]: + if child.tag in sib: + nieces.append(sib[child.tag]) + + # Now we recurse for every data element + for elem, datum in elems: + self._serialize(elem, datum, nieces) + + # Return the first element; at the top level, this will be the + # root element + if elems: + return elems[0][0] + + def serialize(self, obj, *args, **kwargs): + """Serialize an object. + + Serializes an object against the template. Returns a string + with the serialized XML. Positional and keyword arguments are + passed to etree.tostring(). + + :param obj: The object to serialize. + """ + + elem = self.make_tree(obj) + if elem is None: + return '' + + for k, v in self.serialize_options.items(): + kwargs.setdefault(k, v) + + # Serialize it into XML + return etree.tostring(elem, *args, **kwargs) + + def make_tree(self, obj): + """Create a tree. + + Serializes an object against the template. Returns an Element + node with appropriate children. + + :param obj: The object to serialize. + """ + + # If the template is empty, return the empty string + if self.root is None: + return None + + # Get the siblings and nsmap of the root element + siblings = self._siblings() + nsmap = self._nsmap() + + # Form the element tree + return self._serialize(None, obj, siblings, nsmap) + + def _siblings(self): + """Hook method for computing root siblings. + + An overridable hook method to return the siblings of the root + element. By default, this is the root element itself. + """ + + return [self.root] + + def _nsmap(self): + """Hook method for computing the namespace dictionary. + + An overridable hook method to return the namespace dictionary. + """ + + return self.nsmap.copy() + + def unwrap(self): + """Unwraps a template to return a template element.""" + + # Return the root element + return self.root + + def wrap(self): + """Wraps a template element to return a template.""" + + # We are a template + return self + + def apply(self, master): + """Hook method for determining slave applicability. + + An overridable hook method used to determine if this template + is applicable as a slave to a given master template. + + :param master: The master template to test. + """ + + return True + + def tree(self): + """Return string representation of the template tree. + + Returns a representation of the template as a string, suitable + for inclusion in debug logs. + """ + + return "%r: %s" % (self, self.root.tree()) + + +class MasterTemplate(Template): + """Represent a master template. + + Master templates are versioned derivatives of templates that + additionally allow slave templates to be attached. Slave + templates allow modification of the serialized result without + directly changing the master. + """ + + def __init__(self, root, version, nsmap=None): + """Initialize a master template. + + :param root: The root element of the template. + :param version: The version number of the template. + :param nsmap: An optional namespace dictionary to be + associated with the root element of the + template. + """ + + super(MasterTemplate, self).__init__(root, nsmap) + self.version = version + self.slaves = [] + + def __repr__(self): + """Return string representation of the template.""" + + return ("<%s.%s object version %s at %#x>" % + (self.__class__.__module__, self.__class__.__name__, + self.version, id(self))) + + def _siblings(self): + """Hook method for computing root siblings. + + An overridable hook method to return the siblings of the root + element. This is the root element plus the root elements of + all the slave templates. + """ + + return [self.root] + [slave.root for slave in self.slaves] + + def _nsmap(self): + """Hook method for computing the namespace dictionary. + + An overridable hook method to return the namespace dictionary. + The namespace dictionary is computed by taking the master + template's namespace dictionary and updating it from all the + slave templates. + """ + + nsmap = self.nsmap.copy() + for slave in self.slaves: + nsmap.update(slave._nsmap()) + return nsmap + + def attach(self, *slaves): + """Attach one or more slave templates. + + Attaches one or more slave templates to the master template. + Slave templates must have a root element with the same tag as + the master template. The slave template's apply() method will + be called to determine if the slave should be applied to this + master; if it returns False, that slave will be skipped. + (This allows filtering of slaves based on the version of the + master template.) + """ + + slave_list = [] + for slave in slaves: + slave = slave.wrap() + + # Make sure we have a tree match + if slave.root.tag != self.root.tag: + slavetag = slave.root.tag + mastertag = self.root.tag + msg = _("Template tree mismatch; adding slave %(slavetag)s " + "to master %(mastertag)s") % locals() + raise ValueError(msg) + + # Make sure slave applies to this template + if not slave.apply(self): + continue + + slave_list.append(slave) + + # Add the slaves + self.slaves.extend(slave_list) + + def copy(self): + """Return a copy of this master template.""" + + # Return a copy of the MasterTemplate + tmp = self.__class__(self.root, self.version, self.nsmap) + tmp.slaves = self.slaves[:] + return tmp + + +class SlaveTemplate(Template): + """Represent a slave template. + + Slave templates are versioned derivatives of templates. Each + slave has a minimum version and optional maximum version of the + master template to which they can be attached. + """ + + def __init__(self, root, min_vers, max_vers=None, nsmap=None): + """Initialize a slave template. + + :param root: The root element of the template. + :param min_vers: The minimum permissible version of the master + template for this slave template to apply. + :param max_vers: An optional upper bound for the master + template version. + :param nsmap: An optional namespace dictionary to be + associated with the root element of the + template. + """ + + super(SlaveTemplate, self).__init__(root, nsmap) + self.min_vers = min_vers + self.max_vers = max_vers + + def __repr__(self): + """Return string representation of the template.""" + + return ("<%s.%s object versions %s-%s at %#x>" % + (self.__class__.__module__, self.__class__.__name__, + self.min_vers, self.max_vers, id(self))) + + def apply(self, master): + """Hook method for determining slave applicability. + + An overridable hook method used to determine if this template + is applicable as a slave to a given master template. This + version requires the master template to have a version number + between min_vers and max_vers. + + :param master: The master template to test. + """ + + # Does the master meet our minimum version requirement? + if master.version < self.min_vers: + return False + + # How about our maximum version requirement? + if self.max_vers is not None and master.version > self.max_vers: + return False + + return True + + +class TemplateBuilder(object): + """Template builder. + + This class exists to allow templates to be lazily built without + having to build them each time they are needed. It must be + subclassed, and the subclass must implement the construct() + method, which must return a Template (or subclass) instance. The + constructor will always return the template returned by + construct(), or, if it has a copy() method, a copy of that + template. + """ + + _tmpl = None + + def __new__(cls, copy=True): + """Construct and return a template. + + :param copy: If True (the default), a copy of the template + will be constructed and returned, if possible. + """ + + # Do we need to construct the template? + if cls._tmpl is None: + tmp = super(TemplateBuilder, cls).__new__(cls) + + # Construct the template + cls._tmpl = tmp.construct() + + # If the template has a copy attribute, return the result of + # calling it + if copy and hasattr(cls._tmpl, 'copy'): + return cls._tmpl.copy() + + # Return the template + return cls._tmpl + + def construct(self): + """Construct a template. + + Called to construct a template instance, which it must return. + Only called once. + """ + + raise NotImplementedError(_("subclasses must implement construct()!")) + + +def make_links(parent, selector=None): + """ + Attach an Atom <links> element to the parent. + """ + + elem = SubTemplateElement(parent, '{%s}link' % XMLNS_ATOM, + selector=selector) + elem.set('rel') + elem.set('type') + elem.set('href') + + # Just for completeness... + return elem + + +def make_flat_dict(name, selector=None, subselector=None, ns=None): + """ + Utility for simple XML templates that traditionally used + XMLDictSerializer with no metadata. Returns a template element + where the top-level element has the given tag name, and where + sub-elements have tag names derived from the object's keys and + text derived from the object's values. This only works for flat + dictionary objects, not dictionaries containing nested lists or + dictionaries. + """ + + # Set up the names we need... + if ns is None: + elemname = name + tagname = Selector(0) + else: + elemname = '{%s}%s' % (ns, name) + tagname = lambda obj, do_raise=False: '{%s}%s' % (ns, obj[0]) + + if selector is None: + selector = name + + # Build the root element + root = TemplateElement(elemname, selector=selector, + subselector=subselector) + + # Build an element to represent all the keys and values + elem = SubTemplateElement(root, tagname, selector=get_items) + elem.text = 1 + + # Return the template + return root diff --git a/cinder/api/sizelimit.py b/cinder/api/sizelimit.py new file mode 100644 index 000000000..3bde3bf8d --- /dev/null +++ b/cinder/api/sizelimit.py @@ -0,0 +1,54 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2012 OpenStack, LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +""" +Request Body limiting middleware. + +""" + +import webob.dec +import webob.exc + +from cinder import context +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder import wsgi + + +#default request size is 112k +max_request_body_size_opt = cfg.BoolOpt('osapi_max_request_body_size', + default=114688, + help='') + +FLAGS = flags.FLAGS +FLAGS.register_opt(max_request_body_size_opt) +LOG = logging.getLogger(__name__) + + +class RequestBodySizeLimiter(wsgi.Middleware): + """Add a 'cinder.context' to WSGI environ.""" + + def __init__(self, *args, **kwargs): + super(RequestBodySizeLimiter, self).__init__(*args, **kwargs) + + @webob.dec.wsgify(RequestClass=wsgi.Request) + def __call__(self, req): + if (req.content_length > FLAGS.osapi_max_request_body_size + or len(req.body) > FLAGS.osapi_max_request_body_size): + msg = _("Request is too large.") + raise webob.exc.HTTPBadRequest(explanation=msg) + else: + return self.application diff --git a/cinder/common/__init__.py b/cinder/common/__init__.py new file mode 100644 index 000000000..0a3b98867 --- /dev/null +++ b/cinder/common/__init__.py @@ -0,0 +1,15 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 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/cinder/common/memorycache.py b/cinder/common/memorycache.py new file mode 100644 index 000000000..564526092 --- /dev/null +++ b/cinder/common/memorycache.py @@ -0,0 +1,64 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Super simple fake memcache client.""" + +from cinder import utils + + +class Client(object): + """Replicates a tiny subset of memcached client interface.""" + + def __init__(self, *args, **kwargs): + """Ignores the passed in args.""" + self.cache = {} + + def get(self, key): + """Retrieves the value for a key or None. + + this expunges expired keys during each get""" + + for k in self.cache.keys(): + (timeout, _value) = self.cache[k] + if timeout and utils.utcnow_ts() >= timeout: + del self.cache[k] + + return self.cache.get(key, (0, None))[1] + + def set(self, key, value, time=0, min_compress_len=0): + """Sets the value for a key.""" + timeout = 0 + if time != 0: + timeout = utils.utcnow_ts() + time + self.cache[key] = (timeout, value) + return True + + def add(self, key, value, time=0, min_compress_len=0): + """Sets the value for a key if it doesn't exist.""" + if not self.get(key) is None: + return False + return self.set(key, value, time, min_compress_len) + + def incr(self, key, delta=1): + """Increments the value for a key.""" + value = self.get(key) + if value is None: + return None + new_value = int(value) + delta + self.cache[key] = (self.cache[key][0], str(new_value)) + return new_value diff --git a/cinder/common/policy.py b/cinder/common/policy.py new file mode 100644 index 000000000..ec944a1cc --- /dev/null +++ b/cinder/common/policy.py @@ -0,0 +1,222 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 OpenStack, LLC. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Common Policy Engine Implementation""" + +import json +import urllib +import urllib2 + + +class NotAuthorized(Exception): + pass + + +_BRAIN = None + + +def set_brain(brain): + """Set the brain used by enforce(). + + Defaults use Brain() if not set. + + """ + global _BRAIN + _BRAIN = brain + + +def reset(): + """Clear the brain used by enforce().""" + global _BRAIN + _BRAIN = None + + +def enforce(match_list, target_dict, credentials_dict): + """Enforces authorization of some rules against credentials. + + :param match_list: nested tuples of data to match against + + The basic brain supports three types of match lists: + + 1) rules + + looks like: ``('rule:compute:get_instance',)`` + + Retrieves the named rule from the rules dict and recursively + checks against the contents of the rule. + + 2) roles + + looks like: ``('role:compute:admin',)`` + + Matches if the specified role is in credentials_dict['roles']. + + 3) generic + + looks like: ``('tenant_id:%(tenant_id)s',)`` + + Substitutes values from the target dict into the match using + the % operator and matches them against the creds dict. + + Combining rules: + + The brain returns True if any of the outer tuple of rules + match and also True if all of the inner tuples match. You + can use this to perform simple boolean logic. For + example, the following rule would return True if the creds + contain the role 'admin' OR the if the tenant_id matches + the target dict AND the the creds contains the role + 'compute_sysadmin': + + :: + + { + "rule:combined": ( + 'role:admin', + ('tenant_id:%(tenant_id)s', 'role:compute_sysadmin') + ) + } + + Note that rule and role are reserved words in the credentials match, so + you can't match against properties with those names. Custom brains may + also add new reserved words. For example, the HttpBrain adds http as a + reserved word. + + :param target_dict: dict of object properties + + Target dicts contain as much information as we can about the object being + operated on. + + :param credentials_dict: dict of actor properties + + Credentials dicts contain as much information as we can about the user + performing the action. + + :raises NotAuthorized: if the check fails + + """ + global _BRAIN + if not _BRAIN: + _BRAIN = Brain() + if not _BRAIN.check(match_list, target_dict, credentials_dict): + raise NotAuthorized() + + +class Brain(object): + """Implements policy checking.""" + @classmethod + def load_json(cls, data, default_rule=None): + """Init a brain using json instead of a rules dictionary.""" + rules_dict = json.loads(data) + return cls(rules=rules_dict, default_rule=default_rule) + + def __init__(self, rules=None, default_rule=None): + self.rules = rules or {} + self.default_rule = default_rule + + def add_rule(self, key, match): + self.rules[key] = match + + def _check(self, match, target_dict, cred_dict): + match_kind, match_value = match.split(':', 1) + try: + f = getattr(self, '_check_%s' % match_kind) + except AttributeError: + if not self._check_generic(match, target_dict, cred_dict): + return False + else: + if not f(match_value, target_dict, cred_dict): + return False + return True + + def check(self, match_list, target_dict, cred_dict): + """Checks authorization of some rules against credentials. + + Detailed description of the check with examples in policy.enforce(). + + :param match_list: nested tuples of data to match against + :param target_dict: dict of object properties + :param credentials_dict: dict of actor properties + + :returns: True if the check passes + + """ + if not match_list: + return True + for and_list in match_list: + if isinstance(and_list, basestring): + and_list = (and_list,) + if all([self._check(item, target_dict, cred_dict) + for item in and_list]): + return True + return False + + def _check_rule(self, match, target_dict, cred_dict): + """Recursively checks credentials based on the brains rules.""" + try: + new_match_list = self.rules[match] + except KeyError: + if self.default_rule and match != self.default_rule: + new_match_list = ('rule:%s' % self.default_rule,) + else: + return False + + return self.check(new_match_list, target_dict, cred_dict) + + def _check_role(self, match, target_dict, cred_dict): + """Check that there is a matching role in the cred dict.""" + return match.lower() in [x.lower() for x in cred_dict['roles']] + + def _check_generic(self, match, target_dict, cred_dict): + """Check an individual match. + + Matches look like: + + tenant:%(tenant_id)s + role:compute:admin + + """ + + # TODO(termie): do dict inspection via dot syntax + match = match % target_dict + key, value = match.split(':', 1) + if key in cred_dict: + return value == cred_dict[key] + return False + + +class HttpBrain(Brain): + """A brain that can check external urls for policy. + + Posts json blobs for target and credentials. + + """ + + def _check_http(self, match, target_dict, cred_dict): + """Check http: rules by calling to a remote server. + + This example implementation simply verifies that the response is + exactly 'True'. A custom brain using response codes could easily + be implemented. + + """ + url = match % target_dict + data = {'target': json.dumps(target_dict), + 'credentials': json.dumps(cred_dict)} + post_data = urllib.urlencode(data) + f = urllib2.urlopen(url, post_data) + return f.read() == "True" diff --git a/cinder/compat/__init__.py b/cinder/compat/__init__.py new file mode 100644 index 000000000..8f085d939 --- /dev/null +++ b/cinder/compat/__init__.py @@ -0,0 +1,15 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 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/cinder/compat/flagfile.py b/cinder/compat/flagfile.py new file mode 100644 index 000000000..9690217b2 --- /dev/null +++ b/cinder/compat/flagfile.py @@ -0,0 +1,188 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 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. + +import contextlib +import os +import shutil +import tempfile + +''' +Compatibility code for handling the deprecated --flagfile option. + +gflags style configuration files are deprecated and will be removed in future. + +The code in this module transles --flagfile options into --config-file and can +be removed when support for --flagfile is removed. +''' + + +def _get_flagfile(argp): + '''Parse the filename from a --flagfile argument. + + The current and next arguments are passed as a 2 item list. If the + flagfile filename is in the next argument, the two arguments are + joined into the first item while the second item is set to None. + ''' + i = argp[0].find('-flagfile') + if i < 0: + return None + + # Accept -flagfile or -flagfile + if i != 0 and (i != 1 or argp[0][i] != '-'): + return None + + i += len('-flagfile') + if i == len(argp[0]): # Accept [-]-flagfile foo + argp[0] += '=' + argp[1] + argp[1] = None + + if argp[0][i] != '=': # Accept [-]-flagfile=foo + return None + + return argp[0][i + 1:] + + +def _open_file_for_reading(path): + '''Helper method which test code may stub out.''' + return open(path, 'r') + + +def _open_fd_for_writing(fd, _path): + '''Helper method which test code may stub out.''' + return os.fdopen(fd, 'w') + + +def _read_lines(flagfile): + '''Read a flag file, returning all lines with comments stripped.''' + with _open_file_for_reading(flagfile) as f: + lines = f.readlines() + ret = [] + for l in lines: + if l.isspace() or l.startswith('#') or l.startswith('//'): + continue + ret.append(l.strip()) + return ret + + +def _read_flagfile(arg, next_arg, tempdir=None): + '''Convert a --flagfile argument to --config-file. + + If the supplied argument is a --flagfile argument, read the contents + of the file and convert it to a .ini format config file. Return a + --config-file argument with the converted file. + + If the flag file contains more --flagfile arguments, multiple + --config-file arguments will be returned. + + The returned argument list may also contain None values which should + be filtered out later. + ''' + argp = [arg, next_arg] + flagfile = _get_flagfile(argp) + if not flagfile: + return argp + + args = _read_lines(flagfile) + + if args and not args[0].startswith('--'): + # This is a config file, not a flagfile, so return it. + return ['--config-file=' + flagfile] + argp[1:] + + # + # We're recursing here to convert any --flagfile arguments + # read from this flagfile into --config-file arguments + # + # We don't actually include those --config-file arguments + # in the generated config file; instead we include all those + # --config-file args in the final command line + # + args = _iterate_args(args, _read_flagfile, tempdir=tempdir) + + config_file_args = [] + + (fd, tmpconf) = tempfile.mkstemp(suffix='.conf', dir=tempdir) + + with _open_fd_for_writing(fd, tmpconf) as f: + f.write('[DEFAULT]\n') + for arg in args: + if arg.startswith('--config-file='): + config_file_args.append(arg) + continue + if '=' in arg: + f.write(arg[2:] + '\n') + elif arg[2:].startswith('no'): + f.write(arg[4:] + '=false\n') + else: + f.write(arg[2:] + '=true\n') + + return ['--config-file=' + tmpconf] + argp[1:] + config_file_args + + +def _iterate_args(args, iterator, **kwargs): + '''Run an iterator function on the supplied args list. + + The iterator is passed the current arg and next arg and returns a + list of args. The returned args replace the suppied args in the + resulting args list. + + The iterator will be passed None for the next arg when processing + the last arg. + ''' + args.append(None) + + ret = [] + for i in range(len(args)): + if args[i] is None: # last item, or consumed file name + continue + + modified = iterator(args[i], args[i + 1], **kwargs) + args[i], args[i + 1] = modified[:2] + + ret.extend(modified[:1] + modified[2:]) # don't append next arg + + return filter(None, ret) + + +def handle_flagfiles(args, tempdir=None): + '''Replace --flagfile arguments with --config-file arguments. + + Replace any --flagfile argument in the supplied list with a --config-file + argument containing a temporary config file with the contents of the flag + file translated to .ini format. + + The tempdir argument is a directory which will be used to create temporary + files. + ''' + return _iterate_args(args[:], _read_flagfile, tempdir=tempdir) + + +@contextlib.contextmanager +def handle_flagfiles_managed(args): + '''A context manager for handle_flagfiles() which removes temp files. + + For use with the 'with' statement, i.e.:: + + with handle_flagfiles_managed(args) as args: + # Do stuff + # Any temporary fils have been removed + ''' + # NOTE(johannes): Would be nice to use utils.tempdir(), but it + # causes an import loop + tempdir = tempfile.mkdtemp(prefix='cinder-conf-') + try: + yield handle_flagfiles(args, tempdir=tempdir) + finally: + shutil.rmtree(tempdir) diff --git a/cinder/compute/__init__.py b/cinder/compute/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cinder/compute/aggregate_states.py b/cinder/compute/aggregate_states.py new file mode 100644 index 000000000..92e194027 --- /dev/null +++ b/cinder/compute/aggregate_states.py @@ -0,0 +1,44 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC. +# 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. + +"""Possible states for host aggregates. + +An aggregate may be 'created', in which case the admin has triggered its +creation, but the underlying hypervisor pool has not actually being set up +yet. An aggregate may be 'changing', meaning that the underlying hypervisor +pool is being setup. An aggregate may be 'active', in which case the underlying +hypervisor pool is up and running. An aggregate may be 'dismissed' when it has +no hosts and it has been deleted. An aggregate may be in 'error' in all other +cases. +A 'created' aggregate becomes 'changing' during the first request of +adding a host. During a 'changing' status no other requests will be accepted; +this is to allow the hypervisor layer to instantiate the underlying pool +without any potential race condition that may incur in master/slave-based +configurations. The aggregate goes into the 'active' state when the underlying +pool has been correctly instantiated. +All other operations (e.g. add/remove hosts) that succeed will keep the +aggregate in the 'active' state. If a number of continuous requests fail, +an 'active' aggregate goes into an 'error' state. To recover from such a state, +admin intervention is required. Currently an error state is irreversible, +that is, in order to recover from it an aggregate must be deleted. +""" + +CREATED = 'created' +CHANGING = 'changing' +ACTIVE = 'active' +ERROR = 'error' +DISMISSED = 'dismissed' diff --git a/cinder/context.py b/cinder/context.py new file mode 100644 index 000000000..a9b5519c2 --- /dev/null +++ b/cinder/context.py @@ -0,0 +1,138 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""RequestContext: context for requests that persist through all of cinder.""" + +import copy + +from cinder import log as logging +from cinder.openstack.common import local +from cinder import utils + + +LOG = logging.getLogger(__name__) + + +def generate_request_id(): + return 'req-' + str(utils.gen_uuid()) + + +class RequestContext(object): + """Security context and request information. + + Represents the user taking a given action within the system. + + """ + + def __init__(self, user_id, project_id, is_admin=None, read_deleted="no", + roles=None, remote_address=None, timestamp=None, + request_id=None, auth_token=None, overwrite=True, + quota_class=None, **kwargs): + """ + :param read_deleted: 'no' indicates deleted records are hidden, 'yes' + indicates deleted records are visible, 'only' indicates that + *only* deleted records are visible. + + :param overwrite: Set to False to ensure that the greenthread local + copy of the index is not overwritten. + + :param kwargs: Extra arguments that might be present, but we ignore + because they possibly came in from older rpc messages. + """ + if kwargs: + LOG.warn(_('Arguments dropped when creating context: %s') % + str(kwargs)) + + self.user_id = user_id + self.project_id = project_id + self.roles = roles or [] + self.is_admin = is_admin + if self.is_admin is None: + self.is_admin = 'admin' in [x.lower() for x in self.roles] + elif self.is_admin and 'admin' not in self.roles: + self.roles.append('admin') + self.read_deleted = read_deleted + self.remote_address = remote_address + if not timestamp: + timestamp = utils.utcnow() + if isinstance(timestamp, basestring): + timestamp = utils.parse_strtime(timestamp) + self.timestamp = timestamp + if not request_id: + request_id = generate_request_id() + self.request_id = request_id + self.auth_token = auth_token + self.quota_class = quota_class + if overwrite or not hasattr(local.store, 'context'): + self.update_store() + + def _get_read_deleted(self): + return self._read_deleted + + def _set_read_deleted(self, read_deleted): + if read_deleted not in ('no', 'yes', 'only'): + raise ValueError(_("read_deleted can only be one of 'no', " + "'yes' or 'only', not %r") % read_deleted) + self._read_deleted = read_deleted + + def _del_read_deleted(self): + del self._read_deleted + + read_deleted = property(_get_read_deleted, _set_read_deleted, + _del_read_deleted) + + def update_store(self): + local.store.context = self + + def to_dict(self): + return {'user_id': self.user_id, + 'project_id': self.project_id, + 'is_admin': self.is_admin, + 'read_deleted': self.read_deleted, + 'roles': self.roles, + 'remote_address': self.remote_address, + 'timestamp': utils.strtime(self.timestamp), + 'request_id': self.request_id, + 'auth_token': self.auth_token, + 'quota_class': self.quota_class} + + @classmethod + def from_dict(cls, values): + return cls(**values) + + def elevated(self, read_deleted=None, overwrite=False): + """Return a version of this context with admin flag set.""" + context = copy.copy(self) + context.is_admin = True + + if 'admin' not in context.roles: + context.roles.append('admin') + + if read_deleted is not None: + context.read_deleted = read_deleted + + return context + + +def get_admin_context(read_deleted="no"): + return RequestContext(user_id=None, + project_id=None, + is_admin=True, + read_deleted=read_deleted, + overwrite=False) diff --git a/cinder/db/__init__.py b/cinder/db/__init__.py new file mode 100644 index 000000000..f4eb417ec --- /dev/null +++ b/cinder/db/__init__.py @@ -0,0 +1,23 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. +""" +DB abstraction for Cinder +""" + +from cinder.db.api import * diff --git a/cinder/db/api.py b/cinder/db/api.py new file mode 100644 index 000000000..1e39531fd --- /dev/null +++ b/cinder/db/api.py @@ -0,0 +1,1335 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 X.commerce, a business unit of eBay Inc. +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Defines interface for DB access. + +The underlying driver is loaded as a :class:`LazyPluggable`. + +Functions in this module are imported into the cinder.db namespace. Call these +functions from cinder.db namespace, not the cinder.db.api namespace. + +All functions in this module return objects that implement a dictionary-like +interface. Currently, many of these objects are sqlalchemy objects that +implement a dictionary interface. However, a future goal is to have all of +these objects be simple dictionaries. + + +**Related Flags** + +:db_backend: string to lookup in the list of LazyPluggable backends. + `sqlalchemy` is the only supported backend right now. + +:sql_connection: string specifying the sqlalchemy connection to use, like: + `sqlite:///var/lib/cinder/cinder.sqlite`. + +:enable_new_services: when adding a new service to the database, is it in the + pool of available hardware (Default: True) + +""" + +from cinder import exception +from cinder import flags +from cinder.openstack.common import cfg +from cinder import utils + + +db_opts = [ + cfg.StrOpt('db_backend', + default='sqlalchemy', + help='The backend to use for db'), + cfg.BoolOpt('enable_new_services', + default=True, + help='Services to be added to the available pool on create'), + cfg.StrOpt('instance_name_template', + default='instance-%08x', + help='Template string to be used to generate instance names'), + cfg.StrOpt('volume_name_template', + default='volume-%s', + help='Template string to be used to generate instance names'), + cfg.StrOpt('snapshot_name_template', + default='snapshot-%s', + help='Template string to be used to generate snapshot names'), + ] + +FLAGS = flags.FLAGS +FLAGS.register_opts(db_opts) + +IMPL = utils.LazyPluggable('db_backend', + sqlalchemy='cinder.db.sqlalchemy.api') + + +class NoMoreNetworks(exception.Error): + """No more available networks.""" + pass + + +class NoMoreTargets(exception.Error): + """No more available targets""" + pass + + +################### + + +def service_destroy(context, service_id): + """Destroy the service or raise if it does not exist.""" + return IMPL.service_destroy(context, service_id) + + +def service_get(context, service_id): + """Get a service or raise if it does not exist.""" + return IMPL.service_get(context, service_id) + + +def service_get_by_host_and_topic(context, host, topic): + """Get a service by host it's on and topic it listens to.""" + return IMPL.service_get_by_host_and_topic(context, host, topic) + + +def service_get_all(context, disabled=None): + """Get all services.""" + return IMPL.service_get_all(context, disabled) + + +def service_get_all_by_topic(context, topic): + """Get all services for a given topic.""" + return IMPL.service_get_all_by_topic(context, topic) + + +def service_get_all_by_host(context, host): + """Get all services for a given host.""" + return IMPL.service_get_all_by_host(context, host) + + +def service_get_all_compute_by_host(context, host): + """Get all compute services for a given host.""" + return IMPL.service_get_all_compute_by_host(context, host) + + +def service_get_all_compute_sorted(context): + """Get all compute services sorted by instance count. + + :returns: a list of (Service, instance_count) tuples. + + """ + return IMPL.service_get_all_compute_sorted(context) + + +def service_get_all_volume_sorted(context): + """Get all volume services sorted by volume count. + + :returns: a list of (Service, volume_count) tuples. + + """ + return IMPL.service_get_all_volume_sorted(context) + + +def service_get_by_args(context, host, binary): + """Get the state of an service by node name and binary.""" + return IMPL.service_get_by_args(context, host, binary) + + +def service_create(context, values): + """Create a service from the values dictionary.""" + return IMPL.service_create(context, values) + + +def service_update(context, service_id, values): + """Set the given properties on an service and update it. + + Raises NotFound if service does not exist. + + """ + return IMPL.service_update(context, service_id, values) + + +################### + + +def compute_node_get(context, compute_id): + """Get an computeNode or raise if it does not exist.""" + return IMPL.compute_node_get(context, compute_id) + + +def compute_node_get_all(context): + """Get all computeNodes.""" + return IMPL.compute_node_get_all(context) + + +def compute_node_create(context, values): + """Create a computeNode from the values dictionary.""" + return IMPL.compute_node_create(context, values) + + +def compute_node_update(context, compute_id, values, auto_adjust=True): + """Set the given properties on an computeNode and update it. + + Raises NotFound if computeNode does not exist. + """ + return IMPL.compute_node_update(context, compute_id, values, auto_adjust) + + +def compute_node_get_by_host(context, host): + return IMPL.compute_node_get_by_host(context, host) + + +def compute_node_utilization_update(context, host, free_ram_mb_delta=0, + free_disk_gb_delta=0, work_delta=0, vm_delta=0): + return IMPL.compute_node_utilization_update(context, host, + free_ram_mb_delta, free_disk_gb_delta, work_delta, + vm_delta) + + +def compute_node_utilization_set(context, host, free_ram_mb=None, + free_disk_gb=None, work=None, vms=None): + return IMPL.compute_node_utilization_set(context, host, free_ram_mb, + free_disk_gb, work, vms) + +################### + + +def certificate_create(context, values): + """Create a certificate from the values dictionary.""" + return IMPL.certificate_create(context, values) + + +def certificate_get_all_by_project(context, project_id): + """Get all certificates for a project.""" + return IMPL.certificate_get_all_by_project(context, project_id) + + +def certificate_get_all_by_user(context, user_id): + """Get all certificates for a user.""" + return IMPL.certificate_get_all_by_user(context, user_id) + + +def certificate_get_all_by_user_and_project(context, user_id, project_id): + """Get all certificates for a user and project.""" + return IMPL.certificate_get_all_by_user_and_project(context, + user_id, + project_id) + + +################### + +def floating_ip_get(context, id): + return IMPL.floating_ip_get(context, id) + + +def floating_ip_get_pools(context): + """Returns a list of floating ip pools""" + return IMPL.floating_ip_get_pools(context) + + +def floating_ip_allocate_address(context, project_id, pool): + """Allocate free floating ip from specified pool and return the address. + + Raises if one is not available. + + """ + return IMPL.floating_ip_allocate_address(context, project_id, pool) + + +def floating_ip_create(context, values): + """Create a floating ip from the values dictionary.""" + return IMPL.floating_ip_create(context, values) + + +def floating_ip_count_by_project(context, project_id): + """Count floating ips used by project.""" + return IMPL.floating_ip_count_by_project(context, project_id) + + +def floating_ip_deallocate(context, address): + """Deallocate an floating ip by address.""" + return IMPL.floating_ip_deallocate(context, address) + + +def floating_ip_destroy(context, address): + """Destroy the floating_ip or raise if it does not exist.""" + return IMPL.floating_ip_destroy(context, address) + + +def floating_ip_disassociate(context, address): + """Disassociate an floating ip from a fixed ip by address. + + :returns: the address of the existing fixed ip. + + """ + return IMPL.floating_ip_disassociate(context, address) + + +def floating_ip_fixed_ip_associate(context, floating_address, + fixed_address, host): + """Associate an floating ip to a fixed_ip by address.""" + return IMPL.floating_ip_fixed_ip_associate(context, + floating_address, + fixed_address, + host) + + +def floating_ip_get_all(context): + """Get all floating ips.""" + return IMPL.floating_ip_get_all(context) + + +def floating_ip_get_all_by_host(context, host): + """Get all floating ips by host.""" + return IMPL.floating_ip_get_all_by_host(context, host) + + +def floating_ip_get_all_by_project(context, project_id): + """Get all floating ips by project.""" + return IMPL.floating_ip_get_all_by_project(context, project_id) + + +def floating_ip_get_by_address(context, address): + """Get a floating ip by address or raise if it doesn't exist.""" + return IMPL.floating_ip_get_by_address(context, address) + + +def floating_ip_get_by_fixed_address(context, fixed_address): + """Get a floating ips by fixed address""" + return IMPL.floating_ip_get_by_fixed_address(context, fixed_address) + + +def floating_ip_get_by_fixed_ip_id(context, fixed_ip_id): + """Get a floating ips by fixed address""" + return IMPL.floating_ip_get_by_fixed_ip_id(context, fixed_ip_id) + + +def floating_ip_update(context, address, values): + """Update a floating ip by address or raise if it doesn't exist.""" + return IMPL.floating_ip_update(context, address, values) + + +def floating_ip_set_auto_assigned(context, address): + """Set auto_assigned flag to floating ip""" + return IMPL.floating_ip_set_auto_assigned(context, address) + + +def dnsdomain_list(context): + """Get a list of all zones in our database, public and private.""" + return IMPL.dnsdomain_list(context) + + +def dnsdomain_register_for_zone(context, fqdomain, zone): + """Associated a DNS domain with an availability zone""" + return IMPL.dnsdomain_register_for_zone(context, fqdomain, zone) + + +def dnsdomain_register_for_project(context, fqdomain, project): + """Associated a DNS domain with a project id""" + return IMPL.dnsdomain_register_for_project(context, fqdomain, project) + + +def dnsdomain_unregister(context, fqdomain): + """Purge associations for the specified DNS zone""" + return IMPL.dnsdomain_unregister(context, fqdomain) + + +def dnsdomain_get(context, fqdomain): + """Get the db record for the specified domain.""" + return IMPL.dnsdomain_get(context, fqdomain) + + +#################### + + +def migration_update(context, id, values): + """Update a migration instance.""" + return IMPL.migration_update(context, id, values) + + +def migration_create(context, values): + """Create a migration record.""" + return IMPL.migration_create(context, values) + + +def migration_get(context, migration_id): + """Finds a migration by the id.""" + return IMPL.migration_get(context, migration_id) + + +def migration_get_by_instance_and_status(context, instance_uuid, status): + """Finds a migration by the instance uuid its migrating.""" + return IMPL.migration_get_by_instance_and_status(context, instance_uuid, + status) + + +def migration_get_all_unconfirmed(context, confirm_window): + """Finds all unconfirmed migrations within the confirmation window.""" + return IMPL.migration_get_all_unconfirmed(context, confirm_window) + + +################### + + +def queue_get_for(context, topic, physical_node_id): + """Return a channel to send a message to a node with a topic.""" + return IMPL.queue_get_for(context, topic, physical_node_id) + + +################### + + +def iscsi_target_count_by_host(context, host): + """Return count of export devices.""" + return IMPL.iscsi_target_count_by_host(context, host) + + +def iscsi_target_create_safe(context, values): + """Create an iscsi_target from the values dictionary. + + The device is not returned. If the create violates the unique + constraints because the iscsi_target and host already exist, + no exception is raised. + + """ + return IMPL.iscsi_target_create_safe(context, values) + + +############### + + +def auth_token_destroy(context, token_id): + """Destroy an auth token.""" + return IMPL.auth_token_destroy(context, token_id) + + +def auth_token_get(context, token_hash): + """Retrieves a token given the hash representing it.""" + return IMPL.auth_token_get(context, token_hash) + + +def auth_token_update(context, token_hash, values): + """Updates a token given the hash representing it.""" + return IMPL.auth_token_update(context, token_hash, values) + + +def auth_token_create(context, token): + """Creates a new token.""" + return IMPL.auth_token_create(context, token) + + +################### + + +def quota_create(context, project_id, resource, limit): + """Create a quota for the given project and resource.""" + return IMPL.quota_create(context, project_id, resource, limit) + + +def quota_get(context, project_id, resource): + """Retrieve a quota or raise if it does not exist.""" + return IMPL.quota_get(context, project_id, resource) + + +def quota_get_all_by_project(context, project_id): + """Retrieve all quotas associated with a given project.""" + return IMPL.quota_get_all_by_project(context, project_id) + + +def quota_update(context, project_id, resource, limit): + """Update a quota or raise if it does not exist.""" + return IMPL.quota_update(context, project_id, resource, limit) + + +def quota_destroy(context, project_id, resource): + """Destroy the quota or raise if it does not exist.""" + return IMPL.quota_destroy(context, project_id, resource) + + +def quota_destroy_all_by_project(context, project_id): + """Destroy all quotas associated with a given project.""" + return IMPL.quota_get_all_by_project(context, project_id) + + +################### + + +def quota_class_create(context, class_name, resource, limit): + """Create a quota class for the given name and resource.""" + return IMPL.quota_class_create(context, class_name, resource, limit) + + +def quota_class_get(context, class_name, resource): + """Retrieve a quota class or raise if it does not exist.""" + return IMPL.quota_class_get(context, class_name, resource) + + +def quota_class_get_all_by_name(context, class_name): + """Retrieve all quotas associated with a given quota class.""" + return IMPL.quota_class_get_all_by_name(context, class_name) + + +def quota_class_update(context, class_name, resource, limit): + """Update a quota class or raise if it does not exist.""" + return IMPL.quota_class_update(context, class_name, resource, limit) + + +def quota_class_destroy(context, class_name, resource): + """Destroy the quota class or raise if it does not exist.""" + return IMPL.quota_class_destroy(context, class_name, resource) + + +def quota_class_destroy_all_by_name(context, class_name): + """Destroy all quotas associated with a given quota class.""" + return IMPL.quota_class_destroy_all_by_name(context, class_name) + + +################### + + +def volume_allocate_iscsi_target(context, volume_id, host): + """Atomically allocate a free iscsi_target from the pool.""" + return IMPL.volume_allocate_iscsi_target(context, volume_id, host) + + +def volume_attached(context, volume_id, instance_id, mountpoint): + """Ensure that a volume is set as attached.""" + return IMPL.volume_attached(context, volume_id, instance_id, mountpoint) + + +def volume_create(context, values): + """Create a volume from the values dictionary.""" + return IMPL.volume_create(context, values) + + +def volume_data_get_for_project(context, project_id): + """Get (volume_count, gigabytes) for project.""" + return IMPL.volume_data_get_for_project(context, project_id) + + +def volume_destroy(context, volume_id): + """Destroy the volume or raise if it does not exist.""" + return IMPL.volume_destroy(context, volume_id) + + +def volume_detached(context, volume_id): + """Ensure that a volume is set as detached.""" + return IMPL.volume_detached(context, volume_id) + + +def volume_get(context, volume_id): + """Get a volume or raise if it does not exist.""" + return IMPL.volume_get(context, volume_id) + + +def volume_get_all(context): + """Get all volumes.""" + return IMPL.volume_get_all(context) + + +def volume_get_all_by_host(context, host): + """Get all volumes belonging to a host.""" + return IMPL.volume_get_all_by_host(context, host) + + +def volume_get_all_by_instance(context, instance_id): + """Get all volumes belonging to a instance.""" + return IMPL.volume_get_all_by_instance(context, instance_id) + + +def volume_get_all_by_project(context, project_id): + """Get all volumes belonging to a project.""" + return IMPL.volume_get_all_by_project(context, project_id) + + +def volume_get_instance(context, volume_id): + """Get the instance that a volume is attached to.""" + return IMPL.volume_get_instance(context, volume_id) + + +def volume_get_iscsi_target_num(context, volume_id): + """Get the target num (tid) allocated to the volume.""" + return IMPL.volume_get_iscsi_target_num(context, volume_id) + + +def volume_update(context, volume_id, values): + """Set the given properties on an volume and update it. + + Raises NotFound if volume does not exist. + + """ + return IMPL.volume_update(context, volume_id, values) + + +#################### + + +def snapshot_create(context, values): + """Create a snapshot from the values dictionary.""" + return IMPL.snapshot_create(context, values) + + +def snapshot_destroy(context, snapshot_id): + """Destroy the snapshot or raise if it does not exist.""" + return IMPL.snapshot_destroy(context, snapshot_id) + + +def snapshot_get(context, snapshot_id): + """Get a snapshot or raise if it does not exist.""" + return IMPL.snapshot_get(context, snapshot_id) + + +def snapshot_get_all(context): + """Get all snapshots.""" + return IMPL.snapshot_get_all(context) + + +def snapshot_get_all_by_project(context, project_id): + """Get all snapshots belonging to a project.""" + return IMPL.snapshot_get_all_by_project(context, project_id) + + +def snapshot_get_all_for_volume(context, volume_id): + """Get all snapshots for a volume.""" + return IMPL.snapshot_get_all_for_volume(context, volume_id) + + +def snapshot_update(context, snapshot_id, values): + """Set the given properties on an snapshot and update it. + + Raises NotFound if snapshot does not exist. + + """ + return IMPL.snapshot_update(context, snapshot_id, values) + + +#################### + + +def block_device_mapping_create(context, values): + """Create an entry of block device mapping""" + return IMPL.block_device_mapping_create(context, values) + + +def block_device_mapping_update(context, bdm_id, values): + """Update an entry of block device mapping""" + return IMPL.block_device_mapping_update(context, bdm_id, values) + + +def block_device_mapping_update_or_create(context, values): + """Update an entry of block device mapping. + If not existed, create a new entry""" + return IMPL.block_device_mapping_update_or_create(context, values) + + +def block_device_mapping_get_all_by_instance(context, instance_uuid): + """Get all block device mapping belonging to a instance""" + return IMPL.block_device_mapping_get_all_by_instance(context, + instance_uuid) + + +def block_device_mapping_destroy(context, bdm_id): + """Destroy the block device mapping.""" + return IMPL.block_device_mapping_destroy(context, bdm_id) + + +def block_device_mapping_destroy_by_instance_and_volume(context, instance_uuid, + volume_id): + """Destroy the block device mapping or raise if it does not exist.""" + return IMPL.block_device_mapping_destroy_by_instance_and_volume( + context, instance_uuid, volume_id) + + +#################### + + +def security_group_get_all(context): + """Get all security groups.""" + return IMPL.security_group_get_all(context) + + +def security_group_get(context, security_group_id): + """Get security group by its id.""" + return IMPL.security_group_get(context, security_group_id) + + +def security_group_get_by_name(context, project_id, group_name): + """Returns a security group with the specified name from a project.""" + return IMPL.security_group_get_by_name(context, project_id, group_name) + + +def security_group_get_by_project(context, project_id): + """Get all security groups belonging to a project.""" + return IMPL.security_group_get_by_project(context, project_id) + + +def security_group_get_by_instance(context, instance_id): + """Get security groups to which the instance is assigned.""" + return IMPL.security_group_get_by_instance(context, instance_id) + + +def security_group_exists(context, project_id, group_name): + """Indicates if a group name exists in a project.""" + return IMPL.security_group_exists(context, project_id, group_name) + + +def security_group_in_use(context, group_id): + """Indicates if a security group is currently in use.""" + return IMPL.security_group_in_use(context, group_id) + + +def security_group_create(context, values): + """Create a new security group.""" + return IMPL.security_group_create(context, values) + + +def security_group_destroy(context, security_group_id): + """Deletes a security group.""" + return IMPL.security_group_destroy(context, security_group_id) + + +def security_group_count_by_project(context, project_id): + """Count number of security groups in a project.""" + return IMPL.security_group_count_by_project(context, project_id) + + +#################### + + +def security_group_rule_create(context, values): + """Create a new security group.""" + return IMPL.security_group_rule_create(context, values) + + +def security_group_rule_get_by_security_group(context, security_group_id): + """Get all rules for a a given security group.""" + return IMPL.security_group_rule_get_by_security_group(context, + security_group_id) + + +def security_group_rule_get_by_security_group_grantee(context, + security_group_id): + """Get all rules that grant access to the given security group.""" + return IMPL.security_group_rule_get_by_security_group_grantee(context, + security_group_id) + + +def security_group_rule_destroy(context, security_group_rule_id): + """Deletes a security group rule.""" + return IMPL.security_group_rule_destroy(context, security_group_rule_id) + + +def security_group_rule_get(context, security_group_rule_id): + """Gets a security group rule.""" + return IMPL.security_group_rule_get(context, security_group_rule_id) + + +def security_group_rule_count_by_group(context, security_group_id): + """Count rules in a given security group.""" + return IMPL.security_group_rule_count_by_group(context, security_group_id) + + +################### + + +def provider_fw_rule_create(context, rule): + """Add a firewall rule at the provider level (all hosts & instances).""" + return IMPL.provider_fw_rule_create(context, rule) + + +def provider_fw_rule_get_all(context): + """Get all provider-level firewall rules.""" + return IMPL.provider_fw_rule_get_all(context) + + +def provider_fw_rule_destroy(context, rule_id): + """Delete a provider firewall rule from the database.""" + return IMPL.provider_fw_rule_destroy(context, rule_id) + + +################### + + +def user_get(context, id): + """Get user by id.""" + return IMPL.user_get(context, id) + + +def user_get_by_uid(context, uid): + """Get user by uid.""" + return IMPL.user_get_by_uid(context, uid) + + +def user_get_by_access_key(context, access_key): + """Get user by access key.""" + return IMPL.user_get_by_access_key(context, access_key) + + +def user_create(context, values): + """Create a new user.""" + return IMPL.user_create(context, values) + + +def user_delete(context, id): + """Delete a user.""" + return IMPL.user_delete(context, id) + + +def user_get_all(context): + """Create a new user.""" + return IMPL.user_get_all(context) + + +def user_add_role(context, user_id, role): + """Add another global role for user.""" + return IMPL.user_add_role(context, user_id, role) + + +def user_remove_role(context, user_id, role): + """Remove global role from user.""" + return IMPL.user_remove_role(context, user_id, role) + + +def user_get_roles(context, user_id): + """Get global roles for user.""" + return IMPL.user_get_roles(context, user_id) + + +def user_add_project_role(context, user_id, project_id, role): + """Add project role for user.""" + return IMPL.user_add_project_role(context, user_id, project_id, role) + + +def user_remove_project_role(context, user_id, project_id, role): + """Remove project role from user.""" + return IMPL.user_remove_project_role(context, user_id, project_id, role) + + +def user_get_roles_for_project(context, user_id, project_id): + """Return list of roles a user holds on project.""" + return IMPL.user_get_roles_for_project(context, user_id, project_id) + + +def user_update(context, user_id, values): + """Update user.""" + return IMPL.user_update(context, user_id, values) + + +################### + + +def project_get(context, id): + """Get project by id.""" + return IMPL.project_get(context, id) + + +def project_create(context, values): + """Create a new project.""" + return IMPL.project_create(context, values) + + +def project_add_member(context, project_id, user_id): + """Add user to project.""" + return IMPL.project_add_member(context, project_id, user_id) + + +def project_get_all(context): + """Get all projects.""" + return IMPL.project_get_all(context) + + +def project_get_by_user(context, user_id): + """Get all projects of which the given user is a member.""" + return IMPL.project_get_by_user(context, user_id) + + +def project_remove_member(context, project_id, user_id): + """Remove the given user from the given project.""" + return IMPL.project_remove_member(context, project_id, user_id) + + +def project_update(context, project_id, values): + """Update Remove the given user from the given project.""" + return IMPL.project_update(context, project_id, values) + + +def project_delete(context, project_id): + """Delete project.""" + return IMPL.project_delete(context, project_id) + + +def project_get_networks(context, project_id, associate=True): + """Return the network associated with the project. + + If associate is true, it will attempt to associate a new + network if one is not found, otherwise it returns None. + + """ + return IMPL.project_get_networks(context, project_id, associate) + + +################### + + +def console_pool_create(context, values): + """Create console pool.""" + return IMPL.console_pool_create(context, values) + + +def console_pool_get(context, pool_id): + """Get a console pool.""" + return IMPL.console_pool_get(context, pool_id) + + +def console_pool_get_by_host_type(context, compute_host, proxy_host, + console_type): + """Fetch a console pool for a given proxy host, compute host, and type.""" + return IMPL.console_pool_get_by_host_type(context, + compute_host, + proxy_host, + console_type) + + +def console_pool_get_all_by_host_type(context, host, console_type): + """Fetch all pools for given proxy host and type.""" + return IMPL.console_pool_get_all_by_host_type(context, + host, + console_type) + + +def console_create(context, values): + """Create a console.""" + return IMPL.console_create(context, values) + + +def console_delete(context, console_id): + """Delete a console.""" + return IMPL.console_delete(context, console_id) + + +def console_get_by_pool_instance(context, pool_id, instance_id): + """Get console entry for a given instance and pool.""" + return IMPL.console_get_by_pool_instance(context, pool_id, instance_id) + + +def console_get_all_by_instance(context, instance_id): + """Get consoles for a given instance.""" + return IMPL.console_get_all_by_instance(context, instance_id) + + +def console_get(context, console_id, instance_id=None): + """Get a specific console (possibly on a given instance).""" + return IMPL.console_get(context, console_id, instance_id) + + + ################## + + +def instance_type_create(context, values): + """Create a new instance type.""" + return IMPL.instance_type_create(context, values) + + +def instance_type_get_all(context, inactive=False, filters=None): + """Get all instance types.""" + return IMPL.instance_type_get_all( + context, inactive=inactive, filters=filters) + + +def instance_type_get(context, id): + """Get instance type by id.""" + return IMPL.instance_type_get(context, id) + + +def instance_type_get_by_name(context, name): + """Get instance type by name.""" + return IMPL.instance_type_get_by_name(context, name) + + +def instance_type_get_by_flavor_id(context, id): + """Get instance type by name.""" + return IMPL.instance_type_get_by_flavor_id(context, id) + + +def instance_type_destroy(context, name): + """Delete a instance type.""" + return IMPL.instance_type_destroy(context, name) + + +#################### + + +def cell_create(context, values): + """Create a new child Cell entry.""" + return IMPL.cell_create(context, values) + + +def cell_update(context, cell_id, values): + """Update a child Cell entry.""" + return IMPL.cell_update(context, cell_id, values) + + +def cell_delete(context, cell_id): + """Delete a child Cell.""" + return IMPL.cell_delete(context, cell_id) + + +def cell_get(context, cell_id): + """Get a specific child Cell.""" + return IMPL.cell_get(context, cell_id) + + +def cell_get_all(context): + """Get all child Cells.""" + return IMPL.cell_get_all(context) + + +#################### + + +def instance_metadata_get(context, instance_id): + """Get all metadata for an instance.""" + return IMPL.instance_metadata_get(context, instance_id) + + +def instance_metadata_delete(context, instance_id, key): + """Delete the given metadata item.""" + IMPL.instance_metadata_delete(context, instance_id, key) + + +def instance_metadata_update(context, instance_id, metadata, delete): + """Update metadata if it exists, otherwise create it.""" + IMPL.instance_metadata_update(context, instance_id, metadata, delete) + + +#################### + + +def agent_build_create(context, values): + """Create a new agent build entry.""" + return IMPL.agent_build_create(context, values) + + +def agent_build_get_by_triple(context, hypervisor, os, architecture): + """Get agent build by hypervisor/OS/architecture triple.""" + return IMPL.agent_build_get_by_triple(context, hypervisor, os, + architecture) + + +def agent_build_get_all(context): + """Get all agent builds.""" + return IMPL.agent_build_get_all(context) + + +def agent_build_destroy(context, agent_update_id): + """Destroy agent build entry.""" + IMPL.agent_build_destroy(context, agent_update_id) + + +def agent_build_update(context, agent_build_id, values): + """Update agent build entry.""" + IMPL.agent_build_update(context, agent_build_id, values) + + +#################### + + +def bw_usage_get_by_uuids(context, uuids, start_period): + """Return bw usages for instance(s) in a given audit period.""" + return IMPL.bw_usage_get_by_uuids(context, uuids, start_period) + + +def bw_usage_update(context, + uuid, + mac, + start_period, + bw_in, bw_out): + """Update cached bw usage for an instance and network + Creates new record if needed.""" + return IMPL.bw_usage_update(context, + uuid, + mac, + start_period, + bw_in, bw_out) + + +#################### + + +def instance_type_extra_specs_get(context, instance_type_id): + """Get all extra specs for an instance type.""" + return IMPL.instance_type_extra_specs_get(context, instance_type_id) + + +def instance_type_extra_specs_delete(context, instance_type_id, key): + """Delete the given extra specs item.""" + IMPL.instance_type_extra_specs_delete(context, instance_type_id, key) + + +def instance_type_extra_specs_update_or_create(context, instance_type_id, + extra_specs): + """Create or update instance type extra specs. This adds or modifies the + key/value pairs specified in the extra specs dict argument""" + IMPL.instance_type_extra_specs_update_or_create(context, instance_type_id, + extra_specs) + + +################## + + +def volume_metadata_get(context, volume_id): + """Get all metadata for a volume.""" + return IMPL.volume_metadata_get(context, volume_id) + + +def volume_metadata_delete(context, volume_id, key): + """Delete the given metadata item.""" + IMPL.volume_metadata_delete(context, volume_id, key) + + +def volume_metadata_update(context, volume_id, metadata, delete): + """Update metadata if it exists, otherwise create it.""" + IMPL.volume_metadata_update(context, volume_id, metadata, delete) + + +################## + + +def volume_type_create(context, values): + """Create a new volume type.""" + return IMPL.volume_type_create(context, values) + + +def volume_type_get_all(context, inactive=False): + """Get all volume types.""" + return IMPL.volume_type_get_all(context, inactive) + + +def volume_type_get(context, id): + """Get volume type by id.""" + return IMPL.volume_type_get(context, id) + + +def volume_type_get_by_name(context, name): + """Get volume type by name.""" + return IMPL.volume_type_get_by_name(context, name) + + +def volume_type_destroy(context, name): + """Delete a volume type.""" + return IMPL.volume_type_destroy(context, name) + + +#################### + + +def volume_type_extra_specs_get(context, volume_type_id): + """Get all extra specs for a volume type.""" + return IMPL.volume_type_extra_specs_get(context, volume_type_id) + + +def volume_type_extra_specs_delete(context, volume_type_id, key): + """Delete the given extra specs item.""" + IMPL.volume_type_extra_specs_delete(context, volume_type_id, key) + + +def volume_type_extra_specs_update_or_create(context, volume_type_id, + extra_specs): + """Create or update volume type extra specs. This adds or modifies the + key/value pairs specified in the extra specs dict argument""" + IMPL.volume_type_extra_specs_update_or_create(context, volume_type_id, + extra_specs) + + +################### + + +def s3_image_get(context, image_id): + """Find local s3 image represented by the provided id""" + return IMPL.s3_image_get(context, image_id) + + +def s3_image_get_by_uuid(context, image_uuid): + """Find local s3 image represented by the provided uuid""" + return IMPL.s3_image_get_by_uuid(context, image_uuid) + + +def s3_image_create(context, image_uuid): + """Create local s3 image represented by provided uuid""" + return IMPL.s3_image_create(context, image_uuid) + + +#################### + + +def sm_backend_conf_create(context, values): + """Create a new SM Backend Config entry.""" + return IMPL.sm_backend_conf_create(context, values) + + +def sm_backend_conf_update(context, sm_backend_conf_id, values): + """Update a SM Backend Config entry.""" + return IMPL.sm_backend_conf_update(context, sm_backend_conf_id, values) + + +def sm_backend_conf_delete(context, sm_backend_conf_id): + """Delete a SM Backend Config.""" + return IMPL.sm_backend_conf_delete(context, sm_backend_conf_id) + + +def sm_backend_conf_get(context, sm_backend_conf_id): + """Get a specific SM Backend Config.""" + return IMPL.sm_backend_conf_get(context, sm_backend_conf_id) + + +def sm_backend_conf_get_by_sr(context, sr_uuid): + """Get a specific SM Backend Config.""" + return IMPL.sm_backend_conf_get_by_sr(context, sr_uuid) + + +def sm_backend_conf_get_all(context): + """Get all SM Backend Configs.""" + return IMPL.sm_backend_conf_get_all(context) + + +#################### + + +def sm_flavor_create(context, values): + """Create a new SM Flavor entry.""" + return IMPL.sm_flavor_create(context, values) + + +def sm_flavor_update(context, sm_flavor_id, values): + """Update a SM Flavor entry.""" + return IMPL.sm_flavor_update(context, values) + + +def sm_flavor_delete(context, sm_flavor_id): + """Delete a SM Flavor.""" + return IMPL.sm_flavor_delete(context, sm_flavor_id) + + +def sm_flavor_get(context, sm_flavor): + """Get a specific SM Flavor.""" + return IMPL.sm_flavor_get(context, sm_flavor) + + +def sm_flavor_get_all(context): + """Get all SM Flavors.""" + return IMPL.sm_flavor_get_all(context) + + +#################### + + +def sm_volume_create(context, values): + """Create a new child Zone entry.""" + return IMPL.sm_volume_create(context, values) + + +def sm_volume_update(context, volume_id, values): + """Update a child Zone entry.""" + return IMPL.sm_volume_update(context, values) + + +def sm_volume_delete(context, volume_id): + """Delete a child Zone.""" + return IMPL.sm_volume_delete(context, volume_id) + + +def sm_volume_get(context, volume_id): + """Get a specific child Zone.""" + return IMPL.sm_volume_get(context, volume_id) + + +def sm_volume_get_all(context): + """Get all child Zones.""" + return IMPL.sm_volume_get_all(context) + + +#################### + + +def aggregate_create(context, values, metadata=None): + """Create a new aggregate with metadata.""" + return IMPL.aggregate_create(context, values, metadata) + + +def aggregate_get(context, aggregate_id): + """Get a specific aggregate by id.""" + return IMPL.aggregate_get(context, aggregate_id) + + +def aggregate_get_by_host(context, host): + """Get a specific aggregate by host""" + return IMPL.aggregate_get_by_host(context, host) + + +def aggregate_update(context, aggregate_id, values): + """Update the attributes of an aggregates. If values contains a metadata + key, it updates the aggregate metadata too.""" + return IMPL.aggregate_update(context, aggregate_id, values) + + +def aggregate_delete(context, aggregate_id): + """Delete an aggregate.""" + return IMPL.aggregate_delete(context, aggregate_id) + + +def aggregate_get_all(context): + """Get all aggregates.""" + return IMPL.aggregate_get_all(context) + + +def aggregate_metadata_add(context, aggregate_id, metadata, set_delete=False): + """Add/update metadata. If set_delete=True, it adds only.""" + IMPL.aggregate_metadata_add(context, aggregate_id, metadata, set_delete) + + +def aggregate_metadata_get(context, aggregate_id): + """Get metadata for the specified aggregate.""" + return IMPL.aggregate_metadata_get(context, aggregate_id) + + +def aggregate_metadata_delete(context, aggregate_id, key): + """Delete the given metadata key.""" + IMPL.aggregate_metadata_delete(context, aggregate_id, key) + + +def aggregate_host_add(context, aggregate_id, host): + """Add host to the aggregate.""" + IMPL.aggregate_host_add(context, aggregate_id, host) + + +def aggregate_host_get_all(context, aggregate_id): + """Get hosts for the specified aggregate.""" + return IMPL.aggregate_host_get_all(context, aggregate_id) + + +def aggregate_host_delete(context, aggregate_id, host): + """Delete the given host from the aggregate.""" + IMPL.aggregate_host_delete(context, aggregate_id, host) + + +#################### + + +def instance_fault_create(context, values): + """Create a new Instance Fault.""" + return IMPL.instance_fault_create(context, values) + + +def instance_fault_get_by_instance_uuids(context, instance_uuids): + """Get all instance faults for the provided instance_uuids.""" + return IMPL.instance_fault_get_by_instance_uuids(context, instance_uuids) diff --git a/cinder/db/base.py b/cinder/db/base.py new file mode 100644 index 000000000..8b9d437c6 --- /dev/null +++ b/cinder/db/base.py @@ -0,0 +1,40 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Base class for classes that need modular database access.""" + +from cinder import flags +from cinder.openstack.common import cfg +from cinder.openstack.common import importutils + + +db_driver_opt = cfg.StrOpt('db_driver', + default='cinder.db', + help='driver to use for database access') + +FLAGS = flags.FLAGS +FLAGS.register_opt(db_driver_opt) + + +class Base(object): + """DB driver is injected in the init method.""" + + def __init__(self, db_driver=None): + if not db_driver: + db_driver = FLAGS.db_driver + self.db = importutils.import_module(db_driver) # pylint: disable=C0103 diff --git a/cinder/db/migration.py b/cinder/db/migration.py new file mode 100644 index 000000000..87147ce92 --- /dev/null +++ b/cinder/db/migration.py @@ -0,0 +1,35 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Database setup and migration commands.""" + +from cinder import utils + + +IMPL = utils.LazyPluggable('db_backend', + sqlalchemy='cinder.db.sqlalchemy.migration') + + +def db_sync(version=None): + """Migrate the database to `version` or the most recent version.""" + return IMPL.db_sync(version=version) + + +def db_version(): + """Display the current database version.""" + return IMPL.db_version() diff --git a/cinder/db/sqlalchemy/__init__.py b/cinder/db/sqlalchemy/__init__.py new file mode 100644 index 000000000..747015af5 --- /dev/null +++ b/cinder/db/sqlalchemy/__init__.py @@ -0,0 +1,17 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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/cinder/db/sqlalchemy/api.py b/cinder/db/sqlalchemy/api.py new file mode 100644 index 000000000..2d40b3046 --- /dev/null +++ b/cinder/db/sqlalchemy/api.py @@ -0,0 +1,1499 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 X.commerce, a business unit of eBay Inc. +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Implementation of SQLAlchemy backend.""" + +import datetime +import functools +import warnings + +from cinder import db +from cinder import exception +from cinder import flags +from cinder import utils +from cinder import log as logging +from cinder.compute import aggregate_states +from cinder.db.sqlalchemy import models +from cinder.db.sqlalchemy.session import get_session +from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import joinedload +from sqlalchemy.sql import func +from sqlalchemy.sql.expression import literal_column + +FLAGS = flags.FLAGS + +LOG = logging.getLogger(__name__) + + +def is_admin_context(context): + """Indicates if the request context is an administrator.""" + if not context: + warnings.warn(_('Use of empty request context is deprecated'), + DeprecationWarning) + raise Exception('die') + return context.is_admin + + +def is_user_context(context): + """Indicates if the request context is a normal user.""" + if not context: + return False + if context.is_admin: + return False + if not context.user_id or not context.project_id: + return False + return True + + +def authorize_project_context(context, project_id): + """Ensures a request has permission to access the given project.""" + if is_user_context(context): + if not context.project_id: + raise exception.NotAuthorized() + elif context.project_id != project_id: + raise exception.NotAuthorized() + + +def authorize_user_context(context, user_id): + """Ensures a request has permission to access the given user.""" + if is_user_context(context): + if not context.user_id: + raise exception.NotAuthorized() + elif context.user_id != user_id: + raise exception.NotAuthorized() + + +def authorize_quota_class_context(context, class_name): + """Ensures a request has permission to access the given quota class.""" + if is_user_context(context): + if not context.quota_class: + raise exception.NotAuthorized() + elif context.quota_class != class_name: + raise exception.NotAuthorized() + + +def require_admin_context(f): + """Decorator to require admin request context. + + The first argument to the wrapped function must be the context. + + """ + + def wrapper(*args, **kwargs): + if not is_admin_context(args[0]): + raise exception.AdminRequired() + return f(*args, **kwargs) + return wrapper + + +def require_context(f): + """Decorator to require *any* user or admin context. + + This does no authorization for user or project access matching, see + :py:func:`authorize_project_context` and + :py:func:`authorize_user_context`. + + The first argument to the wrapped function must be the context. + + """ + + def wrapper(*args, **kwargs): + if not is_admin_context(args[0]) and not is_user_context(args[0]): + raise exception.NotAuthorized() + return f(*args, **kwargs) + return wrapper + + +def require_volume_exists(f): + """Decorator to require the specified volume to exist. + + Requires the wrapped function to use context and volume_id as + their first two arguments. + """ + + def wrapper(context, volume_id, *args, **kwargs): + db.volume_get(context, volume_id) + return f(context, volume_id, *args, **kwargs) + wrapper.__name__ = f.__name__ + return wrapper + + +def require_aggregate_exists(f): + """Decorator to require the specified aggregate to exist. + + Requires the wrapped function to use context and aggregate_id as + their first two arguments. + """ + + @functools.wraps(f) + def wrapper(context, aggregate_id, *args, **kwargs): + db.aggregate_get(context, aggregate_id) + return f(context, aggregate_id, *args, **kwargs) + return wrapper + + +def model_query(context, *args, **kwargs): + """Query helper that accounts for context's `read_deleted` field. + + :param context: context to query under + :param session: if present, the session to use + :param read_deleted: if present, overrides context's read_deleted field. + :param project_only: if present and context is user-type, then restrict + query to match the context's project_id. + """ + session = kwargs.get('session') or get_session() + read_deleted = kwargs.get('read_deleted') or context.read_deleted + project_only = kwargs.get('project_only') + + query = session.query(*args) + + if read_deleted == 'no': + query = query.filter_by(deleted=False) + elif read_deleted == 'yes': + pass # omit the filter to include deleted and active + elif read_deleted == 'only': + query = query.filter_by(deleted=True) + else: + raise Exception( + _("Unrecognized read_deleted value '%s'") % read_deleted) + + if project_only and is_user_context(context): + query = query.filter_by(project_id=context.project_id) + + return query + + +def exact_filter(query, model, filters, legal_keys): + """Applies exact match filtering to a query. + + Returns the updated query. Modifies filters argument to remove + filters consumed. + + :param query: query to apply filters to + :param model: model object the query applies to, for IN-style + filtering + :param filters: dictionary of filters; values that are lists, + tuples, sets, or frozensets cause an 'IN' test to + be performed, while exact matching ('==' operator) + is used for other values + :param legal_keys: list of keys to apply exact filtering to + """ + + filter_dict = {} + + # Walk through all the keys + for key in legal_keys: + # Skip ones we're not filtering on + if key not in filters: + continue + + # OK, filtering on this key; what value do we search for? + value = filters.pop(key) + + if isinstance(value, (list, tuple, set, frozenset)): + # Looking for values in a list; apply to query directly + column_attr = getattr(model, key) + query = query.filter(column_attr.in_(value)) + else: + # OK, simple exact match; save for later + filter_dict[key] = value + + # Apply simple exact matches + if filter_dict: + query = query.filter_by(**filter_dict) + + return query + + +################### + + +@require_admin_context +def service_destroy(context, service_id): + session = get_session() + with session.begin(): + service_ref = service_get(context, service_id, session=session) + service_ref.delete(session=session) + + +@require_admin_context +def service_get(context, service_id, session=None): + result = model_query(context, models.Service, session=session).\ + filter_by(id=service_id).\ + first() + if not result: + raise exception.ServiceNotFound(service_id=service_id) + + return result + + +@require_admin_context +def service_get_all(context, disabled=None): + query = model_query(context, models.Service) + + if disabled is not None: + query = query.filter_by(disabled=disabled) + + return query.all() + + +@require_admin_context +def service_get_all_by_topic(context, topic): + return model_query(context, models.Service, read_deleted="no").\ + filter_by(disabled=False).\ + filter_by(topic=topic).\ + all() + + +@require_admin_context +def service_get_by_host_and_topic(context, host, topic): + return model_query(context, models.Service, read_deleted="no").\ + filter_by(disabled=False).\ + filter_by(host=host).\ + filter_by(topic=topic).\ + first() + + +@require_admin_context +def service_get_all_by_host(context, host): + return model_query(context, models.Service, read_deleted="no").\ + filter_by(host=host).\ + all() + + +@require_admin_context +def _service_get_all_topic_subquery(context, session, topic, subq, label): + sort_value = getattr(subq.c, label) + return model_query(context, models.Service, + func.coalesce(sort_value, 0), + session=session, read_deleted="no").\ + filter_by(topic=topic).\ + filter_by(disabled=False).\ + outerjoin((subq, models.Service.host == subq.c.host)).\ + order_by(sort_value).\ + all() + + +@require_admin_context +def service_get_all_volume_sorted(context): + session = get_session() + with session.begin(): + topic = 'volume' + label = 'volume_gigabytes' + subq = model_query(context, models.Volume.host, + func.sum(models.Volume.size).label(label), + session=session, read_deleted="no").\ + group_by(models.Volume.host).\ + subquery() + return _service_get_all_topic_subquery(context, + session, + topic, + subq, + label) + + +@require_admin_context +def service_get_by_args(context, host, binary): + result = model_query(context, models.Service).\ + filter_by(host=host).\ + filter_by(binary=binary).\ + first() + + if not result: + raise exception.HostBinaryNotFound(host=host, binary=binary) + + return result + + +@require_admin_context +def service_create(context, values): + service_ref = models.Service() + service_ref.update(values) + if not FLAGS.enable_new_services: + service_ref.disabled = True + service_ref.save() + return service_ref + + +@require_admin_context +def service_update(context, service_id, values): + session = get_session() + with session.begin(): + service_ref = service_get(context, service_id, session=session) + service_ref.update(values) + service_ref.save(session=session) + + +################### + + +def _metadata_refs(metadata_dict, meta_class): + metadata_refs = [] + if metadata_dict: + for k, v in metadata_dict.iteritems(): + metadata_ref = meta_class() + metadata_ref['key'] = k + metadata_ref['value'] = v + metadata_refs.append(metadata_ref) + return metadata_refs + + +def _dict_with_extra_specs(inst_type_query): + """Takes an instance, volume, or instance type query returned + by sqlalchemy and returns it as a dictionary, converting the + extra_specs entry from a list of dicts: + + 'extra_specs' : [{'key': 'k1', 'value': 'v1', ...}, ...] + + to a single dict: + + 'extra_specs' : {'k1': 'v1'} + + """ + inst_type_dict = dict(inst_type_query) + extra_specs = dict([(x['key'], x['value']) + for x in inst_type_query['extra_specs']]) + inst_type_dict['extra_specs'] = extra_specs + return inst_type_dict + + +################### + + +def queue_get_for(context, topic, physical_node_id): + # FIXME(ja): this should be servername? + return "%s.%s" % (topic, physical_node_id) + + +################### + + +@require_admin_context +def iscsi_target_count_by_host(context, host): + return model_query(context, models.IscsiTarget).\ + filter_by(host=host).\ + count() + + +@require_admin_context +def iscsi_target_create_safe(context, values): + iscsi_target_ref = models.IscsiTarget() + + for (key, value) in values.iteritems(): + iscsi_target_ref[key] = value + try: + iscsi_target_ref.save() + return iscsi_target_ref + except IntegrityError: + return None + + +################### + + +@require_context +def quota_get(context, project_id, resource, session=None): + result = model_query(context, models.Quota, session=session, + read_deleted="no").\ + filter_by(project_id=project_id).\ + filter_by(resource=resource).\ + first() + + if not result: + raise exception.ProjectQuotaNotFound(project_id=project_id) + + return result + + +@require_context +def quota_get_all_by_project(context, project_id): + authorize_project_context(context, project_id) + + rows = model_query(context, models.Quota, read_deleted="no").\ + filter_by(project_id=project_id).\ + all() + + result = {'project_id': project_id} + for row in rows: + result[row.resource] = row.hard_limit + + return result + + +@require_admin_context +def quota_create(context, project_id, resource, limit): + quota_ref = models.Quota() + quota_ref.project_id = project_id + quota_ref.resource = resource + quota_ref.hard_limit = limit + quota_ref.save() + return quota_ref + + +@require_admin_context +def quota_update(context, project_id, resource, limit): + session = get_session() + with session.begin(): + quota_ref = quota_get(context, project_id, resource, session=session) + quota_ref.hard_limit = limit + quota_ref.save(session=session) + + +@require_admin_context +def quota_destroy(context, project_id, resource): + session = get_session() + with session.begin(): + quota_ref = quota_get(context, project_id, resource, session=session) + quota_ref.delete(session=session) + + +@require_admin_context +def quota_destroy_all_by_project(context, project_id): + session = get_session() + with session.begin(): + quotas = model_query(context, models.Quota, session=session, + read_deleted="no").\ + filter_by(project_id=project_id).\ + all() + + for quota_ref in quotas: + quota_ref.delete(session=session) + + +################### + + +@require_context +def quota_class_get(context, class_name, resource, session=None): + result = model_query(context, models.QuotaClass, session=session, + read_deleted="no").\ + filter_by(class_name=class_name).\ + filter_by(resource=resource).\ + first() + + if not result: + raise exception.QuotaClassNotFound(class_name=class_name) + + return result + + +@require_context +def quota_class_get_all_by_name(context, class_name): + authorize_quota_class_context(context, class_name) + + rows = model_query(context, models.QuotaClass, read_deleted="no").\ + filter_by(class_name=class_name).\ + all() + + result = {'class_name': class_name} + for row in rows: + result[row.resource] = row.hard_limit + + return result + + +@require_admin_context +def quota_class_create(context, class_name, resource, limit): + quota_class_ref = models.QuotaClass() + quota_class_ref.class_name = class_name + quota_class_ref.resource = resource + quota_class_ref.hard_limit = limit + quota_class_ref.save() + return quota_class_ref + + +@require_admin_context +def quota_class_update(context, class_name, resource, limit): + session = get_session() + with session.begin(): + quota_class_ref = quota_class_get(context, class_name, resource, + session=session) + quota_class_ref.hard_limit = limit + quota_class_ref.save(session=session) + + +@require_admin_context +def quota_class_destroy(context, class_name, resource): + session = get_session() + with session.begin(): + quota_class_ref = quota_class_get(context, class_name, resource, + session=session) + quota_class_ref.delete(session=session) + + +@require_admin_context +def quota_class_destroy_all_by_name(context, class_name): + session = get_session() + with session.begin(): + quota_classes = model_query(context, models.QuotaClass, + session=session, read_deleted="no").\ + filter_by(class_name=class_name).\ + all() + + for quota_class_ref in quota_classes: + quota_class_ref.delete(session=session) + + +################### + + +@require_admin_context +def volume_allocate_iscsi_target(context, volume_id, host): + session = get_session() + with session.begin(): + iscsi_target_ref = model_query(context, models.IscsiTarget, + session=session, read_deleted="no").\ + filter_by(volume=None).\ + filter_by(host=host).\ + with_lockmode('update').\ + first() + + # NOTE(vish): if with_lockmode isn't supported, as in sqlite, + # then this has concurrency issues + if not iscsi_target_ref: + raise db.NoMoreTargets() + + iscsi_target_ref.volume_id = volume_id + session.add(iscsi_target_ref) + + return iscsi_target_ref.target_num + + +@require_admin_context +def volume_attached(context, volume_id, instance_id, mountpoint): + session = get_session() + with session.begin(): + volume_ref = volume_get(context, volume_id, session=session) + volume_ref['status'] = 'in-use' + volume_ref['mountpoint'] = mountpoint + volume_ref['attach_status'] = 'attached' + volume_ref['instance_id'] = instance_id + volume_ref.save(session=session) + + +@require_context +def volume_create(context, values): + values['volume_metadata'] = _metadata_refs(values.get('metadata'), + models.VolumeMetadata) + volume_ref = models.Volume() + if not values.get('id'): + values['id'] = str(utils.gen_uuid()) + volume_ref.update(values) + + session = get_session() + with session.begin(): + volume_ref.save(session=session) + + return volume_ref + + +@require_admin_context +def volume_data_get_for_project(context, project_id): + result = model_query(context, + func.count(models.Volume.id), + func.sum(models.Volume.size), + read_deleted="no").\ + filter_by(project_id=project_id).\ + first() + + # NOTE(vish): convert None to 0 + return (result[0] or 0, result[1] or 0) + + +@require_admin_context +def volume_destroy(context, volume_id): + session = get_session() + with session.begin(): + session.query(models.Volume).\ + filter_by(id=volume_id).\ + update({'deleted': True, + 'deleted_at': utils.utcnow(), + 'updated_at': literal_column('updated_at')}) + session.query(models.IscsiTarget).\ + filter_by(volume_id=volume_id).\ + update({'volume_id': None}) + session.query(models.VolumeMetadata).\ + filter_by(volume_id=volume_id).\ + update({'deleted': True, + 'deleted_at': utils.utcnow(), + 'updated_at': literal_column('updated_at')}) + + +@require_admin_context +def volume_detached(context, volume_id): + session = get_session() + with session.begin(): + volume_ref = volume_get(context, volume_id, session=session) + volume_ref['status'] = 'available' + volume_ref['mountpoint'] = None + volume_ref['attach_status'] = 'detached' + volume_ref.instance = None + volume_ref.save(session=session) + + +@require_context +def _volume_get_query(context, session=None, project_only=False): + return model_query(context, models.Volume, session=session, + project_only=project_only).\ + options(joinedload('instance')).\ + options(joinedload('volume_metadata')).\ + options(joinedload('volume_type')) + + +@require_context +def volume_get(context, volume_id, session=None): + result = _volume_get_query(context, session=session, project_only=True).\ + filter_by(id=volume_id).\ + first() + + if not result: + raise exception.VolumeNotFound(volume_id=volume_id) + + return result + + +@require_admin_context +def volume_get_all(context): + return _volume_get_query(context).all() + + +@require_admin_context +def volume_get_all_by_host(context, host): + return _volume_get_query(context).filter_by(host=host).all() + + +@require_admin_context +def volume_get_all_by_instance(context, instance_id): + result = model_query(context, models.Volume, read_deleted="no").\ + options(joinedload('volume_metadata')).\ + options(joinedload('volume_type')).\ + filter_by(instance_id=instance_id).\ + all() + + return result + + +@require_context +def volume_get_all_by_project(context, project_id): + authorize_project_context(context, project_id) + return _volume_get_query(context).filter_by(project_id=project_id).all() + + +@require_admin_context +def volume_get_instance(context, volume_id): + result = _volume_get_query(context).filter_by(id=volume_id).first() + + if not result: + raise exception.VolumeNotFound(volume_id=volume_id) + + return result.instance + + +@require_admin_context +def volume_get_iscsi_target_num(context, volume_id): + result = model_query(context, models.IscsiTarget, read_deleted="yes").\ + filter_by(volume_id=volume_id).\ + first() + + if not result: + raise exception.ISCSITargetNotFoundForVolume(volume_id=volume_id) + + return result.target_num + + +@require_context +def volume_update(context, volume_id, values): + session = get_session() + metadata = values.get('metadata') + if metadata is not None: + volume_metadata_update(context, + volume_id, + values.pop('metadata'), + delete=True) + with session.begin(): + volume_ref = volume_get(context, volume_id, session=session) + volume_ref.update(values) + volume_ref.save(session=session) + + +#################### + +def _volume_metadata_get_query(context, volume_id, session=None): + return model_query(context, models.VolumeMetadata, + session=session, read_deleted="no").\ + filter_by(volume_id=volume_id) + + +@require_context +@require_volume_exists +def volume_metadata_get(context, volume_id): + rows = _volume_metadata_get_query(context, volume_id).all() + result = {} + for row in rows: + result[row['key']] = row['value'] + + return result + + +@require_context +@require_volume_exists +def volume_metadata_delete(context, volume_id, key): + _volume_metadata_get_query(context, volume_id).\ + filter_by(key=key).\ + update({'deleted': True, + 'deleted_at': utils.utcnow(), + 'updated_at': literal_column('updated_at')}) + + +@require_context +@require_volume_exists +def volume_metadata_get_item(context, volume_id, key, session=None): + result = _volume_metadata_get_query(context, volume_id, session=session).\ + filter_by(key=key).\ + first() + + if not result: + raise exception.VolumeMetadataNotFound(metadata_key=key, + volume_id=volume_id) + return result + + +@require_context +@require_volume_exists +def volume_metadata_update(context, volume_id, metadata, delete): + session = get_session() + + # Set existing metadata to deleted if delete argument is True + if delete: + original_metadata = volume_metadata_get(context, volume_id) + for meta_key, meta_value in original_metadata.iteritems(): + if meta_key not in metadata: + meta_ref = volume_metadata_get_item(context, volume_id, + meta_key, session) + meta_ref.update({'deleted': True}) + meta_ref.save(session=session) + + meta_ref = None + + # Now update all existing items with new values, or create new meta objects + for meta_key, meta_value in metadata.iteritems(): + + # update the value whether it exists or not + item = {"value": meta_value} + + try: + meta_ref = volume_metadata_get_item(context, volume_id, + meta_key, session) + except exception.VolumeMetadataNotFound, e: + meta_ref = models.VolumeMetadata() + item.update({"key": meta_key, "volume_id": volume_id}) + + meta_ref.update(item) + meta_ref.save(session=session) + + return metadata + + +################### + + +@require_context +def snapshot_create(context, values): + snapshot_ref = models.Snapshot() + if not values.get('id'): + values['id'] = str(utils.gen_uuid()) + snapshot_ref.update(values) + + session = get_session() + with session.begin(): + snapshot_ref.save(session=session) + return snapshot_ref + + +@require_admin_context +def snapshot_destroy(context, snapshot_id): + session = get_session() + with session.begin(): + session.query(models.Snapshot).\ + filter_by(id=snapshot_id).\ + update({'deleted': True, + 'deleted_at': utils.utcnow(), + 'updated_at': literal_column('updated_at')}) + + +@require_context +def snapshot_get(context, snapshot_id, session=None): + result = model_query(context, models.Snapshot, session=session, + project_only=True).\ + filter_by(id=snapshot_id).\ + first() + + if not result: + raise exception.SnapshotNotFound(snapshot_id=snapshot_id) + + return result + + +@require_admin_context +def snapshot_get_all(context): + return model_query(context, models.Snapshot).all() + + +@require_context +def snapshot_get_all_for_volume(context, volume_id): + return model_query(context, models.Snapshot, read_deleted='no', + project_only=True).\ + filter_by(volume_id=volume_id).all() + + +@require_context +def snapshot_get_all_by_project(context, project_id): + authorize_project_context(context, project_id) + return model_query(context, models.Snapshot).\ + filter_by(project_id=project_id).\ + all() + + +@require_context +def snapshot_update(context, snapshot_id, values): + session = get_session() + with session.begin(): + snapshot_ref = snapshot_get(context, snapshot_id, session=session) + snapshot_ref.update(values) + snapshot_ref.save(session=session) + + +################### + + +@require_admin_context +def migration_create(context, values): + migration = models.Migration() + migration.update(values) + migration.save() + return migration + + +@require_admin_context +def migration_update(context, id, values): + session = get_session() + with session.begin(): + migration = migration_get(context, id, session=session) + migration.update(values) + migration.save(session=session) + return migration + + +@require_admin_context +def migration_get(context, id, session=None): + result = model_query(context, models.Migration, session=session, + read_deleted="yes").\ + filter_by(id=id).\ + first() + + if not result: + raise exception.MigrationNotFound(migration_id=id) + + return result + + +@require_admin_context +def migration_get_by_instance_and_status(context, instance_uuid, status): + result = model_query(context, models.Migration, read_deleted="yes").\ + filter_by(instance_uuid=instance_uuid).\ + filter_by(status=status).\ + first() + + if not result: + raise exception.MigrationNotFoundByStatus(instance_id=instance_uuid, + status=status) + + return result + + +@require_admin_context +def migration_get_all_unconfirmed(context, confirm_window, session=None): + confirm_window = datetime.datetime.utcnow() - datetime.timedelta( + seconds=confirm_window) + + return model_query(context, models.Migration, session=session, + read_deleted="yes").\ + filter(models.Migration.updated_at <= confirm_window).\ + filter_by(status="finished").\ + all() + + +################## + + +@require_admin_context +def volume_type_create(context, values): + """Create a new instance type. In order to pass in extra specs, + the values dict should contain a 'extra_specs' key/value pair: + + {'extra_specs' : {'k1': 'v1', 'k2': 'v2', ...}} + + """ + session = get_session() + with session.begin(): + try: + volume_type_get_by_name(context, values['name'], session) + raise exception.VolumeTypeExists(name=values['name']) + except exception.VolumeTypeNotFoundByName: + pass + try: + specs = values.get('extra_specs') + + values['extra_specs'] = _metadata_refs(values.get('extra_specs'), + models.VolumeTypeExtraSpecs) + volume_type_ref = models.VolumeTypes() + volume_type_ref.update(values) + volume_type_ref.save() + except Exception, e: + raise exception.DBError(e) + return volume_type_ref + + +@require_context +def volume_type_get_all(context, inactive=False, filters=None): + """ + Returns a dict describing all volume_types with name as key. + """ + filters = filters or {} + + read_deleted = "yes" if inactive else "no" + rows = model_query(context, models.VolumeTypes, + read_deleted=read_deleted).\ + options(joinedload('extra_specs')).\ + order_by("name").\ + all() + + # TODO(sirp): this patern of converting rows to a result with extra_specs + # is repeated quite a bit, might be worth creating a method for it + result = {} + for row in rows: + result[row['name']] = _dict_with_extra_specs(row) + + return result + + +@require_context +def volume_type_get(context, id, session=None): + """Returns a dict describing specific volume_type""" + result = model_query(context, models.VolumeTypes, session=session).\ + options(joinedload('extra_specs')).\ + filter_by(id=id).\ + first() + + if not result: + raise exception.VolumeTypeNotFound(volume_type_id=id) + + return _dict_with_extra_specs(result) + + +@require_context +def volume_type_get_by_name(context, name, session=None): + """Returns a dict describing specific volume_type""" + result = model_query(context, models.VolumeTypes, session=session).\ + options(joinedload('extra_specs')).\ + filter_by(name=name).\ + first() + + if not result: + raise exception.VolumeTypeNotFoundByName(volume_type_name=name) + else: + return _dict_with_extra_specs(result) + + +@require_admin_context +def volume_type_destroy(context, name): + session = get_session() + with session.begin(): + volume_type_ref = volume_type_get_by_name(context, name, + session=session) + volume_type_id = volume_type_ref['id'] + session.query(models.VolumeTypes).\ + filter_by(id=volume_type_id).\ + update({'deleted': True, + 'deleted_at': utils.utcnow(), + 'updated_at': literal_column('updated_at')}) + session.query(models.VolumeTypeExtraSpecs).\ + filter_by(volume_type_id=volume_type_id).\ + update({'deleted': True, + 'deleted_at': utils.utcnow(), + 'updated_at': literal_column('updated_at')}) + + +#################### + + +def _volume_type_extra_specs_query(context, volume_type_id, session=None): + return model_query(context, models.VolumeTypeExtraSpecs, session=session, + read_deleted="no").\ + filter_by(volume_type_id=volume_type_id) + + +@require_context +def volume_type_extra_specs_get(context, volume_type_id): + rows = _volume_type_extra_specs_query(context, volume_type_id).\ + all() + + result = {} + for row in rows: + result[row['key']] = row['value'] + + return result + + +@require_context +def volume_type_extra_specs_delete(context, volume_type_id, key): + _volume_type_extra_specs_query(context, volume_type_id).\ + filter_by(key=key).\ + update({'deleted': True, + 'deleted_at': utils.utcnow(), + 'updated_at': literal_column('updated_at')}) + + +@require_context +def volume_type_extra_specs_get_item(context, volume_type_id, key, + session=None): + result = _volume_type_extra_specs_query( + context, volume_type_id, session=session).\ + filter_by(key=key).\ + first() + + if not result: + raise exception.VolumeTypeExtraSpecsNotFound( + extra_specs_key=key, volume_type_id=volume_type_id) + + return result + + +@require_context +def volume_type_extra_specs_update_or_create(context, volume_type_id, + specs): + session = get_session() + spec_ref = None + for key, value in specs.iteritems(): + try: + spec_ref = volume_type_extra_specs_get_item( + context, volume_type_id, key, session) + except exception.VolumeTypeExtraSpecsNotFound, e: + spec_ref = models.VolumeTypeExtraSpecs() + spec_ref.update({"key": key, "value": value, + "volume_type_id": volume_type_id, + "deleted": 0}) + spec_ref.save(session=session) + return specs + + +#################### + + +@require_admin_context +def sm_backend_conf_create(context, values): + backend_conf = models.SMBackendConf() + backend_conf.update(values) + backend_conf.save() + return backend_conf + + +@require_admin_context +def sm_backend_conf_update(context, sm_backend_id, values): + session = get_session() + with session.begin(): + backend_conf = model_query(context, models.SMBackendConf, + session=session, + read_deleted="yes").\ + filter_by(id=sm_backend_id).\ + first() + + if not backend_conf: + raise exception.NotFound( + _("No backend config with id %(sm_backend_id)s") % locals()) + + backend_conf.update(values) + backend_conf.save(session=session) + return backend_conf + + +@require_admin_context +def sm_backend_conf_delete(context, sm_backend_id): + # FIXME(sirp): for consistency, shouldn't this just mark as deleted with + # `purge` actually deleting the record? + session = get_session() + with session.begin(): + model_query(context, models.SMBackendConf, session=session, + read_deleted="yes").\ + filter_by(id=sm_backend_id).\ + delete() + + +@require_admin_context +def sm_backend_conf_get(context, sm_backend_id): + result = model_query(context, models.SMBackendConf, read_deleted="yes").\ + filter_by(id=sm_backend_id).\ + first() + + if not result: + raise exception.NotFound(_("No backend config with id " + "%(sm_backend_id)s") % locals()) + + return result + + +@require_admin_context +def sm_backend_conf_get_by_sr(context, sr_uuid): + session = get_session() + return model_query(context, models.SMBackendConf, read_deleted="yes").\ + filter_by(sr_uuid=sr_uuid).\ + first() + + +@require_admin_context +def sm_backend_conf_get_all(context): + return model_query(context, models.SMBackendConf, read_deleted="yes").\ + all() + + +#################### + + +def _sm_flavor_get_query(context, sm_flavor_label, session=None): + return model_query(context, models.SMFlavors, session=session, + read_deleted="yes").\ + filter_by(label=sm_flavor_label) + + +@require_admin_context +def sm_flavor_create(context, values): + sm_flavor = models.SMFlavors() + sm_flavor.update(values) + sm_flavor.save() + return sm_flavor + + +@require_admin_context +def sm_flavor_update(context, sm_flavor_label, values): + sm_flavor = sm_flavor_get(context, sm_flavor_label) + sm_flavor.update(values) + sm_flavor.save() + return sm_flavor + + +@require_admin_context +def sm_flavor_delete(context, sm_flavor_label): + session = get_session() + with session.begin(): + _sm_flavor_get_query(context, sm_flavor_label).delete() + + +@require_admin_context +def sm_flavor_get(context, sm_flavor_label): + result = _sm_flavor_get_query(context, sm_flavor_label).first() + + if not result: + raise exception.NotFound( + _("No sm_flavor called %(sm_flavor)s") % locals()) + + return result + + +@require_admin_context +def sm_flavor_get_all(context): + return model_query(context, models.SMFlavors, read_deleted="yes").all() + + +############################### + + +def _sm_volume_get_query(context, volume_id, session=None): + return model_query(context, models.SMVolume, session=session, + read_deleted="yes").\ + filter_by(id=volume_id) + + +def sm_volume_create(context, values): + sm_volume = models.SMVolume() + sm_volume.update(values) + sm_volume.save() + return sm_volume + + +def sm_volume_update(context, volume_id, values): + sm_volume = sm_volume_get(context, volume_id) + sm_volume.update(values) + sm_volume.save() + return sm_volume + + +def sm_volume_delete(context, volume_id): + session = get_session() + with session.begin(): + _sm_volume_get_query(context, volume_id, session=session).delete() + + +def sm_volume_get(context, volume_id): + result = _sm_volume_get_query(context, volume_id).first() + + if not result: + raise exception.NotFound( + _("No sm_volume with id %(volume_id)s") % locals()) + + return result + + +def sm_volume_get_all(context): + return model_query(context, models.SMVolume, read_deleted="yes").all() + + +################ + + +def _aggregate_get_query(context, model_class, id_field, id, + session=None, read_deleted=None): + return model_query(context, model_class, session=session, + read_deleted=read_deleted).filter(id_field == id) + + +@require_admin_context +def aggregate_create(context, values, metadata=None): + session = get_session() + aggregate = _aggregate_get_query(context, + models.Aggregate, + models.Aggregate.name, + values['name'], + session=session, + read_deleted='yes').first() + values.setdefault('operational_state', aggregate_states.CREATED) + if not aggregate: + aggregate = models.Aggregate() + aggregate.update(values) + aggregate.save(session=session) + elif aggregate.deleted: + values['deleted'] = False + values['deleted_at'] = None + aggregate.update(values) + aggregate.save(session=session) + else: + raise exception.AggregateNameExists(aggregate_name=values['name']) + if metadata: + aggregate_metadata_add(context, aggregate.id, metadata) + return aggregate + + +@require_admin_context +def aggregate_get(context, aggregate_id): + aggregate = _aggregate_get_query(context, + models.Aggregate, + models.Aggregate.id, + aggregate_id).first() + + if not aggregate: + raise exception.AggregateNotFound(aggregate_id=aggregate_id) + + return aggregate + + +@require_admin_context +def aggregate_get_by_host(context, host): + aggregate_host = _aggregate_get_query(context, + models.AggregateHost, + models.AggregateHost.host, + host).first() + + if not aggregate_host: + raise exception.AggregateHostNotFound(host=host) + + return aggregate_get(context, aggregate_host.aggregate_id) + + +@require_admin_context +def aggregate_update(context, aggregate_id, values): + session = get_session() + aggregate = _aggregate_get_query(context, + models.Aggregate, + models.Aggregate.id, + aggregate_id, + session=session).first() + if aggregate: + metadata = values.get('metadata') + if metadata is not None: + aggregate_metadata_add(context, + aggregate_id, + values.pop('metadata'), + set_delete=True) + with session.begin(): + aggregate.update(values) + aggregate.save(session=session) + values['metadata'] = metadata + return aggregate + else: + raise exception.AggregateNotFound(aggregate_id=aggregate_id) + + +@require_admin_context +def aggregate_delete(context, aggregate_id): + query = _aggregate_get_query(context, + models.Aggregate, + models.Aggregate.id, + aggregate_id) + if query.first(): + query.update({'deleted': True, + 'deleted_at': utils.utcnow(), + 'operational_state': aggregate_states.DISMISSED, + 'updated_at': literal_column('updated_at')}) + else: + raise exception.AggregateNotFound(aggregate_id=aggregate_id) + + +@require_admin_context +def aggregate_get_all(context): + return model_query(context, models.Aggregate).all() + + +@require_admin_context +@require_aggregate_exists +def aggregate_metadata_get(context, aggregate_id): + rows = model_query(context, + models.AggregateMetadata).\ + filter_by(aggregate_id=aggregate_id).all() + + return dict([(r['key'], r['value']) for r in rows]) + + +@require_admin_context +@require_aggregate_exists +def aggregate_metadata_delete(context, aggregate_id, key): + query = _aggregate_get_query(context, + models.AggregateMetadata, + models.AggregateMetadata.aggregate_id, + aggregate_id).\ + filter_by(key=key) + if query.first(): + query.update({'deleted': True, + 'deleted_at': utils.utcnow(), + 'updated_at': literal_column('updated_at')}) + else: + raise exception.AggregateMetadataNotFound(aggregate_id=aggregate_id, + metadata_key=key) + + +@require_admin_context +@require_aggregate_exists +def aggregate_metadata_get_item(context, aggregate_id, key, session=None): + result = _aggregate_get_query(context, + models.AggregateMetadata, + models.AggregateMetadata.aggregate_id, + aggregate_id, session=session, + read_deleted='yes').\ + filter_by(key=key).first() + + if not result: + raise exception.AggregateMetadataNotFound(metadata_key=key, + aggregate_id=aggregate_id) + + return result + + +@require_admin_context +@require_aggregate_exists +def aggregate_metadata_add(context, aggregate_id, metadata, set_delete=False): + session = get_session() + + if set_delete: + original_metadata = aggregate_metadata_get(context, aggregate_id) + for meta_key, meta_value in original_metadata.iteritems(): + if meta_key not in metadata: + meta_ref = aggregate_metadata_get_item(context, aggregate_id, + meta_key, session) + meta_ref.update({'deleted': True}) + meta_ref.save(session=session) + + meta_ref = None + + for meta_key, meta_value in metadata.iteritems(): + item = {"value": meta_value} + try: + meta_ref = aggregate_metadata_get_item(context, aggregate_id, + meta_key, session) + if meta_ref.deleted: + item.update({'deleted': False, 'deleted_at': None}) + except exception.AggregateMetadataNotFound: + meta_ref = models.AggregateMetadata() + item.update({"key": meta_key, "aggregate_id": aggregate_id}) + + meta_ref.update(item) + meta_ref.save(session=session) + + return metadata + + +@require_admin_context +@require_aggregate_exists +def aggregate_host_get_all(context, aggregate_id): + rows = model_query(context, + models.AggregateHost).\ + filter_by(aggregate_id=aggregate_id).all() + + return [r.host for r in rows] + + +@require_admin_context +@require_aggregate_exists +def aggregate_host_delete(context, aggregate_id, host): + query = _aggregate_get_query(context, + models.AggregateHost, + models.AggregateHost.aggregate_id, + aggregate_id).filter_by(host=host) + if query.first(): + query.update({'deleted': True, + 'deleted_at': utils.utcnow(), + 'updated_at': literal_column('updated_at')}) + else: + raise exception.AggregateHostNotFound(aggregate_id=aggregate_id, + host=host) + + +@require_admin_context +@require_aggregate_exists +def aggregate_host_add(context, aggregate_id, host): + session = get_session() + host_ref = _aggregate_get_query(context, + models.AggregateHost, + models.AggregateHost.aggregate_id, + aggregate_id, + session=session, + read_deleted='yes').\ + filter_by(host=host).first() + if not host_ref: + try: + host_ref = models.AggregateHost() + values = {"host": host, "aggregate_id": aggregate_id, } + host_ref.update(values) + host_ref.save(session=session) + except exception.DBError: + raise exception.AggregateHostConflict(host=host) + elif host_ref.deleted: + host_ref.update({'deleted': False, 'deleted_at': None}) + host_ref.save(session=session) + else: + raise exception.AggregateHostExists(host=host, + aggregate_id=aggregate_id) + return host_ref diff --git a/cinder/db/sqlalchemy/migrate_repo/README b/cinder/db/sqlalchemy/migrate_repo/README new file mode 100644 index 000000000..6218f8cac --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/README @@ -0,0 +1,4 @@ +This is a database migration repository. + +More information at +http://code.google.com/p/sqlalchemy-migrate/ diff --git a/cinder/db/sqlalchemy/migrate_repo/__init__.py b/cinder/db/sqlalchemy/migrate_repo/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cinder/db/sqlalchemy/migrate_repo/manage.py b/cinder/db/sqlalchemy/migrate_repo/manage.py new file mode 100644 index 000000000..09e340f44 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/manage.py @@ -0,0 +1,4 @@ +#!/usr/bin/env python +from migrate.versioning.shell import main +if __name__ == '__main__': + main(debug='False', repository='.') diff --git a/cinder/db/sqlalchemy/migrate_repo/migrate.cfg b/cinder/db/sqlalchemy/migrate_repo/migrate.cfg new file mode 100644 index 000000000..10c685c0e --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/migrate.cfg @@ -0,0 +1,20 @@ +[db_settings] +# Used to identify which repository this database is versioned under. +# You can use the name of your project. +repository_id=cinder + +# The name of the database table used to track the schema version. +# This name shouldn't already be used by your project. +# If this is changed once a database is under version control, you'll need to +# change the table name in each database too. +version_table=migrate_version + +# When committing a change script, Migrate will attempt to generate the +# sql for all supported databases; normally, if one of them fails - probably +# because you don't have that database installed - it is ignored and the +# commit continues, perhaps ending successfully. +# Databases in this list MUST compile successfully during a commit, or the +# entire commit will fail. List the databases your application will actually +# be using to ensure your updates to that database work properly. +# This must be a list; example: ['postgres','sqlite'] +required_dbs=[] diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/001_austin.py b/cinder/db/sqlalchemy/migrate_repo/versions/001_austin.py new file mode 100644 index 000000000..2e21685f8 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/001_austin.py @@ -0,0 +1,627 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +## Table code mostly autogenerated by genmodel.py +from sqlalchemy import Boolean, Column, DateTime, ForeignKey +from sqlalchemy import ForeignKeyConstraint, Integer, MetaData, String +from sqlalchemy import Table, Text +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + # + # New Tables + # + auth_tokens = Table('auth_tokens', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('token_hash', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + primary_key=True, + nullable=False), + Column('user_id', Integer()), + Column('server_manageent_url', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('storage_url', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('cdn_management_url', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + + export_devices = Table('export_devices', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('shelf_id', Integer()), + Column('blade_id', Integer()), + Column('volume_id', + Integer(), + ForeignKey('volumes.id'), + nullable=True), + ) + + fixed_ips = Table('fixed_ips', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('address', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('network_id', + Integer(), + ForeignKey('networks.id'), + nullable=True), + Column('instance_id', + Integer(), + ForeignKey('instances.id'), + nullable=True), + Column('allocated', Boolean(create_constraint=True, name=None)), + Column('leased', Boolean(create_constraint=True, name=None)), + Column('reserved', Boolean(create_constraint=True, name=None)), + ) + + floating_ips = Table('floating_ips', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('address', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('fixed_ip_id', + Integer(), + ForeignKey('fixed_ips.id'), + nullable=True), + Column('project_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('host', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + + instances = Table('instances', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('internal_id', Integer()), + Column('admin_pass', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('user_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('project_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('image_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('kernel_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('ramdisk_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('server_name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('launch_index', Integer()), + Column('key_name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('key_data', + Text(length=None, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('state', Integer()), + Column('state_description', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('memory_mb', Integer()), + Column('vcpus', Integer()), + Column('local_gb', Integer()), + Column('hostname', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('host', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('instance_type', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('user_data', + Text(length=None, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('reservation_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('mac_address', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('scheduled_at', DateTime(timezone=False)), + Column('launched_at', DateTime(timezone=False)), + Column('terminated_at', DateTime(timezone=False)), + Column('display_name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('display_description', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + + key_pairs = Table('key_pairs', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('user_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('fingerprint', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('public_key', + Text(length=None, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + + networks = Table('networks', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('injected', Boolean(create_constraint=True, name=None)), + Column('cidr', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('netmask', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('bridge', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('gateway', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('broadcast', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('dns', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('vlan', Integer()), + Column('vpn_public_address', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('vpn_public_port', Integer()), + Column('vpn_private_address', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('dhcp_start', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('project_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('host', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + + projects = Table('projects', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + primary_key=True, + nullable=False), + Column('name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('description', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('project_manager', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + ForeignKey('users.id')), + ) + + quotas = Table('quotas', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('project_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('instances', Integer()), + Column('cores', Integer()), + Column('volumes', Integer()), + Column('gigabytes', Integer()), + Column('floating_ips', Integer()), + ) + + security_groups = Table('security_groups', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('description', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('user_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('project_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + + security_group_inst_assoc = Table('security_group_instance_association', + meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('security_group_id', + Integer(), + ForeignKey('security_groups.id')), + Column('instance_id', Integer(), ForeignKey('instances.id')), + ) + + security_group_rules = Table('security_group_rules', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('parent_group_id', + Integer(), + ForeignKey('security_groups.id')), + Column('protocol', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('from_port', Integer()), + Column('to_port', Integer()), + Column('cidr', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('group_id', + Integer(), + ForeignKey('security_groups.id')), + ) + + services = Table('services', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('host', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('binary', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('topic', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('report_count', Integer(), nullable=False), + Column('disabled', Boolean(create_constraint=True, name=None)), + ) + + users = Table('users', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + primary_key=True, + nullable=False), + Column('name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('access_key', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('secret_key', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('is_admin', Boolean(create_constraint=True, name=None)), + ) + + user_project_association = Table('user_project_association', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('user_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + ForeignKey('users.id'), + primary_key=True, + nullable=False), + Column('project_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + ForeignKey('projects.id'), + primary_key=True, + nullable=False), + ) + + user_project_role_association = Table('user_project_role_association', + meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('user_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + primary_key=True, + nullable=False), + Column('project_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + primary_key=True, + nullable=False), + Column('role', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + primary_key=True, + nullable=False), + ForeignKeyConstraint(['user_id', + 'project_id'], + ['user_project_association.user_id', + 'user_project_association.project_id']), + ) + + user_role_association = Table('user_role_association', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('user_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + ForeignKey('users.id'), + primary_key=True, + nullable=False), + Column('role', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + primary_key=True, + nullable=False), + ) + + volumes = Table('volumes', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('ec2_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('user_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('project_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('host', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('size', Integer()), + Column('availability_zone', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('instance_id', + Integer(), + ForeignKey('instances.id'), + nullable=True), + Column('mountpoint', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('attach_time', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('status', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('attach_status', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('scheduled_at', DateTime(timezone=False)), + Column('launched_at', DateTime(timezone=False)), + Column('terminated_at', DateTime(timezone=False)), + Column('display_name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('display_description', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + tables = [auth_tokens, + instances, key_pairs, networks, fixed_ips, floating_ips, + quotas, security_groups, security_group_inst_assoc, + security_group_rules, services, users, projects, + user_project_association, user_project_role_association, + user_role_association, volumes, export_devices] + + for table in tables: + try: + table.create() + except Exception: + LOG.info(repr(table)) + LOG.exception('Exception while creating table') + meta.drop_all(tables=tables) + raise + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + meta = MetaData() + meta.bind = migrate_engine + + auth_tokens = Table('auth_tokens', meta, autoload=True) + export_devices = Table('export_devices', meta, autoload=True) + fixed_ips = Table('fixed_ips', meta, autoload=True) + floating_ips = Table('floating_ips', meta, autoload=True) + instances = Table('instances', meta, autoload=True) + key_pairs = Table('key_pairs', meta, autoload=True) + networks = Table('networks', meta, autoload=True) + projects = Table('projects', meta, autoload=True) + quotas = Table('quotas', meta, autoload=True) + security_groups = Table('security_groups', meta, autoload=True) + security_group_inst_assoc = Table('security_group_instance_association', + meta, autoload=True) + security_group_rules = Table('security_group_rules', meta, autoload=True) + services = Table('services', meta, autoload=True) + users = Table('users', meta, autoload=True) + user_project_association = Table('user_project_association', meta, + autoload=True) + user_project_role_association = Table('user_project_role_association', + meta, + autoload=True) + user_role_association = Table('user_role_association', meta, autoload=True) + volumes = Table('volumes', meta, autoload=True) + + # table order matters, don't change + for table in (auth_tokens, export_devices, floating_ips, fixed_ips, + key_pairs, networks, + quotas, security_group_inst_assoc, + security_group_rules, security_groups, services, + user_project_role_association, user_project_association, + user_role_association, + projects, users, volumes, instances): + table.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/002_bexar.py b/cinder/db/sqlalchemy/migrate_repo/versions/002_bexar.py new file mode 100644 index 000000000..ba1576b7b --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/002_bexar.py @@ -0,0 +1,236 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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 sqlalchemy import Boolean, Column, DateTime, ForeignKey +from sqlalchemy import Integer, MetaData, String, Table, Text +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + volumes = Table('volumes', meta, autoload=True) + + instances = Table('instances', meta, autoload=True) + services = Table('services', meta, autoload=True) + networks = Table('networks', meta, autoload=True) + auth_tokens = Table('auth_tokens', meta, autoload=True) + + # + # New Tables + # + certificates = Table('certificates', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('user_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('project_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('file_name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + + consoles = Table('consoles', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('instance_name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('instance_id', Integer()), + Column('password', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('port', Integer(), nullable=True), + Column('pool_id', + Integer(), + ForeignKey('console_pools.id')), + ) + + console_pools = Table('console_pools', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('address', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('username', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('password', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('console_type', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('public_hostname', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('host', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('compute_host', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + + instance_actions = Table('instance_actions', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('instance_id', + Integer(), + ForeignKey('instances.id')), + Column('action', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('error', + Text(length=None, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + + iscsi_targets = Table('iscsi_targets', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('target_num', Integer()), + Column('host', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('volume_id', + Integer(), + ForeignKey('volumes.id'), + nullable=True), + ) + + tables = [certificates, console_pools, consoles, instance_actions, + iscsi_targets] + for table in tables: + try: + table.create() + except Exception: + LOG.info(repr(table)) + LOG.exception('Exception while creating table') + meta.drop_all(tables=tables) + raise + + auth_tokens.c.user_id.alter(type=String(length=255, + convert_unicode=False, + assert_unicode=None, + unicode_error=None, + _warn_on_bytestring=False)) + + # + # New Columns + # + instances_availability_zone = Column( + 'availability_zone', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)) + + instances_locked = Column('locked', + Boolean(create_constraint=True, name=None)) + + networks_cidr_v6 = Column( + 'cidr_v6', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)) + + networks_ra_server = Column( + 'ra_server', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)) + + services_availability_zone = Column( + 'availability_zone', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)) + + instances.create_column(instances_availability_zone) + instances.create_column(instances_locked) + networks.create_column(networks_cidr_v6) + networks.create_column(networks_ra_server) + services.create_column(services_availability_zone) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + volumes = Table('volumes', meta, autoload=True) + + instances = Table('instances', meta, autoload=True) + services = Table('services', meta, autoload=True) + networks = Table('networks', meta, autoload=True) + auth_tokens = Table('auth_tokens', meta, autoload=True) + + certificates = Table('certificates', meta, autoload=True) + consoles = Table('consoles', meta, autoload=True) + console_pools = Table('console_pools', meta, autoload=True) + instance_actions = Table('instance_actions', meta, autoload=True) + iscsi_targets = Table('iscsi_targets', meta, autoload=True) + + # table order matters, don't change + tables = [certificates, consoles, console_pools, instance_actions, + iscsi_targets] + for table in tables: + table.drop() + + auth_tokens.c.user_id.alter(type=Integer()) + + instances.drop_column('availability_zone') + instances.drop_column('locked') + networks.drop_column('cidr_v6') + networks.drop_column('ra_server') + services.drop_column('availability_zone') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/002_postgresql_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/002_postgresql_downgrade.sql new file mode 100644 index 000000000..cf5c1a208 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/002_postgresql_downgrade.sql @@ -0,0 +1,20 @@ +BEGIN; + + DROP TABLE certificates; + DROP TABLE consoles; + DROP TABLE console_pools; + DROP TABLE instance_actions; + DROP TABLE iscsi_targets; + + ALTER TABLE auth_tokens ADD COLUMN user_id_backup INTEGER; + UPDATE auth_tokens SET user_id_backup = CAST(user_id AS INTEGER); + ALTER TABLE auth_tokens DROP COLUMN user_id; + ALTER TABLE auth_tokens RENAME COLUMN user_id_backup TO user_id; + + ALTER TABLE instances DROP COLUMN availability_zone; + ALTER TABLE instances DROP COLUMN locked; + ALTER TABLE networks DROP COLUMN cidr_v6; + ALTER TABLE networks DROP COLUMN ra_server; + ALTER TABLE services DROP COLUMN availability_zone; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/002_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/002_sqlite_downgrade.sql new file mode 100644 index 000000000..8c6a5beca --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/002_sqlite_downgrade.sql @@ -0,0 +1,388 @@ +BEGIN TRANSACTION; + + DROP TABLE certificates; + + DROP TABLE console_pools; + + DROP TABLE consoles; + + DROP TABLE instance_actions; + + DROP TABLE iscsi_targets; + + CREATE TEMPORARY TABLE auth_tokens_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + token_hash VARCHAR(255) NOT NULL, + user_id VARCHAR(255), + server_manageent_url VARCHAR(255), + storage_url VARCHAR(255), + cdn_management_url VARCHAR(255), + PRIMARY KEY (token_hash), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO auth_tokens_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + token_hash, + user_id, + server_manageent_url, + storage_url, + cdn_management_url + FROM auth_tokens; + + DROP TABLE auth_tokens; + + CREATE TABLE auth_tokens ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + token_hash VARCHAR(255) NOT NULL, + user_id INTEGER, + server_manageent_url VARCHAR(255), + storage_url VARCHAR(255), + cdn_management_url VARCHAR(255), + PRIMARY KEY (token_hash), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO auth_tokens + SELECT created_at, + updated_at, + deleted_at, + deleted, + token_hash, + user_id, + server_manageent_url, + storage_url, + cdn_management_url + FROM auth_tokens_backup; + + DROP TABLE auth_tokens_backup; + + CREATE TEMPORARY TABLE instances_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + internal_id INTEGER, + admin_pass VARCHAR(255), + user_id VARCHAR(255), + project_id VARCHAR(255), + image_id VARCHAR(255), + kernel_id VARCHAR(255), + ramdisk_id VARCHAR(255), + server_name VARCHAR(255), + launch_index INTEGER, + key_name VARCHAR(255), + key_data TEXT, + state INTEGER, + state_description VARCHAR(255), + memory_mb INTEGER, + vcpus INTEGER, + local_gb INTEGER, + hostname VARCHAR(255), + host VARCHAR(255), + instance_type VARCHAR(255), + user_data TEXT, + reservation_id VARCHAR(255), + mac_address VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + availability_zone VARCHAR(255), + locked BOOLEAN, + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (locked IN (0, 1)) + ); + + INSERT INTO instances_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + internal_id, + admin_pass, + user_id, + project_id, + image_id, + kernel_id, + ramdisk_id, + server_name, + launch_index, + key_name, + key_data, + state, + state_description, + memory_mb, + vcpus, + local_gb, + hostname, + host, + instance_type, + user_data, + reservation_id, + mac_address, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + availability_zone, + locked + FROM instances; + + DROP TABLE instances; + + CREATE TABLE instances ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + internal_id INTEGER, + admin_pass VARCHAR(255), + user_id VARCHAR(255), + project_id VARCHAR(255), + image_id VARCHAR(255), + kernel_id VARCHAR(255), + ramdisk_id VARCHAR(255), + server_name VARCHAR(255), + launch_index INTEGER, + key_name VARCHAR(255), + key_data TEXT, + state INTEGER, + state_description VARCHAR(255), + memory_mb INTEGER, + vcpus INTEGER, + local_gb INTEGER, + hostname VARCHAR(255), + host VARCHAR(255), + instance_type VARCHAR(255), + user_data TEXT, + reservation_id VARCHAR(255), + mac_address VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO instances + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + internal_id, + admin_pass, + user_id, + project_id, + image_id, + kernel_id, + ramdisk_id, + server_name, + launch_index, + key_name, + key_data, + state, + state_description, + memory_mb, + vcpus, + local_gb, + hostname, + host, + instance_type, + user_data, + reservation_id, + mac_address, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description + FROM instances_backup; + + DROP TABLE instances_backup; + + CREATE TEMPORARY TABLE networks_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + injected BOOLEAN, + cidr VARCHAR(255), + netmask VARCHAR(255), + bridge VARCHAR(255), + gateway VARCHAR(255), + broadcast VARCHAR(255), + dns VARCHAR(255), + vlan INTEGER, + vpn_public_address VARCHAR(255), + vpn_public_port INTEGER, + vpn_private_address VARCHAR(255), + dhcp_start VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + cidr_v6 VARCHAR(255), + ra_server VARCHAR(255), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (injected IN (0, 1)) + ); + + INSERT INTO networks_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + injected, + cidr, + netmask, + bridge, + gateway, + broadcast, + dns, + vlan, + vpn_public_address, + vpn_public_port, + vpn_private_address, + dhcp_start, + project_id, + host, + cidr_v6, + ra_server + FROM networks; + + DROP TABLE networks; + + CREATE TABLE networks ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + injected BOOLEAN, + cidr VARCHAR(255), + netmask VARCHAR(255), + bridge VARCHAR(255), + gateway VARCHAR(255), + broadcast VARCHAR(255), + dns VARCHAR(255), + vlan INTEGER, + vpn_public_address VARCHAR(255), + vpn_public_port INTEGER, + vpn_private_address VARCHAR(255), + dhcp_start VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (injected IN (0, 1)) + ); + + INSERT INTO networks + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + injected, + cidr, + netmask, + bridge, + gateway, + broadcast, + dns, + vlan, + vpn_public_address, + vpn_public_port, + vpn_private_address, + dhcp_start, + project_id, + host + FROM networks_backup; + + DROP TABLE networks_backup; + + CREATE TEMPORARY TABLE services_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + host VARCHAR(255), + binary VARCHAR(255), + topic VARCHAR(255), + report_count INTEGER NOT NULL, + disabled BOOLEAN, + availability_zone VARCHAR(255), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (disabled IN (0, 1)) + ); + + INSERT INTO services_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + host, + binary, + topic, + report_count, + disabled, + availability_zone + FROM services; + + DROP TABLE services; + + CREATE TABLE services ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + host VARCHAR(255), + binary VARCHAR(255), + topic VARCHAR(255), + report_count INTEGER NOT NULL, + disabled BOOLEAN, + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (disabled IN (0, 1)) + ); + + INSERT INTO services + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + host, + binary, + topic, + report_count, + disabled + FROM services_backup; + + DROP TABLE services_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/003_add_label_to_networks.py b/cinder/db/sqlalchemy/migrate_repo/versions/003_add_label_to_networks.py new file mode 100644 index 000000000..668b77f0f --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/003_add_label_to_networks.py @@ -0,0 +1,42 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC +# 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 sqlalchemy import Column, Integer, MetaData, String, Table + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + networks = Table('networks', meta, autoload=True) + + networks_label = Column( + 'label', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)) + networks.create_column(networks_label) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + networks = Table('networks', meta, autoload=True) + + networks.drop_column('label') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/003_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/003_sqlite_downgrade.sql new file mode 100644 index 000000000..01601cac0 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/003_sqlite_downgrade.sql @@ -0,0 +1,111 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE networks_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + injected BOOLEAN, + cidr VARCHAR(255), + netmask VARCHAR(255), + bridge VARCHAR(255), + gateway VARCHAR(255), + broadcast VARCHAR(255), + dns VARCHAR(255), + vlan INTEGER, + vpn_public_address VARCHAR(255), + vpn_public_port INTEGER, + vpn_private_address VARCHAR(255), + dhcp_start VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + cidr_v6 VARCHAR(255), + ra_server VARCHAR(255), + label VARCHAR(255), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (injected IN (0, 1)) + ); + + INSERT INTO networks_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + injected, + cidr, + netmask, + bridge, + gateway, + broadcast, + dns, + vlan, + vpn_public_address, + vpn_public_port, + vpn_private_address, + dhcp_start, + project_id, + host, + cidr_v6, + ra_server, + label + FROM networks; + + DROP TABLE networks; + + CREATE TABLE networks ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + injected BOOLEAN, + cidr VARCHAR(255), + netmask VARCHAR(255), + bridge VARCHAR(255), + gateway VARCHAR(255), + broadcast VARCHAR(255), + dns VARCHAR(255), + vlan INTEGER, + vpn_public_address VARCHAR(255), + vpn_public_port INTEGER, + vpn_private_address VARCHAR(255), + dhcp_start VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + cidr_v6 VARCHAR(255), + ra_server VARCHAR(255), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (injected IN (0, 1)) + ); + + INSERT INTO networks + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + injected, + cidr, + netmask, + bridge, + gateway, + broadcast, + dns, + vlan, + vpn_public_address, + vpn_public_port, + vpn_private_address, + dhcp_start, + project_id, + host, + cidr_v6, + ra_server + FROM networks_backup; + + DROP TABLE networks_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/004_add_zone_tables.py b/cinder/db/sqlalchemy/migrate_repo/versions/004_add_zone_tables.py new file mode 100644 index 000000000..e46d9d443 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/004_add_zone_tables.py @@ -0,0 +1,66 @@ +# Copyright 2010 OpenStack LLC. +# 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 sqlalchemy import Boolean, Column, DateTime, Integer +from sqlalchemy import MetaData, String, Table +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + # + # New Tables + # + zones = Table('zones', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('api_url', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('username', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('password', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + + for table in (zones, ): + try: + table.create() + except Exception: + LOG.info(repr(table)) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + zones = Table('zones', meta, autoload=True) + + for table in (zones, ): + table.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/005_add_instance_metadata.py b/cinder/db/sqlalchemy/migrate_repo/versions/005_add_instance_metadata.py new file mode 100644 index 000000000..4eb66111a --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/005_add_instance_metadata.py @@ -0,0 +1,81 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 Justin Santa Barbara +# 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 sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer +from sqlalchemy import MetaData, String, Table +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + instances = Table('instances', meta, autoload=True) + + quotas = Table('quotas', meta, autoload=True) + + instance_metadata_table = Table('instance_metadata', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('instance_id', + Integer(), + ForeignKey('instances.id'), + nullable=False), + Column('key', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('value', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False))) + + for table in (instance_metadata_table, ): + try: + table.create() + except Exception: + LOG.info(repr(table)) + LOG.exception('Exception while creating table') + raise + + quota_metadata_items = Column('metadata_items', Integer()) + quotas.create_column(quota_metadata_items) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + instances = Table('instances', meta, autoload=True) + + quotas = Table('quotas', meta, autoload=True) + + instance_metadata_table = Table('instance_metadata', meta, autoload=True) + + for table in (instance_metadata_table, ): + table.drop() + + quotas.drop_column('metadata_items') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/006_add_provider_data_to_volumes.py b/cinder/db/sqlalchemy/migrate_repo/versions/006_add_provider_data_to_volumes.py new file mode 100644 index 000000000..df2be9df4 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/006_add_provider_data_to_volumes.py @@ -0,0 +1,54 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 Justin Santa Barbara. +# 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 sqlalchemy import Column, Integer, MetaData, String, Table + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + volumes = Table('volumes', meta, autoload=True) + + # Add columns to existing tables + volumes_provider_location = Column('provider_location', + String(length=256, + convert_unicode=False, + assert_unicode=None, + unicode_error=None, + _warn_on_bytestring=False)) + + volumes_provider_auth = Column('provider_auth', + String(length=256, + convert_unicode=False, + assert_unicode=None, + unicode_error=None, + _warn_on_bytestring=False)) + volumes.create_column(volumes_provider_location) + volumes.create_column(volumes_provider_auth) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + volumes = Table('volumes', meta, autoload=True) + + volumes.drop_column('provider_location') + volumes.drop_column('provider_auth') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/006_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/006_sqlite_downgrade.sql new file mode 100644 index 000000000..f55c28437 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/006_sqlite_downgrade.sql @@ -0,0 +1,113 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE volumes_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + ec2_id VARCHAR(255), + user_id VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + size INTEGER, + availability_zone VARCHAR(255), + instance_id INTEGER, + mountpoint VARCHAR(255), + attach_time VARCHAR(255), + status VARCHAR(255), + attach_status VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + provider_location VARCHAR(256), + provider_auth VARCHAR(256), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + FOREIGN KEY(instance_id) REFERENCES instances (id) + ); + + INSERT INTO volumes_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + ec2_id, + user_id, + project_id, + host, + size, + availability_zone, + instance_id, + mountpoint, + attach_time, + status, + attach_status, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + provider_location, + provider_auth + FROM volumes; + + DROP TABLE volumes; + + CREATE TABLE volumes ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + ec2_id VARCHAR(255), + user_id VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + size INTEGER, + availability_zone VARCHAR(255), + instance_id INTEGER, + mountpoint VARCHAR(255), + attach_time VARCHAR(255), + status VARCHAR(255), + attach_status VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + FOREIGN KEY(instance_id) REFERENCES instances (id) + ); + + INSERT INTO volumes + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + ec2_id, + user_id, + project_id, + host, + size, + availability_zone, + instance_id, + mountpoint, + attach_time, + status, + attach_status, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description + FROM volumes_backup; + + DROP TABLE volumes_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/007_add_ipv6_to_fixed_ips.py b/cinder/db/sqlalchemy/migrate_repo/versions/007_add_ipv6_to_fixed_ips.py new file mode 100644 index 000000000..d84fa1734 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/007_add_ipv6_to_fixed_ips.py @@ -0,0 +1,70 @@ +# Copyright 2011 OpenStack LLC +# 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 sqlalchemy import Column, Integer, MetaData, String, Table + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + fixed_ips = Table('fixed_ips', meta, autoload=True) + + # + # New Columns + # + fixed_ips_addressV6 = Column( + "addressV6", + String( + length=255, + convert_unicode=False, + assert_unicode=None, + unicode_error=None, + _warn_on_bytestring=False)) + + fixed_ips_netmaskV6 = Column( + "netmaskV6", + String( + length=3, + convert_unicode=False, + assert_unicode=None, + unicode_error=None, + _warn_on_bytestring=False)) + + fixed_ips_gatewayV6 = Column( + "gatewayV6", + String( + length=255, + convert_unicode=False, + assert_unicode=None, + unicode_error=None, + _warn_on_bytestring=False)) + # Add columns to existing tables + fixed_ips.create_column(fixed_ips_addressV6) + fixed_ips.create_column(fixed_ips_netmaskV6) + fixed_ips.create_column(fixed_ips_gatewayV6) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + fixed_ips = Table('fixed_ips', meta, autoload=True) + + fixed_ips.drop_column('addressV6') + fixed_ips.drop_column('netmaskV6') + fixed_ips.drop_column('gatewayV6') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/007_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/007_sqlite_downgrade.sql new file mode 100644 index 000000000..44d347698 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/007_sqlite_downgrade.sql @@ -0,0 +1,79 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE fixed_ips_backup ( + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN DEFAULT FALSE, + leased BOOLEAN DEFAULT FALSE, + reserved BOOLEAN DEFAULT FALSE, + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + addressV6 VARCHAR(255), + netmaskV6 VARCHAR(3), + gatewayV6 VARCHAR(255), + PRIMARY KEY (id), + CHECK (leased IN (0, 1)), + CHECK (allocated IN (0, 1)), + CHECK (deleted IN (0, 1)), + CHECK (reserved IN (0, 1)) + ); + + INSERT INTO fixed_ips_backup + SELECT id, + address, + network_id, + instance_id, + allocated, + leased, + reserved, + created_at, + updated_at, + deleted_at, + deleted, + addressV6, + netmaskV6, + gatewayV6 + FROM fixed_ips; + + DROP TABLE fixed_ips; + + CREATE TABLE fixed_ips ( + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN DEFAULT FALSE, + leased BOOLEAN DEFAULT FALSE, + reserved BOOLEAN DEFAULT FALSE, + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + PRIMARY KEY (id), + CHECK (leased IN (0, 1)), + CHECK (allocated IN (0, 1)), + CHECK (deleted IN (0, 1)), + CHECK (reserved IN (0, 1)) + ); + + INSERT INTO fixed_ips + SELECT id, + address, + network_id, + instance_id, + allocated, + leased, + reserved, + created_at, + updated_at, + deleted_at, + deleted + FROM fixed_ips_backup; + + DROP TABLE fixed_ips_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/008_add_instance_types.py b/cinder/db/sqlalchemy/migrate_repo/versions/008_add_instance_types.py new file mode 100644 index 000000000..98e538628 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/008_add_instance_types.py @@ -0,0 +1,85 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 Ken Pepple +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Boolean, Column, DateTime, Integer +from sqlalchemy import MetaData, String, Table +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here + # Don't create your own engine; bind migrate_engine + # to your metadata + meta = MetaData() + meta.bind = migrate_engine + # + # New Tables + # + instance_types = Table('instance_types', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + unique=True), + Column('id', Integer(), primary_key=True, nullable=False), + Column('memory_mb', Integer(), nullable=False), + Column('vcpus', Integer(), nullable=False), + Column('local_gb', Integer(), nullable=False), + Column('flavorid', Integer(), nullable=False, unique=True), + Column('swap', Integer(), nullable=False, default=0), + Column('rxtx_quota', Integer(), nullable=False, default=0), + Column('rxtx_cap', Integer(), nullable=False, default=0)) + try: + instance_types.create() + except Exception: + LOG.info(repr(instance_types)) + LOG.exception('Exception while creating instance_types table') + raise + + # Here are the old static instance types + INSTANCE_TYPES = { + 'm1.tiny': dict(memory_mb=512, vcpus=1, local_gb=0, flavorid=1), + 'm1.small': dict(memory_mb=2048, vcpus=1, local_gb=20, flavorid=2), + 'm1.medium': dict(memory_mb=4096, vcpus=2, local_gb=40, flavorid=3), + 'm1.large': dict(memory_mb=8192, vcpus=4, local_gb=80, flavorid=4), + 'm1.xlarge': dict(memory_mb=16384, vcpus=8, local_gb=160, flavorid=5)} + try: + i = instance_types.insert() + for name, values in INSTANCE_TYPES.iteritems(): + # FIXME(kpepple) should we be seeding created_at / updated_at ? + # now = datetime.datatime.utcnow() + i.execute({'name': name, 'memory_mb': values["memory_mb"], + 'vcpus': values["vcpus"], 'deleted': False, + 'local_gb': values["local_gb"], + 'flavorid': values["flavorid"]}) + except Exception: + LOG.info(repr(instance_types)) + LOG.exception('Exception while seeding instance_types table') + raise + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + meta = MetaData() + meta.bind = migrate_engine + instance_types = Table('instance_types', meta, autoload=True) + for table in (instance_types, ): + table.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/009_add_instance_migrations.py b/cinder/db/sqlalchemy/migrate_repo/versions/009_add_instance_migrations.py new file mode 100644 index 000000000..acedd3ad0 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/009_add_instance_migrations.py @@ -0,0 +1,70 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC. +# 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 sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer +from sqlalchemy import MetaData, String, Table +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + instances = Table('instances', meta, autoload=True) + + # + # New Tables + # + migrations = Table('migrations', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('source_compute', String(255)), + Column('dest_compute', String(255)), + Column('dest_host', String(255)), + Column('instance_id', Integer, ForeignKey('instances.id'), + nullable=True), + Column('status', String(255)), + ) + + for table in (migrations, ): + try: + table.create() + except Exception: + LOG.info(repr(table)) + LOG.exception('Exception while creating table') + raise + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + instances = Table('instances', meta, autoload=True) + + migrations = Table('migrations', meta, autoload=True) + + for table in (migrations, ): + table.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/010_add_os_type_to_instances.py b/cinder/db/sqlalchemy/migrate_repo/versions/010_add_os_type_to_instances.py new file mode 100644 index 000000000..da01940bd --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/010_add_os_type_to_instances.py @@ -0,0 +1,45 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, Integer, MetaData, String, Table + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + instances_os_type = Column('os_type', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False), + nullable=True) + instances.create_column(instances_os_type) + migrate_engine.execute(instances.update()\ + .where(instances.c.os_type == None)\ + .values(os_type='linux')) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + instances.drop_column('os_type') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/011_live_migration.py b/cinder/db/sqlalchemy/migrate_repo/versions/011_live_migration.py new file mode 100644 index 000000000..c2a3560a3 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/011_live_migration.py @@ -0,0 +1,85 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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 sqlalchemy import Boolean, Column, DateTime, Integer, MetaData +from sqlalchemy import Table, Text +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + compute_nodes = Table('compute_nodes', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('service_id', Integer(), nullable=False), + + Column('vcpus', Integer(), nullable=False), + Column('memory_mb', Integer(), nullable=False), + Column('local_gb', Integer(), nullable=False), + Column('vcpus_used', Integer(), nullable=False), + Column('memory_mb_used', Integer(), nullable=False), + Column('local_gb_used', Integer(), nullable=False), + Column('hypervisor_type', + Text(convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + nullable=False), + Column('hypervisor_version', Integer(), nullable=False), + Column('cpu_info', + Text(convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + nullable=False), + ) + + try: + compute_nodes.create() + except Exception: + LOG.info(repr(compute_nodes)) + LOG.exception('Exception while creating table') + meta.drop_all(tables=[compute_nodes]) + raise + + instances_launched_on = Column( + 'launched_on', + Text(convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + nullable=True) + instances.create_column(instances_launched_on) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + compute_nodes = Table('compute_nodes', meta, autoload=True) + + compute_nodes.drop() + + instances.drop_column('launched_on') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/012_add_ipv6_flatmanager.py b/cinder/db/sqlalchemy/migrate_repo/versions/012_add_ipv6_flatmanager.py new file mode 100644 index 000000000..a626d2c7d --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/012_add_ipv6_flatmanager.py @@ -0,0 +1,90 @@ +# Copyright (c) 2011 NTT. +# 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 sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer +from sqlalchemy import MetaData, String, Table + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + instances = Table('instances', meta, autoload=True) + + networks = Table('networks', meta, autoload=True) + fixed_ips = Table('fixed_ips', meta, autoload=True) + + # Alter column name + networks.c.ra_server.alter(name='gateway_v6') + # Add new column to existing table + networks_netmask_v6 = Column( + 'netmask_v6', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)) + networks.create_column(networks_netmask_v6) + + # drop existing columns from table + fixed_ips.c.addressV6.drop() + fixed_ips.c.netmaskV6.drop() + fixed_ips.c.gatewayV6.drop() + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + instances = Table('instances', meta, autoload=True) + + networks = Table('networks', meta, autoload=True) + fixed_ips = Table('fixed_ips', meta, autoload=True) + + networks.c.gateway_v6.alter(name='ra_server') + networks.drop_column('netmask_v6') + + fixed_ips_addressV6 = Column( + "addressV6", + String( + length=255, + convert_unicode=False, + assert_unicode=None, + unicode_error=None, + _warn_on_bytestring=False)) + + fixed_ips_netmaskV6 = Column( + "netmaskV6", + String( + length=3, + convert_unicode=False, + assert_unicode=None, + unicode_error=None, + _warn_on_bytestring=False)) + + fixed_ips_gatewayV6 = Column( + "gatewayV6", + String( + length=255, + convert_unicode=False, + assert_unicode=None, + unicode_error=None, + _warn_on_bytestring=False)) + + for column in (fixed_ips_addressV6, + fixed_ips_netmaskV6, + fixed_ips_gatewayV6): + fixed_ips.create_column(column) diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/012_sqlite_upgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/012_sqlite_upgrade.sql new file mode 100644 index 000000000..0779f50e8 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/012_sqlite_upgrade.sql @@ -0,0 +1,195 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE networks_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + injected BOOLEAN, + cidr VARCHAR(255), + netmask VARCHAR(255), + bridge VARCHAR(255), + gateway VARCHAR(255), + broadcast VARCHAR(255), + dns VARCHAR(255), + vlan INTEGER, + vpn_public_address VARCHAR(255), + vpn_public_port INTEGER, + vpn_private_address VARCHAR(255), + dhcp_start VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + cidr_v6 VARCHAR(255), + ra_server VARCHAR(255), + label VARCHAR(255), + PRIMARY KEY (id), + CHECK (injected IN (0, 1)), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO networks_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + injected, + cidr, + netmask, + bridge, + gateway, + broadcast, + dns, + vlan, + vpn_public_address, + vpn_public_port, + vpn_private_address, + dhcp_start, + project_id, + host, + cidr_v6, + ra_server, + label + FROM networks; + + DROP TABLE networks; + + CREATE TABLE networks ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + injected BOOLEAN, + cidr VARCHAR(255), + netmask VARCHAR(255), + bridge VARCHAR(255), + gateway VARCHAR(255), + broadcast VARCHAR(255), + dns VARCHAR(255), + vlan INTEGER, + vpn_public_address VARCHAR(255), + vpn_public_port INTEGER, + vpn_private_address VARCHAR(255), + dhcp_start VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + cidr_v6 VARCHAR(255), + gateway_v6 VARCHAR(255), + label VARCHAR(255), + netmask_v6 VARCHAR(255), + PRIMARY KEY (id), + CHECK (injected IN (0, 1)), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO networks + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + injected, + cidr, + netmask, + bridge, + gateway, + broadcast, + dns, + vlan, + vpn_public_address, + vpn_public_port, + vpn_private_address, + dhcp_start, + project_id, + host, + cidr_v6, + ra_server AS gateway_v6, + label, + NULL AS netmask_v6 + FROM networks_backup; + + DROP TABLE networks_backup; + + CREATE TEMPORARY TABLE fixed_ips_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN, + leased BOOLEAN, + reserved BOOLEAN, + addressV6 VARCHAR(255), + netmaskV6 VARCHAR(3), + gatewayV6 VARCHAR(255), + PRIMARY KEY (id), + CHECK (reserved IN (0, 1)), + CHECK (allocated IN (0, 1)), + CHECK (leased IN (0, 1)), + CHECK (deleted IN (0, 1)), + FOREIGN KEY(instance_id) REFERENCES instances (id), + FOREIGN KEY(network_id) REFERENCES networks (id) + ); + + INSERT INTO fixed_ips_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + address, + network_id, + instance_id, + allocated, + leased, + reserved, + addressV6, + netmaskV6, + gatewayV6 + FROM fixed_ips; + + DROP TABLE fixed_ips; + + CREATE TABLE fixed_ips ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN, + leased BOOLEAN, + reserved BOOLEAN, + PRIMARY KEY (id), + CHECK (reserved IN (0, 1)), + CHECK (allocated IN (0, 1)), + CHECK (leased IN (0, 1)), + CHECK (deleted IN (0, 1)), + FOREIGN KEY(instance_id) REFERENCES instances (id), + FOREIGN KEY(network_id) REFERENCES networks (id) + ); + + INSERT INTO fixed_ips + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + address, + network_id, + instance_id, + allocated, + leased, + reserved + FROM fixed_ips_backup; + + DROP TABLE fixed_ips_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/013_add_flavors_to_migrations.py b/cinder/db/sqlalchemy/migrate_repo/versions/013_add_flavors_to_migrations.py new file mode 100644 index 000000000..d8735ec7d --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/013_add_flavors_to_migrations.py @@ -0,0 +1,43 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 sqlalchemy import Column, Integer, MetaData, Table + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + migrations = Table('migrations', meta, autoload=True) + + old_flavor_id = Column('old_flavor_id', Integer()) + new_flavor_id = Column('new_flavor_id', Integer()) + + migrations.create_column(old_flavor_id) + migrations.create_column(new_flavor_id) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + migrations = Table('migrations', meta, autoload=True) + + migrations.drop_column('old_flavor_id') + migrations.drop_column('new_flavor_id') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/013_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/013_sqlite_downgrade.sql new file mode 100644 index 000000000..fbba364be --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/013_sqlite_downgrade.sql @@ -0,0 +1,69 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE migrations_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + source_compute VARCHAR(255), + dest_compute VARCHAR(255), + dest_host VARCHAR(255), + instance_id INTEGER, + status VARCHAR(255), + old_flavor_id INTEGER, + new_flavor_id INTEGER, + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + FOREIGN KEY(instance_id) REFERENCES instances (id) + ); + + INSERT INTO migrations_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + source_compute, + dest_compute, + dest_host, + instance_id, + status, + old_flavor_id, + new_flavor_id + FROM migrations; + + DROP TABLE migrations; + + CREATE TABLE migrations ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + source_compute VARCHAR(255), + dest_compute VARCHAR(255), + dest_host VARCHAR(255), + instance_id INTEGER, + status VARCHAR(255), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + FOREIGN KEY(instance_id) REFERENCES instances (id) + ); + + INSERT INTO migrations + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + source_compute, + dest_compute, + dest_host, + instance_id, + status + FROM migrations_backup; + + DROP TABLE migrations_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/014_add_instance_type_id_to_instances.py b/cinder/db/sqlalchemy/migrate_repo/versions/014_add_instance_type_id_to_instances.py new file mode 100644 index 000000000..b363caca5 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/014_add_instance_type_id_to_instances.py @@ -0,0 +1,74 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, Integer, MetaData, String, Table + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + instance_types = Table('instance_types', meta, autoload=True) + instances = Table('instances', meta, autoload=True) + + c_instance_type_id = Column('instance_type_id', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False), + nullable=True) + + instances.create_column(c_instance_type_id) + + type_names = {} + recs = migrate_engine.execute(instance_types.select()) + for row in recs: + type_names[row[0]] = row[1] + + for type_id, type_name in type_names.iteritems(): + migrate_engine.execute(instances.update()\ + .where(instances.c.instance_type == type_name)\ + .values(instance_type_id=type_id)) + + instances.c.instance_type.drop() + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instance_types = Table('instance_types', meta, autoload=True) + instances = Table('instances', meta, autoload=True) + + c_instance_type = Column('instance_type', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False), + nullable=True) + instances.create_column(c_instance_type) + + type_names = {} + recs = migrate_engine.execute(instance_types.select()) + for row in recs: + type_names[row[0]] = row[1] + + for type_id, type_name in type_names.iteritems(): + migrate_engine.execute(instances.update()\ + .where(instances.c.instance_type_id == type_id)\ + .values(instance_type=type_name)) + + instances.c.instance_type_id.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/015_add_auto_assign_to_floating_ips.py b/cinder/db/sqlalchemy/migrate_repo/versions/015_add_auto_assign_to_floating_ips.py new file mode 100644 index 000000000..51db85066 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/015_add_auto_assign_to_floating_ips.py @@ -0,0 +1,35 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# Copyright 2011 Grid Dynamics +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Boolean, Column, MetaData, Table + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + floating_ips = Table('floating_ips', meta, autoload=True) + c_auto_assigned = Column('auto_assigned', Boolean, default=False) + floating_ips.create_column(c_auto_assigned) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + floating_ips = Table('floating_ips', meta, autoload=True) + floating_ips.drop_column('auto_assigned') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/015_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/015_sqlite_downgrade.sql new file mode 100644 index 000000000..c599ef2b3 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/015_sqlite_downgrade.sql @@ -0,0 +1,62 @@ +BEGIN TRANSACTION; + CREATE TEMPORARY TABLE floating_ips_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + fixed_ip_id INTEGER, + project_id VARCHAR(255), + host VARCHAR(255), + auto_assigned BOOLEAN, + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (auto_assigned IN (0, 1)), + FOREIGN KEY(fixed_ip_id) REFERENCES fixed_ips (id) + ); + + INSERT INTO floating_ips_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + address, + fixed_ip_id, + project_id, + host, + auto_assigned + FROM floating_ips; + + DROP TABLE floating_ips; + + CREATE TABLE floating_ips ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + fixed_ip_id INTEGER, + project_id VARCHAR(255), + host VARCHAR(255), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + FOREIGN KEY(fixed_ip_id) REFERENCES fixed_ips (id) + ); + + INSERT INTO floating_ips + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + address, + fixed_ip_id, + project_id, + host + FROM floating_ips_backup; + + DROP TABLE floating_ips_backup; +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/016_make_quotas_key_and_value.py b/cinder/db/sqlalchemy/migrate_repo/versions/016_make_quotas_key_and_value.py new file mode 100644 index 000000000..1c7081c4a --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/016_make_quotas_key_and_value.py @@ -0,0 +1,213 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Boolean, Column, DateTime, Integer +from sqlalchemy import MetaData, String, Table + +from cinder import utils + +resources = [ + 'instances', + 'cores', + 'volumes', + 'gigabytes', + 'floating_ips', + 'metadata_items', +] + + +def old_style_quotas_table(meta, name): + return Table(name, meta, + Column('id', Integer(), primary_key=True), + Column('created_at', DateTime(), + default=utils.utcnow), + Column('updated_at', DateTime(), + onupdate=utils.utcnow), + Column('deleted_at', DateTime()), + Column('deleted', Boolean(), default=False), + Column('project_id', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False)), + Column('instances', Integer()), + Column('cores', Integer()), + Column('volumes', Integer()), + Column('gigabytes', Integer()), + Column('floating_ips', Integer()), + Column('metadata_items', Integer()), + ) + + +def new_style_quotas_table(meta, name): + return Table(name, meta, + Column('id', Integer(), primary_key=True), + Column('created_at', DateTime(), + default=utils.utcnow), + Column('updated_at', DateTime(), + onupdate=utils.utcnow), + Column('deleted_at', DateTime()), + Column('deleted', Boolean(), default=False), + Column('project_id', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False)), + Column('resource', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False), + nullable=False), + Column('hard_limit', Integer(), nullable=True), + ) + + +def quotas_table(meta, name='quotas'): + return Table(name, meta, autoload=True) + + +def _assert_no_duplicate_project_ids(quotas): + project_ids = set() + message = ('There are multiple active quotas for project "%s" ' + '(among others, possibly). ' + 'Please resolve all ambiguous quotas before ' + 'reattempting the migration.') + for quota in quotas: + assert quota.project_id not in project_ids, message % quota.project_id + project_ids.add(quota.project_id) + + +def assert_old_quotas_have_no_active_duplicates(migrate_engine, quotas): + """Ensure that there are no duplicate non-deleted quota entries.""" + select = quotas.select().where(quotas.c.deleted == False) + results = migrate_engine.execute(select) + _assert_no_duplicate_project_ids(list(results)) + + +def assert_new_quotas_have_no_active_duplicates(migrate_engine, quotas): + """Ensure that there are no duplicate non-deleted quota entries.""" + for resource in resources: + select = quotas.select().\ + where(quotas.c.deleted == False).\ + where(quotas.c.resource == resource) + results = migrate_engine.execute(select) + _assert_no_duplicate_project_ids(list(results)) + + +def convert_forward(migrate_engine, old_quotas, new_quotas): + quotas = list(migrate_engine.execute(old_quotas.select())) + for quota in quotas: + for resource in resources: + hard_limit = getattr(quota, resource) + if hard_limit is None: + continue + insert = new_quotas.insert().values( + created_at=quota.created_at, + updated_at=quota.updated_at, + deleted_at=quota.deleted_at, + deleted=quota.deleted, + project_id=quota.project_id, + resource=resource, + hard_limit=hard_limit) + migrate_engine.execute(insert) + + +def earliest(date1, date2): + if date1 is None and date2 is None: + return None + if date1 is None: + return date2 + if date2 is None: + return date1 + if date1 < date2: + return date1 + return date2 + + +def latest(date1, date2): + if date1 is None and date2 is None: + return None + if date1 is None: + return date2 + if date2 is None: + return date1 + if date1 > date2: + return date1 + return date2 + + +def convert_backward(migrate_engine, old_quotas, new_quotas): + quotas = {} + for quota in migrate_engine.execute(new_quotas.select()): + if (quota.resource not in resources + or quota.hard_limit is None or quota.deleted): + continue + if not quota.project_id in quotas: + quotas[quota.project_id] = { + 'project_id': quota.project_id, + 'created_at': quota.created_at, + 'updated_at': quota.updated_at, + quota.resource: quota.hard_limit, + } + else: + quotas[quota.project_id]['created_at'] = earliest( + quota.created_at, quotas[quota.project_id]['created_at']) + quotas[quota.project_id]['updated_at'] = latest( + quota.updated_at, quotas[quota.project_id]['updated_at']) + quotas[quota.project_id][quota.resource] = quota.hard_limit + + for quota in quotas.itervalues(): + insert = old_quotas.insert().values(**quota) + migrate_engine.execute(insert) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + old_quotas = quotas_table(meta) + assert_old_quotas_have_no_active_duplicates(migrate_engine, old_quotas) + + new_quotas = new_style_quotas_table(meta, 'quotas_new') + new_quotas.create() + convert_forward(migrate_engine, old_quotas, new_quotas) + old_quotas.drop() + + # clear metadata to work around this: + # http://code.google.com/p/sqlalchemy-migrate/issues/detail?id=128 + meta.clear() + new_quotas = quotas_table(meta, 'quotas_new') + new_quotas.rename('quotas') + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + meta = MetaData() + meta.bind = migrate_engine + + new_quotas = quotas_table(meta) + assert_new_quotas_have_no_active_duplicates(migrate_engine, new_quotas) + + old_quotas = old_style_quotas_table(meta, 'quotas_old') + old_quotas.create() + convert_backward(migrate_engine, old_quotas, new_quotas) + new_quotas.drop() + + # clear metadata to work around this: + # http://code.google.com/p/sqlalchemy-migrate/issues/detail?id=128 + meta.clear() + old_quotas = quotas_table(meta, 'quotas_old') + old_quotas.rename('quotas') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/017_make_instance_type_id_an_integer.py b/cinder/db/sqlalchemy/migrate_repo/versions/017_make_instance_type_id_an_integer.py new file mode 100644 index 000000000..0aed48a7d --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/017_make_instance_type_id_an_integer.py @@ -0,0 +1,87 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 OpenStack LLC. +# 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 sqlalchemy import Column, Integer, MetaData, String, Table +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + types = {} + for instance in migrate_engine.execute(instances.select()): + if instance.instance_type_id is None: + types[instance.id] = None + continue + try: + types[instance.id] = int(instance.instance_type_id) + except ValueError: + LOG.warn("Instance %s did not have instance_type_id " + "converted to an integer because its value is %s" % + (instance.id, instance.instance_type_id)) + types[instance.id] = None + + integer_column = Column('instance_type_id_int', Integer(), nullable=True) + string_column = instances.c.instance_type_id + + integer_column.create(instances) + for instance_id, instance_type_id in types.iteritems(): + update = instances.update().\ + where(instances.c.id == instance_id).\ + values(instance_type_id_int=instance_type_id) + migrate_engine.execute(update) + + string_column.alter(name='instance_type_id_str') + integer_column.alter(name='instance_type_id') + string_column.drop() + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + integer_column = instances.c.instance_type_id + string_column = Column('instance_type_id_str', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False), + nullable=True) + + types = {} + for instance in migrate_engine.execute(instances.select()): + if instance.instance_type_id is None: + types[instance.id] = None + else: + types[instance.id] = str(instance.instance_type_id) + + string_column.create(instances) + for instance_id, instance_type_id in types.iteritems(): + update = instances.update().\ + where(instances.c.id == instance_id).\ + values(instance_type_id_str=instance_type_id) + migrate_engine.execute(update) + + integer_column.alter(name='instance_type_id_int') + string_column.alter(name='instance_type_id') + integer_column.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/018_rename_server_management_url.py b/cinder/db/sqlalchemy/migrate_repo/versions/018_rename_server_management_url.py new file mode 100644 index 000000000..59ead97ad --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/018_rename_server_management_url.py @@ -0,0 +1,35 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import MetaData, Table + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + tokens = Table('auth_tokens', meta, autoload=True) + c_manageent = tokens.c.server_manageent_url + c_manageent.alter(name='server_management_url') + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + tokens = Table('auth_tokens', meta, autoload=True) + c_management = tokens.c.server_management_url + c_management.alter(name='server_manageent_url') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/019_add_volume_snapshot_support.py b/cinder/db/sqlalchemy/migrate_repo/versions/019_add_volume_snapshot_support.py new file mode 100644 index 000000000..e0670e3c7 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/019_add_volume_snapshot_support.py @@ -0,0 +1,82 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 MORITA Kazutaka. +# 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 sqlalchemy import Column, Table, MetaData +from sqlalchemy import Integer, DateTime, Boolean, String + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + # + # New Tables + # + snapshots = Table('snapshots', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('volume_id', Integer(), nullable=False), + Column('user_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('project_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('status', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('progress', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('volume_size', Integer()), + Column('scheduled_at', DateTime(timezone=False)), + Column('display_name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('display_description', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False))) + try: + snapshots.create() + except Exception: + LOG.info(repr(snapshots)) + LOG.exception('Exception while creating table') + meta.drop_all(tables=[snapshots]) + raise + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + meta = MetaData() + meta.bind = migrate_engine + snapshots = Table('snapshots', meta, autoload=True) + snapshots.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/020_add_snapshot_id_to_volumes.py b/cinder/db/sqlalchemy/migrate_repo/versions/020_add_snapshot_id_to_volumes.py new file mode 100644 index 000000000..c5a632ca0 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/020_add_snapshot_id_to_volumes.py @@ -0,0 +1,40 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 MORITA Kazutaka. +# 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 sqlalchemy import Column, Table, MetaData, Integer + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + volumes = Table('volumes', meta, autoload=True) + + snapshot_id = Column('snapshot_id', Integer()) + # Add columns to existing tables + volumes.create_column(snapshot_id) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + volumes = Table('volumes', meta, autoload=True) + + volumes.drop_column('snapshot_id') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/020_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/020_sqlite_downgrade.sql new file mode 100644 index 000000000..97b946604 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/020_sqlite_downgrade.sql @@ -0,0 +1,119 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE volumes_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + ec2_id VARCHAR(255), + user_id VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + size INTEGER, + availability_zone VARCHAR(255), + instance_id INTEGER, + mountpoint VARCHAR(255), + attach_time VARCHAR(255), + status VARCHAR(255), + attach_status VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + provider_location VARCHAR(256), + provider_auth VARCHAR(256), + snapshot_id INTEGER, + PRIMARY KEY (id), + FOREIGN KEY(instance_id) REFERENCES instances (id), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO volumes_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + ec2_id, + user_id, + project_id, + host, + size, + availability_zone, + instance_id, + mountpoint, + attach_time, + status, + attach_status, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + provider_location, + provider_auth, + snapshot_id + FROM volumes; + + DROP TABLE volumes; + + CREATE TABLE volumes ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + ec2_id VARCHAR(255), + user_id VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + size INTEGER, + availability_zone VARCHAR(255), + instance_id INTEGER, + mountpoint VARCHAR(255), + attach_time VARCHAR(255), + status VARCHAR(255), + attach_status VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + provider_location VARCHAR(256), + provider_auth VARCHAR(256), + PRIMARY KEY (id), + FOREIGN KEY(instance_id) REFERENCES instances (id), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO volumes + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + ec2_id, + user_id, + project_id, + host, + size, + availability_zone, + instance_id, + mountpoint, + attach_time, + status, + attach_status, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + provider_location, + provider_auth + FROM volumes_backup; + + DROP TABLE volumes_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/021_rename_image_ids.py b/cinder/db/sqlalchemy/migrate_repo/versions/021_rename_image_ids.py new file mode 100644 index 000000000..64b539ed6 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/021_rename_image_ids.py @@ -0,0 +1,38 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import MetaData, Table + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + + image_id_column = instances.c.image_id + image_id_column.alter(name='image_ref') + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + image_ref_column = instances.c.image_ref + image_ref_column.alter(name='image_id') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/022_set_engine_mysql_innodb.py b/cinder/db/sqlalchemy/migrate_repo/versions/022_set_engine_mysql_innodb.py new file mode 100644 index 000000000..2c10b790a --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/022_set_engine_mysql_innodb.py @@ -0,0 +1,64 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import MetaData + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + if migrate_engine.name == "mysql": + migrate_engine.execute("ALTER TABLE auth_tokens Engine=InnoDB") + migrate_engine.execute("ALTER TABLE certificates Engine=InnoDB") + migrate_engine.execute("ALTER TABLE compute_nodes Engine=InnoDB") + migrate_engine.execute("ALTER TABLE console_pools Engine=InnoDB") + migrate_engine.execute("ALTER TABLE consoles Engine=InnoDB") + migrate_engine.execute("ALTER TABLE export_devices Engine=InnoDB") + migrate_engine.execute("ALTER TABLE fixed_ips Engine=InnoDB") + migrate_engine.execute("ALTER TABLE floating_ips Engine=InnoDB") + migrate_engine.execute("ALTER TABLE instance_actions Engine=InnoDB") + migrate_engine.execute("ALTER TABLE instance_metadata Engine=InnoDB") + migrate_engine.execute("ALTER TABLE instance_types Engine=InnoDB") + migrate_engine.execute("ALTER TABLE instances Engine=InnoDB") + migrate_engine.execute("ALTER TABLE iscsi_targets Engine=InnoDB") + migrate_engine.execute("ALTER TABLE key_pairs Engine=InnoDB") + migrate_engine.execute("ALTER TABLE migrate_version Engine=InnoDB") + migrate_engine.execute("ALTER TABLE migrations Engine=InnoDB") + migrate_engine.execute("ALTER TABLE networks Engine=InnoDB") + migrate_engine.execute("ALTER TABLE projects Engine=InnoDB") + migrate_engine.execute("ALTER TABLE quotas Engine=InnoDB") + migrate_engine.execute( + "ALTER TABLE security_group_instance_association Engine=InnoDB") + migrate_engine.execute( + "ALTER TABLE security_group_rules Engine=InnoDB") + migrate_engine.execute("ALTER TABLE security_groups Engine=InnoDB") + migrate_engine.execute("ALTER TABLE services Engine=InnoDB") + migrate_engine.execute( + "ALTER TABLE user_project_association Engine=InnoDB") + migrate_engine.execute( + "ALTER TABLE user_project_role_association Engine=InnoDB") + migrate_engine.execute( + "ALTER TABLE user_role_association Engine=InnoDB") + migrate_engine.execute("ALTER TABLE users Engine=InnoDB") + migrate_engine.execute("ALTER TABLE volumes Engine=InnoDB") + migrate_engine.execute("ALTER TABLE zones Engine=InnoDB") + migrate_engine.execute("ALTER TABLE snapshots Engine=InnoDB") + + +def downgrade(migrate_engine): + pass diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py b/cinder/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py new file mode 100644 index 000000000..ee607dd92 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py @@ -0,0 +1,42 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, MetaData, String, Table + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + instances_vm_mode = Column('vm_mode', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False), + nullable=True) + instances.create_column(instances_vm_mode) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + instances.drop_column('vm_mode') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/024_add_block_device_mapping.py b/cinder/db/sqlalchemy/migrate_repo/versions/024_add_block_device_mapping.py new file mode 100644 index 000000000..5c6ddb970 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/024_add_block_device_mapping.py @@ -0,0 +1,92 @@ +# Copyright 2011 OpenStack LLC. +# Copyright 2011 Isaku Yamahata +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import MetaData, Table, Column +from sqlalchemy import DateTime, Boolean, Integer, String +from sqlalchemy import ForeignKey +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + instances = Table('instances', meta, autoload=True) + volumes = Table('volumes', meta, autoload=True) + snapshots = Table('snapshots', meta, autoload=True) + + # + # New Tables + # + block_device_mapping = Table('block_device_mapping', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, autoincrement=True), + Column('instance_id', + Integer(), + ForeignKey('instances.id'), + nullable=False), + Column('device_name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + nullable=False), + Column('delete_on_termination', + Boolean(create_constraint=True, name=None), + default=False), + Column('virtual_name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + nullable=True), + Column('snapshot_id', + Integer(), + ForeignKey('snapshots.id'), + nullable=True), + Column('volume_id', Integer(), ForeignKey('volumes.id'), + nullable=True), + Column('volume_size', Integer(), nullable=True), + Column('no_device', + Boolean(create_constraint=True, name=None), + nullable=True), + ) + try: + block_device_mapping.create() + except Exception: + LOG.info(repr(block_device_mapping)) + LOG.exception('Exception while creating table') + meta.drop_all(tables=[block_device_mapping]) + raise + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + instances = Table('instances', meta, autoload=True) + volumes = Table('volumes', meta, autoload=True) + snapshots = Table('snapshots', meta, autoload=True) + + block_device_mapping = Table('block_device_mapping', meta, autoload=True) + block_device_mapping.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/025_add_uuid_to_instances.py b/cinder/db/sqlalchemy/migrate_repo/versions/025_add_uuid_to_instances.py new file mode 100644 index 000000000..313cb16de --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/025_add_uuid_to_instances.py @@ -0,0 +1,45 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, Integer, MetaData, String, Table + +from cinder import utils + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + uuid_column = Column("uuid", String(36)) + instances.create_column(uuid_column) + + rows = migrate_engine.execute(instances.select()) + for row in rows: + instance_uuid = str(utils.gen_uuid()) + migrate_engine.execute(instances.update()\ + .where(instances.c.id == row[0])\ + .values(uuid=instance_uuid)) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + instances.drop_column('uuid') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/026_add_agent_table.py b/cinder/db/sqlalchemy/migrate_repo/versions/026_add_agent_table.py new file mode 100644 index 000000000..d8f038b0d --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/026_add_agent_table.py @@ -0,0 +1,89 @@ +# Copyright 2011 OpenStack LLC. +# 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 sqlalchemy import Boolean, Column, DateTime, Integer +from sqlalchemy import MetaData, String, Table +from cinder import log as logging + + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + # + # New Tables + # + builds = Table('agent_builds', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('hypervisor', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('os', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('architecture', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('version', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('url', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('md5hash', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + for table in (builds, ): + try: + table.create() + except Exception: + LOG.info(repr(table)) + + instances = Table('instances', meta, autoload=True) + + # + # New Columns + # + architecture = Column('architecture', String(length=255)) + + # Add columns to existing tables + instances.create_column(architecture) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + builds = Table('agent_builds', meta, autoload=True) + for table in (builds, ): + table.drop() + + instances = Table('instances', meta, autoload=True) + instances.drop_column('architecture') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/027_add_provider_firewall_rules.py b/cinder/db/sqlalchemy/migrate_repo/versions/027_add_provider_firewall_rules.py new file mode 100644 index 000000000..8b653444c --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/027_add_provider_firewall_rules.py @@ -0,0 +1,65 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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 sqlalchemy import Boolean, Column, DateTime +from sqlalchemy import Integer, MetaData, String +from sqlalchemy import Table + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + # + # New Tables + # + provider_fw_rules = Table('provider_fw_rules', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('protocol', + String(length=5, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('from_port', Integer()), + Column('to_port', Integer()), + Column('cidr', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False))) + for table in (provider_fw_rules,): + try: + table.create() + except Exception: + LOG.info(repr(table)) + LOG.exception('Exception while creating table') + raise + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + provider_fw_rules = Table('provider_fw_rules', meta, autoload=True) + for table in (provider_fw_rules,): + table.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/028_add_instance_type_extra_specs.py b/cinder/db/sqlalchemy/migrate_repo/versions/028_add_instance_type_extra_specs.py new file mode 100644 index 000000000..b8346b735 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/028_add_instance_type_extra_specs.py @@ -0,0 +1,76 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 University of Southern California +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer +from sqlalchemy import MetaData, String, Table +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + instance_types = Table('instance_types', meta, autoload=True) + + # + # New Tables + # + instance_type_extra_specs_table = Table('instance_type_extra_specs', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('instance_type_id', + Integer(), + ForeignKey('instance_types.id'), + nullable=False), + Column('key', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('value', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False))) + + for table in (instance_type_extra_specs_table, ): + try: + table.create() + except Exception: + LOG.info(repr(table)) + LOG.exception('Exception while creating table') + raise + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + instance_types = Table('instance_types', meta, autoload=True) + + instance_type_extra_specs_table = Table('instance_type_extra_specs', + meta, + autoload=True) + for table in (instance_type_extra_specs_table, ): + table.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/029_add_zone_weight_offsets.py b/cinder/db/sqlalchemy/migrate_repo/versions/029_add_zone_weight_offsets.py new file mode 100644 index 000000000..80eb836c0 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/029_add_zone_weight_offsets.py @@ -0,0 +1,41 @@ +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, Float, Integer, MetaData, Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + zones = Table('zones', meta, autoload=True) + + # + # New Columns + # + weight_offset = Column('weight_offset', Float(), default=0.0) + weight_scale = Column('weight_scale', Float(), default=1.0) + + zones.create_column(weight_offset) + zones.create_column(weight_scale) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + zones = Table('zones', meta, autoload=True) + + zones.drop_column('weight_offset') + zones.drop_column('weight_scale') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py b/cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py new file mode 100644 index 000000000..a34baa83d --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py @@ -0,0 +1,146 @@ +# Copyright 2011 OpenStack LLC. +# 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 sqlalchemy import select, Boolean, Column, DateTime, ForeignKey +from sqlalchemy import Integer, MetaData, String +from sqlalchemy import Table + +from cinder import log as logging +from cinder import utils + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # grab tables and (column for dropping later) + instances = Table('instances', meta, autoload=True) + networks = Table('networks', meta, autoload=True) + fixed_ips = Table('fixed_ips', meta, autoload=True) + c = instances.columns['mac_address'] + + interface = Column('bridge_interface', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False)) + + virtual_interface_id = Column('virtual_interface_id', + Integer()) + # add interface column to networks table + # values will have to be set manually before running cinder + try: + networks.create_column(interface) + except Exception: + LOG.error(_("interface column not added to networks table")) + raise + + # + # New Tables + # + virtual_interfaces = Table('virtual_interfaces', meta, + Column('created_at', DateTime(timezone=False), + default=utils.utcnow()), + Column('updated_at', DateTime(timezone=False), + onupdate=utils.utcnow()), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('address', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + unique=True), + Column('network_id', + Integer(), + ForeignKey('networks.id')), + Column('instance_id', + Integer(), + ForeignKey('instances.id'), + nullable=False), + mysql_engine='InnoDB') + + # create virtual_interfaces table + try: + virtual_interfaces.create() + except Exception: + LOG.error(_("Table |%s| not created!"), repr(virtual_interfaces)) + raise + + # add virtual_interface_id column to fixed_ips table + try: + fixed_ips.create_column(virtual_interface_id) + except Exception: + LOG.error(_("VIF column not added to fixed_ips table")) + raise + + # populate the virtual_interfaces table + # extract data from existing instance and fixed_ip tables + s = select([instances.c.id, instances.c.mac_address, + fixed_ips.c.network_id], + fixed_ips.c.instance_id == instances.c.id) + keys = ('instance_id', 'address', 'network_id') + join_list = [dict(zip(keys, row)) for row in s.execute()] + LOG.debug(_("join list for moving mac_addresses |%s|"), join_list) + + # insert data into the table + if join_list: + i = virtual_interfaces.insert() + i.execute(join_list) + + # populate the fixed_ips virtual_interface_id column + s = select([fixed_ips.c.id, fixed_ips.c.instance_id], + fixed_ips.c.instance_id != None) + + for row in s.execute(): + m = select([virtual_interfaces.c.id]).\ + where(virtual_interfaces.c.instance_id == row['instance_id']).\ + as_scalar() + u = fixed_ips.update().values(virtual_interface_id=m).\ + where(fixed_ips.c.id == row['id']) + u.execute() + + # drop the mac_address column from instances + c.drop() + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # grab tables and (column for dropping later) + instances = Table('instances', meta, autoload=True) + networks = Table('networks', meta, autoload=True) + fixed_ips = Table('fixed_ips', meta, autoload=True) + virtual_interfaces = Table('virtual_interfaces', meta, autoload=True) + + mac_address = Column('mac_address', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)) + + instances.create_column(mac_address) + + s = select([instances.c.id, virtual_interfaces.c.address], + virtual_interfaces.c.instance_id == instances.c.id) + + for row in s.execute(): + u = instances.update().values(mac_address=row['address']).\ + where(instances.c.id == row['id']) + + networks.drop_column('bridge_interface') + virtual_interfaces.drop() + fixed_ips.drop_column('virtual_interface_id') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/030_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/030_sqlite_downgrade.sql new file mode 100644 index 000000000..2486e6d2d --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/030_sqlite_downgrade.sql @@ -0,0 +1,377 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE instances_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + internal_id INTEGER, + admin_pass VARCHAR(255), + user_id VARCHAR(255), + project_id VARCHAR(255), + image_ref VARCHAR(255), + kernel_id VARCHAR(255), + ramdisk_id VARCHAR(255), + server_name VARCHAR(255), + launch_index INTEGER, + key_name VARCHAR(255), + key_data TEXT, + state INTEGER, + state_description VARCHAR(255), + memory_mb INTEGER, + vcpus INTEGER, + local_gb INTEGER, + hostname VARCHAR(255), + host VARCHAR(255), + user_data TEXT, + reservation_id VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + availability_zone VARCHAR(255), + locked BOOLEAN, + os_type VARCHAR(255), + launched_on TEXT, + instance_type_id INTEGER, + vm_mode VARCHAR(255), + uuid VARCHAR(36), + architecture VARCHAR(255), + PRIMARY KEY (id), + CHECK (locked IN (0, 1)), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO instances_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + internal_id, + admin_pass, + user_id, + project_id, + image_ref, + kernel_id, + ramdisk_id, + server_name, + launch_index, + key_name, + key_data, + state, + state_description, + memory_mb, + vcpus, + local_gb, + hostname, + host, + user_data, + reservation_id, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + availability_zone, + locked, + os_type, + launched_on, + instance_type_id, + vm_mode, + uuid, + architecture + FROM instances; + + DROP TABLE instances; + + CREATE TABLE instances ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + internal_id INTEGER, + admin_pass VARCHAR(255), + user_id VARCHAR(255), + project_id VARCHAR(255), + image_ref VARCHAR(255), + kernel_id VARCHAR(255), + ramdisk_id VARCHAR(255), + server_name VARCHAR(255), + launch_index INTEGER, + key_name VARCHAR(255), + key_data TEXT, + state INTEGER, + state_description VARCHAR(255), + memory_mb INTEGER, + vcpus INTEGER, + local_gb INTEGER, + hostname VARCHAR(255), + host VARCHAR(255), + user_data TEXT, + reservation_id VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + availability_zone VARCHAR(255), + locked BOOLEAN, + os_type VARCHAR(255), + launched_on TEXT, + instance_type_id INTEGER, + vm_mode VARCHAR(255), + uuid VARCHAR(36), + architecture VARCHAR(255), + mac_address VARCHAR(255), + PRIMARY KEY (id), + CHECK (locked IN (0, 1)), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO instances + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + internal_id, + admin_pass, + user_id, + project_id, + image_ref, + kernel_id, + ramdisk_id, + server_name, + launch_index, + key_name, + key_data, + state, + state_description, + memory_mb, + vcpus, + local_gb, + hostname, + host, + user_data, + reservation_id, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + availability_zone, + locked, + os_type, + launched_on, + instance_type_id, + vm_mode, + uuid, + architecture, + NULL AS mac_address + FROM instances_backup; + + DROP TABLE instances_backup; + + UPDATE instances SET mac_address=(SELECT address + FROM virtual_interfaces + WHERE virtual_interfaces.instance_id = instances.id); + + CREATE TEMPORARY TABLE networks_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + injected BOOLEAN, + cidr VARCHAR(255), + netmask VARCHAR(255), + bridge VARCHAR(255), + gateway VARCHAR(255), + broadcast VARCHAR(255), + dns VARCHAR(255), + vlan INTEGER, + vpn_public_address VARCHAR(255), + vpn_public_port INTEGER, + vpn_private_address VARCHAR(255), + dhcp_start VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + cidr_v6 VARCHAR(255), + gateway_v6 VARCHAR(255), + label VARCHAR(255), + netmask_v6 VARCHAR(255), + bridge_interface VARCHAR(255), + PRIMARY KEY (id), + CHECK (injected IN (0, 1)), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO networks_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + injected, + cidr, + netmask, + bridge, + gateway, + broadcast, + dns, + vlan, + vpn_public_address, + vpn_public_port, + vpn_private_address, + dhcp_start, + project_id, + host, + cidr_v6, + gateway_v6, + label, + netmask_v6, + bridge_interface + FROM networks; + + DROP TABLE networks; + + CREATE TABLE networks ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + injected BOOLEAN, + cidr VARCHAR(255), + netmask VARCHAR(255), + bridge VARCHAR(255), + gateway VARCHAR(255), + broadcast VARCHAR(255), + dns VARCHAR(255), + vlan INTEGER, + vpn_public_address VARCHAR(255), + vpn_public_port INTEGER, + vpn_private_address VARCHAR(255), + dhcp_start VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + cidr_v6 VARCHAR(255), + gateway_v6 VARCHAR(255), + label VARCHAR(255), + netmask_v6 VARCHAR(255), + PRIMARY KEY (id), + CHECK (injected IN (0, 1)), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO networks + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + injected, + cidr, + netmask, + bridge, + gateway, + broadcast, + dns, + vlan, + vpn_public_address, + vpn_public_port, + vpn_private_address, + dhcp_start, + project_id, + host, + cidr_v6, + gateway_v6, + label, + netmask_v6 + FROM networks_backup; + + DROP TABLE networks_backup; + + DROP TABLE virtual_interfaces; + + CREATE TEMPORARY TABLE fixed_ips_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN, + leased BOOLEAN, + reserved BOOLEAN, + virtual_interface_id INTEGER, + PRIMARY KEY (id), + CHECK (reserved IN (0, 1)), + CHECK (allocated IN (0, 1)), + CHECK (leased IN (0, 1)), + CHECK (deleted IN (0, 1)), + FOREIGN KEY(instance_id) REFERENCES instances (id), + FOREIGN KEY(network_id) REFERENCES networks (id) + ); + + INSERT INTO fixed_ips_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + address, + network_id, + instance_id, + allocated, + leased, + reserved, + virtual_interface_id + FROM fixed_ips; + + DROP TABLE fixed_ips; + + CREATE TABLE fixed_ips ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN, + leased BOOLEAN, + reserved BOOLEAN, + PRIMARY KEY (id), + CHECK (reserved IN (0, 1)), + CHECK (allocated IN (0, 1)), + CHECK (leased IN (0, 1)), + CHECK (deleted IN (0, 1)), + FOREIGN KEY(instance_id) REFERENCES instances (id), + FOREIGN KEY(network_id) REFERENCES networks (id) + ); + + INSERT INTO fixed_ips + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + address, + network_id, + instance_id, + allocated, + leased, + reserved + FROM fixed_ips_backup; + + DROP TABLE fixed_ips_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py b/cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py new file mode 100644 index 000000000..4c1413b22 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py @@ -0,0 +1,59 @@ +# Copyright 2011 OpenStack LLC. +# 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 sqlalchemy import MetaData, Table +from migrate import ForeignKeyConstraint + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + dialect = migrate_engine.url.get_dialect().name + + # grab tables + fixed_ips = Table('fixed_ips', meta, autoload=True) + virtual_interfaces = Table('virtual_interfaces', meta, autoload=True) + + # add foreignkey if not sqlite + try: + if not dialect.startswith('sqlite'): + ForeignKeyConstraint(columns=[fixed_ips.c.virtual_interface_id], + refcolumns=[virtual_interfaces.c.id]).create() + except Exception: + LOG.error(_("foreign key constraint couldn't be added")) + raise + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + dialect = migrate_engine.url.get_dialect().name + + # grab tables + fixed_ips = Table('fixed_ips', meta, autoload=True) + virtual_interfaces = Table('virtual_interfaces', meta, autoload=True) + + # drop foreignkey if not sqlite + try: + if not dialect.startswith('sqlite'): + ForeignKeyConstraint(columns=[fixed_ips.c.virtual_interface_id], + refcolumns=[virtual_interfaces.c.id]).drop() + except Exception: + LOG.error(_("foreign key constraint couldn't be dropped")) + raise diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/031_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/031_sqlite_downgrade.sql new file mode 100644 index 000000000..c1d26b180 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/031_sqlite_downgrade.sql @@ -0,0 +1,48 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE fixed_ips_backup ( + id INTEGER NOT NULL, + address VARCHAR(255), + virtual_interface_id INTEGER, + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN default FALSE, + leased BOOLEAN default FALSE, + reserved BOOLEAN default FALSE, + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY(virtual_interface_id) REFERENCES virtual_interfaces (id) + ); + + INSERT INTO fixed_ips_backup + SELECT id, address, virtual_interface_id, network_id, instance_id, allocated, leased, reserved, created_at, updated_at, deleted_at, deleted + FROM fixed_ips; + + DROP TABLE fixed_ips; + + CREATE TABLE fixed_ips ( + id INTEGER NOT NULL, + address VARCHAR(255), + virtual_interface_id INTEGER, + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN default FALSE, + leased BOOLEAN default FALSE, + reserved BOOLEAN default FALSE, + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + PRIMARY KEY (id) + ); + + INSERT INTO fixed_ips + SELECT id, address, virtual_interface_id, network_id, instance_id, allocated, leased, reserved, created_at, updated_at, deleted_at, deleted + FROM fixed_ips; + + DROP TABLE fixed_ips_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/031_sqlite_upgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/031_sqlite_upgrade.sql new file mode 100644 index 000000000..2a9362545 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/031_sqlite_upgrade.sql @@ -0,0 +1,48 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE fixed_ips_backup ( + id INTEGER NOT NULL, + address VARCHAR(255), + virtual_interface_id INTEGER, + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN default FALSE, + leased BOOLEAN default FALSE, + reserved BOOLEAN default FALSE, + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + PRIMARY KEY (id) + ); + + INSERT INTO fixed_ips_backup + SELECT id, address, virtual_interface_id, network_id, instance_id, allocated, leased, reserved, created_at, updated_at, deleted_at, deleted + FROM fixed_ips; + + DROP TABLE fixed_ips; + + CREATE TABLE fixed_ips ( + id INTEGER NOT NULL, + address VARCHAR(255), + virtual_interface_id INTEGER, + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN default FALSE, + leased BOOLEAN default FALSE, + reserved BOOLEAN default FALSE, + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY(virtual_interface_id) REFERENCES virtual_interfaces (id) + ); + + INSERT INTO fixed_ips + SELECT id, address, virtual_interface_id, network_id, instance_id, allocated, leased, reserved, created_at, updated_at, deleted_at, deleted + FROM fixed_ips; + + DROP TABLE fixed_ips_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/032_add_root_device_name.py b/cinder/db/sqlalchemy/migrate_repo/versions/032_add_root_device_name.py new file mode 100644 index 000000000..f12070c57 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/032_add_root_device_name.py @@ -0,0 +1,42 @@ +# Copyright 2011 OpenStack LLC. +# Copyright 2011 Isaku Yamahata +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, Integer, MetaData, Table, String + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + root_device_name = Column( + 'root_device_name', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + nullable=True) + instances.create_column(root_device_name) + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + instances.drop_column('root_device_name') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/033_ha_network.py b/cinder/db/sqlalchemy/migrate_repo/versions/033_ha_network.py new file mode 100644 index 000000000..becc353f6 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/033_ha_network.py @@ -0,0 +1,42 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 OpenStack, LLC. +# 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 sqlalchemy import Column, Table, MetaData, Boolean, String + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + fixed_ips_host = Column('host', String(255)) + fixed_ips = Table('fixed_ips', meta, autoload=True) + fixed_ips.create_column(fixed_ips_host) + + networks_multi_host = Column('multi_host', Boolean, default=False) + networks = Table('networks', meta, autoload=True) + networks.create_column(networks_multi_host) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + fixed_ips = Table('fixed_ips', meta, autoload=True) + fixed_ips.drop_column('host') + + networks = Table('networks', meta, autoload=True) + networks.drop_column('multi_host') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/033_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/033_sqlite_downgrade.sql new file mode 100644 index 000000000..34188d866 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/033_sqlite_downgrade.sql @@ -0,0 +1,193 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE fixed_ips_backup ( + id INTEGER NOT NULL, + address VARCHAR(255), + virtual_interface_id INTEGER, + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN default FALSE, + leased BOOLEAN default FALSE, + reserved BOOLEAN default FALSE, + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + host VARCHAR(255), + PRIMARY KEY (id), + FOREIGN KEY(virtual_interface_id) REFERENCES virtual_interfaces (id) + ); + + INSERT INTO fixed_ips_backup + SELECT id, + address, + virtual_interface_id, + network_id, + instance_id, + allocated, + leased, + reserved, + created_at, + updated_at, + deleted_at, + deleted, + host + FROM fixed_ips; + + DROP TABLE fixed_ips; + + CREATE TABLE fixed_ips ( + id INTEGER NOT NULL, + address VARCHAR(255), + virtual_interface_id INTEGER, + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN default FALSE, + leased BOOLEAN default FALSE, + reserved BOOLEAN default FALSE, + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY(virtual_interface_id) REFERENCES virtual_interfaces (id) + ); + + INSERT INTO fixed_ips + SELECT id, + address, + virtual_interface_id, + network_id, + instance_id, + allocated, + leased, + reserved, + created_at, + updated_at, + deleted_at, + deleted + FROM fixed_ips_backup; + + DROP TABLE fixed_ips_backup; + + CREATE TEMPORARY TABLE networks_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + injected BOOLEAN, + cidr VARCHAR(255), + netmask VARCHAR(255), + bridge VARCHAR(255), + gateway VARCHAR(255), + broadcast VARCHAR(255), + dns VARCHAR(255), + vlan INTEGER, + vpn_public_address VARCHAR(255), + vpn_public_port INTEGER, + vpn_private_address VARCHAR(255), + dhcp_start VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + cidr_v6 VARCHAR(255), + gateway_v6 VARCHAR(255), + label VARCHAR(255), + netmask_v6 VARCHAR(255), + bridge_interface VARCHAR(255), + multi_host BOOLEAN, + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (injected IN (0, 1)), + CHECK (multi_host IN (0, 1)) + ); + + INSERT INTO networks_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + injected, + cidr, + netmask, + bridge, + gateway, + broadcast, + dns, + vlan, + vpn_public_address, + vpn_public_port, + vpn_private_address, + dhcp_start, + project_id, + host, + cidr_v6, + gateway_v6, + label, + netmask_v6, + bridge_interface, + multi_host + FROM networks; + + DROP TABLE networks; + + CREATE TABLE networks( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + injected BOOLEAN, + cidr VARCHAR(255), + netmask VARCHAR(255), + bridge VARCHAR(255), + gateway VARCHAR(255), + broadcast VARCHAR(255), + dns VARCHAR(255), + vlan INTEGER, + vpn_public_address VARCHAR(255), + vpn_public_port INTEGER, + vpn_private_address VARCHAR(255), + dhcp_start VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + cidr_v6 VARCHAR(255), + gateway_v6 VARCHAR(255), + label VARCHAR(255), + netmask_v6 VARCHAR(255), + bridge_interface VARCHAR(255), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (injected IN (0, 1)) + ); + + INSERT INTO networks + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + injected, + cidr, + netmask, + bridge, + gateway, + broadcast, + dns, + vlan, + vpn_public_address, + vpn_public_port, + vpn_private_address, + dhcp_start, + project_id, + host, + cidr_v6, + gateway_v6, + label, + netmask_v6, + bridge_interface + FROM networks_backup; + + DROP TABLE networks_backup; +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/034_change_instance_id_in_migrations.py b/cinder/db/sqlalchemy/migrate_repo/versions/034_change_instance_id_in_migrations.py new file mode 100644 index 000000000..9cf004301 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/034_change_instance_id_in_migrations.py @@ -0,0 +1,46 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 sqlalchemy import Column, Integer, String, MetaData, Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + migrations = Table('migrations', meta, autoload=True) + instance_uuid = Column('instance_uuid', String(255)) + migrations.create_column(instance_uuid) + + if migrate_engine.name == "mysql": + try: + migrate_engine.execute("ALTER TABLE migrations DROP FOREIGN KEY " + "`migrations_ibfk_1`;") + except Exception: # Don't care, just fail silently. + pass + + migrations.c.instance_id.drop() + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + migrations = Table('migrations', meta, autoload=True) + migrations.c.instance_uuid.drop() + instance_id = Column('instance_id', Integer()) + migrations.create_column(instance_id) diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/035_secondary_dns.py b/cinder/db/sqlalchemy/migrate_repo/versions/035_secondary_dns.py new file mode 100644 index 000000000..c03e5be66 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/035_secondary_dns.py @@ -0,0 +1,39 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 OpenStack, LLC. +# 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 sqlalchemy import Column, Table, MetaData, String + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + networks = Table('networks', meta, autoload=True) + + networks.c.dns.alter(name='dns1') + dns2 = Column('dns2', String(255)) + networks.create_column(dns2) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + networks = Table('networks', meta, autoload=True) + + networks.c.dns1.alter(name='dns') + networks.drop_column('dns2') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/036_change_flavor_id_in_migrations.py b/cinder/db/sqlalchemy/migrate_repo/versions/036_change_flavor_id_in_migrations.py new file mode 100644 index 000000000..38f83fc01 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/036_change_flavor_id_in_migrations.py @@ -0,0 +1,79 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 sqlalchemy import Column, Integer, MetaData, Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instance_types = Table('instance_types', meta, autoload=True) + migrations = Table('migrations', meta, autoload=True) + + old_instance_type_id = Column('old_instance_type_id', Integer()) + new_instance_type_id = Column('new_instance_type_id', Integer()) + migrations.create_column(old_instance_type_id) + migrations.create_column(new_instance_type_id) + + # Convert flavor_id to instance_type_id + itypes = {} + for instance_type in migrate_engine.execute(instance_types.select()): + itypes[instance_type.id] = instance_type.flavorid + + for instance_type_id in itypes.keys(): + migrate_engine.execute(migrations.update()\ + .where(migrations.c.old_flavor_id == itypes[instance_type_id])\ + .values(old_instance_type_id=instance_type_id)) + migrate_engine.execute(migrations.update()\ + .where(migrations.c.new_flavor_id == itypes[instance_type_id])\ + .values(new_instance_type_id=instance_type_id)) + + migrations.c.old_flavor_id.drop() + migrations.c.new_flavor_id.drop() + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instance_types = Table('instance_types', meta, autoload=True) + migrations = Table('migrations', meta, autoload=True) + + old_flavor_id = Column('old_flavor_id', Integer()) + new_flavor_id = Column('new_flavor_id', Integer()) + + migrations.create_column(old_flavor_id) + migrations.create_column(new_flavor_id) + + # Convert instance_type_id to flavor_id + itypes = {} + for instance_type in migrate_engine.execute(instance_types.select()): + itypes[instance_type.flavorid] = instance_type.id + + for instance_type_flavorid in itypes.keys(): + migrate_engine.execute(migrations.update()\ + .where(migrations.c.old_instance_type_id == + itypes[instance_type_flavorid])\ + .values(old_flavor_id=instance_type_flavorid)) + migrate_engine.execute(migrations.update()\ + .where(migrations.c.new_instance_type_id == + itypes[instance_type_flavorid])\ + .values(new_flavor_id=instance_type_flavorid)) + + migrations.c.old_instance_type_id.drop() + migrations.c.new_instance_type_id.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/037_instances_drop_admin_pass.py b/cinder/db/sqlalchemy/migrate_repo/versions/037_instances_drop_admin_pass.py new file mode 100644 index 000000000..c8a1a1927 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/037_instances_drop_admin_pass.py @@ -0,0 +1,42 @@ +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, MetaData, Table, String + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + instances.drop_column('admin_pass') + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + # + # New Columns + # + admin_pass = Column( + 'admin_pass', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + nullable=True) + + instances.create_column(admin_pass) diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/038_add_uuid_to_virtual_interfaces.py b/cinder/db/sqlalchemy/migrate_repo/versions/038_add_uuid_to_virtual_interfaces.py new file mode 100644 index 000000000..fbd1c4570 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/038_add_uuid_to_virtual_interfaces.py @@ -0,0 +1,45 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (C) 2011 Midokura KK +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, Integer, MetaData, String, Table + +from cinder import utils + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + virtual_interfaces = Table('virtual_interfaces', meta, autoload=True) + + uuid_column = Column('uuid', String(36)) + virtual_interfaces.create_column(uuid_column) + + rows = migrate_engine.execute(virtual_interfaces.select()) + for row in rows: + vif_uuid = str(utils.gen_uuid()) + migrate_engine.execute(virtual_interfaces.update()\ + .where(virtual_interfaces.c.id == row[0])\ + .values(uuid=vif_uuid)) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + virtual_interfaces = Table('virtual_interfaces', meta, autoload=True) + + virtual_interfaces.drop_column('uuid') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/038_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/038_sqlite_downgrade.sql new file mode 100644 index 000000000..0ac66e7e0 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/038_sqlite_downgrade.sql @@ -0,0 +1,63 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE virtual_interfaces_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER NOT NULL, + uuid VARCHAR(36), + PRIMARY KEY (id), + FOREIGN KEY(network_id) REFERENCES networks (id), + FOREIGN KEY(instance_id) REFERENCES instances (id), + UNIQUE (address), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO virtual_interfaces_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + address, + network_id, + instance_id, + uuid + FROM virtual_interfaces; + + DROP TABLE virtual_interfaces; + + CREATE TABLE virtual_interfaces ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY(network_id) REFERENCES networks (id), + FOREIGN KEY(instance_id) REFERENCES instances (id), + UNIQUE (address), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO virtual_interfaces + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + address, + network_id, + instance_id + FROM virtual_interfaces_backup; + + DROP TABLE virtual_interfaces_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/039_add_instances_accessip.py b/cinder/db/sqlalchemy/migrate_repo/versions/039_add_instances_accessip.py new file mode 100644 index 000000000..8c8961cd3 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/039_add_instances_accessip.py @@ -0,0 +1,49 @@ +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, Integer, MetaData, Table, String + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + accessIPv4 = Column( + 'access_ip_v4', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + nullable=True) + + accessIPv6 = Column( + 'access_ip_v6', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + nullable=True) + instances.create_column(accessIPv4) + instances.create_column(accessIPv6) + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + instances.drop_column('access_ip_v4') + instances.drop_column('access_ip_v6') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/040_add_uuid_to_networks.py b/cinder/db/sqlalchemy/migrate_repo/versions/040_add_uuid_to_networks.py new file mode 100644 index 000000000..7125911d3 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/040_add_uuid_to_networks.py @@ -0,0 +1,45 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, Integer, MetaData, String, Table + +from cinder import utils + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + networks = Table('networks', meta, autoload=True) + + uuid_column = Column("uuid", String(36)) + networks.create_column(uuid_column) + + rows = migrate_engine.execute(networks.select()) + for row in rows: + networks_uuid = str(utils.gen_uuid()) + migrate_engine.execute(networks.update()\ + .where(networks.c.id == row[0])\ + .values(uuid=networks_uuid)) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + networks = Table('networks', meta, autoload=True) + + networks.drop_column('uuid') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/041_add_config_drive_to_instances.py b/cinder/db/sqlalchemy/migrate_repo/versions/041_add_config_drive_to_instances.py new file mode 100644 index 000000000..f85c4a0d7 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/041_add_config_drive_to_instances.py @@ -0,0 +1,36 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 +# +# Copyright 2011 Piston Cloud Computing, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from sqlalchemy import Column, Integer, MetaData, String, Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table("instances", meta, autoload=True) + + config_drive_column = Column("config_drive", String(255), nullable=True) + instances.create_column(config_drive_column) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table("instances", meta, autoload=True) + + instances.drop_column('config_drive') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/042_add_volume_types_and_extradata.py b/cinder/db/sqlalchemy/migrate_repo/versions/042_add_volume_types_and_extradata.py new file mode 100644 index 000000000..2434bb0ab --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/042_add_volume_types_and_extradata.py @@ -0,0 +1,122 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 Zadara Storage Inc. +# Copyright (c) 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, DateTime, Integer, MetaData, String, Table +from sqlalchemy import Boolean, ForeignKey + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + volumes = Table('volumes', meta, autoload=True) + + # + # New Tables + # + volume_types = Table('volume_types', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + unique=True)) + + volume_type_extra_specs_table = Table('volume_type_extra_specs', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('volume_type_id', + Integer(), + ForeignKey('volume_types.id'), + nullable=False), + Column('key', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('value', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False))) + + volume_metadata_table = Table('volume_metadata', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('volume_id', + Integer(), + ForeignKey('volumes.id'), + nullable=False), + Column('key', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('value', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False))) + + new_tables = (volume_types, + volume_type_extra_specs_table, + volume_metadata_table) + + for table in new_tables: + try: + table.create() + except Exception: + LOG.info(repr(table)) + LOG.exception('Exception while creating table') + raise + + # + # New Columns + # + volume_type_id = Column('volume_type_id', Integer(), nullable=True) + volumes.create_column(volume_type_id) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + volumes = Table('volumes', meta, autoload=True) + + volumes.drop_column('volume_type_id') + + volume_types = Table('volume_types', meta, autoload=True) + volume_type_extra_specs_table = Table('volume_type_extra_specs', + meta, + autoload=True) + volume_metadata_table = Table('volume_metadata', meta, autoload=True) + + # table order matters, don't change + for table in (volume_type_extra_specs_table, + volume_types, + volume_metadata_table): + table.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/042_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/042_sqlite_downgrade.sql new file mode 100644 index 000000000..8fa39663a --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/042_sqlite_downgrade.sql @@ -0,0 +1,129 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE volumes_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + ec2_id VARCHAR(255), + user_id VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + size INTEGER, + availability_zone VARCHAR(255), + instance_id INTEGER, + mountpoint VARCHAR(255), + attach_time VARCHAR(255), + status VARCHAR(255), + attach_status VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + provider_location VARCHAR(256), + provider_auth VARCHAR(256), + snapshot_id INTEGER, + volume_type_id INTEGER, + PRIMARY KEY (id), + FOREIGN KEY(instance_id) REFERENCES instances (id), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO volumes_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + ec2_id, + user_id, + project_id, + host, + size, + availability_zone, + instance_id, + mountpoint, + attach_time, + status, + attach_status, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + provider_location, + provider_auth, + snapshot_id, + volume_type_id + FROM volumes; + + DROP TABLE volumes; + + CREATE TABLE volumes ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + ec2_id VARCHAR(255), + user_id VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + size INTEGER, + availability_zone VARCHAR(255), + instance_id INTEGER, + mountpoint VARCHAR(255), + attach_time VARCHAR(255), + status VARCHAR(255), + attach_status VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + provider_location VARCHAR(256), + provider_auth VARCHAR(256), + snapshot_id INTEGER, + PRIMARY KEY (id), + FOREIGN KEY(instance_id) REFERENCES instances (id), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO volumes + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + ec2_id, + user_id, + project_id, + host, + size, + availability_zone, + instance_id, + mountpoint, + attach_time, + status, + attach_status, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + provider_location, + provider_auth, + snapshot_id + FROM volumes_backup; + + DROP TABLE volumes_backup; + + DROP TABLE volume_type_extra_specs; + + DROP TABLE volume_types; + + DROP TABLE volume_metadata; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/043_add_vsa_data.py b/cinder/db/sqlalchemy/migrate_repo/versions/043_add_vsa_data.py new file mode 100644 index 000000000..1e22608fc --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/043_add_vsa_data.py @@ -0,0 +1,84 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 Zadara Storage Inc. +# Copyright (c) 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, DateTime, Integer, MetaData, String, Table +from sqlalchemy import Boolean + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + # + # New Tables + # + virtual_storage_arrays = Table('virtual_storage_arrays', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('display_name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('display_description', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('project_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('availability_zone', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('instance_type_id', Integer(), nullable=False), + Column('image_ref', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('vc_count', Integer(), nullable=False), + Column('vol_count', Integer(), nullable=False), + Column('status', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + + try: + virtual_storage_arrays.create() + except Exception: + LOG.info(repr(virtual_storage_arrays)) + LOG.exception('Exception while creating table') + raise + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + virtual_storage_arrays = Table('virtual_storage_arrays', + meta, + autoload=True) + virtual_storage_arrays.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/044_update_instance_states.py b/cinder/db/sqlalchemy/migrate_repo/versions/044_update_instance_states.py new file mode 100644 index 000000000..95d3b7529 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/044_update_instance_states.py @@ -0,0 +1,52 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import MetaData, Table, Column, String + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instance_table = Table('instances', meta, autoload=True) + + c_state = instance_table.c.state + c_state.alter(name='power_state') + + c_vm_state = instance_table.c.state_description + c_vm_state.alter(name='vm_state') + + c_task_state = Column('task_state', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False), + nullable=True) + instance_table.create_column(c_task_state) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instance_table = Table('instances', meta, autoload=True) + + c_state = instance_table.c.power_state + c_state.alter(name='state') + + c_vm_state = instance_table.c.vm_state + c_vm_state.alter(name='state_description') + + instance_table.drop_column('task_state') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py b/cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py new file mode 100644 index 000000000..3d75803dc --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py @@ -0,0 +1,44 @@ +# Copyright 2011 Nicira, 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 sqlalchemy import Column, Integer, MetaData, Table + +from cinder import log as logging + + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + networks = Table('networks', meta, autoload=True) + + priority = Column('priority', Integer()) + try: + networks.create_column(priority) + except Exception: + LOG.error(_("priority column not added to networks table")) + raise + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + networks = Table('networks', meta, autoload=True) + + networks.drop_column('priority') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/046_add_instance_swap.py b/cinder/db/sqlalchemy/migrate_repo/versions/046_add_instance_swap.py new file mode 100644 index 000000000..3ee1c4e7e --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/046_add_instance_swap.py @@ -0,0 +1,49 @@ +# Copyright 2011 Isaku Yamahata +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, Integer, MetaData, Table, String + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + default_local_device = Column( + 'default_local_device', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + nullable=True) + + default_swap_device = Column( + 'default_swap_device', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + nullable=True) + instances.create_column(default_local_device) + instances.create_column(default_swap_device) + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + instances.drop_column('default_swap_device') + instances.drop_column('default_local_device') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py b/cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py new file mode 100644 index 000000000..0b365df31 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py @@ -0,0 +1,61 @@ +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import MetaData, Table +from migrate import ForeignKeyConstraint + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + dialect = migrate_engine.url.get_dialect().name + if dialect.startswith('sqlite'): + return + + instances = Table('instances', meta, autoload=True) + vifs = Table('virtual_interfaces', meta, autoload=True) + + try: + fkey_name = list(vifs.c.instance_id.foreign_keys)[0].constraint.name + ForeignKeyConstraint(columns=[vifs.c.instance_id], + refcolumns=[instances.c.id], + name=fkey_name).drop() + except Exception: + LOG.error(_("foreign key constraint couldn't be removed")) + raise + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + meta = MetaData() + meta.bind = migrate_engine + dialect = migrate_engine.url.get_dialect().name + if dialect.startswith('sqlite'): + return + + instances = Table('instances', meta, autoload=True) + vifs = Table('virtual_interfaces', meta, autoload=True) + + try: + ForeignKeyConstraint(columns=[vifs.c.instance_id], + refcolumns=[instances.c.id]).create() + except Exception: + LOG.error(_("foreign key constraint couldn't be added")) + raise diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/047_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/047_sqlite_downgrade.sql new file mode 100644 index 000000000..9bc3ee8d4 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/047_sqlite_downgrade.sql @@ -0,0 +1,46 @@ +BEGIN TRANSACTION; + CREATE TEMPORARY TABLE virtual_interfaces_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER NOT NULL, + uuid VARCHAR(36), + PRIMARY KEY (id) + ); + + INSERT INTO virtual_interfaces_backup + SELECT created_at, updated_at, deleted_at, deleted, id, address, + network_id, instance_id, uuid + FROM virtual_interfaces; + + DROP TABLE virtual_interfaces; + + CREATE TABLE virtual_interfaces ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER NOT NULL, + uuid VARCHAR(36), + PRIMARY KEY (id), + FOREIGN KEY(network_id) REFERENCES networks (id), + FOREIGN KEY(instance_id) REFERENCES instances (id), + UNIQUE (address), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO virtual_interfaces + SELECT created_at, updated_at, deleted_at, deleted, id, address, + network_id, instance_id, uuid + FROM virtual_interfaces_backup; + + DROP TABLE virtual_interfaces_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/047_sqlite_upgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/047_sqlite_upgrade.sql new file mode 100644 index 000000000..2c0919f1d --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/047_sqlite_upgrade.sql @@ -0,0 +1,45 @@ +BEGIN TRANSACTION; + CREATE TEMPORARY TABLE virtual_interfaces_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER NOT NULL, + uuid VARCHAR(36), + PRIMARY KEY (id) + ); + + INSERT INTO virtual_interfaces_backup + SELECT created_at, updated_at, deleted_at, deleted, id, address, + network_id, instance_id, uuid + FROM virtual_interfaces; + + DROP TABLE virtual_interfaces; + + CREATE TABLE virtual_interfaces ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER NOT NULL, + uuid VARCHAR(36), + PRIMARY KEY (id), + FOREIGN KEY(network_id) REFERENCES networks (id), + UNIQUE (address), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO virtual_interfaces + SELECT created_at, updated_at, deleted_at, deleted, id, address, + network_id, instance_id, uuid + FROM virtual_interfaces_backup; + + DROP TABLE virtual_interfaces_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/048_add_zone_name.py b/cinder/db/sqlalchemy/migrate_repo/versions/048_add_zone_name.py new file mode 100644 index 000000000..e313fc7de --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/048_add_zone_name.py @@ -0,0 +1,33 @@ +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, Integer, MetaData, String, Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + zones = Table('zones', meta, autoload=True) + name = Column('name', String(255)) + zones.create_column(name) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + zones = Table('zones', meta, autoload=True) + + zones.drop_column('name') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py b/cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py new file mode 100644 index 000000000..c19d89e64 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py @@ -0,0 +1,44 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, Integer, MetaData, Table + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + progress = Column('progress', Integer()) + try: + instances.create_column(progress) + except Exception: + LOG.error(_("progress column not added to instances table")) + raise + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + instances.drop_column('progress') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/050_add_disk_config_to_instances.py b/cinder/db/sqlalchemy/migrate_repo/versions/050_add_disk_config_to_instances.py new file mode 100644 index 000000000..d4a2fcc13 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/050_add_disk_config_to_instances.py @@ -0,0 +1,37 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Boolean, Column, Integer, MetaData, Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + managed_disk = Column("managed_disk", Boolean(create_constraint=False, + name=None)) + instances.create_column(managed_disk) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instances = Table('instances', meta, autoload=True) + + instances.drop_column('managed_disk') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/050_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/050_sqlite_downgrade.sql new file mode 100644 index 000000000..8db7087bc --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/050_sqlite_downgrade.sql @@ -0,0 +1,207 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE instances_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + internal_id INTEGER, + user_id VARCHAR(255), + project_id VARCHAR(255), + image_ref VARCHAR(255), + kernel_id VARCHAR(255), + ramdisk_id VARCHAR(255), + server_name VARCHAR(255), + launch_index INTEGER, + key_name VARCHAR(255), + key_data TEXT, + power_state INTEGER, + vm_state VARCHAR(255), + memory_mb INTEGER, + vcpus INTEGER, + local_gb INTEGER, + hostname VARCHAR(255), + host VARCHAR(255), + user_data TEXT, + reservation_id VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + availability_zone VARCHAR(255), + locked BOOLEAN, + os_type VARCHAR(255), + launched_on TEXT, + instance_type_id INTEGER, + vm_mode VARCHAR(255), + uuid VARCHAR(36), + architecture VARCHAR(255), + root_device_name VARCHAR(255), + access_ip_v4 VARCHAR(255), + access_ip_v6 VARCHAR(255), + config_drive VARCHAR(255), + task_state VARCHAR(255), + default_local_device VARCHAR(255), + default_swap_device VARCHAR(255), + progress INTEGER, + managed_disk BOOLEAN, + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (locked IN (0, 1)), + CHECK (managed_disk IN (0, 1)) + ); + + INSERT INTO instances_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + internal_id, + user_id, + project_id, + image_ref, + kernel_id, + ramdisk_id, + server_name, + launch_index, + key_name, + key_data, + power_state, + vm_state, + memory_mb, + vcpus, + local_gb, + hostname, + host, + user_data, + reservation_id, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + availability_zone, + locked, + os_type, + launched_on, + instance_type_id, + vm_mode, + uuid, + architecture, + root_device_name, + access_ip_v4, + access_ip_v6, + config_drive, + task_state, + default_local_device, + default_swap_device, + progress, + managed_disk + FROM instances; + + DROP TABLE instances; + + CREATE TABLE instances ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + internal_id INTEGER, + user_id VARCHAR(255), + project_id VARCHAR(255), + image_ref VARCHAR(255), + kernel_id VARCHAR(255), + ramdisk_id VARCHAR(255), + server_name VARCHAR(255), + launch_index INTEGER, + key_name VARCHAR(255), + key_data TEXT, + power_state INTEGER, + vm_state VARCHAR(255), + memory_mb INTEGER, + vcpus INTEGER, + local_gb INTEGER, + hostname VARCHAR(255), + host VARCHAR(255), + user_data TEXT, + reservation_id VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + availability_zone VARCHAR(255), + locked BOOLEAN, + os_type VARCHAR(255), + launched_on TEXT, + instance_type_id INTEGER, + vm_mode VARCHAR(255), + uuid VARCHAR(36), + architecture VARCHAR(255), + root_device_name VARCHAR(255), + access_ip_v4 VARCHAR(255), + access_ip_v6 VARCHAR(255), + config_drive VARCHAR(255), + task_state VARCHAR(255), + default_local_device VARCHAR(255), + default_swap_device VARCHAR(255), + progress INTEGER, + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (locked IN (0, 1)) + ); + + INSERT INTO instances + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + internal_id, + user_id, + project_id, + image_ref, + kernel_id, + ramdisk_id, + server_name, + launch_index, + key_name, + key_data, + power_state, + vm_state, + memory_mb, + vcpus, + local_gb, + hostname, + host, + user_data, + reservation_id, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + availability_zone, + locked, + os_type, + launched_on, + instance_type_id, + vm_mode, + uuid, + architecture, + root_device_name, + access_ip_v4, + access_ip_v6, + config_drive, + task_state, + default_local_device, + default_swap_device, + progress + FROM instances_backup; + + DROP TABLE instances_backup; +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/051_add_vcpu_weight_to_instance_types.py b/cinder/db/sqlalchemy/migrate_repo/versions/051_add_vcpu_weight_to_instance_types.py new file mode 100644 index 000000000..a33831993 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/051_add_vcpu_weight_to_instance_types.py @@ -0,0 +1,34 @@ +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, Integer, MetaData, Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instance_types = Table('instance_types', meta, autoload=True) + + vcpu_weight = Column("vcpu_weight", Integer()) + instance_types.create_column(vcpu_weight) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instance_types = Table('instance_types', meta, autoload=True) + + instance_types.drop_column('vcpu_weight') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/052_kill_export_devices.py b/cinder/db/sqlalchemy/migrate_repo/versions/052_kill_export_devices.py new file mode 100644 index 000000000..c71b4eeef --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/052_kill_export_devices.py @@ -0,0 +1,65 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 University of Southern California +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer +from sqlalchemy import MetaData, Table +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + volumes = Table('volumes', meta, autoload=True) + + # + # New Tables + # + export_devices = Table('export_devices', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('shelf_id', Integer()), + Column('blade_id', Integer()), + Column('volume_id', + Integer(), + ForeignKey('volumes.id'), + nullable=True), + ) + + try: + export_devices.create() + except Exception: + LOG.info(repr(export_devices)) + LOG.exception('Exception while creating table') + raise + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + volumes = Table('volumes', meta, autoload=True) + + export_devices = Table('export_devices', meta, autoload=True) + + export_devices.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/053_add_connection_info_to_block_device_mapping.py b/cinder/db/sqlalchemy/migrate_repo/versions/053_add_connection_info_to_block_device_mapping.py new file mode 100644 index 000000000..8fe139918 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/053_add_connection_info_to_block_device_mapping.py @@ -0,0 +1,38 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 sqlalchemy import Column, MetaData, Table, Text + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + table = Table('block_device_mapping', meta, autoload=True) + + new_column = Column('connection_info', Text()) + + table.create_column(new_column) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + table = Table('block_device_mapping', meta, autoload=True) + + table.c.connection_info.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/053_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/053_sqlite_downgrade.sql new file mode 100644 index 000000000..844399763 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/053_sqlite_downgrade.sql @@ -0,0 +1,87 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE block_device_mapping_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + instance_id INTEGER NOT NULL, + device_name VARCHAR(255) NOT NULL, + delete_on_termination BOOLEAN, + virtual_name VARCHAR(255), + snapshot_id INTEGER, + volume_id INTEGER, + volume_size INTEGER, + no_device BOOLEAN, + connection_info TEXT, + PRIMARY KEY (id), + FOREIGN KEY(snapshot_id) REFERENCES snapshots (id), + CHECK (deleted IN (0, 1)), + CHECK (delete_on_termination IN (0, 1)), + CHECK (no_device IN (0, 1)), + FOREIGN KEY(volume_id) REFERENCES volumes (id), + FOREIGN KEY(instance_id) REFERENCES instances (id) + ); + + INSERT INTO block_device_mapping_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + instance_id, + device_name, + delete_on_termination, + virtual_name, + snapshot_id, + volume_id, + volume_size, + no_device, + connection_info + FROM block_device_mapping; + + DROP TABLE block_device_mapping; + + CREATE TABLE block_device_mapping ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + instance_id INTEGER NOT NULL, + device_name VARCHAR(255) NOT NULL, + delete_on_termination BOOLEAN, + virtual_name VARCHAR(255), + snapshot_id INTEGER, + volume_id INTEGER, + volume_size INTEGER, + no_device BOOLEAN, + PRIMARY KEY (id), + FOREIGN KEY(snapshot_id) REFERENCES snapshots (id), + CHECK (deleted IN (0, 1)), + CHECK (delete_on_termination IN (0, 1)), + CHECK (no_device IN (0, 1)), + FOREIGN KEY(volume_id) REFERENCES volumes (id), + FOREIGN KEY(instance_id) REFERENCES instances (id) + ); + + INSERT INTO block_device_mapping + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + instance_id, + device_name, + delete_on_termination, + virtual_name, + snapshot_id, + volume_id, + volume_size, + no_device + FROM block_device_mapping_backup; + + DROP TABLE block_device_mapping_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/054_add_bw_usage_data_cache.py b/cinder/db/sqlalchemy/migrate_repo/versions/054_add_bw_usage_data_cache.py new file mode 100644 index 000000000..765f9cfc1 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/054_add_bw_usage_data_cache.py @@ -0,0 +1,64 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 MORITA Kazutaka. +# 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 sqlalchemy import Column, Table, MetaData +from sqlalchemy import Integer, BigInteger, DateTime, Boolean, String + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + # + # New Tables + # + bw_cache = Table('bw_usage_cache', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('instance_id', Integer(), nullable=False), + Column('network_label', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('start_period', DateTime(timezone=False), nullable=False), + Column('last_refreshed', DateTime(timezone=False)), + Column('bw_in', BigInteger()), + Column('bw_out', BigInteger())) + try: + bw_cache.create() + except Exception: + LOG.info(repr(bw_cache)) + LOG.exception('Exception while creating table') + meta.drop_all(tables=[bw_cache]) + raise + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + meta = MetaData() + meta.bind = migrate_engine + bw_cache = Table('bw_usage_cache', meta, autoload=True) + bw_cache.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py b/cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py new file mode 100644 index 000000000..b110b6f20 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py @@ -0,0 +1,112 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 migrate +import migrate.changeset +from sqlalchemy import Column, Integer, String, MetaData, Table + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instance_types = Table('instance_types', meta, autoload=True) + + string_column = Column('flavorid_str', String(255)) + + string_column.create(instance_types) + + try: + # NOTE(bcwaldon): This catches a bug with python-migrate + # failing to add the unique constraint + try: + migrate.UniqueConstraint(string_column).create() + except migrate.changeset.NotSupportedError: + LOG.error("Failed to add unique constraint on flavorid") + pass + + # NOTE(bcwaldon): this is a hack to preserve uniqueness constraint + # on existing 'name' column + try: + migrate.UniqueConstraint(instance_types.c.name).create() + except Exception: + pass + + integer_column = instance_types.c.flavorid + + instance_type_rows = list(instance_types.select().execute()) + for instance_type in instance_type_rows: + flavorid_int = instance_type.flavorid + instance_types.update()\ + .where(integer_column == flavorid_int)\ + .values(flavorid_str=str(flavorid_int))\ + .execute() + except Exception: + string_column.drop() + raise + + integer_column.alter(name='flavorid_int') + string_column.alter(name='flavorid') + integer_column.drop() + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instance_types = Table('instance_types', meta, autoload=True) + + integer_column = Column('flavorid_int', Integer()) + + integer_column.create(instance_types) + + try: + # NOTE(bcwaldon): This catches a bug with python-migrate + # failing to add the unique constraint + try: + migrate.UniqueConstraint(integer_column).create() + except migrate.changeset.NotSupportedError: + LOG.info("Failed to add unique constraint on flavorid") + pass + + string_column = instance_types.c.flavorid + + instance_types_rows = list(instance_types.select().execute()) + for instance_type in instance_types_rows: + flavorid_str = instance_type.flavorid + try: + flavorid_int = int(instance_type.flavorid) + except ValueError: + msg = _('Could not cast flavorid to integer: %s. ' + 'Set flavorid to an integer-like string to downgrade.') + LOG.error(msg % instance_type.flavorid) + raise + + instance_types.update()\ + .where(string_column == flavorid_str)\ + .values(flavorid_int=flavorid_int)\ + .execute() + except Exception: + integer_column.drop() + raise + + string_column.alter(name='flavorid_str') + integer_column.alter(name='flavorid') + string_column.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/056_add_s3_images.py b/cinder/db/sqlalchemy/migrate_repo/versions/056_add_s3_images.py new file mode 100644 index 000000000..aed52488a --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/056_add_s3_images.py @@ -0,0 +1,60 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 sqlalchemy import Boolean, Column, DateTime, Integer +from sqlalchemy import MetaData, String, Table +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # + # New Tables + # + s3_images = Table('s3_images', meta, + Column('created_at', + DateTime(timezone=False)), + Column('updated_at', + DateTime(timezone=False)), + Column('deleted_at', + DateTime(timezone=False)), + Column('deleted', + Boolean(create_constraint=True, name=None)), + Column('id', Integer(), + primary_key=True, + nullable=False, + autoincrement=True), + Column('uuid', String(36), + nullable=False)) + try: + s3_images.create() + except Exception: + LOG.exception("Exception while creating table 's3_images'") + meta.drop_all(tables=[s3_images]) + raise + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + s3_images = Table('s3_images', meta, autoload=True) + s3_images.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/057_add_sm_driver_tables.py b/cinder/db/sqlalchemy/migrate_repo/versions/057_add_sm_driver_tables.py new file mode 100644 index 000000000..ea01fc80c --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/057_add_sm_driver_tables.py @@ -0,0 +1,113 @@ +# Copyright (c) 2011 Citrix 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. + +from sqlalchemy import Boolean, Column, DateTime, ForeignKey +from sqlalchemy import Integer, MetaData, String +from sqlalchemy import Table + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + volumes = Table('volumes', meta, autoload=True) + + # + # New Tables + # + flavors = Table('sm_flavors', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('label', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('description', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + + backend = Table('sm_backend_config', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('flavor_id', Integer(), ForeignKey('sm_flavors.id'), + nullable=False), + Column('sr_uuid', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('sr_type', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('config_params', + String(length=2047, + convert_unicode=False, + assert_unicode=None, + unicode_error=None, + _warn_on_bytestring=False)), + ) + + sm_vol = Table('sm_volume', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), ForeignKey('volumes.id'), + primary_key=True, nullable=False), + Column('backend_id', Integer(), + ForeignKey('sm_backend_config.id'), + nullable=False), + Column('vdi_uuid', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + for table in (flavors, backend, sm_vol): + try: + table.create() + except Exception: + LOG.info(repr(table)) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + volumes = Table('volumes', meta, autoload=True) + + flavors = Table('sm_flavors', meta, autoload=True) + backend = Table('sm_backend_config', meta, autoload=True) + sm_vol = Table('sm_volume', meta, autoload=True) + + for table in (flavors, backend, sm_vol): + try: + table.drop() + except Exception: + LOG.info(repr(table)) diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/058_rename_managed_disk.py b/cinder/db/sqlalchemy/migrate_repo/versions/058_rename_managed_disk.py new file mode 100644 index 000000000..e12cabddd --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/058_rename_managed_disk.py @@ -0,0 +1,37 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import MetaData, Table + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + + managed_disk = instances.c.managed_disk + managed_disk.alter(name='auto_disk_config') + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + + image_ref_column = instances.c.auto_disk_config + image_ref_column.alter(name='managed_disk') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/059_split_rxtx_quota_into_network.py b/cinder/db/sqlalchemy/migrate_repo/versions/059_split_rxtx_quota_into_network.py new file mode 100644 index 000000000..58f6d69e0 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/059_split_rxtx_quota_into_network.py @@ -0,0 +1,61 @@ +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, Integer, Float, MetaData, Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instance_types = Table('instance_types', meta, autoload=True) + networks = Table('networks', meta, autoload=True) + + rxtx_base = Column('rxtx_base', Integer) + rxtx_factor = Column('rxtx_factor', Float, default=1) + instance_types.create_column(rxtx_factor) + networks.create_column(rxtx_base) + + base = migrate_engine.execute("select min(rxtx_cap) as min_rxtx from " + "instance_types where rxtx_cap > 0").scalar() + base = base if base > 1 else 1 + update_i_type_sql = ("update instance_types set rxtx_factor = rxtx_cap" + "/%s where rxtx_cap > 0" % base) + migrate_engine.execute(update_i_type_sql) + migrate_engine.execute("update networks set rxtx_base = %s" % base) + + instance_types.c.rxtx_quota.drop() + instance_types.c.rxtx_cap.drop() + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instance_types = Table('instance_types', meta, autoload=True) + networks = Table('networks', meta, autoload=True) + + rxtx_quota = Column('rxtx_quota', Integer) + rxtx_cap = Column('rxtx_cap', Integer) + instance_types.create_column(rxtx_quota) + instance_types.create_column(rxtx_cap) + + base = migrate_engine.execute("select min(rxtx_base) from networks " + "where rxtx_base > 0").scalar() + base = base if base > 1 else 1 + + update_i_type_sql = ("update instance_types set rxtx_cap = " + "rxtx_factor * %s" % base) + migrate_engine.execute(update_i_type_sql) + + instance_types.c.rxtx_factor.drop() + networks.c.rxtx_base.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/059_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/059_sqlite_downgrade.sql new file mode 100644 index 000000000..ecf45c599 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/059_sqlite_downgrade.sql @@ -0,0 +1,137 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE instance_types_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + name VARCHAR(255), + id INTEGER NOT NULL, + memory_mb INTEGER NOT NULL, + vcpus INTEGER NOT NULL, + local_gb INTEGER NOT NULL, + swap INTEGER NOT NULL, + rxtx_quota INTEGER NOT NULL, + rxtx_cap INTEGER NOT NULL, + vcpu_weight INTEGER, + flavorid VARCHAR(255), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + UNIQUE (flavorid), + UNIQUE (name) + ); + + INSERT INTO instance_types_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + name, + id, + memory_mb, + vcpus, + local_gb, + swap, + 0 as rxtx_quota, + COALESCE(rxtx_factor, 1) * COALESCE ((SELECT MIN(rxtx_base) + FROM networks + WHERE rxtx_base > 0), 1) + as rxtx_cap, + vcpu_weight, + flavorid FROM instance_types; + + DROP TABLE instance_types; + + CREATE TABLE instance_types ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + name VARCHAR(255), + id INTEGER NOT NULL, + memory_mb INTEGER NOT NULL, + vcpus INTEGER NOT NULL, + local_gb INTEGER NOT NULL, + swap INTEGER NOT NULL, + rxtx_quota INTEGER NOT NULL, + rxtx_cap INTEGER NOT NULL, + vcpu_weight INTEGER, + flavorid VARCHAR(255), + PRIMARY KEY (id), + UNIQUE (flavorid), + CHECK (deleted IN (0, 1)), + UNIQUE (name) + ); + + INSERT INTO instance_types SELECT * FROM instance_types_backup; + DROP TABLE instance_types_backup; + + CREATE TABLE networks_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + injected BOOLEAN, + cidr VARCHAR(255), + netmask VARCHAR(255), + bridge VARCHAR(255), + gateway VARCHAR(255), + broadcast VARCHAR(255), + dns1 VARCHAR(255), + vlan INTEGER, + vpn_public_address VARCHAR(255), + vpn_public_port INTEGER, + vpn_private_address VARCHAR(255), + dhcp_start VARCHAR(255), + project_id VARCHAR(255), + host VARCHAR(255), + cidr_v6 VARCHAR(255), + gateway_v6 VARCHAR(255), + label VARCHAR(255), + netmask_v6 VARCHAR(255), + bridge_interface VARCHAR(255), + multi_host BOOLEAN, + dns2 VARCHAR(255), + uuid VARCHAR(36), + priority INTEGER, + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (injected IN (0, 1)), + CHECK (multi_host IN (0, 1)) + ); + + INSERT INTO networks_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + injected, + cidr, + netmask, + bridge, + gateway, + broadcast, + dns1, + vlan, + vpn_public_address, + vpn_public_port, + vpn_private_address, + dhcp_start, + project_id, + host, + cidr_v6, + gateway_v6, + label, + netmask_v6, + bridge_interface, + multi_host, + dns2, + uuid, + priority + FROM networks; + + DROP TABLE networks; + ALTER TABLE networks_backup RENAME TO networks; +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/059_sqlite_upgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/059_sqlite_upgrade.sql new file mode 100644 index 000000000..ba7729aed --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/059_sqlite_upgrade.sql @@ -0,0 +1,87 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE instance_types_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + name VARCHAR(255), + id INTEGER NOT NULL, + memory_mb INTEGER NOT NULL, + vcpus INTEGER NOT NULL, + local_gb INTEGER NOT NULL, + swap INTEGER NOT NULL, + rxtx_factor FLOAT, + vcpu_weight INTEGER, + flavorid VARCHAR(255), + PRIMARY KEY (id), + UNIQUE (flavorid), + CHECK (deleted IN (0, 1)), + UNIQUE (name) + ); + + INSERT INTO instance_types_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + name, + id, + memory_mb, + vcpus, + local_gb, + swap, + COALESCE(rxtx_cap, 1) / COALESCE ((SELECT MIN(rxtx_cap) + FROM instance_types + WHERE rxtx_cap > 0), 1) as rxtx_cap, + vcpu_weight, + flavorid + FROM instance_types; + + ALTER TABLE networks ADD COLUMN rxtx_base INTEGER DEFAULT 1; + + UPDATE networks SET rxtx_base = COALESCE((SELECT MIN(rxtx_cap) + FROM instance_types + WHERE rxtx_cap>0), 1); + + DROP TABLE instance_types; + + CREATE TABLE instance_types ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + name VARCHAR(255), + id INTEGER NOT NULL, + memory_mb INTEGER NOT NULL, + vcpus INTEGER NOT NULL, + local_gb INTEGER NOT NULL, + swap INTEGER NOT NULL, + rxtx_factor FLOAT, + vcpu_weight INTEGER, + flavorid VARCHAR(255), + PRIMARY KEY (id), + UNIQUE (flavorid), + CHECK (deleted IN (0, 1)), + UNIQUE (name) + ); + + INSERT INTO instance_types + SELECT created_at, + updated_at, + deleted_at, + deleted, + name, + id, + memory_mb, + vcpus, + local_gb, + swap, + rxtx_factor, + vcpu_weight, + flavorid + FROM instance_types_backup; + + DROP TABLE instance_types_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py b/cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py new file mode 100644 index 000000000..83ed1cf6b --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py @@ -0,0 +1,62 @@ +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import MetaData, Table +from migrate import ForeignKeyConstraint + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + dialect = migrate_engine.url.get_dialect().name + if dialect.startswith('sqlite'): + return + + networks = Table('networks', meta, autoload=True) + vifs = Table('virtual_interfaces', meta, autoload=True) + + try: + fkey_name = list(vifs.c.network_id.foreign_keys)[0].constraint.name + ForeignKeyConstraint(columns=[vifs.c.network_id], + refcolumns=[networks.c.id], + name=fkey_name).drop() + + except Exception: + LOG.error(_("foreign key constraint couldn't be removed")) + raise + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + meta = MetaData() + meta.bind = migrate_engine + dialect = migrate_engine.url.get_dialect().name + if dialect.startswith('sqlite'): + return + + networks = Table('networks', meta, autoload=True) + vifs = Table('virtual_interfaces', meta, autoload=True) + + try: + ForeignKeyConstraint(columns=[vifs.c.network_id], + refcolumns=[networks.c.id]).create() + except Exception: + LOG.error(_("foreign key constraint couldn't be added")) + raise diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/060_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/060_sqlite_downgrade.sql new file mode 100644 index 000000000..2c0919f1d --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/060_sqlite_downgrade.sql @@ -0,0 +1,45 @@ +BEGIN TRANSACTION; + CREATE TEMPORARY TABLE virtual_interfaces_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER NOT NULL, + uuid VARCHAR(36), + PRIMARY KEY (id) + ); + + INSERT INTO virtual_interfaces_backup + SELECT created_at, updated_at, deleted_at, deleted, id, address, + network_id, instance_id, uuid + FROM virtual_interfaces; + + DROP TABLE virtual_interfaces; + + CREATE TABLE virtual_interfaces ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER NOT NULL, + uuid VARCHAR(36), + PRIMARY KEY (id), + FOREIGN KEY(network_id) REFERENCES networks (id), + UNIQUE (address), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO virtual_interfaces + SELECT created_at, updated_at, deleted_at, deleted, id, address, + network_id, instance_id, uuid + FROM virtual_interfaces_backup; + + DROP TABLE virtual_interfaces_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/060_sqlite_upgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/060_sqlite_upgrade.sql new file mode 100644 index 000000000..fd49ea4f5 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/060_sqlite_upgrade.sql @@ -0,0 +1,44 @@ +BEGIN TRANSACTION; + CREATE TEMPORARY TABLE virtual_interfaces_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER NOT NULL, + uuid VARCHAR(36), + PRIMARY KEY (id) + ); + + INSERT INTO virtual_interfaces_backup + SELECT created_at, updated_at, deleted_at, deleted, id, address, + network_id, instance_id, uuid + FROM virtual_interfaces; + + DROP TABLE virtual_interfaces; + + CREATE TABLE virtual_interfaces ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER NOT NULL, + uuid VARCHAR(36), + PRIMARY KEY (id), + UNIQUE (address), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO virtual_interfaces + SELECT created_at, updated_at, deleted_at, deleted, id, address, + network_id, instance_id, uuid + FROM virtual_interfaces_backup; + + DROP TABLE virtual_interfaces_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/061_add_index_to_instance_uuid.py b/cinder/db/sqlalchemy/migrate_repo/versions/061_add_index_to_instance_uuid.py new file mode 100644 index 000000000..1a369bffe --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/061_add_index_to_instance_uuid.py @@ -0,0 +1,29 @@ +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Index, MetaData, Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + Index('uuid', instances.c.uuid, unique=True).create(migrate_engine) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + Index('uuid', instances.c.uuid, unique=True).drop(migrate_engine) diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py b/cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py new file mode 100644 index 000000000..f2b0e8a74 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py @@ -0,0 +1,70 @@ +# Copyright 2011 OpenStack LLC. +# 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 sqlalchemy import Boolean, Column, DateTime, ForeignKey +from sqlalchemy import Integer, MetaData, String +from sqlalchemy import Table, Text + +from cinder import log as logging +from cinder import utils + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + instances = Table('instances', meta, autoload=True) + + # + # New Tables + # + instance_info_caches = Table('instance_info_caches', meta, + Column('created_at', DateTime(timezone=False), + default=utils.utcnow()), + Column('updated_at', DateTime(timezone=False), + onupdate=utils.utcnow()), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True), + Column('network_info', Text()), + Column('instance_id', String(36), + ForeignKey('instances.uuid'), + nullable=False, + unique=True), + mysql_engine='InnoDB') + # create instance_info_caches table + try: + instance_info_caches.create() + except Exception: + LOG.error(_("Table |%s| not created!"), repr(instance_info_caches)) + raise + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + instances = Table('instances', meta, autoload=True) + + instance_info_caches = Table('instance_info_caches', meta, autoload=True) + try: + instance_info_caches.drop() + except Exception: + LOG.error(_("instance_info_caches tables not dropped")) + raise diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/063_add_instance_faults_table.py b/cinder/db/sqlalchemy/migrate_repo/versions/063_add_instance_faults_table.py new file mode 100644 index 000000000..be4561791 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/063_add_instance_faults_table.py @@ -0,0 +1,60 @@ +# Copyright 2011 OpenStack LLC. +# 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 sqlalchemy import Boolean, Column, DateTime, Integer, ForeignKey +from sqlalchemy import MetaData, String, Table, Text +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + # + # New Tables + # + instance_faults = Table('instance_faults', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None), + default=False), + Column('id', Integer(), primary_key=True, nullable=False), + Column('instance_uuid', String(36, ForeignKey('instances.uuid'))), + Column('code', Integer(), nullable=False), + Column('message', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('details', + Text(length=None, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + ) + try: + instance_faults.create() + except Exception: + LOG.info(repr(instance_faults)) + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + meta = MetaData() + meta.bind = migrate_engine + instance_faults = Table('instance_faults', meta, autoload=True) + instance_faults.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py b/cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py new file mode 100644 index 000000000..bed915166 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py @@ -0,0 +1,80 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 sqlalchemy import select, Column, ForeignKey, Integer +from sqlalchemy import MetaData, String, Table +from migrate import ForeignKeyConstraint + +from cinder import log as logging + + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + dialect = migrate_engine.url.get_dialect().name + instance_actions = Table('instance_actions', meta, autoload=True) + instances = Table('instances', meta, autoload=True) + uuid_column = Column('instance_uuid', String(36)) + uuid_column.create(instance_actions) + + try: + instance_actions.update().values( + instance_uuid=select( + [instances.c.uuid], + instances.c.id == instance_actions.c.instance_id) + ).execute() + except Exception: + uuid_column.drop() + raise + + if not dialect.startswith('sqlite'): + fkeys = list(instance_actions.c.instance_id.foreign_keys) + if fkeys: + try: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[instance_actions.c.instance_id], + refcolumns=[instances.c.id], + name=fkey_name).drop() + except Exception: + LOG.error(_("foreign key constraint couldn't be removed")) + raise + + instance_actions.c.instance_id.drop() + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instance_actions = Table('instance_actions', meta, autoload=True) + instances = Table('instances', meta, autoload=True) + id_column = Column('instance_id', Integer, ForeignKey('instances.id')) + id_column.create(instance_actions) + + try: + instance_actions.update().values( + instance_id=select( + [instances.c.id], + instances.c.uuid == instance_actions.c.instance_uuid) + ).execute() + except Exception: + id_column.drop() + raise + + instance_actions.c.instance_uuid.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/065_add_index_to_instance_project_id.py b/cinder/db/sqlalchemy/migrate_repo/versions/065_add_index_to_instance_project_id.py new file mode 100644 index 000000000..9b27f39dc --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/065_add_index_to_instance_project_id.py @@ -0,0 +1,31 @@ +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Index, MetaData, Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + index = Index('project_id', instances.c.project_id) + index.create(migrate_engine) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + index = Index('project_id', instances.c.project_id) + index.drop(migrate_engine) diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/066_preload_instance_info_cache_table.py b/cinder/db/sqlalchemy/migrate_repo/versions/066_preload_instance_info_cache_table.py new file mode 100644 index 000000000..b2df1bbe2 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/066_preload_instance_info_cache_table.py @@ -0,0 +1,31 @@ +# Copyright 2011 OpenStack LLC. +# 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 json + +from sqlalchemy import select, MetaData, Table + +from cinder import log as logging +from cinder import utils + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + pass + + +def downgrade(migrate_engine): + pass diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/067_add_pool_and_interface_to_floating_ip.py b/cinder/db/sqlalchemy/migrate_repo/versions/067_add_pool_and_interface_to_floating_ip.py new file mode 100644 index 000000000..61adb8fa4 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/067_add_pool_and_interface_to_floating_ip.py @@ -0,0 +1,41 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 X.commerce, a business unit of eBay 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 sqlalchemy import Column, MetaData, String, Table + +from cinder import flags + +FLAGS = flags.FLAGS + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + table = Table('floating_ips', meta, autoload=True) + + pool_column = Column('pool', String(255)) + interface_column = Column('interface', String(255)) + table.create_column(pool_column) + table.create_column(interface_column) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + table = Table('floating_ips', meta, autoload=True) + table.c.pool.drop() + table.c.interface.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/067_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/067_sqlite_downgrade.sql new file mode 100644 index 000000000..3cd12cbdc --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/067_sqlite_downgrade.sql @@ -0,0 +1,69 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE floating_ips_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + fixed_ip_id INTEGER, + project_id VARCHAR(255), + host VARCHAR(255), + auto_assigned BOOLEAN, + pool VARCHAR(255), + interface VARCHAR(255), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + FOREIGN KEY(fixed_ip_id) REFERENCES fixed_ips (id) + ); + + INSERT INTO floating_ips_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + address, + fixed_ip_id, + project_id, + host, + auto_assigned, + pool, + interface + FROM floating_ips; + + DROP TABLE floating_ips; + + CREATE TABLE floating_ips ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + fixed_ip_id INTEGER, + project_id VARCHAR(255), + host VARCHAR(255), + auto_assigned BOOLEAN, + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + FOREIGN KEY(fixed_ip_id) REFERENCES fixed_ips (id) + ); + + INSERT INTO floating_ips + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + address, + fixed_ip_id, + project_id, + host, + auto_assigned + FROM floating_ips_backup; + + DROP TABLE floating_ips_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/068_add_instance_attribute.py b/cinder/db/sqlalchemy/migrate_repo/versions/068_add_instance_attribute.py new file mode 100644 index 000000000..a65aff8b4 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/068_add_instance_attribute.py @@ -0,0 +1,36 @@ +# Copyright 2011 Isaku Yamahata +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Boolean +from sqlalchemy import Column, MetaData, Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + shutdown_terminate = Column( + 'shutdown_terminate', Boolean(), default=True) + disable_terminate = Column( + 'disable_terminate', Boolean(), default=False) + instances.create_column(shutdown_terminate) + instances.create_column(disable_terminate) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + instances.drop_column('shutdown_terminate') + instances.drop_column('disable_terminate') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/068_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/068_sqlite_downgrade.sql new file mode 100644 index 000000000..a7700f6fa --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/068_sqlite_downgrade.sql @@ -0,0 +1,219 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE instances_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + internal_id INTEGER, + user_id VARCHAR(255), + project_id VARCHAR(255), + image_ref VARCHAR(255), + kernel_id VARCHAR(255), + ramdisk_id VARCHAR(255), + server_name VARCHAR(255), + launch_index INTEGER, + key_name VARCHAR(255), + key_data TEXT, + power_state INTEGER, + vm_state VARCHAR(255), + memory_mb INTEGER, + vcpus INTEGER, + local_gb INTEGER, + hostname VARCHAR(255), + host VARCHAR(255), + user_data TEXT, + reservation_id VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + availability_zone VARCHAR(255), + locked BOOLEAN, + os_type VARCHAR(255), + launched_on TEXT, + instance_type_id INTEGER, + vm_mode VARCHAR(255), + uuid VARCHAR(36), + architecture VARCHAR(255), + root_device_name VARCHAR(255), + access_ip_v4 VARCHAR(255), + access_ip_v6 VARCHAR(255), + config_drive VARCHAR(255), + task_state VARCHAR(255), + default_local_device VARCHAR(255), + default_swap_device VARCHAR(255), + progress INTEGER, + auto_disk_config BOOLEAN, + shutdown_terminate BOOLEAN, + disable_terminate BOOLEAN, + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (locked IN (0, 1)), + CHECK (auto_disk_config IN (0, 1)), + CHECK (shutdown_terminate IN (0, 1)), + CHECK (disable_terminate IN (0, 1)) + ); + + INSERT INTO instances_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + internal_id, + user_id, + project_id, + image_ref, + kernel_id, + ramdisk_id, + server_name, + launch_index, + key_name, + key_data, + power_state, + vm_state, + memory_mb, + vcpus, + local_gb, + hostname, + host, + user_data, + reservation_id, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + availability_zone, + locked, + os_type, + launched_on, + instance_type_id, + vm_mode, + uuid, + architecture, + root_device_name, + access_ip_v4, + access_ip_v6, + config_drive, + task_state, + default_local_device, + default_swap_device, + progress, + auto_disk_config, + shutdown_terminate, + disable_terminate + FROM instances; + + DROP TABLE instances; + + CREATE TABLE instances( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + internal_id INTEGER, + user_id VARCHAR(255), + project_id VARCHAR(255), + image_ref VARCHAR(255), + kernel_id VARCHAR(255), + ramdisk_id VARCHAR(255), + server_name VARCHAR(255), + launch_index INTEGER, + key_name VARCHAR(255), + key_data TEXT, + power_state INTEGER, + vm_state VARCHAR(255), + memory_mb INTEGER, + vcpus INTEGER, + local_gb INTEGER, + hostname VARCHAR(255), + host VARCHAR(255), + user_data TEXT, + reservation_id VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + availability_zone VARCHAR(255), + locked BOOLEAN, + os_type VARCHAR(255), + launched_on TEXT, + instance_type_id INTEGER, + vm_mode VARCHAR(255), + uuid VARCHAR(36), + architecture VARCHAR(255), + root_device_name VARCHAR(255), + access_ip_v4 VARCHAR(255), + access_ip_v6 VARCHAR(255), + config_drive VARCHAR(255), + task_state VARCHAR(255), + default_local_device VARCHAR(255), + default_swap_device VARCHAR(255), + progress INTEGER, + auto_disk_config BOOLEAN, + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (locked IN (0, 1)), + CHECK (auto_disk_config IN (0, 1)) + ); + + CREATE INDEX project_id ON instances (project_id); + CREATE UNIQUE INDEX uuid ON instances (uuid); + + INSERT INTO instances + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + internal_id, + user_id, + project_id, + image_ref, + kernel_id, + ramdisk_id, + server_name, + launch_index, + key_name, + key_data, + power_state, + vm_state, + memory_mb, + vcpus, + local_gb, + hostname, + host, + user_data, + reservation_id, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + availability_zone, + locked, + os_type, + launched_on, + instance_type_id, + vm_mode, + uuid, + architecture, + root_device_name, + access_ip_v4, + access_ip_v6, + config_drive, + task_state, + default_local_device, + default_swap_device, + progress, + auto_disk_config + FROM instances_backup; + + DROP TABLE instances_backup; +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py b/cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py new file mode 100644 index 000000000..e9984be28 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py @@ -0,0 +1,50 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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 sqlalchemy import Column, Integer, MetaData, Table +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + disk_available_least = Column('disk_available_least', Integer(), default=0) + compute_nodes = Table('compute_nodes', meta, autoload=True) + # Add disk_available_least column to compute_nodes table. + # Thinking about qcow2 image support, both compressed and virtual disk size + # has to be considered. + # disk_available stores "total disk size - used disk(compressed disk size)" + # while disk_available_least stores + # "total disk size - used disk(virtual disk size)". + # virtual disk size is used for kvm block migration. + try: + compute_nodes.create_column(disk_available_least) + except Exception: + LOG.error(_("progress column not added to compute_nodes table")) + raise + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + compute_nodes = Table('compute_nodes', meta, autoload=True) + compute_nodes.drop_column('disk_available_least') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/070_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/070_sqlite_downgrade.sql new file mode 100644 index 000000000..5837603c8 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/070_sqlite_downgrade.sql @@ -0,0 +1,103 @@ +BEGIN TRANSACTION; + CREATE TABLE fixed_ips_backup ( + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + id INTEGER NOT NULL, + address VARCHAR(255), + virtual_interface_id INTEGER, + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN default FALSE, + leased BOOLEAN default FALSE, + reserved BOOLEAN default FALSE, + host VARCHAR(255), + PRIMARY KEY (id) + ); + + CREATE TABLE floating_ips_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + fixed_ip_id INTEGER, + project_id VARCHAR(255), + host VARCHAR(255), + auto_assigned BOOLEAN, + pool VARCHAR(255), + interface VARCHAR(255), + PRIMARY KEY (id) + ); + + INSERT INTO fixed_ips_backup + SELECT created_at, updated_at, deleted_at, deleted, id, address, + virtual_interface_id, network_id, instance_id, allocated, + leased, reserved, host + FROM fixed_ips; + + INSERT INTO floating_ips_backup + SELECT created_at, updated_at, deleted_at, deleted, id, address, + fixed_ip_id, project_id, host, auto_assigned, pool, + interface + FROM floating_ips; + + DROP TABLE fixed_ips; + DROP TABLE floating_ips; + + CREATE TABLE fixed_ips ( + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + id INTEGER NOT NULL, + address VARCHAR(255), + virtual_interface_id INTEGER, + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN default FALSE, + leased BOOLEAN default FALSE, + reserved BOOLEAN default FALSE, + host VARCHAR(255), + PRIMARY KEY (id), + FOREIGN KEY(virtual_interface_id) REFERENCES virtual_interfaces (id), + FOREIGN KEY(network_id) REFERENCES networks (id), + FOREIGN KEY(instance_id) REFERENCES instances (id) + ); + + CREATE TABLE floating_ips ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + fixed_ip_id INTEGER, + project_id VARCHAR(255), + host VARCHAR(255), + auto_assigned BOOLEAN, + pool VARCHAR(255), + interface VARCHAR(255), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + FOREIGN KEY(fixed_ip_id) REFERENCES fixed_ips (id) + ); + + INSERT INTO fixed_ips + SELECT created_at, updated_at, deleted_at, deleted, id, address, + virtual_interface_id, network_id, instance_id, allocated, + leased, reserved, host + FROM fixed_ips_backup; + + INSERT INTO floating_ips + SELECT created_at, updated_at, deleted_at, deleted, id, address, + fixed_ip_id, project_id, host, auto_assigned, pool, + interface + FROM floating_ips_backup; + + DROP TABLE fixed_ips_backup; + DROP TABLE floating_ips_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/070_sqlite_upgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/070_sqlite_upgrade.sql new file mode 100644 index 000000000..2b6f7c39a --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/070_sqlite_upgrade.sql @@ -0,0 +1,99 @@ +BEGIN TRANSACTION; + CREATE TABLE fixed_ips_backup ( + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + id INTEGER NOT NULL, + address VARCHAR(255), + virtual_interface_id INTEGER, + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN default FALSE, + leased BOOLEAN default FALSE, + reserved BOOLEAN default FALSE, + host VARCHAR(255), + PRIMARY KEY (id) + ); + + CREATE TABLE floating_ips_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + fixed_ip_id INTEGER, + project_id VARCHAR(255), + host VARCHAR(255), + auto_assigned BOOLEAN, + pool VARCHAR(255), + interface VARCHAR(255), + PRIMARY KEY (id) + ); + + INSERT INTO fixed_ips_backup + SELECT created_at, updated_at, deleted_at, deleted, id, address, + virtual_interface_id, network_id, instance_id, allocated, + leased, reserved, host + FROM fixed_ips; + + INSERT INTO floating_ips_backup + SELECT created_at, updated_at, deleted_at, deleted, id, address, + fixed_ip_id, project_id, host, auto_assigned, pool, + interface + FROM floating_ips; + + DROP TABLE fixed_ips; + DROP TABLE floating_ips; + + CREATE TABLE fixed_ips ( + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + id INTEGER NOT NULL, + address VARCHAR(255), + virtual_interface_id INTEGER, + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN default FALSE, + leased BOOLEAN default FALSE, + reserved BOOLEAN default FALSE, + host VARCHAR(255), + PRIMARY KEY (id) + ); + + CREATE TABLE floating_ips ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + fixed_ip_id INTEGER, + project_id VARCHAR(255), + host VARCHAR(255), + auto_assigned BOOLEAN, + pool VARCHAR(255), + interface VARCHAR(255), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO fixed_ips + SELECT created_at, updated_at, deleted_at, deleted, id, address, + virtual_interface_id, network_id, instance_id, allocated, + leased, reserved, host + FROM fixed_ips_backup; + + INSERT INTO floating_ips + SELECT created_at, updated_at, deleted_at, deleted, id, address, + fixed_ip_id, project_id, host, auto_assigned, pool, + interface + FROM floating_ips_backup; + + DROP TABLE fixed_ips_backup; + DROP TABLE floating_ips_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/070_untie_nova_network_models.py b/cinder/db/sqlalchemy/migrate_repo/versions/070_untie_nova_network_models.py new file mode 100644 index 000000000..0316194b3 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/070_untie_nova_network_models.py @@ -0,0 +1,100 @@ +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import MetaData, Table +from migrate import ForeignKeyConstraint + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + dialect = migrate_engine.url.get_dialect().name + if dialect.startswith('sqlite'): + return + + instances = Table('instances', meta, autoload=True) + networks = Table('networks', meta, autoload=True) + vifs = Table('virtual_interfaces', meta, autoload=True) + fixed_ips = Table('fixed_ips', meta, autoload=True) + floating_ips = Table('floating_ips', meta, autoload=True) + + try: + fkeys = list(fixed_ips.c.network_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[fixed_ips.c.network_id], + refcolumns=[networks.c.id], + name=fkey_name).drop() + + fkeys = list(fixed_ips.c.virtual_interface_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[fixed_ips.c.virtual_interface_id], + refcolumns=[vifs.c.id], + name=fkey_name).drop() + + fkeys = list(fixed_ips.c.instance_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[fixed_ips.c.instance_id], + refcolumns=[instances.c.id], + name=fkey_name).drop() + + fkeys = list(floating_ips.c.fixed_ip_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[floating_ips.c.fixed_ip_id], + refcolumns=[fixed_ips.c.id], + name=fkey_name).drop() + + except Exception: + LOG.error(_("foreign key constraint couldn't be removed")) + raise + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + meta = MetaData() + meta.bind = migrate_engine + dialect = migrate_engine.url.get_dialect().name + if dialect.startswith('sqlite'): + return + + instances = Table('instances', meta, autoload=True) + networks = Table('networks', meta, autoload=True) + vifs = Table('virtual_interfaces', meta, autoload=True) + fixed_ips = Table('fixed_ips', meta, autoload=True) + floating_ips = Table('floating_ips', meta, autoload=True) + + try: + ForeignKeyConstraint(columns=[fixed_ips.c.network_id], + refcolumns=[networks.c.id]).create() + + ForeignKeyConstraint(columns=[fixed_ips.c.virtual_interface_id], + refcolumns=[vifs.c.id]).create() + + ForeignKeyConstraint(columns=[fixed_ips.c.instance_id], + refcolumns=[instances.c.id]).create() + + ForeignKeyConstraint(columns=[floating_ips.c.fixed_ip_id], + refcolumns=[fixed_ips.c.id]).create() + except Exception: + LOG.error(_("foreign key constraint couldn't be added")) + raise diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/071_add_host_aggregate_tables.py b/cinder/db/sqlalchemy/migrate_repo/versions/071_add_host_aggregate_tables.py new file mode 100644 index 000000000..d85c3bad0 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/071_add_host_aggregate_tables.py @@ -0,0 +1,108 @@ +# Copyright (c) 2011 Citrix 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. + +from sqlalchemy import Boolean, String, DateTime, Integer +from sqlalchemy import MetaData, Column, ForeignKey, Table + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + # + # New Tables + # + aggregates = Table('aggregates', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), + primary_key=True, nullable=False, autoincrement=True), + Column('name', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + unique=True), + Column('operational_state', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + nullable=False), + Column('availability_zone', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + nullable=False), + ) + + hosts = Table('aggregate_hosts', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('host', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + unique=True), + Column('aggregate_id', Integer(), ForeignKey('aggregates.id'), + nullable=False), + ) + + metadata = Table('aggregate_metadata', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('aggregate_id', + Integer(), + ForeignKey('aggregates.id'), + nullable=False), + Column('key', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + nullable=False), + Column('value', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + nullable=False)) + tables = (aggregates, hosts, metadata) + for table in tables: + try: + table.create() + except Exception: + LOG.exception(repr(table)) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + aggregates = Table('aggregates', meta, autoload=True) + hosts = Table('aggregate_hosts', meta, autoload=True) + metadata = Table('aggregate_metadata', meta, autoload=True) + # table order matters, don't change + for table in (hosts, metadata, aggregates): + try: + table.drop() + except Exception: + LOG.exception(repr(table)) diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py b/cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py new file mode 100644 index 000000000..5c1644d57 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py @@ -0,0 +1,77 @@ +# Copyright 2012 Andrew Bogott for The Wikimedia 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. + +from sqlalchemy import Boolean, Column, DateTime, ForeignKey +from sqlalchemy import MetaData, String, Table +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + projects = Table('projects', meta, autoload=True) + + # + # New Tables + # + dns_domains = Table('dns_domains', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('domain', + String(length=512, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + primary_key=True, nullable=False), + Column('scope', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('availability_zone', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('project_id', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + ForeignKey('projects.id')) + ) + # create dns_domains table + try: + dns_domains.create() + except Exception: + LOG.error(_("Table |%s| not created!"), repr(dns_domains)) + raise + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # load tables for fk + projects = Table('projects', meta, autoload=True) + + dns_domains = Table('dns_domains', meta, autoload=True) + try: + dns_domains.drop() + except Exception: + LOG.error(_("dns_domains table not dropped")) + raise diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/072_mysql_upgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/072_mysql_upgrade.sql new file mode 100644 index 000000000..d11e82147 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/072_mysql_upgrade.sql @@ -0,0 +1,13 @@ +CREATE TABLE dns_domains ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + domain VARCHAR(512) CHARACTER SET latin1 NOT NULL, + scope VARCHAR(255), + availability_zone VARCHAR(255), + project_id VARCHAR(255), + PRIMARY KEY (domain), + CHECK (deleted IN (0, 1)), + FOREIGN KEY(project_id) REFERENCES projects (id) +); diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/073_add_capacity.py b/cinder/db/sqlalchemy/migrate_repo/versions/073_add_capacity.py new file mode 100644 index 000000000..31ed41581 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/073_add_capacity.py @@ -0,0 +1,49 @@ +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, Integer, MetaData, Table + +from cinder import log as logging + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta = MetaData() + meta.bind = migrate_engine + compute_nodes = Table('compute_nodes', meta, autoload=True) + + # + # New Columns + # + new_columns = [ + Column('free_ram_mb', Integer()), + Column('free_disk_gb', Integer()), + Column('current_workload', Integer()), + Column('running_vms', Integer()), + ] + for column in new_columns: + compute_nodes.create_column(column) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + compute_nodes = Table('compute_nodes', meta, autoload=True) + + for column in ('free_ram_mb', + 'free_disk_gb', + 'current_workload', + 'running_vms'): + compute_nodes.drop_column(column) diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/074_change_flavor_local_gb.py b/cinder/db/sqlalchemy/migrate_repo/versions/074_change_flavor_local_gb.py new file mode 100644 index 000000000..a371aa696 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/074_change_flavor_local_gb.py @@ -0,0 +1,130 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 sqlalchemy import select, Column, Integer, MetaData, Table + +from cinder import exception +from cinder import flags + +FLAGS = flags.FLAGS + + +def upgrade_libvirt(instances, instance_types): + # Update instance_types first + tiny = None + for inst_type in instance_types.select().execute(): + if inst_type['name'] == 'm1.tiny': + tiny = inst_type['id'] + root_gb = 0 + else: + root_gb = 10 + + instance_types.update()\ + .values(root_gb=root_gb, + ephemeral_gb=inst_type['local_gb'])\ + .where(instance_types.c.id == inst_type['id'])\ + .execute() + + # then update instances following same pattern + instances.update()\ + .values(root_gb=10, + ephemeral_gb=instances.c.local_gb)\ + .execute() + + if tiny is not None: + instances.update()\ + .values(root_gb=0, + ephemeral_gb=instances.c.local_gb)\ + .where(instances.c.instance_type_id == tiny)\ + .execute() + + +def upgrade_other(instances, instance_types): + for table in (instances, instance_types): + table.update().values(root_gb=table.c.local_gb, + ephemeral_gb=0).execute() + + +def check_instance_presence(migrate_engine, instances_table): + result = migrate_engine.execute(instances_table.select().limit(1)) + return result.fetchone() is not None + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + + data_present = check_instance_presence(migrate_engine, instances) + + if data_present and not FLAGS.connection_type: + msg = ("Found instance records in database. You must specify " + "connection_type to run migration migration") + raise exception.Error(msg) + + instance_types = Table('instance_types', meta, autoload=True) + + for table in (instances, instance_types): + root_gb = Column('root_gb', Integer) + root_gb.create(table) + ephemeral_gb = Column('ephemeral_gb', Integer) + ephemeral_gb.create(table) + + # Since this migration is part of the work to get all drivers + # working the same way, we need to treat the new root_gb and + # ephemeral_gb columns differently depending on what the + # driver implementation used to behave like. + if FLAGS.connection_type == 'libvirt': + upgrade_libvirt(instances, instance_types) + else: + upgrade_other(instances, instance_types) + + default_local_device = instances.c.default_local_device + default_local_device.alter(name='default_ephemeral_device') + + for table in (instances, instance_types): + table.drop_column('local_gb') + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + instance_types = Table('instance_types', meta, autoload=True) + + for table in (instances, instance_types): + local_gb = Column('local_gb', Integer) + local_gb.create(table) + + try: + for table in (instances, instance_types): + if FLAGS.connection_type == 'libvirt': + column = table.c.ephemeral_gb + else: + column = table.c.root_gb + table.update().values(local_gb=column).execute() + except Exception: + for table in (instances, instance_types): + table.drop_column('local_gb') + raise + + default_ephemeral_device = instances.c.default_ephemeral_device + default_ephemeral_device.alter(name='default_local_device') + + for table in (instances, instance_types): + table.drop_column('root_gb') + table.drop_column('ephemeral_gb') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/074_sqlite_upgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/074_sqlite_upgrade.sql new file mode 100644 index 000000000..e2708111b --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/074_sqlite_upgrade.sql @@ -0,0 +1,313 @@ +-- sqlalchemy-migrate is surprisingly broken when it comes to migrations +-- for sqlite. As a result, we have to do much of the work manually here + +BEGIN TRANSACTION; + -- make backup of instance_types + CREATE TEMPORARY TABLE instance_types_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + name VARCHAR(255), + id INTEGER NOT NULL, + memory_mb INTEGER NOT NULL, + vcpus INTEGER NOT NULL, + local_gb INTEGER NOT NULL, + swap INTEGER NOT NULL, + rxtx_factor FLOAT, + vcpu_weight INTEGER, + flavorid VARCHAR(255), + PRIMARY KEY (id), + UNIQUE (flavorid), + CHECK (deleted IN (0, 1)), + UNIQUE (name) + ); + + INSERT INTO instance_types_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + name, + id, + memory_mb, + vcpus, + local_gb, + swap, + rxtx_factor, + vcpu_weight, + flavorid + FROM instance_types; + + DROP TABLE instance_types; + + CREATE TABLE instance_types ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + name VARCHAR(255), + id INTEGER NOT NULL, + memory_mb INTEGER NOT NULL, + vcpus INTEGER NOT NULL, + root_gb INTEGER NOT NULL, + ephemeral_gb INTEGER NOT NULL, + swap INTEGER NOT NULL, + rxtx_factor FLOAT, + vcpu_weight INTEGER, + flavorid VARCHAR(255), + PRIMARY KEY (id), + UNIQUE (flavorid), + CHECK (deleted IN (0, 1)), + UNIQUE (name) + ); + + -- copy from backup to new table with root_gb set to local_gb and + -- ephmeral_gb set to 0 + INSERT INTO instance_types + SELECT created_at, + updated_at, + deleted_at, + deleted, + name, + id, + memory_mb, + vcpus, + local_gb, + 0, + swap, + rxtx_factor, + vcpu_weight, + flavorid + FROM instance_types_backup; + + DROP TABLE instance_types_backup; + + -- make backup of instances + CREATE TEMPORARY TABLE instances_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + internal_id INTEGER, + user_id VARCHAR(255), + project_id VARCHAR(255), + image_ref VARCHAR(255), + kernel_id VARCHAR(255), + ramdisk_id VARCHAR(255), + server_name VARCHAR(255), + launch_index INTEGER, + key_name VARCHAR(255), + key_data TEXT, + power_state INTEGER, + vm_state VARCHAR(255), + memory_mb INTEGER, + vcpus INTEGER, + local_gb INTEGER, + hostname VARCHAR(255), + host VARCHAR(255), + user_data TEXT, + reservation_id VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + availability_zone VARCHAR(255), + locked BOOLEAN, + os_type VARCHAR(255), + launched_on TEXT, + instance_type_id INTEGER, + vm_mode VARCHAR(255), + uuid VARCHAR(36), + architecture VARCHAR(255), + root_device_name VARCHAR(255), + access_ip_v4 VARCHAR(255), + access_ip_v6 VARCHAR(255), + config_drive VARCHAR(255), + task_state VARCHAR(255), + default_local_device VARCHAR(255), + default_swap_device VARCHAR(255), + progress INTEGER, + auto_disk_config BOOLEAN, + shutdown_terminate BOOLEAN, + disable_terminate BOOLEAN, + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (locked IN (0, 1)), + CHECK (auto_disk_config IN (0, 1)), + CHECK (shutdown_terminate IN (0, 1)), + CHECK (disable_terminate IN (0, 1)) + ); + + INSERT INTO instances_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + internal_id, + user_id, + project_id, + image_ref, + kernel_id, + ramdisk_id, + server_name, + launch_index, + key_name, + key_data, + power_state, + vm_state, + memory_mb, + vcpus, + local_gb, + hostname, + host, + user_data, + reservation_id, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + availability_zone, + locked, + os_type, + launched_on, + instance_type_id, + vm_mode, + uuid, + architecture, + root_device_name, + access_ip_v4, + access_ip_v6, + config_drive, + task_state, + default_local_device, + default_swap_device, + progress, + auto_disk_config, + shutdown_terminate, + disable_terminate + FROM instances; + + DROP TABLE instances; + + CREATE TABLE instances ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + internal_id INTEGER, + user_id VARCHAR(255), + project_id VARCHAR(255), + image_ref VARCHAR(255), + kernel_id VARCHAR(255), + ramdisk_id VARCHAR(255), + server_name VARCHAR(255), + launch_index INTEGER, + key_name VARCHAR(255), + key_data TEXT, + power_state INTEGER, + vm_state VARCHAR(255), + memory_mb INTEGER, + vcpus INTEGER, + root_gb INTEGER, + ephemeral_gb INTEGER, + hostname VARCHAR(255), + host VARCHAR(255), + user_data TEXT, + reservation_id VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + availability_zone VARCHAR(255), + locked BOOLEAN, + os_type VARCHAR(255), + launched_on TEXT, + instance_type_id INTEGER, + vm_mode VARCHAR(255), + uuid VARCHAR(36), + architecture VARCHAR(255), + root_device_name VARCHAR(255), + access_ip_v4 VARCHAR(255), + access_ip_v6 VARCHAR(255), + config_drive VARCHAR(255), + task_state VARCHAR(255), + default_ephemeral_device VARCHAR(255), + default_swap_device VARCHAR(255), + progress INTEGER, + auto_disk_config BOOLEAN, + shutdown_terminate BOOLEAN, + disable_terminate BOOLEAN, + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)), + CHECK (locked IN (0, 1)), + CHECK (auto_disk_config IN (0, 1)), + CHECK (shutdown_terminate IN (0, 1)), + CHECK (disable_terminate IN (0, 1)) + ); + + CREATE INDEX project_id ON instances (project_id); + CREATE UNIQUE INDEX uuid ON instances (uuid); + + -- copy from backup to new table with root_gb set to local_gb and + -- ephmeral_gb set to 0 + INSERT INTO instances + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + internal_id, + user_id, + project_id, + image_ref, + kernel_id, + ramdisk_id, + server_name, + launch_index, + key_name, + key_data, + power_state, + vm_state, + memory_mb, + vcpus, + local_gb, + 0, + hostname, + host, + user_data, + reservation_id, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + availability_zone, + locked, + os_type, + launched_on, + instance_type_id, + vm_mode, + uuid, + architecture, + root_device_name, + access_ip_v4, + access_ip_v6, + config_drive, + task_state, + default_local_device, + default_swap_device, + progress, + auto_disk_config, + shutdown_terminate, + disable_terminate + FROM instances_backup; + + DROP TABLE instances_backup; +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/075_convert_bw_usage_to_store_network_id.py b/cinder/db/sqlalchemy/migrate_repo/versions/075_convert_bw_usage_to_store_network_id.py new file mode 100644 index 000000000..3d26204f0 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/075_convert_bw_usage_to_store_network_id.py @@ -0,0 +1,97 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 sqlalchemy import and_, select +from sqlalchemy import BigInteger, Boolean, Column, DateTime +from sqlalchemy import Integer, MetaData, String +from sqlalchemy import Table + +from cinder import utils + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + vifs = Table('virtual_interfaces', meta, autoload=True) + networks = Table('networks', meta, autoload=True) + + bw_usage_cache = Table('bw_usage_cache', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('instance_id', Integer(), nullable=False), + Column('network_label', + String(length=255, convert_unicode=False, + assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('start_period', DateTime(timezone=False), + nullable=False), + Column('last_refreshed', DateTime(timezone=False)), + Column('bw_in', BigInteger()), + Column('bw_out', BigInteger()), + useexisting=True) + mac_column = Column('mac', String(255)) + bw_usage_cache.create_column(mac_column) + + bw_usage_cache.update()\ + .values(mac=select([vifs.c.address])\ + .where(and_( + networks.c.label == bw_usage_cache.c.network_label, + networks.c.id == vifs.c.network_id, + bw_usage_cache.c.instance_id == vifs.c.instance_id))\ + .as_scalar()).execute() + + bw_usage_cache.c.network_label.drop() + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + vifs = Table('virtual_interfaces', meta, autoload=True) + network = Table('networks', meta, autoload=True) + + bw_usage_cache = Table('bw_usage_cache', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('instance_id', Integer(), nullable=False), + Column('mac', String(255)), + Column('start_period', DateTime(timezone=False), + nullable=False), + Column('last_refreshed', DateTime(timezone=False)), + Column('bw_in', BigInteger()), + Column('bw_out', BigInteger()), + useexisting=True) + + network_label_column = Column('network_label', String(255)) + bw_usage_cache.create_column(network_label_column) + + bw_usage_cache.update()\ + .values(network_label=select([network.c.label])\ + .where(and_( + network.c.id == vifs.c.network_id, + vifs.c.address == bw_usage_cache.c.mac, + bw_usage_cache.c.instance_id == vifs.c.instance_id))\ + .as_scalar()).execute() + + bw_usage_cache.c.mac.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/076_remove_unique_constraints.py b/cinder/db/sqlalchemy/migrate_repo/versions/076_remove_unique_constraints.py new file mode 100644 index 000000000..971bfbecc --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/076_remove_unique_constraints.py @@ -0,0 +1,84 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) OpenStack, LLC +# 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 sqlalchemy import * + +from sqlalchemy import MetaData, Table +from migrate.changeset.constraint import UniqueConstraint + + +def _get_constraint_names(engine_name): + + # NOTE(vish): These constraint names may be dependent on the backend, but + # there doesn't seem to be we a way to determine the proper + # name for existing constraints. These names are correct for + # mysql and postgres. + if engine_name == "mysql": + return { + "instance_types_name": ("name", "instance_types_name_key"), + "instance_types_flavorid": "instance_types_flavorid_str_key", + "volume_types_name": "name", + } + else: + return { + "instance_types_name": ("instance_types_name_key",), + "instance_types_flavorid": "instance_types_flavorid_str_key", + "volume_types_name": "volume_types_name_key", + } + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + c_names = _get_constraint_names(migrate_engine.name) + + table = Table('instance_types', meta, autoload=True) + for constraint_name in c_names['instance_types_name']: + cons = UniqueConstraint('name', + name=constraint_name, + table=table) + cons.drop() + cons = UniqueConstraint('flavorid', + name=c_names['instance_types_flavorid'], + table=table) + cons.drop() + table = Table('volume_types', meta, autoload=True) + cons = UniqueConstraint('name', + name=c_names['volume_types_name'], + table=table) + cons.drop() + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + c_names = _get_constraint_names(migrate_engine.name) + + table = Table('instance_types', meta, autoload=True) + for constraint_name in c_names['instance_types_name']: + cons = UniqueConstraint('name', + name=constraint_name, + table=table) + cons.create() + table = Table('instance_types', meta, autoload=True) + cons = UniqueConstraint('flavorid', + name=c_names['instance_types_flavorid'], + table=table) + cons.create() + table = Table('volume_types', meta, autoload=True) + cons = UniqueConstraint('name', + name=c_names['volume_types_name'], + table=table) + cons.create() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/076_sqlite_upgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/076_sqlite_upgrade.sql new file mode 100644 index 000000000..6053c1ed7 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/076_sqlite_upgrade.sql @@ -0,0 +1,61 @@ +-- sqlalchemy-migrate is surprisingly broken when it comes to migrations +-- for sqlite. As a result, we have to do much of the work manually here + +BEGIN TRANSACTION; + CREATE TABLE instance_types_temp ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + name VARCHAR(255), + id INTEGER NOT NULL, + memory_mb INTEGER NOT NULL, + vcpus INTEGER NOT NULL, + root_gb INTEGER NOT NULL, + ephemeral_gb INTEGER NOT NULL, + swap INTEGER NOT NULL, + rxtx_factor FLOAT, + vcpu_weight INTEGER, + flavorid VARCHAR(255), + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)) + ); + INSERT INTO instance_types_temp SELECT + created_at, + updated_at, + deleted_at, + deleted, + name, + id, + memory_mb, + vcpus, + root_gb, + ephemeral_gb, + swap, + rxtx_factor, + vcpu_weight, + flavorid + FROM instance_types; + DROP TABLE instance_types; + ALTER TABLE instance_types_temp RENAME TO instance_types; + CREATE TABLE volume_types_temp ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + name VARCHAR(255), + id INTEGER NOT NULL, + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)) + ); + INSERT INTO volume_types_temp SELECT + created_at, + updated_at, + deleted_at, + deleted, + name, + id + FROM volume_types; + DROP TABLE volume_types; + ALTER TABLE volume_types_temp RENAME TO volume_types; +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/077_convert_to_utf8.py b/cinder/db/sqlalchemy/migrate_repo/versions/077_convert_to_utf8.py new file mode 100644 index 000000000..4c08e2f0d --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/077_convert_to_utf8.py @@ -0,0 +1,61 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 OpenStack LLC. +# 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 sqlalchemy import MetaData + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # NOTE (ironcamel): The only table we are not converting to utf8 here is + # dns_domains. This table has a primary key that is 512 characters wide. + # When the mysql engine attempts to convert it to utf8, it complains about + # not supporting key columns larger than 1000. + + if migrate_engine.name == "mysql": + tables = [ + # tables that are FK parents, must be converted early + "aggregates", "console_pools", "instance_types", "instances", + "projects", "security_groups", "sm_backend_config", "sm_flavors", + "snapshots", "user_project_association", "users", "volume_types", + "volumes", + # those that are children and others later + "agent_builds", "aggregate_hosts", "aggregate_metadata", + "auth_tokens", "block_device_mapping", "bw_usage_cache", + "certificates", "compute_nodes", "consoles", "fixed_ips", + "floating_ips", "instance_actions", "instance_faults", + "instance_info_caches", "instance_metadata", + "instance_type_extra_specs", "iscsi_targets", "key_pairs", + "migrate_version", "migrations", "networks", "provider_fw_rules", + "quotas", "s3_images", "security_group_instance_association", + "security_group_rules", "services", "sm_volume", + "user_project_role_association", "user_role_association", + "virtual_interfaces", "virtual_storage_arrays", "volume_metadata", + "volume_type_extra_specs", "zones"] + sql = "SET foreign_key_checks = 0;" + for table in tables: + sql += "ALTER TABLE %s CONVERT TO CHARACTER SET utf8;" % table + sql += "SET foreign_key_checks = 1;" + sql += "ALTER DATABASE %s DEFAULT CHARACTER SET utf8;" \ + % migrate_engine.url.database + migrate_engine.execute(sql) + + +def downgrade(migrate_engine): + # utf8 tables should be backwards compatible, so lets leave it alone + pass diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/078_add_rpc_info_to_zones.py b/cinder/db/sqlalchemy/migrate_repo/versions/078_add_rpc_info_to_zones.py new file mode 100644 index 000000000..e4043f84d --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/078_add_rpc_info_to_zones.py @@ -0,0 +1,46 @@ +# Copyright 2012 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Boolean, Column +from sqlalchemy import Integer, MetaData, String +from sqlalchemy import Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + zones = Table('zones', meta, autoload=True) + + is_parent = Column('is_parent', Boolean(), default=False) + rpc_host = Column('rpc_host', String(255)) + rpc_port = Column('rpc_port', Integer()) + rpc_virtual_host = Column('rpc_virtual_host', String(255)) + + zones.create_column(is_parent) + zones.create_column(rpc_host) + zones.create_column(rpc_port) + zones.create_column(rpc_virtual_host) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + zones = Table('zones', meta, autoload=True) + + zones.drop_column('rpc_virtual_host') + zones.drop_column('rpc_port') + zones.drop_column('rpc_host') + zones.drop_column('is_parent') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/078_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/078_sqlite_downgrade.sql new file mode 100644 index 000000000..80061af78 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/078_sqlite_downgrade.sql @@ -0,0 +1,35 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE zones_temp ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + name VARCHAR(255), + api_url VARCHAR(255), + username VARCHAR(255), + password VARCHAR(255), + weight_offset FLOAT, + weight_scale FLOAT, + PRIMARY KEY (id), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO zones_temp + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + name, + api_url, + username, + password, + weight_offset, + weight_scale FROM zones; + + DROP TABLE zones; + + ALTER TABLE zones_temp RENAME TO zones; +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/079_add_zone_name_to_instances.py b/cinder/db/sqlalchemy/migrate_repo/versions/079_add_zone_name_to_instances.py new file mode 100644 index 000000000..2b22b94a0 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/079_add_zone_name_to_instances.py @@ -0,0 +1,30 @@ +# Copyright 2012 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Column, MetaData, String, Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + zone_name = Column('zone_name', String(255)) + instances.create_column(zone_name) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + instances.drop_column('zone_name') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/080_add_hypervisor_hostname_to_compute_nodes.py b/cinder/db/sqlalchemy/migrate_repo/versions/080_add_hypervisor_hostname_to_compute_nodes.py new file mode 100644 index 000000000..28a3ce48f --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/080_add_hypervisor_hostname_to_compute_nodes.py @@ -0,0 +1,30 @@ +# Copyright 2012 OpenStack, LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT 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 sqlalchemy import Column, MetaData, String, Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + compute_nodes = Table("compute_nodes", meta, autoload=True) + hypervisor_hostname = Column("hypervisor_hostname", String(255)) + compute_nodes.create_column(hypervisor_hostname) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + compute_nodes = Table("compute_nodes", meta, autoload=True) + compute_nodes.drop_column('hypervisor_hostname') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/081_drop_instance_id_bw_cache.py b/cinder/db/sqlalchemy/migrate_repo/versions/081_drop_instance_id_bw_cache.py new file mode 100644 index 000000000..c6687ac80 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/081_drop_instance_id_bw_cache.py @@ -0,0 +1,69 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 OpenStack, LLC. +# 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 json + +from sqlalchemy import Column, Table, MetaData, Integer, Boolean, String +from sqlalchemy import DateTime, BigInteger + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + bw_usage_cache = Table('bw_usage_cache', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('instance_id', Integer(), nullable=False), + Column('mac', String(255)), + Column('start_period', DateTime(timezone=False), + nullable=False), + Column('last_refreshed', DateTime(timezone=False)), + Column('bw_in', BigInteger()), + Column('bw_out', BigInteger()), + useexisting=True) + + bw_usage_cache.drop_column('instance_id') + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + instance_info_caches = Table('instance_info_caches', meta, autoload=True) + bw_usage_cache = Table('bw_usage_cache', meta, autoload=True) + + instance_id = Column('instance_id', Integer) + bw_usage_cache.create_column(instance_id) + + cache = {} + for row in migrate_engine.execute(instance_info_caches.select()): + instance_id = row['instance']['id'] + if not row['network_info']: + continue + + nw_info = json.loads(row['network_info']) + for vif in nw_info: + cache[vif['address']] = instance_id + + for row in migrate_engine.execute(bw_usage_cache.select()): + instance_id = cache[row['mac']] + migrate_engine.execute(bw_usage_cache.update()\ + .where(bw_usage_cache.c.id == row['id'])\ + .values(instance_id=instance_id)) diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/082_zone_to_cell.py b/cinder/db/sqlalchemy/migrate_repo/versions/082_zone_to_cell.py new file mode 100644 index 000000000..79e99503a --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/082_zone_to_cell.py @@ -0,0 +1,35 @@ +# Copyright 2012 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import MetaData, Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + zone_name = instances.c.zone_name + zone_name.alter(name='cell_name') + zones = Table('zones', meta, autoload=True) + zones.rename('cells') + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + cell_name = instances.c.cell_name + cell_name.alter(name='zone_name') + cells = Table('cells', meta, autoload=True) + cells.rename('zones') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py b/cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py new file mode 100644 index 000000000..3869c6ab5 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py @@ -0,0 +1,61 @@ +# Copyright 2012 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Boolean, Column, DateTime +from sqlalchemy import MetaData, Integer, String, Table + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # New table + quota_classes = Table('quota_classes', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True), + Column('class_name', + String(length=255, convert_unicode=True, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False), index=True), + Column('resource', + String(length=255, convert_unicode=True, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False)), + Column('hard_limit', Integer(), nullable=True), + ) + + try: + quota_classes.create() + except Exception: + LOG.error(_("Table |%s| not created!"), repr(quota_classes)) + raise + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + quota_classes = Table('quota_classes', meta, autoload=True) + try: + quota_classes.drop() + except Exception: + LOG.error(_("quota_classes table not dropped")) + raise diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/084_quotas_unlimited.py b/cinder/db/sqlalchemy/migrate_repo/versions/084_quotas_unlimited.py new file mode 100644 index 000000000..bcbc2db90 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/084_quotas_unlimited.py @@ -0,0 +1,43 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 Red Hat, 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 migrate +import sqlalchemy + + +def upgrade(migrate_engine): + """Map quotas hard_limit from NULL to -1""" + _migrate_unlimited(migrate_engine, None, -1) + + +def downgrade(migrate_engine): + """Map quotas hard_limit from -1 to NULL""" + _migrate_unlimited(migrate_engine, -1, None) + + +def _migrate_unlimited(migrate_engine, old_limit, new_limit): + meta = sqlalchemy.MetaData() + meta.bind = migrate_engine + + def _migrate(table_name): + table = sqlalchemy.Table(table_name, meta, autoload=True) + table.update().\ + where(table.c.hard_limit == old_limit).\ + values(hard_limit=new_limit).execute() + + _migrate('quotas') + _migrate('quota_classes') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/085_add_index_to_fixed_ips_by_address.py b/cinder/db/sqlalchemy/migrate_repo/versions/085_add_index_to_fixed_ips_by_address.py new file mode 100644 index 000000000..8c4f0d5c3 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/085_add_index_to_fixed_ips_by_address.py @@ -0,0 +1,31 @@ +# Copyright 2012 IBM +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Index, MetaData, Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('fixed_ips', meta, autoload=True) + index = Index('address', instances.c.address) + index.create(migrate_engine) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('fixed_ips', meta, autoload=True) + index = Index('address', instances.c.address) + index.drop(migrate_engine) diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/086_set_engine_mysql_innodb.py b/cinder/db/sqlalchemy/migrate_repo/versions/086_set_engine_mysql_innodb.py new file mode 100644 index 000000000..da985b956 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/086_set_engine_mysql_innodb.py @@ -0,0 +1,44 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import MetaData + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + + tables = ["agent_builds", "aggregate_hosts", "aggregate_metadata", + "aggregates", "block_device_mapping", "bw_usage_cache", + "dns_domains", "instance_faults", "instance_type_extra_specs", + "provider_fw_rules", "quota_classes", "s3_images", + "sm_backend_config", "sm_flavors", "sm_volume", + "virtual_storage_arrays", "volume_metadata", + "volume_type_extra_specs", "volume_types"] + + meta = MetaData() + meta.bind = migrate_engine + if migrate_engine.name == "mysql": + d = migrate_engine.execute("SHOW TABLE STATUS WHERE Engine!='InnoDB';") + for row in d.fetchall(): + table_name = row[0] + if table_name in tables: + migrate_engine.execute("ALTER TABLE %s Engine=InnoDB" % + table_name) + + +def downgrade(migrate_engine): + pass diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/087_add_uuid_to_bw_usage_cache.py b/cinder/db/sqlalchemy/migrate_repo/versions/087_add_uuid_to_bw_usage_cache.py new file mode 100644 index 000000000..e66004b12 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/087_add_uuid_to_bw_usage_cache.py @@ -0,0 +1,56 @@ +# Copyright 2012 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 sqlalchemy import Boolean, Column, DateTime, BigInteger +from sqlalchemy import MetaData, Integer, String, Table + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # add column: + bw_usage_cache = Table('bw_usage_cache', meta, autoload=True) + uuid = Column('uuid', String(36)) + + # clear the cache to get rid of entries with no uuid + migrate_engine.execute(bw_usage_cache.delete()) + + bw_usage_cache.create_column(uuid) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + # drop column: + bw_usage_cache = Table('bw_usage_cache', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('mac', String(255)), + Column('uuid', String(36)), + Column('start_period', DateTime(timezone=False), nullable=False), + Column('last_refreshed', DateTime(timezone=False)), + Column('bw_in', BigInteger()), + Column('bw_out', BigInteger()), + useexisting=True) + + bw_usage_cache.drop_column('uuid') diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/088_change_instance_id_to_uuid_in_block_device_mapping.py b/cinder/db/sqlalchemy/migrate_repo/versions/088_change_instance_id_to_uuid_in_block_device_mapping.py new file mode 100644 index 000000000..4962b2b05 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/088_change_instance_id_to_uuid_in_block_device_mapping.py @@ -0,0 +1,81 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# Copyright 2012 Michael Still and Canonical 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 sqlalchemy import select, Column, ForeignKey, Integer +from sqlalchemy import MetaData, String, Table +from migrate import ForeignKeyConstraint + +from cinder import log as logging + + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + dialect = migrate_engine.url.get_dialect().name + block_device_mapping = Table('block_device_mapping', meta, autoload=True) + instances = Table('instances', meta, autoload=True) + uuid_column = Column('instance_uuid', String(36)) + uuid_column.create(block_device_mapping) + + try: + block_device_mapping.update().values( + instance_uuid=select( + [instances.c.uuid], + instances.c.id == block_device_mapping.c.instance_id) + ).execute() + except Exception: + uuid_column.drop() + raise + + fkeys = list(block_device_mapping.c.instance_id.foreign_keys) + if fkeys: + try: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint( + columns=[block_device_mapping.c.instance_id], + refcolumns=[instances.c.id], + name=fkey_name).drop() + except Exception: + LOG.error(_("foreign key constraint couldn't be removed")) + raise + + block_device_mapping.c.instance_id.drop() + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + block_device_mapping = Table('block_device_mapping', meta, autoload=True) + instances = Table('instances', meta, autoload=True) + id_column = Column('instance_id', Integer, ForeignKey('instances.id')) + id_column.create(block_device_mapping) + + try: + block_device_mapping.update().values( + instance_id=select( + [instances.c.id], + instances.c.uuid == block_device_mapping.c.instance_uuid) + ).execute() + except Exception: + id_column.drop() + raise + + block_device_mapping.c.instance_uuid.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/088_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/088_sqlite_downgrade.sql new file mode 100644 index 000000000..3699ce9ab --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/088_sqlite_downgrade.sql @@ -0,0 +1,97 @@ +BEGIN TRANSACTION; + CREATE TEMPORARY TABLE block_device_mapping_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + instance_id INTEGER NOT NULL, + device_name VARCHAR(255) NOT NULL, + delete_on_termination BOOLEAN, + virtual_name VARCHAR(255), + snapshot_id INTEGER, + volume_id INTEGER, + volume_size INTEGER, + no_device BOOLEAN, + connection_info TEXT, + instance_uuid VARCHAR(36), + PRIMARY KEY (id), + FOREIGN KEY(snapshot_id) REFERENCES snapshots (id), + CHECK (deleted IN (0, 1)), + CHECK (delete_on_termination IN (0, 1)), + CHECK (no_device IN (0, 1)), + FOREIGN KEY(volume_id) REFERENCES volumes (id), + FOREIGN KEY(instance_id) REFERENCES instances (id) + ); + + INSERT INTO block_device_mapping_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + NULL, + device_name, + delete_on_termination, + virtual_name, + snapshot_id, + volume_id, + volume_size, + no_device, + connection_info, + instance_uuid + FROM block_device_mapping; + + UPDATE block_device_mapping_backup + SET instance_id= + (SELECT id + FROM instances + WHERE block_device_mapping_backup.instance_uuid = instances.uuid + ); + + DROP TABLE block_device_mapping; + + CREATE TABLE block_device_mapping ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + instance_id INTEGER NOT NULL, + device_name VARCHAR(255) NOT NULL, + delete_on_termination BOOLEAN, + virtual_name VARCHAR(255), + snapshot_id INTEGER, + volume_id INTEGER, + volume_size INTEGER, + no_device BOOLEAN, + connection_info TEXT, + PRIMARY KEY (id), + FOREIGN KEY(snapshot_id) REFERENCES snapshots (id), + CHECK (deleted IN (0, 1)), + CHECK (delete_on_termination IN (0, 1)), + CHECK (no_device IN (0, 1)), + FOREIGN KEY(volume_id) REFERENCES volumes (id), + FOREIGN KEY(instance_id) REFERENCES instances (id) + ); + + INSERT INTO block_device_mapping + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + instance_id, + device_name, + delete_on_termination, + virtual_name, + snapshot_id, + volume_id, + volume_size, + no_device, + connection_info + FROM block_device_mapping_backup; + + DROP TABLE block_device_mapping_backup; + +COMMIT; \ No newline at end of file diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/088_sqlite_upgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/088_sqlite_upgrade.sql new file mode 100644 index 000000000..d75d2ffa2 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/088_sqlite_upgrade.sql @@ -0,0 +1,97 @@ +BEGIN TRANSACTION; + CREATE TEMPORARY TABLE block_device_mapping_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + instance_id INTEGER NOT NULL, + device_name VARCHAR(255) NOT NULL, + delete_on_termination BOOLEAN, + virtual_name VARCHAR(255), + snapshot_id INTEGER, + volume_id INTEGER, + volume_size INTEGER, + no_device BOOLEAN, + connection_info TEXT, + instance_uuid VARCHAR(36), + PRIMARY KEY (id), + FOREIGN KEY(snapshot_id) REFERENCES snapshots (id), + CHECK (deleted IN (0, 1)), + CHECK (delete_on_termination IN (0, 1)), + CHECK (no_device IN (0, 1)), + FOREIGN KEY(volume_id) REFERENCES volumes (id), + FOREIGN KEY(instance_id) REFERENCES instances (id) + ); + + INSERT INTO block_device_mapping_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + instance_id, + device_name, + delete_on_termination, + virtual_name, + snapshot_id, + volume_id, + volume_size, + no_device, + connection_info, + NULL + FROM block_device_mapping; + + UPDATE block_device_mapping_backup + SET instance_uuid= + (SELECT uuid + FROM instances + WHERE block_device_mapping_backup.instance_id = instances.id + ); + + DROP TABLE block_device_mapping; + + CREATE TABLE block_device_mapping ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + device_name VARCHAR(255) NOT NULL, + delete_on_termination BOOLEAN, + virtual_name VARCHAR(255), + snapshot_id INTEGER, + volume_id INTEGER, + volume_size INTEGER, + no_device BOOLEAN, + connection_info TEXT, + instance_uuid VARCHAR(36), + PRIMARY KEY (id), + FOREIGN KEY(snapshot_id) REFERENCES snapshots (id), + CHECK (deleted IN (0, 1)), + CHECK (delete_on_termination IN (0, 1)), + CHECK (no_device IN (0, 1)), + FOREIGN KEY(volume_id) REFERENCES volumes (id), + FOREIGN KEY(instance_uuid) REFERENCES instances (uuid) + ); + + INSERT INTO block_device_mapping + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + device_name, + delete_on_termination, + virtual_name, + snapshot_id, + volume_id, + volume_size, + no_device, + connection_info, + instance_uuid + FROM block_device_mapping_backup; + + DROP TABLE block_device_mapping_backup; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/089_add_volume_id_mappings.py b/cinder/db/sqlalchemy/migrate_repo/versions/089_add_volume_id_mappings.py new file mode 100644 index 000000000..11bc25b01 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/089_add_volume_id_mappings.py @@ -0,0 +1,116 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 OpenStack LLC. +# 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 sqlalchemy import Boolean, Column, DateTime, Integer +from sqlalchemy import MetaData, String, Table +from cinder import log as logging +from cinder import utils + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + """Build mapping tables for our volume uuid migration. + + These mapping tables serve two purposes: + 1. Provide a method for downgrade after UUID conversion + 2. Provide a uuid to associate with existing volumes and snapshots + when we do the actual datatype migration from int to uuid + + """ + meta = MetaData() + meta.bind = migrate_engine + + volume_id_mappings = Table('volume_id_mappings', meta, + Column('created_at', + DateTime(timezone=False)), + Column('updated_at', + DateTime(timezone=False)), + Column('deleted_at', + DateTime(timezone=False)), + Column('deleted', + Boolean(create_constraint=True, name=None)), + Column('id', Integer(), + primary_key=True, + nullable=False, + autoincrement=True), + Column('uuid', String(36), + nullable=False)) + try: + volume_id_mappings.create() + except Exception: + LOG.exception("Exception while creating table 'volume_id_mappings'") + meta.drop_all(tables=[volume_id_mappings]) + raise + + snapshot_id_mappings = Table('snapshot_id_mappings', meta, + Column('created_at', + DateTime(timezone=False)), + Column('updated_at', + DateTime(timezone=False)), + Column('deleted_at', + DateTime(timezone=False)), + Column('deleted', + Boolean(create_constraint=True, name=None)), + Column('id', Integer(), + primary_key=True, + nullable=False, + autoincrement=True), + Column('uuid', String(36), + nullable=False)) + try: + snapshot_id_mappings.create() + except Exception: + LOG.exception("Exception while creating table 'snapshot_id_mappings'") + meta.drop_all(tables=[snapshot_id_mappings]) + raise + + if migrate_engine.name == "mysql": + migrate_engine.execute("ALTER TABLE volume_id_mappings Engine=InnoDB") + migrate_engine.execute("ALTER TABLE snapshot_id_mappings "\ + "Engine=InnoDB") + + volumes = Table('volumes', meta, autoload=True) + snapshots = Table('snapshots', meta, autoload=True) + volume_id_mappings = Table('volume_id_mappings', meta, autoload=True) + snapshot_id_mappings = Table('snapshot_id_mappings', meta, autoload=True) + + volume_list = list(volumes.select().execute()) + for v in volume_list: + old_id = v['id'] + new_id = utils.gen_uuid() + row = volume_id_mappings.insert() + row.execute({'id': old_id, + 'uuid': str(new_id)}) + + snapshot_list = list(snapshots.select().execute()) + for s in snapshot_list: + old_id = s['id'] + new_id = utils.gen_uuid() + row = snapshot_id_mappings.insert() + row.execute({'id': old_id, + 'uuid': str(new_id)}) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + volume_id_mappings = Table('volume_id_mappings', meta, autoload=True) + volume_id_mappings.drop() + + snapshot_id_mappings = Table('snapshot_id_mappings', meta, autoload=True) + snapshot_id_mappings.drop() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/090_modify_volume_id_datatype.py b/cinder/db/sqlalchemy/migrate_repo/versions/090_modify_volume_id_datatype.py new file mode 100644 index 000000000..7887cd88e --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/090_modify_volume_id_datatype.py @@ -0,0 +1,239 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 OpenStack LLC. +# 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 sqlalchemy import Integer +from sqlalchemy import MetaData, String, Table +from migrate import ForeignKeyConstraint +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + """Convert volume and snapshot id columns from int to varchar.""" + meta = MetaData() + meta.bind = migrate_engine + dialect = migrate_engine.url.get_dialect().name + + if dialect.startswith('sqlite'): + return + + volumes = Table('volumes', meta, autoload=True) + snapshots = Table('snapshots', meta, autoload=True) + iscsi_targets = Table('iscsi_targets', meta, autoload=True) + volume_metadata = Table('volume_metadata', meta, autoload=True) + sm_volume = Table('sm_volume', meta, autoload=True) + block_device_mapping = Table('block_device_mapping', meta, autoload=True) + + try: + fkeys = list(snapshots.c.volume_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[snapshots.c.volume_id], + refcolumns=[volumes.c.id], + name=fkey_name).drop() + + fkeys = list(iscsi_targets.c.volume_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[iscsi_targets.c.volume_id], + refcolumns=[volumes.c.id], + name=fkey_name).drop() + + fkeys = list(volume_metadata.c.volume_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[volume_metadata.c.volume_id], + refcolumns=[volumes.c.id], + name=fkey_name).drop() + + fkeys = list(sm_volume.c.id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[sm_volume.c.id], + refcolumns=[volumes.c.id], + name=fkey_name).drop() + + fkeys = list(block_device_mapping.c.volume_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[block_device_mapping.c.volume_id], + refcolumns=[volumes.c.id], + name=fkey_name).drop() + + fkeys = list(block_device_mapping.c.snapshot_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[block_device_mapping.c.snapshot_id], + refcolumns=[snapshots.c.id], + name=fkey_name).drop() + + except Exception: + LOG.error(_("Foreign Key constraint couldn't be removed")) + raise + + volumes.c.id.alter(String(36), primary_key=True) + volumes.c.snapshot_id.alter(String(36)) + volume_metadata.c.volume_id.alter(String(36), nullable=False) + snapshots.c.id.alter(String(36), primary_key=True) + snapshots.c.volume_id.alter(String(36)) + sm_volume.c.id.alter(String(36)) + block_device_mapping.c.volume_id.alter(String(36)) + block_device_mapping.c.snapshot_id.alter(String(36)) + iscsi_targets.c.volume_id.alter(String(36), nullable=True) + + try: + fkeys = list(snapshots.c.volume_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[snapshots.c.volume_id], + refcolumns=[volumes.c.id], + name=fkey_name).create() + + fkeys = list(iscsi_targets.c.volume_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[iscsi_targets.c.volume_id], + refcolumns=[volumes.c.id], + name=fkey_name).create() + + fkeys = list(volume_metadata.c.volume_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[volume_metadata.c.volume_id], + refcolumns=[volumes.c.id], + name=fkey_name).create() + + fkeys = list(sm_volume.c.id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[sm_volume.c.id], + refcolumns=[volumes.c.id], + name=fkey_name).create() + # NOTE(jdg) We're intentionally leaving off FK's on BDM + + except Exception: + LOG.error(_("Foreign Key constraint couldn't be removed")) + raise + + +def downgrade(migrate_engine): + """Convert volume and snapshot id columns back to int.""" + meta = MetaData() + meta.bind = migrate_engine + dialect = migrate_engine.url.get_dialect().name + + if dialect.startswith('sqlite'): + return + + volumes = Table('volumes', meta, autoload=True) + snapshots = Table('snapshots', meta, autoload=True) + iscsi_targets = Table('iscsi_targets', meta, autoload=True) + volume_metadata = Table('volume_metadata', meta, autoload=True) + sm_volume = Table('sm_volume', meta, autoload=True) + block_device_mapping = Table('block_device_mapping', meta, autoload=True) + + try: + fkeys = list(snapshots.c.volume_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[snapshots.c.volume_id], + refcolumns=[volumes.c.id], + name=fkey_name).drop() + + fkeys = list(iscsi_targets.c.volume_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[iscsi_targets.c.volume_id], + refcolumns=[volumes.c.id], + name=fkey_name).drop() + + fkeys = list(volume_metadata.c.volume_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[volume_metadata.c.volume_id], + refcolumns=[volumes.c.id], + name=fkey_name).drop() + + fkeys = list(sm_volume.c.id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[sm_volume.c.id], + refcolumns=[volumes.c.id], + name=fkey_name).drop() + + except Exception: + LOG.error(_("Foreign Key constraint couldn't be removed")) + raise + + volumes.c.id.alter(Integer, primary_key=True, autoincrement=True) + volumes.c.snapshot_id.alter(Integer) + volume_metadata.c.volume_id.alter(Integer, nullable=False) + snapshots.c.id.alter(Integer, primary_key=True, autoincrement=True) + snapshots.c.volume_id.alter(Integer) + sm_volume.c.id.alter(Integer) + block_device_mapping.c.volume_id.alter(Integer) + block_device_mapping.c.snapshot_id.alter(Integer) + iscsi_targets.c.volume_id.alter(Integer, nullable=True) + + try: + fkeys = list(snapshots.c.volume_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[snapshots.c.volume_id], + refcolumns=[volumes.c.id], + name=fkey_name).create() + + fkeys = list(iscsi_targets.c.volume_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[iscsi_targets.c.volume_id], + refcolumns=[volumes.c.id], + name=fkey_name).create() + + fkeys = list(volume_metadata.c.volume_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[volume_metadata.c.volume_id], + refcolumns=[volumes.c.id], + name=fkey_name).create() + + fkeys = list(sm_volume.c.id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[sm_volume.c.id], + refcolumns=[volumes.c.id], + name=fkey_name).create() + + # NOTE(jdg) Put the BDM foreign keys back in place + fkeys = list(block_device_mapping.c.volume_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[block_device_mapping.c.volume_id], + refcolumns=[volumes.c.id], + name=fkey_name).drop() + + fkeys = list(block_device_mapping.c.snapshot_id.foreign_keys) + if fkeys: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint(columns=[block_device_mapping.c.snapshot_id], + refcolumns=[snapshots.c.id], + name=fkey_name).drop() + + except Exception: + LOG.error(_("Foreign Key constraint couldn't be removed")) + raise diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/090_sqlite_downgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/090_sqlite_downgrade.sql new file mode 100644 index 000000000..7d89da247 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/090_sqlite_downgrade.sql @@ -0,0 +1,226 @@ +BEGIN TRANSACTION; + + -- change id and snapshot_id datatypes in volumes table + CREATE TABLE volumes_backup( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + ec2_id INTEGER, + user_id VARCHAR(255), + project_id VARCHAR(255), + snapshot_id VARCHAR(255), + host VARCHAR(255), + size INTEGER, + availability_zone VARCHAR(255), + instance_id INTEGER, + mountpoint VARCHAR(255), + attach_time VARCHAR(255), + status VARCHAR(255), + attach_status VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + provider_location VARCHAR(255), + provider_auth VARCHAR(255), + volume_type_id INTEGER, + PRIMARY KEY (id), + FOREIGN KEY(instance_id) REFERENCES instances (id), + UNIQUE (id), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO volumes_backup SELECT + created_at, + updated_at, + deleted_at, + deleted, + id, + ec2_id, + user_id, + project_id, + snapshot_id, + host, + size, + availability_zone, + instance_id, + mountpoint, + attach_time, + status, + attach_status, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + provider_location, + provider_auth, + volume_type_id + FROM volumes; + DROP TABLE volumes; + ALTER TABLE volumes_backup RENAME TO volumes; + + -- change id and volume_id datatypes in snapshots table + CREATE TABLE snapshots_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + user_id VARCHAR(255), + project_id VARCHAR(255), + volume_id INTEGER, + status VARCHAR(255), + progress VARCHAR(255), + volume_size INTEGER, + display_name VARCHAR(255), + display_description VARCHAR(255), + PRIMARY KEY (id), + UNIQUE (id), + CHECK (deleted IN (0, 1)) + ); + INSERT INTO snapshots_backup SELECT + created_at, + updated_at, + deleted_at, + deleted, + id, + user_id, + project_id, + volume_id, + status, + progress, + volume_size, + display_name, + display_description + FROM snapshots; + DROP TABLE snapshots; + ALTER TABLE snapshots_backup RENAME TO snapshots; + + -- change id and volume_id datatypes in iscsi_targets table + CREATE TABLE iscsi_targets_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + target_num INTEGER, + host VARCHAR(255), + volume_id INTEGER, + PRIMARY KEY (id), + FOREIGN KEY(volume_id) REFERENCES volumes(id), + UNIQUE (id), + CHECK (deleted IN (0, 1)) + ); + INSERT INTO iscsi_targets_backup SELECT + created_at, + updated_at, + deleted_at, + deleted, + id, + target_num, + host, + volume_id + FROM iscsi_targets; + DROP TABLE iscsi_targets; + ALTER TABLE iscsi_targets_backup RENAME TO iscsi_targets; + + CREATE TABLE volume_metadata_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + key VARCHAR(255), + value VARCHAR(255), + volume_id INTEGER, + PRIMARY KEY (id), + FOREIGN KEY(volume_id) REFERENCES volumes(id), + UNIQUE (id), + CHECK (deleted IN (0, 1)) + ); + INSERT INTO volume_metadata_backup SELECT + created_at, + updated_at, + deleted_at, + deleted, + id, + key, + value, + volume_id + FROM volume_metadata; + DROP TABLE volume_metadata; + ALTER TABLE volume_metadata_backup RENAME TO volume_metadata; + + -- change volume_id and snapshot_id datatypes in bdm table + CREATE TABLE block_device_mapping_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + instance_uuid VARCHAR(36) NOT NULL, + device_name VARCHAR(255), + delete_on_termination BOOLEAN, + virtual_name VARCHAR(255), + snapshot_id INTEGER, + volume_id INTEGER, + volume_size INTEGER, + no_device BOOLEAN, + connection_info VARCHAR(255), + FOREIGN KEY(instance_uuid) REFERENCES instances(id), + FOREIGN KEY(volume_id) REFERENCES volumes(id), + FOREIGN KEY(snapshot_id) REFERENCES snapshots(id), + PRIMARY KEY (id), + UNIQUE (id), + CHECK (deleted IN (0, 1)) + ); + INSERT INTO block_device_mapping_backup SELECT + created_at, + updated_at, + deleted_at, + deleted, + id, + instance_uuid, + device_name, + delete_on_termination, + virtual_name, + snapshot_id, + volume_id, + volume_size, + no_device, + connection_info + FROM block_device_mapping; + DROP TABLE block_device_mapping; + ALTER TABLE block_device_mapping_backup RENAME TO block_device_mapping; + + -- change volume_id and sm_volume_table + CREATE TABLE sm_volume_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + backend_id INTEGER NOT NULL, + vdi_uuid VARCHAR(255), + PRIMARY KEY (id), + FOREIGN KEY(id) REFERENCES volumes(id), + UNIQUE (id), + CHECK (deleted IN (0,1)) + ); + INSERT INTO sm_volume_backup SELECT + created_at, + updated_at, + deleted_at, + deleted, + id, + backend_id, + vdi_uuid + FROM sm_volume; + DROP TABLE sm_volume; + ALTER TABLE sm_volume_backup RENAME TO sm_volume; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/090_sqlite_upgrade.sql b/cinder/db/sqlalchemy/migrate_repo/versions/090_sqlite_upgrade.sql new file mode 100644 index 000000000..53fbc69f6 --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/090_sqlite_upgrade.sql @@ -0,0 +1,226 @@ +BEGIN TRANSACTION; + + -- change id and snapshot_id datatypes in volumes table + CREATE TABLE volumes_backup( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id VARCHAR(36) NOT NULL, + ec2_id INTEGER, + user_id VARCHAR(255), + project_id VARCHAR(255), + snapshot_id VARCHAR(36), + host VARCHAR(255), + size INTEGER, + availability_zone VARCHAR(255), + instance_id INTEGER, + mountpoint VARCHAR(255), + attach_time VARCHAR(255), + status VARCHAR(255), + attach_status VARCHAR(255), + scheduled_at DATETIME, + launched_at DATETIME, + terminated_at DATETIME, + display_name VARCHAR(255), + display_description VARCHAR(255), + provider_location VARCHAR(255), + provider_auth VARCHAR(255), + volume_type_id INTEGER, + PRIMARY KEY (id), + FOREIGN KEY(instance_id) REFERENCES instances (id), + UNIQUE (id), + CHECK (deleted IN (0, 1)) + ); + + INSERT INTO volumes_backup SELECT + created_at, + updated_at, + deleted_at, + deleted, + id, + ec2_id, + user_id, + project_id, + snapshot_id, + host, + size, + availability_zone, + instance_id, + mountpoint, + attach_time, + status, + attach_status, + scheduled_at, + launched_at, + terminated_at, + display_name, + display_description, + provider_location, + provider_auth, + volume_type_id + FROM volumes; + DROP TABLE volumes; + ALTER TABLE volumes_backup RENAME TO volumes; + + -- change id and volume_id datatypes in snapshots table + CREATE TABLE snapshots_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id VARCHAR(36) NOT NULL, + user_id VARCHAR(255), + project_id VARCHAR(255), + volume_id VARCHAR(36), + status VARCHAR(255), + progress VARCHAR(255), + volume_size INTEGER, + display_name VARCHAR(255), + display_description VARCHAR(255), + PRIMARY KEY (id), + UNIQUE (id), + CHECK (deleted IN (0, 1)) + ); + INSERT INTO snapshots_backup SELECT + created_at, + updated_at, + deleted_at, + deleted, + id, + user_id, + project_id, + volume_id, + status, + progress, + volume_size, + display_name, + display_description + FROM snapshots; + DROP TABLE snapshots; + ALTER TABLE snapshots_backup RENAME TO snapshots; + + -- change id and volume_id datatypes in iscsi_targets table + CREATE TABLE iscsi_targets_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + target_num INTEGER, + host VARCHAR(255), + volume_id VARCHAR(36), + PRIMARY KEY (id), + FOREIGN KEY(volume_id) REFERENCES volumes(id), + UNIQUE (id), + CHECK (deleted IN (0, 1)) + ); + INSERT INTO iscsi_targets_backup SELECT + created_at, + updated_at, + deleted_at, + deleted, + id, + target_num, + host, + volume_id + FROM iscsi_targets; + DROP TABLE iscsi_targets; + ALTER TABLE iscsi_targets_backup RENAME TO iscsi_targets; + + CREATE TABLE volume_metadata_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + key VARCHAR(255), + value VARCHAR(255), + volume_id VARCHAR(36), + PRIMARY KEY (id), + FOREIGN KEY(volume_id) REFERENCES volumes(id), + UNIQUE (id), + CHECK (deleted IN (0, 1)) + ); + INSERT INTO volume_metadata_backup SELECT + created_at, + updated_at, + deleted_at, + deleted, + id, + key, + value, + volume_id + FROM volume_metadata; + DROP TABLE volume_metadata; + ALTER TABLE volume_metadata_backup RENAME TO volume_metadata; + + -- change volume_id and snapshot_id datatypes in bdm table + CREATE TABLE block_device_mapping_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + instance_uuid VARCHAR(36) NOT NULL, + device_name VARCHAR(255), + delete_on_termination BOOLEAN, + virtual_name VARCHAR(255), + snapshot_id VARCHAR(36), + volume_id VARCHAR(36), + volume_size INTEGER, + no_device BOOLEAN, + connection_info VARCHAR(255), + FOREIGN KEY(instance_uuid) REFERENCES instances(id), + FOREIGN KEY(volume_id) REFERENCES volumes(id), + FOREIGN KEY(snapshot_id) REFERENCES snapshots(id), + PRIMARY KEY (id), + UNIQUE (id), + CHECK (deleted IN (0, 1)) + ); + INSERT INTO block_device_mapping_backup SELECT + created_at, + updated_at, + deleted_at, + deleted, + id, + instance_uuid, + device_name, + delete_on_termination, + virtual_name, + snapshot_id, + volume_id, + volume_size, + no_device, + connection_info + FROM block_device_mapping; + DROP TABLE block_device_mapping; + ALTER TABLE block_device_mapping_backup RENAME TO block_device_mapping; + + -- change volume_id and sm_volume_table + CREATE TABLE sm_volume_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id VARCHAR(36) NOT NULL, + backend_id INTEGER NOT NULL, + vdi_uuid VARCHAR(255), + PRIMARY KEY (id), + FOREIGN KEY(id) REFERENCES volumes(id), + UNIQUE (id), + CHECK (deleted IN (0,1)) + ); + INSERT INTO sm_volume_backup SELECT + created_at, + updated_at, + deleted_at, + deleted, + id, + backend_id, + vdi_uuid + FROM sm_volume; + DROP TABLE sm_volume; + ALTER TABLE sm_volume_backup RENAME TO sm_volume; + +COMMIT; diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/091_convert_volume_ids_to_uuid.py b/cinder/db/sqlalchemy/migrate_repo/versions/091_convert_volume_ids_to_uuid.py new file mode 100644 index 000000000..b9ec5c83e --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/091_convert_volume_ids_to_uuid.py @@ -0,0 +1,145 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 OpenStack LLC. +# 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 sqlalchemy import MetaData, select, Table +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + """Convert volume and snapshot id columns from int to varchar.""" + meta = MetaData() + meta.bind = migrate_engine + + volumes = Table('volumes', meta, autoload=True) + snapshots = Table('snapshots', meta, autoload=True) + iscsi_targets = Table('iscsi_targets', meta, autoload=True) + volume_metadata = Table('volume_metadata', meta, autoload=True) + block_device_mapping = Table('block_device_mapping', meta, autoload=True) + sm_volumes = Table('sm_volume', meta, autoload=True) + + volume_mappings = Table('volume_id_mappings', meta, autoload=True) + snapshot_mappings = Table('snapshot_id_mappings', meta, autoload=True) + + volume_list = list(volumes.select().execute()) + for v in volume_list: + new_id = select([volume_mappings.c.uuid], + volume_mappings.c.id == v['id']) + + volumes.update().\ + where(volumes.c.id == v['id']).\ + values(id=new_id).execute() + + sm_volumes.update().\ + where(sm_volumes.c.id == v['id']).\ + values(id=new_id).execute() + + snapshots.update().\ + where(snapshots.c.volume_id == v['id']).\ + values(volume_id=new_id).execute() + + iscsi_targets.update().\ + where(iscsi_targets.c.volume_id == v['id']).\ + values(volume_id=new_id).execute() + + volume_metadata.update().\ + where(volume_metadata.c.volume_id == v['id']).\ + values(volume_id=new_id).execute() + + block_device_mapping.update().\ + where(block_device_mapping.c.volume_id == v['id']).\ + values(volume_id=new_id).execute() + + snapshot_list = list(snapshots.select().execute()) + for s in snapshot_list: + new_id = select([snapshot_mappings.c.uuid], + volume_mappings.c.id == s['id']) + + volumes.update().\ + where(volumes.c.snapshot_id == s['id']).\ + values(snapshot_id=new_id).execute() + + snapshots.update().\ + where(snapshots.c.id == s['id']).\ + values(volume_id=new_id).execute() + + block_device_mapping.update().\ + where(block_device_mapping.c.snapshot_id == s['id']).\ + values(snapshot_id=new_id).execute() + + +def downgrade(migrate_engine): + """Convert volume and snapshot id columns back to int.""" + meta = MetaData() + meta.bind = migrate_engine + + volumes = Table('volumes', meta, autoload=True) + snapshots = Table('snapshots', meta, autoload=True) + iscsi_targets = Table('iscsi_targets', meta, autoload=True) + volume_metadata = Table('volume_metadata', meta, autoload=True) + block_device_mapping = Table('block_device_mapping', meta, autoload=True) + sm_volumes = Table('sm_volume', meta, autoload=True) + + volume_mappings = Table('volume_id_mappings', meta, autoload=True) + snapshot_mappings = Table('snapshot_id_mappings', meta, autoload=True) + + volume_list = list(volumes.select().execute()) + for v in volume_list: + new_id = select([volume_mappings.c.id], + volume_mappings.c.uuid == v['id']) + + volumes.update().\ + where(volumes.c.id == v['id']).\ + values(id=new_id).execute() + + sm_volumes.update().\ + where(sm_volumes.c.id == v['id']).\ + values(id=new_id).execute() + + snapshots.update().\ + where(snapshots.c.volume_id == v['id']).\ + values(volume_id=new_id).execute() + + iscsi_targets.update().\ + where(iscsi_targets.c.volume_id == v['id']).\ + values(volume_id=new_id).execute() + + volume_metadata.update().\ + where(volume_metadata.c.volume_id == v['id']).\ + values(volume_id=new_id).execute() + + block_device_mapping.update().\ + where(block_device_mapping.c.volume_id == v['id']).\ + values(volume_id=new_id).execute() + + snapshot_list = list(snapshots.select().execute()) + for s in snapshot_list: + new_id = select([snapshot_mappings.c.id], + volume_mappings.c.uuid == s['id']) + + volumes.update().\ + where(volumes.c.snapshot_id == s['id']).\ + values(snapshot_id=new_id).execute() + + snapshots.update().\ + where(snapshots.c.id == s['id']).\ + values(volume_id=new_id).execute() + + block_device_mapping.update().\ + where(block_device_mapping.c.snapshot_id == s['id']).\ + values(snapshot_id=new_id).execute() diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/__init__.py b/cinder/db/sqlalchemy/migrate_repo/versions/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cinder/db/sqlalchemy/migration.py b/cinder/db/sqlalchemy/migration.py new file mode 100644 index 000000000..153be1a1f --- /dev/null +++ b/cinder/db/sqlalchemy/migration.py @@ -0,0 +1,129 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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 distutils.version as dist_version +import os +import sys + +from cinder.db.sqlalchemy.session import get_engine +from cinder import exception +from cinder import flags +from cinder import log as logging + + +import sqlalchemy +import migrate +from migrate.versioning import util as migrate_util + + +LOG = logging.getLogger(__name__) + + +@migrate_util.decorator +def patched_with_engine(f, *a, **kw): + url = a[0] + engine = migrate_util.construct_engine(url, **kw) + + try: + kw['engine'] = engine + return f(*a, **kw) + finally: + if isinstance(engine, migrate_util.Engine) and engine is not url: + migrate_util.log.debug('Disposing SQLAlchemy engine %s', engine) + engine.dispose() + + +# TODO(jkoelker) When migrate 0.7.3 is released and cinder depends +# on that version or higher, this can be removed +MIN_PKG_VERSION = dist_version.StrictVersion('0.7.3') +if (not hasattr(migrate, '__version__') or + dist_version.StrictVersion(migrate.__version__) < MIN_PKG_VERSION): + migrate_util.with_engine = patched_with_engine + + +# NOTE(jkoelker) Delay importing migrate until we are patched +from migrate import exceptions as versioning_exceptions +from migrate.versioning import api as versioning_api +from migrate.versioning.repository import Repository + +FLAGS = flags.FLAGS + +_REPOSITORY = None + + +def db_sync(version=None): + if version is not None: + try: + version = int(version) + except ValueError: + raise exception.Error(_("version should be an integer")) + + current_version = db_version() + repository = _find_migrate_repo() + if version is None or version > current_version: + return versioning_api.upgrade(get_engine(), repository, version) + else: + return versioning_api.downgrade(get_engine(), repository, + version) + + +def db_version(): + repository = _find_migrate_repo() + try: + return versioning_api.db_version(get_engine(), repository) + except versioning_exceptions.DatabaseNotControlledError: + # If we aren't version controlled we may already have the database + # in the state from before we started version control, check for that + # and set up version_control appropriately + meta = sqlalchemy.MetaData() + engine = get_engine() + meta.reflect(bind=engine) + try: + for table in ('auth_tokens', 'zones', 'export_devices', + 'fixed_ips', 'floating_ips', 'instances', + 'key_pairs', 'networks', 'projects', 'quotas', + 'security_group_instance_association', + 'security_group_rules', 'security_groups', + 'services', 'migrations', + 'users', 'user_project_association', + 'user_project_role_association', + 'user_role_association', + 'virtual_storage_arrays', + 'volumes', 'volume_metadata', + 'volume_types', 'volume_type_extra_specs'): + assert table in meta.tables + return db_version_control(1) + except AssertionError: + return db_version_control(0) + + +def db_version_control(version=None): + repository = _find_migrate_repo() + versioning_api.version_control(get_engine(), repository, version) + return version + + +def _find_migrate_repo(): + """Get the path for the migrate repository.""" + global _REPOSITORY + path = os.path.join(os.path.abspath(os.path.dirname(__file__)), + 'migrate_repo') + assert os.path.exists(path) + if _REPOSITORY is None: + _REPOSITORY = Repository(path) + return _REPOSITORY diff --git a/cinder/db/sqlalchemy/models.py b/cinder/db/sqlalchemy/models.py new file mode 100644 index 000000000..732e6832f --- /dev/null +++ b/cinder/db/sqlalchemy/models.py @@ -0,0 +1,1063 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 X.commerce, a business unit of eBay Inc. +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# Copyright 2011 Piston Cloud Computing, 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. +""" +SQLAlchemy models for cinder data. +""" + +from sqlalchemy.orm import relationship, backref, object_mapper +from sqlalchemy import Column, Integer, BigInteger, String, schema +from sqlalchemy import ForeignKey, DateTime, Boolean, Text, Float +from sqlalchemy.exc import IntegrityError +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.schema import ForeignKeyConstraint + +from cinder.db.sqlalchemy.session import get_session + +from cinder import exception +from cinder import flags +from cinder import utils + + +FLAGS = flags.FLAGS +BASE = declarative_base() + + +class CinderBase(object): + """Base class for Cinder Models.""" + __table_args__ = {'mysql_engine': 'InnoDB'} + __table_initialized__ = False + created_at = Column(DateTime, default=utils.utcnow) + updated_at = Column(DateTime, onupdate=utils.utcnow) + deleted_at = Column(DateTime) + deleted = Column(Boolean, default=False) + metadata = None + + def save(self, session=None): + """Save this object.""" + if not session: + session = get_session() + session.add(self) + try: + session.flush() + except IntegrityError, e: + if str(e).endswith('is not unique'): + raise exception.Duplicate(str(e)) + else: + raise + + def delete(self, session=None): + """Delete this object.""" + self.deleted = True + self.deleted_at = utils.utcnow() + self.save(session=session) + + def __setitem__(self, key, value): + setattr(self, key, value) + + def __getitem__(self, key): + return getattr(self, key) + + def get(self, key, default=None): + return getattr(self, key, default) + + def __iter__(self): + self._i = iter(object_mapper(self).columns) + return self + + def next(self): + n = self._i.next().name + return n, getattr(self, n) + + def update(self, values): + """Make the model object behave like a dict""" + for k, v in values.iteritems(): + setattr(self, k, v) + + def iteritems(self): + """Make the model object behave like a dict. + + Includes attributes from joins.""" + local = dict(self) + joined = dict([(k, v) for k, v in self.__dict__.iteritems() + if not k[0] == '_']) + local.update(joined) + return local.iteritems() + + +class Service(BASE, CinderBase): + """Represents a running service on a host.""" + + __tablename__ = 'services' + id = Column(Integer, primary_key=True) + host = Column(String(255)) # , ForeignKey('hosts.id')) + binary = Column(String(255)) + topic = Column(String(255)) + report_count = Column(Integer, nullable=False, default=0) + disabled = Column(Boolean, default=False) + availability_zone = Column(String(255), default='cinder') + + +class ComputeNode(BASE, CinderBase): + """Represents a running compute service on a host.""" + + __tablename__ = 'compute_nodes' + id = Column(Integer, primary_key=True) + service_id = Column(Integer, ForeignKey('services.id'), nullable=True) + service = relationship(Service, + backref=backref('compute_node'), + foreign_keys=service_id, + primaryjoin='and_(' + 'ComputeNode.service_id == Service.id,' + 'ComputeNode.deleted == False)') + + vcpus = Column(Integer) + memory_mb = Column(Integer) + local_gb = Column(Integer) + vcpus_used = Column(Integer) + memory_mb_used = Column(Integer) + local_gb_used = Column(Integer) + hypervisor_type = Column(Text) + hypervisor_version = Column(Integer) + hypervisor_hostname = Column(String(255)) + + # Free Ram, amount of activity (resize, migration, boot, etc) and + # the number of running VM's are a good starting point for what's + # important when making scheduling decisions. + # + # NOTE(sandy): We'll need to make this extensible for other schedulers. + free_ram_mb = Column(Integer) + free_disk_gb = Column(Integer) + current_workload = Column(Integer) + running_vms = Column(Integer) + + # Note(masumotok): Expected Strings example: + # + # '{"arch":"x86_64", + # "model":"Nehalem", + # "topology":{"sockets":1, "threads":2, "cores":3}, + # "features":["tdtscp", "xtpr"]}' + # + # Points are "json translatable" and it must have all dictionary keys + # above, since it is copied from <cpu> tag of getCapabilities() + # (See libvirt.virtConnection). + cpu_info = Column(Text, nullable=True) + disk_available_least = Column(Integer) + + +class Certificate(BASE, CinderBase): + """Represents a an x509 certificate""" + __tablename__ = 'certificates' + id = Column(Integer, primary_key=True) + + user_id = Column(String(255)) + project_id = Column(String(255)) + file_name = Column(String(255)) + + +class Instance(BASE, CinderBase): + """Represents a guest vm.""" + __tablename__ = 'instances' + injected_files = [] + + id = Column(Integer, primary_key=True, autoincrement=True) + + @property + def name(self): + try: + base_name = FLAGS.instance_name_template % self.id + except TypeError: + # Support templates like "uuid-%(uuid)s", etc. + info = {} + for key, value in self.iteritems(): + # prevent recursion if someone specifies %(name)s + # %(name)s will not be valid. + if key == 'name': + continue + info[key] = value + try: + base_name = FLAGS.instance_name_template % info + except KeyError: + base_name = self.uuid + if getattr(self, '_rescue', False): + base_name += "-rescue" + return base_name + + user_id = Column(String(255)) + project_id = Column(String(255)) + + image_ref = Column(String(255)) + kernel_id = Column(String(255)) + ramdisk_id = Column(String(255)) + server_name = Column(String(255)) + +# image_ref = Column(Integer, ForeignKey('images.id'), nullable=True) +# kernel_id = Column(Integer, ForeignKey('images.id'), nullable=True) +# ramdisk_id = Column(Integer, ForeignKey('images.id'), nullable=True) +# ramdisk = relationship(Ramdisk, backref=backref('instances', order_by=id)) +# kernel = relationship(Kernel, backref=backref('instances', order_by=id)) +# project = relationship(Project, backref=backref('instances', order_by=id)) + + launch_index = Column(Integer) + key_name = Column(String(255)) + key_data = Column(Text) + + power_state = Column(Integer) + vm_state = Column(String(255)) + task_state = Column(String(255)) + + memory_mb = Column(Integer) + vcpus = Column(Integer) + root_gb = Column(Integer) + ephemeral_gb = Column(Integer) + + hostname = Column(String(255)) + host = Column(String(255)) # , ForeignKey('hosts.id')) + + # *not* flavor_id + instance_type_id = Column(Integer) + + user_data = Column(Text) + + reservation_id = Column(String(255)) + + scheduled_at = Column(DateTime) + launched_at = Column(DateTime) + terminated_at = Column(DateTime) + + availability_zone = Column(String(255)) + + # User editable field for display in user-facing UIs + display_name = Column(String(255)) + display_description = Column(String(255)) + + # To remember on which host a instance booted. + # An instance may have moved to another host by live migraiton. + launched_on = Column(Text) + locked = Column(Boolean) + + os_type = Column(String(255)) + architecture = Column(String(255)) + vm_mode = Column(String(255)) + uuid = Column(String(36)) + + root_device_name = Column(String(255)) + default_ephemeral_device = Column(String(255), nullable=True) + default_swap_device = Column(String(255), nullable=True) + config_drive = Column(String(255)) + + # User editable field meant to represent what ip should be used + # to connect to the instance + access_ip_v4 = Column(String(255)) + access_ip_v6 = Column(String(255)) + + auto_disk_config = Column(Boolean()) + progress = Column(Integer) + + # EC2 instance_initiated_shutdown_teminate + # True: -> 'terminate' + # False: -> 'stop' + shutdown_terminate = Column(Boolean(), default=True, nullable=False) + + # EC2 disable_api_termination + disable_terminate = Column(Boolean(), default=False, nullable=False) + + # OpenStack compute cell name + cell_name = Column(String(255)) + + +class InstanceInfoCache(BASE, CinderBase): + """ + Represents a cache of information about an instance + """ + __tablename__ = 'instance_info_caches' + id = Column(Integer, primary_key=True, autoincrement=True) + + # text column used for storing a json object of network data for api + network_info = Column(Text) + + instance_id = Column(String(36), ForeignKey('instances.uuid'), + nullable=False, unique=True) + instance = relationship(Instance, + backref=backref('info_cache', uselist=False), + foreign_keys=instance_id, + primaryjoin=instance_id == Instance.uuid) + + +class InstanceActions(BASE, CinderBase): + """Represents a guest VM's actions and results""" + __tablename__ = "instance_actions" + id = Column(Integer, primary_key=True) + instance_uuid = Column(String(36), ForeignKey('instances.uuid')) + action = Column(String(255)) + error = Column(Text) + + +class InstanceTypes(BASE, CinderBase): + """Represent possible instance_types or flavor of VM offered""" + __tablename__ = "instance_types" + id = Column(Integer, primary_key=True) + name = Column(String(255)) + memory_mb = Column(Integer) + vcpus = Column(Integer) + root_gb = Column(Integer) + ephemeral_gb = Column(Integer) + flavorid = Column(String(255)) + swap = Column(Integer, nullable=False, default=0) + rxtx_factor = Column(Float, nullable=False, default=1) + vcpu_weight = Column(Integer, nullable=True) + + instances = relationship(Instance, + backref=backref('instance_type', uselist=False), + foreign_keys=id, + primaryjoin='and_(' + 'Instance.instance_type_id == ' + 'InstanceTypes.id, ' + 'InstanceTypes.deleted == False)') + + +class Volume(BASE, CinderBase): + """Represents a block storage device that can be attached to a vm.""" + __tablename__ = 'volumes' + id = Column(String(36), primary_key=True) + + @property + def name(self): + return FLAGS.volume_name_template % self.id + + ec2_id = Column(Integer) + user_id = Column(String(255)) + project_id = Column(String(255)) + + snapshot_id = Column(String(36)) + + host = Column(String(255)) # , ForeignKey('hosts.id')) + size = Column(Integer) + availability_zone = Column(String(255)) # TODO(vish): foreign key? + instance_id = Column(Integer, ForeignKey('instances.id'), nullable=True) + instance = relationship(Instance, + backref=backref('volumes'), + foreign_keys=instance_id, + primaryjoin='and_(Volume.instance_id==Instance.id,' + 'Volume.deleted==False)') + mountpoint = Column(String(255)) + attach_time = Column(String(255)) # TODO(vish): datetime + status = Column(String(255)) # TODO(vish): enum? + attach_status = Column(String(255)) # TODO(vish): enum + + scheduled_at = Column(DateTime) + launched_at = Column(DateTime) + terminated_at = Column(DateTime) + + display_name = Column(String(255)) + display_description = Column(String(255)) + + provider_location = Column(String(255)) + provider_auth = Column(String(255)) + + volume_type_id = Column(Integer) + + +class VolumeMetadata(BASE, CinderBase): + """Represents a metadata key/value pair for a volume""" + __tablename__ = 'volume_metadata' + id = Column(Integer, primary_key=True) + key = Column(String(255)) + value = Column(String(255)) + volume_id = Column(String(36), ForeignKey('volumes.id'), nullable=False) + volume = relationship(Volume, backref="volume_metadata", + foreign_keys=volume_id, + primaryjoin='and_(' + 'VolumeMetadata.volume_id == Volume.id,' + 'VolumeMetadata.deleted == False)') + + +class VolumeTypes(BASE, CinderBase): + """Represent possible volume_types of volumes offered""" + __tablename__ = "volume_types" + id = Column(Integer, primary_key=True) + name = Column(String(255)) + + volumes = relationship(Volume, + backref=backref('volume_type', uselist=False), + foreign_keys=id, + primaryjoin='and_(' + 'Volume.volume_type_id == VolumeTypes.id, ' + 'VolumeTypes.deleted == False)') + + +class VolumeTypeExtraSpecs(BASE, CinderBase): + """Represents additional specs as key/value pairs for a volume_type""" + __tablename__ = 'volume_type_extra_specs' + id = Column(Integer, primary_key=True) + key = Column(String(255)) + value = Column(String(255)) + volume_type_id = Column(Integer, ForeignKey('volume_types.id'), + nullable=False) + volume_type = relationship(VolumeTypes, backref="extra_specs", + foreign_keys=volume_type_id, + primaryjoin='and_(' + 'VolumeTypeExtraSpecs.volume_type_id == VolumeTypes.id,' + 'VolumeTypeExtraSpecs.deleted == False)') + + +class Quota(BASE, CinderBase): + """Represents a single quota override for a project. + + If there is no row for a given project id and resource, then the + default for the quota class is used. If there is no row for a + given quota class and resource, then the default for the + deployment is used. If the row is present but the hard limit is + Null, then the resource is unlimited. + """ + + __tablename__ = 'quotas' + id = Column(Integer, primary_key=True) + + project_id = Column(String(255), index=True) + + resource = Column(String(255)) + hard_limit = Column(Integer, nullable=True) + + +class QuotaClass(BASE, CinderBase): + """Represents a single quota override for a quota class. + + If there is no row for a given quota class and resource, then the + default for the deployment is used. If the row is present but the + hard limit is Null, then the resource is unlimited. + """ + + __tablename__ = 'quota_classes' + id = Column(Integer, primary_key=True) + + class_name = Column(String(255), index=True) + + resource = Column(String(255)) + hard_limit = Column(Integer, nullable=True) + + +class Snapshot(BASE, CinderBase): + """Represents a block storage device that can be attached to a vm.""" + __tablename__ = 'snapshots' + id = Column(String(36), primary_key=True) + + @property + def name(self): + return FLAGS.snapshot_name_template % self.id + + @property + def volume_name(self): + return FLAGS.volume_name_template % self.volume_id + + user_id = Column(String(255)) + project_id = Column(String(255)) + + volume_id = Column(String(36)) + status = Column(String(255)) + progress = Column(String(255)) + volume_size = Column(Integer) + + display_name = Column(String(255)) + display_description = Column(String(255)) + + +class BlockDeviceMapping(BASE, CinderBase): + """Represents block device mapping that is defined by EC2""" + __tablename__ = "block_device_mapping" + id = Column(Integer, primary_key=True, autoincrement=True) + + instance_uuid = Column(Integer, ForeignKey('instances.uuid'), + nullable=False) + instance = relationship(Instance, + backref=backref('balock_device_mapping'), + foreign_keys=instance_uuid, + primaryjoin='and_(BlockDeviceMapping.' + 'instance_uuid==' + 'Instance.uuid,' + 'BlockDeviceMapping.deleted==' + 'False)') + device_name = Column(String(255), nullable=False) + + # default=False for compatibility of the existing code. + # With EC2 API, + # default True for ami specified device. + # default False for created with other timing. + delete_on_termination = Column(Boolean, default=False) + + # for ephemeral device + virtual_name = Column(String(255), nullable=True) + + # for snapshot or volume + snapshot_id = Column(String(36), ForeignKey('snapshots.id')) + # outer join + snapshot = relationship(Snapshot, + foreign_keys=snapshot_id) + + volume_id = Column(String(36), ForeignKey('volumes.id'), nullable=True) + volume = relationship(Volume, + foreign_keys=volume_id) + volume_size = Column(Integer, nullable=True) + + # for no device to suppress devices. + no_device = Column(Boolean, nullable=True) + + connection_info = Column(Text, nullable=True) + + +class IscsiTarget(BASE, CinderBase): + """Represates an iscsi target for a given host""" + __tablename__ = 'iscsi_targets' + __table_args__ = (schema.UniqueConstraint("target_num", "host"), + {'mysql_engine': 'InnoDB'}) + id = Column(Integer, primary_key=True) + target_num = Column(Integer) + host = Column(String(255)) + volume_id = Column(String(36), ForeignKey('volumes.id'), nullable=True) + volume = relationship(Volume, + backref=backref('iscsi_target', uselist=False), + foreign_keys=volume_id, + primaryjoin='and_(IscsiTarget.volume_id==Volume.id,' + 'IscsiTarget.deleted==False)') + + +class SecurityGroupInstanceAssociation(BASE, CinderBase): + __tablename__ = 'security_group_instance_association' + id = Column(Integer, primary_key=True) + security_group_id = Column(Integer, ForeignKey('security_groups.id')) + instance_id = Column(Integer, ForeignKey('instances.id')) + + +class SecurityGroup(BASE, CinderBase): + """Represents a security group.""" + __tablename__ = 'security_groups' + id = Column(Integer, primary_key=True) + + name = Column(String(255)) + description = Column(String(255)) + user_id = Column(String(255)) + project_id = Column(String(255)) + + instances = relationship(Instance, + secondary="security_group_instance_association", + primaryjoin='and_(' + 'SecurityGroup.id == ' + 'SecurityGroupInstanceAssociation.security_group_id,' + 'SecurityGroupInstanceAssociation.deleted == False,' + 'SecurityGroup.deleted == False)', + secondaryjoin='and_(' + 'SecurityGroupInstanceAssociation.instance_id == Instance.id,' + # (anthony) the condition below shouldn't be necessary now that the + # association is being marked as deleted. However, removing this + # may cause existing deployments to choke, so I'm leaving it + 'Instance.deleted == False)', + backref='security_groups') + + +class SecurityGroupIngressRule(BASE, CinderBase): + """Represents a rule in a security group.""" + __tablename__ = 'security_group_rules' + id = Column(Integer, primary_key=True) + + parent_group_id = Column(Integer, ForeignKey('security_groups.id')) + parent_group = relationship("SecurityGroup", backref="rules", + foreign_keys=parent_group_id, + primaryjoin='and_(' + 'SecurityGroupIngressRule.parent_group_id == SecurityGroup.id,' + 'SecurityGroupIngressRule.deleted == False)') + + protocol = Column(String(5)) # "tcp", "udp", or "icmp" + from_port = Column(Integer) + to_port = Column(Integer) + cidr = Column(String(255)) + + # Note: This is not the parent SecurityGroup. It's SecurityGroup we're + # granting access for. + group_id = Column(Integer, ForeignKey('security_groups.id')) + grantee_group = relationship("SecurityGroup", + foreign_keys=group_id, + primaryjoin='and_(' + 'SecurityGroupIngressRule.group_id == SecurityGroup.id,' + 'SecurityGroupIngressRule.deleted == False)') + + +class ProviderFirewallRule(BASE, CinderBase): + """Represents a rule in a security group.""" + __tablename__ = 'provider_fw_rules' + id = Column(Integer, primary_key=True) + + protocol = Column(String(5)) # "tcp", "udp", or "icmp" + from_port = Column(Integer) + to_port = Column(Integer) + cidr = Column(String(255)) + + +class KeyPair(BASE, CinderBase): + """Represents a public key pair for ssh.""" + __tablename__ = 'key_pairs' + id = Column(Integer, primary_key=True) + + name = Column(String(255)) + + user_id = Column(String(255)) + + fingerprint = Column(String(255)) + public_key = Column(Text) + + +class Migration(BASE, CinderBase): + """Represents a running host-to-host migration.""" + __tablename__ = 'migrations' + id = Column(Integer, primary_key=True, nullable=False) + # NOTE(tr3buchet): the ____compute variables are instance['host'] + source_compute = Column(String(255)) + dest_compute = Column(String(255)) + # NOTE(tr3buchet): dest_host, btw, is an ip address + dest_host = Column(String(255)) + old_instance_type_id = Column(Integer()) + new_instance_type_id = Column(Integer()) + instance_uuid = Column(String(255), ForeignKey('instances.uuid'), + nullable=True) + #TODO(_cerberus_): enum + status = Column(String(255)) + + +class Network(BASE, CinderBase): + """Represents a network.""" + __tablename__ = 'networks' + __table_args__ = (schema.UniqueConstraint("vpn_public_address", + "vpn_public_port"), + {'mysql_engine': 'InnoDB'}) + id = Column(Integer, primary_key=True) + label = Column(String(255)) + + injected = Column(Boolean, default=False) + cidr = Column(String(255), unique=True) + cidr_v6 = Column(String(255), unique=True) + multi_host = Column(Boolean, default=False) + + gateway_v6 = Column(String(255)) + netmask_v6 = Column(String(255)) + netmask = Column(String(255)) + bridge = Column(String(255)) + bridge_interface = Column(String(255)) + gateway = Column(String(255)) + broadcast = Column(String(255)) + dns1 = Column(String(255)) + dns2 = Column(String(255)) + + vlan = Column(Integer) + vpn_public_address = Column(String(255)) + vpn_public_port = Column(Integer) + vpn_private_address = Column(String(255)) + dhcp_start = Column(String(255)) + + rxtx_base = Column(Integer) + + project_id = Column(String(255)) + priority = Column(Integer) + host = Column(String(255)) # , ForeignKey('hosts.id')) + uuid = Column(String(36)) + + +class VirtualInterface(BASE, CinderBase): + """Represents a virtual interface on an instance.""" + __tablename__ = 'virtual_interfaces' + id = Column(Integer, primary_key=True) + address = Column(String(255), unique=True) + network_id = Column(Integer, nullable=False) + instance_id = Column(Integer, nullable=False) + uuid = Column(String(36)) + + +# TODO(vish): can these both come from the same baseclass? +class FixedIp(BASE, CinderBase): + """Represents a fixed ip for an instance.""" + __tablename__ = 'fixed_ips' + id = Column(Integer, primary_key=True) + address = Column(String(255)) + network_id = Column(Integer, nullable=True) + virtual_interface_id = Column(Integer, nullable=True) + instance_id = Column(Integer, nullable=True) + # associated means that a fixed_ip has its instance_id column set + # allocated means that a fixed_ip has a its virtual_interface_id column set + allocated = Column(Boolean, default=False) + # leased means dhcp bridge has leased the ip + leased = Column(Boolean, default=False) + reserved = Column(Boolean, default=False) + host = Column(String(255)) + + +class FloatingIp(BASE, CinderBase): + """Represents a floating ip that dynamically forwards to a fixed ip.""" + __tablename__ = 'floating_ips' + id = Column(Integer, primary_key=True) + address = Column(String(255)) + fixed_ip_id = Column(Integer, nullable=True) + project_id = Column(String(255)) + host = Column(String(255)) # , ForeignKey('hosts.id')) + auto_assigned = Column(Boolean, default=False, nullable=False) + pool = Column(String(255)) + interface = Column(String(255)) + + +class AuthToken(BASE, CinderBase): + """Represents an authorization token for all API transactions. + + Fields are a string representing the actual token and a user id for + mapping to the actual user + + """ + __tablename__ = 'auth_tokens' + token_hash = Column(String(255), primary_key=True) + user_id = Column(String(255)) + server_management_url = Column(String(255)) + storage_url = Column(String(255)) + cdn_management_url = Column(String(255)) + + +class User(BASE, CinderBase): + """Represents a user.""" + __tablename__ = 'users' + id = Column(String(255), primary_key=True) + + name = Column(String(255)) + access_key = Column(String(255)) + secret_key = Column(String(255)) + + is_admin = Column(Boolean) + + +class Project(BASE, CinderBase): + """Represents a project.""" + __tablename__ = 'projects' + id = Column(String(255), primary_key=True) + name = Column(String(255)) + description = Column(String(255)) + + project_manager = Column(String(255), ForeignKey(User.id)) + + members = relationship(User, + secondary='user_project_association', + backref='projects') + + +class DNSDomain(BASE, CinderBase): + """Represents a DNS domain with availability zone or project info.""" + __tablename__ = 'dns_domains' + domain = Column(String(512), primary_key=True) + scope = Column(String(255)) + availability_zone = Column(String(255)) + project_id = Column(String(255)) + project = relationship(Project, + primaryjoin=project_id == Project.id, + foreign_keys=[Project.id], + uselist=False) + + +class UserProjectRoleAssociation(BASE, CinderBase): + __tablename__ = 'user_project_role_association' + user_id = Column(String(255), primary_key=True) + user = relationship(User, + primaryjoin=user_id == User.id, + foreign_keys=[User.id], + uselist=False) + + project_id = Column(String(255), primary_key=True) + project = relationship(Project, + primaryjoin=project_id == Project.id, + foreign_keys=[Project.id], + uselist=False) + + role = Column(String(255), primary_key=True) + ForeignKeyConstraint(['user_id', + 'project_id'], + ['user_project_association.user_id', + 'user_project_association.project_id']) + + +class UserRoleAssociation(BASE, CinderBase): + __tablename__ = 'user_role_association' + user_id = Column(String(255), ForeignKey('users.id'), primary_key=True) + user = relationship(User, backref='roles') + role = Column(String(255), primary_key=True) + + +class UserProjectAssociation(BASE, CinderBase): + __tablename__ = 'user_project_association' + user_id = Column(String(255), ForeignKey(User.id), primary_key=True) + project_id = Column(String(255), ForeignKey(Project.id), primary_key=True) + + +class ConsolePool(BASE, CinderBase): + """Represents pool of consoles on the same physical node.""" + __tablename__ = 'console_pools' + id = Column(Integer, primary_key=True) + address = Column(String(255)) + username = Column(String(255)) + password = Column(String(255)) + console_type = Column(String(255)) + public_hostname = Column(String(255)) + host = Column(String(255)) + compute_host = Column(String(255)) + + +class Console(BASE, CinderBase): + """Represents a console session for an instance.""" + __tablename__ = 'consoles' + id = Column(Integer, primary_key=True) + instance_name = Column(String(255)) + instance_id = Column(Integer) + password = Column(String(255)) + port = Column(Integer, nullable=True) + pool_id = Column(Integer, ForeignKey('console_pools.id')) + pool = relationship(ConsolePool, backref=backref('consoles')) + + +class InstanceMetadata(BASE, CinderBase): + """Represents a metadata key/value pair for an instance""" + __tablename__ = 'instance_metadata' + id = Column(Integer, primary_key=True) + key = Column(String(255)) + value = Column(String(255)) + instance_id = Column(Integer, ForeignKey('instances.id'), nullable=False) + instance = relationship(Instance, backref="metadata", + foreign_keys=instance_id, + primaryjoin='and_(' + 'InstanceMetadata.instance_id == Instance.id,' + 'InstanceMetadata.deleted == False)') + + +class InstanceTypeExtraSpecs(BASE, CinderBase): + """Represents additional specs as key/value pairs for an instance_type""" + __tablename__ = 'instance_type_extra_specs' + id = Column(Integer, primary_key=True) + key = Column(String(255)) + value = Column(String(255)) + instance_type_id = Column(Integer, ForeignKey('instance_types.id'), + nullable=False) + instance_type = relationship(InstanceTypes, backref="extra_specs", + foreign_keys=instance_type_id, + primaryjoin='and_(' + 'InstanceTypeExtraSpecs.instance_type_id == InstanceTypes.id,' + 'InstanceTypeExtraSpecs.deleted == False)') + + +class Cell(BASE, CinderBase): + """Represents parent and child cells of this cell.""" + __tablename__ = 'cells' + id = Column(Integer, primary_key=True) + name = Column(String(255)) + api_url = Column(String(255)) + username = Column(String(255)) + password = Column(String(255)) + weight_offset = Column(Float(), default=0.0) + weight_scale = Column(Float(), default=1.0) + is_parent = Column(Boolean()) + rpc_host = Column(String(255)) + rpc_port = Column(Integer()) + rpc_virtual_host = Column(String(255)) + + +class AggregateHost(BASE, CinderBase): + """Represents a host that is member of an aggregate.""" + __tablename__ = 'aggregate_hosts' + id = Column(Integer, primary_key=True, autoincrement=True) + host = Column(String(255), unique=True) + aggregate_id = Column(Integer, ForeignKey('aggregates.id'), nullable=False) + + +class AggregateMetadata(BASE, CinderBase): + """Represents a metadata key/value pair for an aggregate.""" + __tablename__ = 'aggregate_metadata' + id = Column(Integer, primary_key=True) + key = Column(String(255), nullable=False) + value = Column(String(255), nullable=False) + aggregate_id = Column(Integer, ForeignKey('aggregates.id'), nullable=False) + + +class Aggregate(BASE, CinderBase): + """Represents a cluster of hosts that exists in this zone.""" + __tablename__ = 'aggregates' + id = Column(Integer, primary_key=True, autoincrement=True) + name = Column(String(255), unique=True) + operational_state = Column(String(255), nullable=False) + availability_zone = Column(String(255), nullable=False) + _hosts = relationship(AggregateHost, + secondary="aggregate_hosts", + primaryjoin='and_(' + 'Aggregate.id == AggregateHost.aggregate_id,' + 'AggregateHost.deleted == False,' + 'Aggregate.deleted == False)', + secondaryjoin='and_(' + 'AggregateHost.aggregate_id == Aggregate.id, ' + 'AggregateHost.deleted == False,' + 'Aggregate.deleted == False)', + backref='aggregates') + + _metadata = relationship(AggregateMetadata, + secondary="aggregate_metadata", + primaryjoin='and_(' + 'Aggregate.id == AggregateMetadata.aggregate_id,' + 'AggregateMetadata.deleted == False,' + 'Aggregate.deleted == False)', + secondaryjoin='and_(' + 'AggregateMetadata.aggregate_id == Aggregate.id, ' + 'AggregateMetadata.deleted == False,' + 'Aggregate.deleted == False)', + backref='aggregates') + + @property + def hosts(self): + return [h.host for h in self._hosts] + + @property + def metadetails(self): + return dict([(m.key, m.value) for m in self._metadata]) + + +class AgentBuild(BASE, CinderBase): + """Represents an agent build.""" + __tablename__ = 'agent_builds' + id = Column(Integer, primary_key=True) + hypervisor = Column(String(255)) + os = Column(String(255)) + architecture = Column(String(255)) + version = Column(String(255)) + url = Column(String(255)) + md5hash = Column(String(255)) + + +class BandwidthUsage(BASE, CinderBase): + """Cache for instance bandwidth usage data pulled from the hypervisor""" + __tablename__ = 'bw_usage_cache' + id = Column(Integer, primary_key=True, nullable=False) + uuid = Column(String(36), nullable=False) + mac = Column(String(255), nullable=False) + start_period = Column(DateTime, nullable=False) + last_refreshed = Column(DateTime) + bw_in = Column(BigInteger) + bw_out = Column(BigInteger) + + +class S3Image(BASE, CinderBase): + """Compatibility layer for the S3 image service talking to Glance""" + __tablename__ = 's3_images' + id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) + uuid = Column(String(36), nullable=False) + + +class VolumeIdMapping(BASE, CinderBase): + """Compatability layer for the EC2 volume service""" + __tablename__ = 'volume_id_mappings' + id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) + uuid = Column(String(36), nullable=False) + + +class SnapshotIdMapping(BASE, CinderBase): + """Compatability layer for the EC2 snapshot service""" + __tablename__ = 'snapshot_id_mappings' + id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) + uuid = Column(String(36), nullable=False) + + +class SMFlavors(BASE, CinderBase): + """Represents a flavor for SM volumes.""" + __tablename__ = 'sm_flavors' + id = Column(Integer(), primary_key=True) + label = Column(String(255)) + description = Column(String(255)) + + +class SMBackendConf(BASE, CinderBase): + """Represents the connection to the backend for SM.""" + __tablename__ = 'sm_backend_config' + id = Column(Integer(), primary_key=True) + flavor_id = Column(Integer, ForeignKey('sm_flavors.id'), nullable=False) + sr_uuid = Column(String(255)) + sr_type = Column(String(255)) + config_params = Column(String(2047)) + + +class SMVolume(BASE, CinderBase): + __tablename__ = 'sm_volume' + id = Column(String(36), ForeignKey(Volume.id), primary_key=True) + backend_id = Column(Integer, ForeignKey('sm_backend_config.id'), + nullable=False) + vdi_uuid = Column(String(255)) + + +class InstanceFault(BASE, CinderBase): + __tablename__ = 'instance_faults' + id = Column(Integer(), primary_key=True, autoincrement=True) + instance_uuid = Column(String(36), + ForeignKey('instances.uuid'), + nullable=False) + code = Column(Integer(), nullable=False) + message = Column(String(255)) + details = Column(Text) + + +def register_models(): + """Register Models and create metadata. + + Called from cinder.db.sqlalchemy.__init__ as part of loading the driver, + it will never need to be called explicitly elsewhere unless the + connection is lost and needs to be reestablished. + """ + from sqlalchemy import create_engine + models = (AgentBuild, + Aggregate, + AggregateHost, + AggregateMetadata, + AuthToken, + Certificate, + Cell, + Console, + ConsolePool, + FixedIp, + FloatingIp, + Instance, + InstanceActions, + InstanceFault, + InstanceMetadata, + InstanceTypeExtraSpecs, + InstanceTypes, + IscsiTarget, + Migration, + Network, + Project, + SecurityGroup, + SecurityGroupIngressRule, + SecurityGroupInstanceAssociation, + Service, + SMBackendConf, + SMFlavors, + SMVolume, + User, + Volume, + VolumeMetadata, + VolumeTypeExtraSpecs, + VolumeTypes, + VolumeIdMapping, + SnapshotIdMapping, + ) + engine = create_engine(FLAGS.sql_connection, echo=False) + for model in models: + model.metadata.create_all(engine) diff --git a/cinder/db/sqlalchemy/session.py b/cinder/db/sqlalchemy/session.py new file mode 100644 index 000000000..fd6eef4ba --- /dev/null +++ b/cinder/db/sqlalchemy/session.py @@ -0,0 +1,156 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Session Handling for SQLAlchemy backend.""" + +import time + +import sqlalchemy.interfaces +import sqlalchemy.orm +from sqlalchemy.exc import DisconnectionError, OperationalError +from sqlalchemy.pool import NullPool, StaticPool + +import cinder.exception +import cinder.flags as flags +import cinder.log as logging + + +FLAGS = flags.FLAGS +LOG = logging.getLogger(__name__) + +_ENGINE = None +_MAKER = None + + +def get_session(autocommit=True, expire_on_commit=False): + """Return a SQLAlchemy session.""" + global _MAKER + + if _MAKER is None: + engine = get_engine() + _MAKER = get_maker(engine, autocommit, expire_on_commit) + + session = _MAKER() + session.query = cinder.exception.wrap_db_error(session.query) + session.flush = cinder.exception.wrap_db_error(session.flush) + return session + + +class SynchronousSwitchListener(sqlalchemy.interfaces.PoolListener): + + """Switch sqlite connections to non-synchronous mode""" + + def connect(self, dbapi_con, con_record): + dbapi_con.execute("PRAGMA synchronous = OFF") + + +class MySQLPingListener(object): + + """ + Ensures that MySQL connections checked out of the + pool are alive. + + Borrowed from: + http://groups.google.com/group/sqlalchemy/msg/a4ce563d802c929f + """ + + def checkout(self, dbapi_con, con_record, con_proxy): + try: + dbapi_con.cursor().execute('select 1') + except dbapi_con.OperationalError, ex: + if ex.args[0] in (2006, 2013, 2014, 2045, 2055): + LOG.warn('Got mysql server has gone away: %s', ex) + raise DisconnectionError("Database server went away") + else: + raise + + +def is_db_connection_error(args): + """Return True if error in connecting to db.""" + # NOTE(adam_g): This is currently MySQL specific and needs to be extended + # to support Postgres and others. + conn_err_codes = ('2002', '2003', '2006') + for err_code in conn_err_codes: + if args.find(err_code) != -1: + return True + return False + + +def get_engine(): + """Return a SQLAlchemy engine.""" + global _ENGINE + if _ENGINE is None: + connection_dict = sqlalchemy.engine.url.make_url(FLAGS.sql_connection) + + engine_args = { + "pool_recycle": FLAGS.sql_idle_timeout, + "echo": False, + 'convert_unicode': True, + } + + # Map our SQL debug level to SQLAlchemy's options + if FLAGS.sql_connection_debug >= 100: + engine_args['echo'] = 'debug' + elif FLAGS.sql_connection_debug >= 50: + engine_args['echo'] = True + + if "sqlite" in connection_dict.drivername: + engine_args["poolclass"] = NullPool + + if FLAGS.sql_connection == "sqlite://": + engine_args["poolclass"] = StaticPool + engine_args["connect_args"] = {'check_same_thread': False} + + if not FLAGS.sqlite_synchronous: + engine_args["listeners"] = [SynchronousSwitchListener()] + + if 'mysql' in connection_dict.drivername: + engine_args['listeners'] = [MySQLPingListener()] + + _ENGINE = sqlalchemy.create_engine(FLAGS.sql_connection, **engine_args) + + try: + _ENGINE.connect() + except OperationalError, e: + if not is_db_connection_error(e.args[0]): + raise + + remaining = FLAGS.sql_max_retries + if remaining == -1: + remaining = 'infinite' + while True: + msg = _('SQL connection failed. %s attempts left.') + LOG.warn(msg % remaining) + if remaining != 'infinite': + remaining -= 1 + time.sleep(FLAGS.sql_retry_interval) + try: + _ENGINE.connect() + break + except OperationalError, e: + if (remaining != 'infinite' and remaining == 0) or \ + not is_db_connection_error(e.args[0]): + raise + return _ENGINE + + +def get_maker(engine, autocommit=True, expire_on_commit=False): + """Return a SQLAlchemy sessionmaker using the given engine.""" + return sqlalchemy.orm.sessionmaker(bind=engine, + autocommit=autocommit, + expire_on_commit=expire_on_commit) diff --git a/cinder/exception.py b/cinder/exception.py new file mode 100644 index 000000000..b57c1925e --- /dev/null +++ b/cinder/exception.py @@ -0,0 +1,938 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Cinder base exception handling. + +Includes decorator for re-raising Cinder-type exceptions. + +SHOULD include dedicated exception logging. + +""" + +import functools +import sys + +import webob.exc + +from cinder import log as logging + +LOG = logging.getLogger(__name__) + + +class ConvertedException(webob.exc.WSGIHTTPException): + def __init__(self, code=0, title="", explanation=""): + self.code = code + self.title = title + self.explanation = explanation + super(ConvertedException, self).__init__() + + +class ProcessExecutionError(IOError): + def __init__(self, stdout=None, stderr=None, exit_code=None, cmd=None, + description=None): + self.exit_code = exit_code + self.stderr = stderr + self.stdout = stdout + self.cmd = cmd + self.description = description + + if description is None: + description = _('Unexpected error while running command.') + if exit_code is None: + exit_code = '-' + message = _('%(description)s\nCommand: %(cmd)s\n' + 'Exit code: %(exit_code)s\nStdout: %(stdout)r\n' + 'Stderr: %(stderr)r') % locals() + IOError.__init__(self, message) + + +class Error(Exception): + pass + + +class DBError(Error): + """Wraps an implementation specific exception.""" + def __init__(self, inner_exception=None): + self.inner_exception = inner_exception + super(DBError, self).__init__(str(inner_exception)) + + +def wrap_db_error(f): + def _wrap(*args, **kwargs): + try: + return f(*args, **kwargs) + except UnicodeEncodeError: + raise InvalidUnicodeParameter() + except Exception, e: + LOG.exception(_('DB exception wrapped.')) + raise DBError(e) + _wrap.func_name = f.func_name + return _wrap + + +def wrap_exception(notifier=None, publisher_id=None, event_type=None, + level=None): + """This decorator wraps a method to catch any exceptions that may + get thrown. It logs the exception as well as optionally sending + it to the notification system. + """ + # TODO(sandy): Find a way to import cinder.notifier.api so we don't have + # to pass it in as a parameter. Otherwise we get a cyclic import of + # cinder.notifier.api -> cinder.utils -> cinder.exception :( + # TODO(johannes): Also, it would be nice to use + # utils.save_and_reraise_exception() without an import loop + def inner(f): + def wrapped(*args, **kw): + try: + return f(*args, **kw) + except Exception, e: + # Save exception since it can be clobbered during processing + # below before we can re-raise + exc_info = sys.exc_info() + + if notifier: + payload = dict(args=args, exception=e) + payload.update(kw) + + # Use a temp vars so we don't shadow + # our outer definitions. + temp_level = level + if not temp_level: + temp_level = notifier.ERROR + + temp_type = event_type + if not temp_type: + # If f has multiple decorators, they must use + # functools.wraps to ensure the name is + # propagated. + temp_type = f.__name__ + + notifier.notify(publisher_id, temp_type, temp_level, + payload) + + # re-raise original exception since it may have been clobbered + raise exc_info[0], exc_info[1], exc_info[2] + + return functools.wraps(f)(wrapped) + return inner + + +class CinderException(Exception): + """Base Cinder Exception + + To correctly use this class, inherit from it and define + a 'message' property. That message will get printf'd + with the keyword arguments provided to the constructor. + + """ + message = _("An unknown exception occurred.") + + def __init__(self, message=None, **kwargs): + self.kwargs = kwargs + + if 'code' not in self.kwargs: + try: + self.kwargs['code'] = self.code + except AttributeError: + pass + + if not message: + try: + message = self.message % kwargs + + except Exception as e: + # kwargs doesn't match a variable in the message + # log the issue and the kwargs + LOG.exception(_('Exception in string format operation')) + for name, value in kwargs.iteritems(): + LOG.error("%s: %s" % (name, value)) + # at least get the core message out if something happened + message = self.message + + super(CinderException, self).__init__(message) + + +class DecryptionFailure(CinderException): + message = _("Failed to decrypt text") + + +class ImagePaginationFailed(CinderException): + message = _("Failed to paginate through images from image service") + + +class VirtualInterfaceCreateException(CinderException): + message = _("Virtual Interface creation failed") + + +class VirtualInterfaceMacAddressException(CinderException): + message = _("5 attempts to create virtual interface" + "with unique mac address failed") + + +class GlanceConnectionFailed(CinderException): + message = _("Connection to glance failed") + ": %(reason)s" + + +class MelangeConnectionFailed(CinderException): + message = _("Connection to melange failed") + ": %(reason)s" + + +class NotAuthorized(CinderException): + message = _("Not authorized.") + code = 403 + + +class AdminRequired(NotAuthorized): + message = _("User does not have admin privileges") + + +class PolicyNotAuthorized(NotAuthorized): + message = _("Policy doesn't allow %(action)s to be performed.") + + +class ImageNotAuthorized(CinderException): + message = _("Not authorized for image %(image_id)s.") + + +class Invalid(CinderException): + message = _("Unacceptable parameters.") + code = 400 + + +class InvalidSnapshot(Invalid): + message = _("Invalid snapshot") + ": %(reason)s" + + +class VolumeUnattached(Invalid): + message = _("Volume %(volume_id)s is not attached to anything") + + +class InvalidKeypair(Invalid): + message = _("Keypair data is invalid") + + +class SfJsonEncodeFailure(CinderException): + message = _("Failed to load data into json format") + + +class InvalidRequest(Invalid): + message = _("The request is invalid.") + + +class InvalidSignature(Invalid): + message = _("Invalid signature %(signature)s for user %(user)s.") + + +class InvalidInput(Invalid): + message = _("Invalid input received") + ": %(reason)s" + + +class InvalidInstanceType(Invalid): + message = _("Invalid instance type %(instance_type)s.") + + +class InvalidVolumeType(Invalid): + message = _("Invalid volume type") + ": %(reason)s" + + +class InvalidVolume(Invalid): + message = _("Invalid volume") + ": %(reason)s" + + +class InvalidPortRange(Invalid): + message = _("Invalid port range %(from_port)s:%(to_port)s. %(msg)s") + + +class InvalidIpProtocol(Invalid): + message = _("Invalid IP protocol %(protocol)s.") + + +class InvalidContentType(Invalid): + message = _("Invalid content type %(content_type)s.") + + +class InvalidCidr(Invalid): + message = _("Invalid cidr %(cidr)s.") + + +class InvalidRPCConnectionReuse(Invalid): + message = _("Invalid reuse of an RPC connection.") + + +class InvalidUnicodeParameter(Invalid): + message = _("Invalid Parameter: " + "Unicode is not supported by the current database.") + + +# Cannot be templated as the error syntax varies. +# msg needs to be constructed when raised. +class InvalidParameterValue(Invalid): + message = _("%(err)s") + + +class InvalidAggregateAction(Invalid): + message = _("Cannot perform action '%(action)s' on aggregate " + "%(aggregate_id)s. Reason: %(reason)s.") + + +class InvalidGroup(Invalid): + message = _("Group not valid. Reason: %(reason)s") + + +class InstanceInvalidState(Invalid): + message = _("Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot " + "%(method)s while the instance is in this state.") + + +class InstanceNotRunning(Invalid): + message = _("Instance %(instance_id)s is not running.") + + +class InstanceNotSuspended(Invalid): + message = _("Instance %(instance_id)s is not suspended.") + + +class InstanceNotInRescueMode(Invalid): + message = _("Instance %(instance_id)s is not in rescue mode") + + +class InstanceSuspendFailure(Invalid): + message = _("Failed to suspend instance") + ": %(reason)s" + + +class InstanceResumeFailure(Invalid): + message = _("Failed to resume server") + ": %(reason)s." + + +class InstanceRebootFailure(Invalid): + message = _("Failed to reboot instance") + ": %(reason)s" + + +class InstanceTerminationFailure(Invalid): + message = _("Failed to terminate instance") + ": %(reason)s" + + +class ServiceUnavailable(Invalid): + message = _("Service is unavailable at this time.") + + +class VolumeServiceUnavailable(ServiceUnavailable): + message = _("Volume service is unavailable at this time.") + + +class UnableToMigrateToSelf(Invalid): + message = _("Unable to migrate instance (%(instance_id)s) " + "to current host (%(host)s).") + + +class DestinationHostUnavailable(Invalid): + message = _("Destination compute host is unavailable at this time.") + + +class SourceHostUnavailable(Invalid): + message = _("Original compute host is unavailable at this time.") + + +class InvalidHypervisorType(Invalid): + message = _("The supplied hypervisor type of is invalid.") + + +class DestinationHypervisorTooOld(Invalid): + message = _("The instance requires a newer hypervisor version than " + "has been provided.") + + +class DestinationDiskExists(Invalid): + message = _("The supplied disk path (%(path)s) already exists, " + "it is expected not to exist.") + + +class InvalidDevicePath(Invalid): + message = _("The supplied device path (%(path)s) is invalid.") + + +class DeviceIsBusy(Invalid): + message = _("The supplied device (%(device)s) is busy.") + + +class InvalidCPUInfo(Invalid): + message = _("Unacceptable CPU info") + ": %(reason)s" + + +class InvalidIpAddressError(Invalid): + message = _("%(address)s is not a valid IP v4/6 address.") + + +class InvalidVLANTag(Invalid): + message = _("VLAN tag is not appropriate for the port group " + "%(bridge)s. Expected VLAN tag is %(tag)s, " + "but the one associated with the port group is %(pgroup)s.") + + +class InvalidVLANPortGroup(Invalid): + message = _("vSwitch which contains the port group %(bridge)s is " + "not associated with the desired physical adapter. " + "Expected vSwitch is %(expected)s, but the one associated " + "is %(actual)s.") + + +class InvalidDiskFormat(Invalid): + message = _("Disk format %(disk_format)s is not acceptable") + + +class ImageUnacceptable(Invalid): + message = _("Image %(image_id)s is unacceptable: %(reason)s") + + +class InstanceUnacceptable(Invalid): + message = _("Instance %(instance_id)s is unacceptable: %(reason)s") + + +class NotFound(CinderException): + message = _("Resource could not be found.") + code = 404 + + +class FlagNotSet(NotFound): + message = _("Required flag %(flag)s not set.") + + +class VolumeNotFound(NotFound): + message = _("Volume %(volume_id)s could not be found.") + + +class SfAccountNotFound(NotFound): + message = _("Unable to locate account %(account_name)s on " + "Solidfire device") + + +class VolumeNotFoundForInstance(VolumeNotFound): + message = _("Volume not found for instance %(instance_id)s.") + + +class VolumeMetadataNotFound(NotFound): + message = _("Volume %(volume_id)s has no metadata with " + "key %(metadata_key)s.") + + +class NoVolumeTypesFound(NotFound): + message = _("Zero volume types found.") + + +class VolumeTypeNotFound(NotFound): + message = _("Volume type %(volume_type_id)s could not be found.") + + +class VolumeTypeNotFoundByName(VolumeTypeNotFound): + message = _("Volume type with name %(volume_type_name)s " + "could not be found.") + + +class VolumeTypeExtraSpecsNotFound(NotFound): + message = _("Volume Type %(volume_type_id)s has no extra specs with " + "key %(extra_specs_key)s.") + + +class SnapshotNotFound(NotFound): + message = _("Snapshot %(snapshot_id)s could not be found.") + + +class VolumeIsBusy(CinderException): + message = _("deleting volume %(volume_name)s that has snapshot") + + +class SnapshotIsBusy(CinderException): + message = _("deleting snapshot %(snapshot_name)s that has " + "dependent volumes") + + +class ISCSITargetNotFoundForVolume(NotFound): + message = _("No target id found for volume %(volume_id)s.") + + +class DiskNotFound(NotFound): + message = _("No disk at %(location)s") + + +class VolumeDriverNotFound(NotFound): + message = _("Could not find a handler for %(driver_type)s volume.") + + +class InvalidImageRef(Invalid): + message = _("Invalid image href %(image_href)s.") + + +class ListingImageRefsNotSupported(Invalid): + message = _("Some images have been stored via hrefs." + " This version of the api does not support displaying image hrefs.") + + +class ImageNotFound(NotFound): + message = _("Image %(image_id)s could not be found.") + + +class KernelNotFoundForImage(ImageNotFound): + message = _("Kernel not found for image %(image_id)s.") + + +class UserNotFound(NotFound): + message = _("User %(user_id)s could not be found.") + + +class ProjectNotFound(NotFound): + message = _("Project %(project_id)s could not be found.") + + +class ProjectMembershipNotFound(NotFound): + message = _("User %(user_id)s is not a member of project %(project_id)s.") + + +class UserRoleNotFound(NotFound): + message = _("Role %(role_id)s could not be found.") + + +class StorageRepositoryNotFound(NotFound): + message = _("Cannot find SR to read/write VDI.") + + +class DatastoreNotFound(NotFound): + message = _("Could not find the datastore reference(s) which the VM uses.") + + +class FixedIpNotFound(NotFound): + message = _("No fixed IP associated with id %(id)s.") + + +class FixedIpNotFoundForAddress(FixedIpNotFound): + message = _("Fixed ip not found for address %(address)s.") + + +class FixedIpNotFoundForInstance(FixedIpNotFound): + message = _("Instance %(instance_id)s has zero fixed ips.") + + +class FixedIpNotFoundForNetworkHost(FixedIpNotFound): + message = _("Network host %(host)s has zero fixed ips " + "in network %(network_id)s.") + + +class FixedIpNotFoundForSpecificInstance(FixedIpNotFound): + message = _("Instance %(instance_id)s doesn't have fixed ip '%(ip)s'.") + + +class FixedIpNotFoundForHost(FixedIpNotFound): + message = _("Host %(host)s has zero fixed ips.") + + +class FixedIpNotFoundForNetwork(FixedIpNotFound): + message = _("Fixed IP address (%(address)s) does not exist in " + "network (%(network_uuid)s).") + + +class FixedIpAlreadyInUse(CinderException): + message = _("Fixed IP address %(address)s is already in use.") + + +class FixedIpInvalid(Invalid): + message = _("Fixed IP address %(address)s is invalid.") + + +class NoMoreFixedIps(CinderException): + message = _("Zero fixed ips available.") + + +class NoFixedIpsDefined(NotFound): + message = _("Zero fixed ips could be found.") + + +class FloatingIpNotFound(NotFound): + message = _("Floating ip not found for id %(id)s.") + + +class FloatingIpDNSExists(Invalid): + message = _("The DNS entry %(name)s already exists in domain %(domain)s.") + + +class FloatingIpNotFoundForAddress(FloatingIpNotFound): + message = _("Floating ip not found for address %(address)s.") + + +class FloatingIpNotFoundForHost(FloatingIpNotFound): + message = _("Floating ip not found for host %(host)s.") + + +class NoMoreFloatingIps(FloatingIpNotFound): + message = _("Zero floating ips available.") + + +class FloatingIpAssociated(CinderException): + message = _("Floating ip %(address)s is associated.") + + +class FloatingIpNotAssociated(CinderException): + message = _("Floating ip %(address)s is not associated.") + + +class NoFloatingIpsDefined(NotFound): + message = _("Zero floating ips exist.") + + +class NoFloatingIpInterface(NotFound): + message = _("Interface %(interface)s not found.") + + +class KeypairNotFound(NotFound): + message = _("Keypair %(name)s not found for user %(user_id)s") + + +class CertificateNotFound(NotFound): + message = _("Certificate %(certificate_id)s not found.") + + +class ServiceNotFound(NotFound): + message = _("Service %(service_id)s could not be found.") + + +class HostNotFound(NotFound): + message = _("Host %(host)s could not be found.") + + +class HostBinaryNotFound(NotFound): + message = _("Could not find binary %(binary)s on host %(host)s.") + + +class AuthTokenNotFound(NotFound): + message = _("Auth token %(token)s could not be found.") + + +class AccessKeyNotFound(NotFound): + message = _("Access Key %(access_key)s could not be found.") + + +class QuotaNotFound(NotFound): + message = _("Quota could not be found") + + +class ProjectQuotaNotFound(QuotaNotFound): + message = _("Quota for project %(project_id)s could not be found.") + + +class QuotaClassNotFound(QuotaNotFound): + message = _("Quota class %(class_name)s could not be found.") + + +class SecurityGroupNotFound(NotFound): + message = _("Security group %(security_group_id)s not found.") + + +class SecurityGroupNotFoundForProject(SecurityGroupNotFound): + message = _("Security group %(security_group_id)s not found " + "for project %(project_id)s.") + + +class SecurityGroupNotFoundForRule(SecurityGroupNotFound): + message = _("Security group with rule %(rule_id)s not found.") + + +class SecurityGroupExistsForInstance(Invalid): + message = _("Security group %(security_group_id)s is already associated" + " with the instance %(instance_id)s") + + +class SecurityGroupNotExistsForInstance(Invalid): + message = _("Security group %(security_group_id)s is not associated with" + " the instance %(instance_id)s") + + +class MigrationNotFound(NotFound): + message = _("Migration %(migration_id)s could not be found.") + + +class MigrationNotFoundByStatus(MigrationNotFound): + message = _("Migration not found for instance %(instance_id)s " + "with status %(status)s.") + + +class NoInstanceTypesFound(NotFound): + message = _("Zero instance types found.") + + +class InstanceTypeNotFound(NotFound): + message = _("Instance type %(instance_type_id)s could not be found.") + + +class InstanceTypeNotFoundByName(InstanceTypeNotFound): + message = _("Instance type with name %(instance_type_name)s " + "could not be found.") + + +class FlavorNotFound(NotFound): + message = _("Flavor %(flavor_id)s could not be found.") + + +class CellNotFound(NotFound): + message = _("Cell %(cell_id)s could not be found.") + + +class SchedulerHostFilterNotFound(NotFound): + message = _("Scheduler Host Filter %(filter_name)s could not be found.") + + +class SchedulerCostFunctionNotFound(NotFound): + message = _("Scheduler cost function %(cost_fn_str)s could" + " not be found.") + + +class SchedulerWeightFlagNotFound(NotFound): + message = _("Scheduler weight flag not found: %(flag_name)s") + + +class InstanceMetadataNotFound(NotFound): + message = _("Instance %(instance_id)s has no metadata with " + "key %(metadata_key)s.") + + +class InstanceTypeExtraSpecsNotFound(NotFound): + message = _("Instance Type %(instance_type_id)s has no extra specs with " + "key %(extra_specs_key)s.") + + +class LDAPObjectNotFound(NotFound): + message = _("LDAP object could not be found") + + +class LDAPUserNotFound(LDAPObjectNotFound): + message = _("LDAP user %(user_id)s could not be found.") + + +class LDAPGroupNotFound(LDAPObjectNotFound): + message = _("LDAP group %(group_id)s could not be found.") + + +class LDAPGroupMembershipNotFound(NotFound): + message = _("LDAP user %(user_id)s is not a member of group %(group_id)s.") + + +class FileNotFound(NotFound): + message = _("File %(file_path)s could not be found.") + + +class NoFilesFound(NotFound): + message = _("Zero files could be found.") + + +class SwitchNotFoundForNetworkAdapter(NotFound): + message = _("Virtual switch associated with the " + "network adapter %(adapter)s not found.") + + +class NetworkAdapterNotFound(NotFound): + message = _("Network adapter %(adapter)s could not be found.") + + +class ClassNotFound(NotFound): + message = _("Class %(class_name)s could not be found: %(exception)s") + + +class NotAllowed(CinderException): + message = _("Action not allowed.") + + +class GlobalRoleNotAllowed(NotAllowed): + message = _("Unable to use global role %(role_id)s") + + +class ImageRotationNotAllowed(CinderException): + message = _("Rotation is not allowed for snapshots") + + +class RotationRequiredForBackup(CinderException): + message = _("Rotation param is required for backup image_type") + + +#TODO(bcwaldon): EOL this exception! +class Duplicate(CinderException): + pass + + +class KeyPairExists(Duplicate): + message = _("Key pair %(key_name)s already exists.") + + +class UserExists(Duplicate): + message = _("User %(user)s already exists.") + + +class LDAPUserExists(UserExists): + message = _("LDAP user %(user)s already exists.") + + +class LDAPGroupExists(Duplicate): + message = _("LDAP group %(group)s already exists.") + + +class LDAPMembershipExists(Duplicate): + message = _("User %(uid)s is already a member of " + "the group %(group_dn)s") + + +class ProjectExists(Duplicate): + message = _("Project %(project)s already exists.") + + +class InstanceExists(Duplicate): + message = _("Instance %(name)s already exists.") + + +class InstanceTypeExists(Duplicate): + message = _("Instance Type %(name)s already exists.") + + +class VolumeTypeExists(Duplicate): + message = _("Volume Type %(name)s already exists.") + + +class InvalidSharedStorage(CinderException): + message = _("%(path)s is on shared storage: %(reason)s") + + +class MigrationError(CinderException): + message = _("Migration error") + ": %(reason)s" + + +class MalformedRequestBody(CinderException): + message = _("Malformed message body: %(reason)s") + + +class ConfigNotFound(NotFound): + message = _("Could not find config at %(path)s") + + +class PasteAppNotFound(NotFound): + message = _("Could not load paste app '%(name)s' from %(path)s") + + +class CannotResizeToSameSize(CinderException): + message = _("When resizing, instances must change size!") + + +class ImageTooLarge(CinderException): + message = _("Image is larger than instance type allows") + + +class ZoneRequestError(CinderException): + message = _("1 or more Zones could not complete the request") + + +class InstanceTypeMemoryTooSmall(CinderException): + message = _("Instance type's memory is too small for requested image.") + + +class InstanceTypeDiskTooSmall(CinderException): + message = _("Instance type's disk is too small for requested image.") + + +class InsufficientFreeMemory(CinderException): + message = _("Insufficient free memory on compute node to start %(uuid)s.") + + +class CouldNotFetchMetrics(CinderException): + message = _("Could not fetch bandwidth/cpu/disk metrics for this host.") + + +class NoValidHost(CinderException): + message = _("No valid host was found. %(reason)s") + + +class WillNotSchedule(CinderException): + message = _("Host %(host)s is not up or doesn't exist.") + + +class QuotaError(CinderException): + message = _("Quota exceeded") + ": code=%(code)s" + + +class AggregateError(CinderException): + message = _("Aggregate %(aggregate_id)s: action '%(action)s' " + "caused an error: %(reason)s.") + + +class AggregateNotFound(NotFound): + message = _("Aggregate %(aggregate_id)s could not be found.") + + +class AggregateNameExists(Duplicate): + message = _("Aggregate %(aggregate_name)s already exists.") + + +class AggregateHostNotFound(NotFound): + message = _("Aggregate %(aggregate_id)s has no host %(host)s.") + + +class AggregateMetadataNotFound(NotFound): + message = _("Aggregate %(aggregate_id)s has no metadata with " + "key %(metadata_key)s.") + + +class AggregateHostConflict(Duplicate): + message = _("Host %(host)s already member of another aggregate.") + + +class AggregateHostExists(Duplicate): + message = _("Aggregate %(aggregate_id)s already has host %(host)s.") + + +class DuplicateSfVolumeNames(Duplicate): + message = _("Detected more than one volume with name %(vol_name)s") + + +class VolumeTypeCreateFailed(CinderException): + message = _("Cannot create volume_type with " + "name %(name)s and specs %(extra_specs)s") + + +class InstanceTypeCreateFailed(CinderException): + message = _("Unable to create instance type") + + +class SolidFireAPIException(CinderException): + message = _("Bad response from SolidFire API") + + +class SolidFireAPIStatusException(SolidFireAPIException): + message = _("Error in SolidFire API response: status=%(status)s") + + +class SolidFireAPIDataException(SolidFireAPIException): + message = _("Error in SolidFire API response: data=%(data)s") + + +class DuplicateVlan(Duplicate): + message = _("Detected existing vlan with id %(vlan)d") + + +class InstanceNotFound(NotFound): + message = _("Instance %(instance_id)s could not be found.") + + +class InvalidInstanceIDMalformed(Invalid): + message = _("Invalid id: %(val)s (expecting \"i-...\").") + + +class CouldNotFetchImage(CinderException): + message = _("Could not fetch image %(image)s") diff --git a/cinder/flags.py b/cinder/flags.py new file mode 100644 index 000000000..3f1d9f5d8 --- /dev/null +++ b/cinder/flags.py @@ -0,0 +1,356 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# All Rights Reserved. +# 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. + +"""Command-line flag library. + +Emulates gflags by wrapping cfg.ConfigOpts. + +The idea is to move fully to cfg eventually, and this wrapper is a +stepping stone. + +""" + +import os +import socket +import sys + +from cinder.compat import flagfile +from cinder.openstack.common import cfg + + +class CinderConfigOpts(cfg.CommonConfigOpts): + + def __init__(self, *args, **kwargs): + super(CinderConfigOpts, self).__init__(*args, **kwargs) + self.disable_interspersed_args() + + def __call__(self, argv): + with flagfile.handle_flagfiles_managed(argv[1:]) as args: + return argv[:1] + super(CinderConfigOpts, self).__call__(args) + + +FLAGS = CinderConfigOpts() + + +class UnrecognizedFlag(Exception): + pass + + +def DECLARE(name, module_string, flag_values=FLAGS): + if module_string not in sys.modules: + __import__(module_string, globals(), locals()) + if name not in flag_values: + raise UnrecognizedFlag('%s not defined by %s' % (name, module_string)) + + +def _get_my_ip(): + """ + Returns the actual ip of the local machine. + + This code figures out what source address would be used if some traffic + were to be sent out to some well known address on the Internet. In this + case, a Google DNS server is used, but the specific address does not + matter much. No traffic is actually sent. + """ + try: + csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + csock.connect(('8.8.8.8', 80)) + (addr, port) = csock.getsockname() + csock.close() + return addr + except socket.error: + return "127.0.0.1" + + +log_opts = [ + cfg.StrOpt('logdir', + default=None, + help='Log output to a per-service log file in named directory'), + cfg.StrOpt('logfile', + default=None, + help='Log output to a named file'), + cfg.BoolOpt('use_stderr', + default=True, + help='Log output to standard error'), + ] + +core_opts = [ + cfg.StrOpt('connection_type', + default=None, + help='Virtualization api connection type : libvirt, xenapi, ' + 'or fake'), + cfg.StrOpt('sql_connection', + default='sqlite:///$state_path/$sqlite_db', + help='The SQLAlchemy connection string used to connect to the ' + 'database'), + cfg.IntOpt('sql_connection_debug', + default=0, + help='Verbosity of SQL debugging information. 0=None, ' + '100=Everything'), + cfg.StrOpt('api_paste_config', + default="api-paste.ini", + help='File name for the paste.deploy config for cinder-api'), + cfg.StrOpt('pybasedir', + default=os.path.abspath(os.path.join(os.path.dirname(__file__), + '../')), + help='Directory where the cinder python module is installed'), + cfg.StrOpt('bindir', + default='$pybasedir/bin', + help='Directory where cinder binaries are installed'), + cfg.StrOpt('state_path', + default='$pybasedir', + help="Top-level directory for maintaining cinder's state"), + cfg.StrOpt('lock_path', + default='$pybasedir', + help='Directory to use for lock files'), + ] + +debug_opts = [ + cfg.BoolOpt('fake_rabbit', + default=False, + help='If passed, use a fake RabbitMQ provider'), +] + +FLAGS.register_cli_opts(log_opts) +FLAGS.register_cli_opts(core_opts) +FLAGS.register_cli_opts(debug_opts) + +global_opts = [ + cfg.StrOpt('my_ip', + default=_get_my_ip(), + help='ip address of this host'), + cfg.ListOpt('region_list', + default=[], + help='list of region=fqdn pairs separated by commas'), + cfg.StrOpt('aws_access_key_id', + default='admin', + help='AWS Access ID'), + cfg.StrOpt('aws_secret_access_key', + default='admin', + help='AWS Access Key'), + cfg.StrOpt('glance_host', + default='$my_ip', + help='default glance hostname or ip'), + cfg.IntOpt('glance_port', + default=9292, + help='default glance port'), + cfg.ListOpt('glance_api_servers', + default=['$glance_host:$glance_port'], + help='A list of the glance api servers available to cinder ' + '([hostname|ip]:port)'), + cfg.StrOpt('scheduler_topic', + default='scheduler', + help='the topic scheduler nodes listen on'), + cfg.StrOpt('volume_topic', + default='volume', + help='the topic volume nodes listen on'), + cfg.StrOpt('rabbit_host', + default='localhost', + help='the RabbitMQ host'), + cfg.IntOpt('rabbit_port', + default=5672, + help='the RabbitMQ port'), + cfg.BoolOpt('rabbit_use_ssl', + default=False, + help='connect over SSL for RabbitMQ'), + cfg.StrOpt('rabbit_userid', + default='guest', + help='the RabbitMQ userid'), + cfg.StrOpt('rabbit_password', + default='guest', + help='the RabbitMQ password'), + cfg.StrOpt('rabbit_virtual_host', + default='/', + help='the RabbitMQ virtual host'), + cfg.IntOpt('rabbit_retry_interval', + default=1, + help='how frequently to retry connecting with RabbitMQ'), + cfg.IntOpt('rabbit_retry_backoff', + default=2, + help='how long to backoff for between retries when connecting ' + 'to RabbitMQ'), + cfg.IntOpt('rabbit_max_retries', + default=0, + help='maximum retries with trying to connect to RabbitMQ ' + '(the default of 0 implies an infinite retry count)'), + cfg.StrOpt('control_exchange', + default='cinder', + help='the main RabbitMQ exchange to connect to'), + cfg.BoolOpt('rabbit_durable_queues', + default=False, + help='use durable queues in RabbitMQ'), + cfg.BoolOpt('api_rate_limit', + default=True, + help='whether to rate limit the api'), + cfg.ListOpt('enabled_apis', + default=['osapi_volume'], + help='a list of APIs to enable by default'), + cfg.ListOpt('osapi_volume_ext_list', + default=[], + help='Specify list of extensions to load when using osapi_' + 'volume_extension option with cinder.api.openstack.' + 'volume.contrib.select_extensions'), + cfg.MultiStrOpt('osapi_volume_extension', + default=[ + 'cinder.api.openstack.volume.contrib.standard_extensions' + ], + help='osapi volume extension to load'), + cfg.StrOpt('osapi_scheme', + default='http', + help='the protocol to use when connecting to the openstack api ' + 'server (http, https)'), + cfg.StrOpt('osapi_path', + default='/v1.1/', + help='the path prefix used to call the openstack api server'), + cfg.StrOpt('osapi_compute_link_prefix', + default=None, + help='Base URL that will be presented to users in links ' + 'to the OpenStack Compute API'), + cfg.IntOpt('osapi_max_limit', + default=1000, + help='the maximum number of items returned in a single ' + 'response from a collection resource'), + cfg.StrOpt('metadata_host', + default='$my_ip', + help='the ip for the metadata api server'), + cfg.IntOpt('metadata_port', + default=8775, + help='the port for the metadata api port'), + cfg.StrOpt('default_project', + default='openstack', + help='the default project to use for openstack'), + cfg.StrOpt('default_image', + default='ami-11111', + help='default image to use, testing only'), + cfg.StrOpt('default_instance_type', + default='m1.small', + help='default instance type to use, testing only'), + cfg.StrOpt('null_kernel', + default='nokernel', + help='kernel image that indicates not to use a kernel, but to ' + 'use a raw disk image instead'), + cfg.StrOpt('vpn_image_id', + default='0', + help='image id used when starting up a cloudpipe vpn server'), + cfg.StrOpt('vpn_key_suffix', + default='-vpn', + help='Suffix to add to project name for vpn key and secgroups'), + cfg.IntOpt('auth_token_ttl', + default=3600, + help='Seconds for auth tokens to linger'), + cfg.StrOpt('logfile_mode', + default='0644', + help='Default file mode used when creating log files'), + cfg.StrOpt('sqlite_db', + default='cinder.sqlite', + help='the filename to use with sqlite'), + cfg.BoolOpt('sqlite_synchronous', + default=True, + help='If passed, use synchronous mode for sqlite'), + cfg.IntOpt('sql_idle_timeout', + default=3600, + help='timeout before idle sql connections are reaped'), + cfg.IntOpt('sql_max_retries', + default=10, + help='maximum db connection retries during startup. ' + '(setting -1 implies an infinite retry count)'), + cfg.IntOpt('sql_retry_interval', + default=10, + help='interval between retries of opening a sql connection'), + cfg.StrOpt('volume_manager', + default='cinder.volume.manager.VolumeManager', + help='full class name for the Manager for volume'), + cfg.StrOpt('scheduler_manager', + default='cinder.scheduler.manager.SchedulerManager', + help='full class name for the Manager for scheduler'), + cfg.StrOpt('host', + default=socket.gethostname(), + help='Name of this node. This can be an opaque identifier. ' + 'It is not necessarily a hostname, FQDN, or IP address.'), + cfg.StrOpt('node_availability_zone', + default='cinder', + help='availability zone of this node'), + cfg.StrOpt('notification_driver', + default='cinder.notifier.no_op_notifier', + help='Default driver for sending notifications'), + cfg.ListOpt('memcached_servers', + default=None, + help='Memcached servers or None for in process cache.'), + cfg.StrOpt('instance_usage_audit_period', + default='month', + help='time period to generate instance usages for. ' + 'Time period must be hour, day, month or year'), + cfg.IntOpt('bandwith_poll_interval', + default=600, + help='interval to pull bandwidth usage info'), + cfg.BoolOpt('start_guests_on_host_boot', + default=False, + help='Whether to restart guests when the host reboots'), + cfg.BoolOpt('resume_guests_state_on_host_boot', + default=False, + help='Whether to start guests that were running before the ' + 'host rebooted'), + cfg.StrOpt('default_ephemeral_format', + default=None, + help='The default format a ephemeral_volume will be ' + 'formatted with on creation.'), + cfg.StrOpt('root_helper', + default='sudo', + help='Command prefix to use for running commands as root'), + cfg.BoolOpt('use_ipv6', + default=False, + help='use ipv6'), + cfg.BoolOpt('monkey_patch', + default=False, + help='Whether to log monkey patching'), + cfg.ListOpt('monkey_patch_modules', + default=[], + help='List of modules/decorators to monkey patch'), + cfg.BoolOpt('allow_resize_to_same_host', + default=False, + help='Allow destination machine to match source for resize. ' + 'Useful when testing in single-host environments.'), + cfg.IntOpt('reclaim_instance_interval', + default=0, + help='Interval in seconds for reclaiming deleted instances'), + cfg.IntOpt('zombie_instance_updated_at_window', + default=172800, + help='Number of seconds zombie instances are cleaned up.'), + cfg.IntOpt('service_down_time', + default=60, + help='maximum time since last check-in for up service'), + cfg.StrOpt('default_schedule_zone', + default=None, + help='availability zone to use when user doesn\'t specify one'), + cfg.ListOpt('isolated_images', + default=[], + help='Images to run on isolated host'), + cfg.ListOpt('isolated_hosts', + default=[], + help='Host reserved for specific images'), + cfg.StrOpt('volume_api_class', + default='cinder.volume.api.API', + help='The full class name of the volume API class to use'), + cfg.StrOpt('auth_strategy', + default='noauth', + help='The strategy to use for auth. Supports noauth, keystone, ' + 'and deprecated.'), +] + +FLAGS.register_opts(global_opts) diff --git a/cinder/locale/bs/LC_MESSAGES/nova.po b/cinder/locale/bs/LC_MESSAGES/nova.po new file mode 100644 index 000000000..f2171c73d --- /dev/null +++ b/cinder/locale/bs/LC_MESSAGES/nova.po @@ -0,0 +1,8201 @@ +# Bosnian translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2012-01-19 20:22+0000\n" +"Last-Translator: yazar <zrncescientiae@gmail.com>\n" +"Language-Team: Bosnian <bs@li.org>\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 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "NeoÄekivana greÅ¡ka prilikom pokretanja komande." + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "" + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "" + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "" + +#: cinder/exception.py:216 +#, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "" + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "" + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "" + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "" + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "" + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "" + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "" + +#: cinder/exception.py:334 +msgid "Failed to terminate instance" +msgstr "" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, python-format +msgid "Could not fetch image %(image)s" +msgstr "" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "" + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "" + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, python-format +msgid "QuotaError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "" + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:551 +msgid "Invalid CIDR" +msgstr "" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "" + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:725 +#, python-format +msgid "%s - This rule already exists in group" +msgstr "" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:959 +msgid "Detach Volume Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, python-format +msgid "Invalid mode: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +msgid "Security group is still in use" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:46 +msgid "Instance type for vpn instances" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +msgid "Cannot run any more instances of this type." +msgstr "" + +#: cinder/compute/api.py:259 +#, python-format +msgid "Can only run %s more instances of this type." +msgstr "" + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "" + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +msgid "Going to try to soft delete instance" +msgstr "" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +msgid "Going to try to terminate instance" +msgstr "" + +#: cinder/compute/api.py:977 +msgid "Going to try to stop instance" +msgstr "" + +#: cinder/compute/api.py:996 +msgid "Going to try to start instance" +msgstr "" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "" + +#: cinder/network/linux_net.py:1142 +#, python-format +msgid "Starting bridge %s " +msgstr "" + +#: cinder/network/linux_net.py:1149 +#, python-format +msgid "Done starting bridge %s" +msgstr "" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +msgid "Instance soft rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:696 +msgid "Failed to soft reboot instance." +msgstr "" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "" + +#: cinder/virt/libvirt/connection.py:978 +msgid "Guest does not have a console available" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, python-format +msgid "VBD %s already detached" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:392 +#, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:895 +msgid "Failed to fetch glance image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +msgid "Starting instance" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +msgid "Failed to spawn, rolling back" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +msgid "Starting VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +msgid "Finished snapshot and upload for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:677 +msgid "Starting snapshot for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:686 +#, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +msgid "Destroying VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +msgid "Injecting network info to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1495 +#, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +#, fuzzy +msgid "Volume status must be available or error" +msgstr "Status volumena mora biti omoguÄen" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +#, fuzzy +msgid "Volume Snapshot status must be available or error" +msgstr "Status volumena mora biti omoguÄen" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +msgid "Connected to DFM server" +msgstr "" + +#: cinder/volume/netapp.py:159 +#, python-format +msgid "Job failed: %s" +msgstr "" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, python-format +msgid "No LUN ID for volume %s" +msgstr "" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "" + +#: cinder/volume/netapp.py:614 +#, python-format +msgid "Failed to get host details for host ID %s" +msgstr "" + +#: cinder/volume/netapp.py:620 +#, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "" + +#: cinder/volume/netapp.py:625 +#, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, python-format +msgid "Got response: %s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:96 +#, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Zone %(zone_id)s could not be found." +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "" + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You can only" +#~ " run %s more instances of this " +#~ "type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to terminate %s" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Reconnected to queue" +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "response %s" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "" + +#~ msgid "message %s" +#~ msgstr "" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "" + +#~ msgid "Publishing to route %s" +#~ msgstr "" + +#~ msgid "Declaring queue %s" +#~ msgstr "" + +#~ msgid "Declaring exchange %s" +#~ msgstr "" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "" + +#~ msgid "cool, it's a device" +#~ msgstr "" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "" + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Snapshotting VM %(vm_ref)s with label '%(label)s'..." +#~ msgstr "" + +#~ msgid "Created snapshot %(template_vm_ref)s from VM %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "Size for image %(image)s:%(virtual_size)d" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "" + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "" + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "" + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "" + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Finished snapshot and upload for VM %s" +#~ msgstr "" + +#~ msgid "Starting snapshot for VM %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Creating VIF for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/cs/LC_MESSAGES/nova.po b/cinder/locale/cs/LC_MESSAGES/nova.po new file mode 100644 index 000000000..89cc85783 --- /dev/null +++ b/cinder/locale/cs/LC_MESSAGES/nova.po @@ -0,0 +1,8251 @@ +# Czech translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2012-04-04 20:28+0000\n" +"Last-Translator: ZbynÄk Schwarz <Unknown>\n" +"Language-Team: Czech <cs@li.org>\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" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "Jméno souboru koÅenové CA" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "Jméno souboru se soukromým klÃÄem" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "Název souboru seznamu zruÅ¡enà koÅenového certifikátu" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "Kde uchováváme naÅ¡e klÃÄe" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "Kde uchováváme naÅ¡i koÅenovou CA" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "Použijeme CA pro každý projekt?" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "" +"PÅedmÄt certifikátu pro uživatele, %s pro projekt, uživatel, Äasové " +"razÃtko" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "PÅedmÄt certifikátu pro projekty, %s pro projekt, Äasové razÃtko" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "Cesta pÅÃznaků: %s" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "PÅi spuÅ¡tÄnà pÅÃkazu doÅ¡lo k neÄekané chybÄ." + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" +"%(description)s\n" +"PÅÃkaz: %(cmd)s\n" +"Kód ukonÄenÃ: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "VyjÃmka DB zabalena." + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "Vyskytla se neoÄekávaná výjimka." + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "Nelze deÅ¡ifrovat text" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "Nelze stránkovat skrze obrázky ze služby obrázků" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "VytvoÅenà virtuálnÃho rozhranà selhalo" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "Selhalo 5 pokusů o vytvoÅenà virtuálnÃho rozhranà s jedineÄnou mac adresou" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "PÅipojenà k glance selhalo" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "PÅipojenà k melange selhalo" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "Neschváleno." + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "Uživatel nemá správcovská oprávnÄnÃ" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "Pravidla nedovolujÃ, aby bylo %(action)s provedeno." + +#: cinder/exception.py:216 +#, fuzzy, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "Kernel nenalezen v obrazu %(image_id)s." + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "NepÅijatelné parametry." + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "Neplatný snÃmek" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "Svazek %(volume_id)s nenà k niÄemu pÅipojen" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "Data páru klÃÄů jsou neplatná" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "Nelze naÄÃst data do formátu json" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "Požadavek je neplatný." + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "Neplatný podpis %(signature)s pro uživatele %(user)s." + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "Obdržen neplatný vstup" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "Neplatná instance typu %(instance_type)s." + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "Neplatný typ svazku" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "Neplatný svazek" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "Neplatný rozsah portů %(from_port)s:%(to_port)s. %(msg)s" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "Neplatný protokol IP %(protocol)s." + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "Neplatný typ obsahu %(content_type)s." + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "Neplatný cidr %(cidr)s." + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "Neplatné znovu použità pÅipojenà RPC." + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "%(err)s" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" +"Nelze provést Äinnost '%(action)s' na agregátu %(aggregate_id)s. Důvod: " +"%(reason)s." + +#: cinder/exception.py:301 +#, fuzzy, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "Nebyl nalezen žádný platný hostitel. %(reason)s" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" +"Instance %(instance_uuid)s v %(attr)s %(state)s. Nelze %(method)s " +"zatÃmco je instance v tomto stavu." + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "Instance %(instance_id)s nenà spuÅ¡tÄna." + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "Instance %(instance_id)s nenà pozastavena." + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "Instance %(instance_id)s nenà v nouzovém režimu." + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "Nelze pozastavit instanci" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "Server nemůže pokraÄovat" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "Nelze restartovat instanci" + +#: cinder/exception.py:334 +#, fuzzy +msgid "Failed to terminate instance" +msgstr "Nelze restartovat instanci" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "Služba je v tuto chvÃli nedostupná." + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "Služba svazku je v tuto chvÃli nedostupná." + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "Služba výpoÄtu je v tuto chvÃli nedostupná." + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" +"Nelze pÅesunout instanci (%(instance_id)s) na souÄasného hostitele " +"(%(host)s)." + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "CÃlový výpoÄetnà hostitel je v souÄasnosti nedostupný." + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "Původnà výpoÄetnà hostitel je v souÄasnosti nedostupný." + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "Zadaný typ hypervizoru je neplatný." + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "Instance vyžaduje novÄjšà verzi hypervizoru, než byla poskytnuta." + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "Zadaná cesta disku (%(path)s) již existuje, oÄekává se, že nebude." + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "Zadaná cesta zaÅÃzenà (%(path)s) je neplatná." + +#: cinder/exception.py:381 +#, fuzzy, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "Zadaná cesta zaÅÃzenà (%(path)s) je neplatná." + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "NepÅijatelné informace o procesoru" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "%(address)s nenà platná IP adresa v4/6." + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" +"ZnaÄka VLAN nenà vhodná pro skupinu portů %(bridge)s. OÄekávaná znaÄka " +"VLAN je %(tag)s, ale znaÄka pÅipojená ke skupinÄ portů je %(pgroup)s." + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" +"vSwitch který obsahuje skupinu portů %(bridge)s nenà spojen s požadovaným" +" fyzickým adaptérem. OÄekávaný vSwitch je %(expected)s, ale spojený je " +"%(actual)s." + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "Formát disku %(disk_format)s nenà pÅijatelný" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "Obraz %(image_id)s je nepÅijatelný: %(reason)s" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "Instance %(instance_id)s je nepÅijatelná: %(reason)s" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "Id Ec2 %(ec2_id)s je nepÅijatelné." + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "Zdroj nemohl být nalezen." + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "Požadovaný pÅÃznak %(flag)s nenà nastaven." + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "Svazek %(volume_id)s nemohl být nastaven." + +#: cinder/exception.py:435 +#, fuzzy, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "Nelze nalézt úÄet %(account_name) on zaÅÃzenà Solidfire" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "Svazek nenà nalezen v instanci %(instance_id)s." + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "Svazek %(volume_id)s nemá žádná metadata s klÃÄem %(metadata_key)s." + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "Nalezeno nula typů svazku." + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "Typ svazku %(volume_type_id)s nemohl být nalezen." + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "Typ svazku s názvem %(volume_type_name)s nemohl být nalezen." + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" +"Typ svazku %(volume_type_id)s nemá žádné dodateÄné parametry s klÃÄem " +"%(extra_specs_key)s." + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "SnÃmek %(snapshot_id)s nemohl být nalezen." + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "mazánà svazku %(volume_name)s který má snÃmek" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "Nenalezeno žádné cÃlové id ve svazku %(volume_id)s." + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "Źádný disk ve %(location)s" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "Nelze najÃt obslužnou rutinu pro svazek %(driver_type)s." + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "Neplatný href %(image_href)s obrazu." + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" +"NÄkteré obrazy byly uloženy pomocà href. Tato verze api nepodporuje " +"zobrazovánà href obrazů." + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "Obraz %(image_id)s nemohl být nalezen." + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "Kernel nenalezen v obrazu %(image_id)s." + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "Uživatel %(user_id)s nemohl být nalezen." + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "Projekt %(project_id)s nemohl být nalezen." + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "Uživatel %(user_id)s nenà Älenem projektu %(project_id)s." + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "Role %(role_id)s nemohla být nalezena." + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "Nelze najÃt SR pro ÄtenÃ/zápis VDI." + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "%(req)s je vyžadováno pro vytvoÅenà sÃtÄ." + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "SÃÅ¥ %(network_id)s nemohla být nalezena." + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "SÃÅ¥ nemohla být pro most %(bridge)s nalezena." + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "SÃÅ¥ nemohla být pro uuid %(uuid)s nalezena." + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "SÃÅ¥ nemohla být pro cidr %(cidr)s nalezena." + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "SÃÅ¥ nemohla být pro instance %(instance_id)s nalezena." + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "Źádné sÃtÄ nejsou urÄeny." + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" +"BuÄ sÃÅ¥ uuid %(network_uuid)s nenà pÅÃtomna nebo je pÅidÄlena projektu " +"%(project_id)s." + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "Hostitel nenà v sÃti (%(network_id)s) nastaven." + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "Nelze najÃt odkazy datového úložiÅ¡tÄ, který VM použÃvá." + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "Žádná pevná IP nenà spojena s %(id)s." + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "Pevná ip nenà pro adresu %(address)s nalezena." + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "Instance %(instance_id)s má nula pevných ip." + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "SÃÅ¥ový hostitel %(host)s má nula pevných ip v sÃti %(network_id)s." + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "Instance %(instance_id)s nemá pevnou ip '%(ip)s'." + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "Hostitel %(host)s má nula pevných ip." + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "Pevná IP adresa (%(address)s) v sÃti (%(network_uuid)s) neexistuje." + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "Pevná IP adresa (%(address)s) je již použÃvána." + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "Pevná IP adresa (%(address)s) je neplatná." + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "Je dostupno nula pevných ip." + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "Bylo nalezeno nula pevných ip." + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "Plovoucà ip nenà nalezena pro id %(id)s." + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "Záznam DNS %(name)s již v doménÄ %(domain)s existuje." + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "Plovoucà ip nenalezeno pro adresu %(address)s." + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "Plovoucà ip nenalezeno pro hostitele %(host)s." + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "Je dostupných nula plovoucÃch ip." + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "Plovoucà ip %(address)s je pÅidružena." + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "Plovoucà ip %(address)s nenà pÅidružena." + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "Existuje nula plovoucÃch ip." + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "Rozhranà %(interface)s nenalezeno." + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "Dvojice klÃÄů %(name)s nenalezena pro uživatele %(user_id)s" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "Certifikát %(certificate_id)s nenalezen." + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "Služba %(service_id)s nemohla být nalezena." + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "Hostitel %(host)s nemohl být nalezen." + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "Hostitel výpoÄtu %(host)s nemohl být nalezen." + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "Nelze najÃt binárnà soubor %(binary)s v hostiteli %(host)s." + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "Známka opeávnÄnà %(token)s nemohla být nalezena." + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "PÅÃstupový klÃÄ %(access_key)s nemohl být nalezen." + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "Kvóta nemohla být nalezena." + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "Kvóta pro projekt %(project_id)s nemohla být nalezena." + +#: cinder/exception.py:696 +#, fuzzy, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "TÅÃda %(class_name)s nemohla být nalezena: %(exception)s" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "BezpeÄnostnà skupina %(security_group_id)s nenà nalezena." + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" +"BezpeÄnostnà skupina %(security_group_id)s nenà nalezena v projektu " +"%(project_id)s." + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "BezpeÄnostnà skupina s pravidlem %(rule_id)s nenalezena." + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" +"BezpeÄnostnà skupina %(security_group_id)s je již pÅidružena k instanci " +"%(instance_id)s" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" +"BezpeÄnostnà skupina %(security_group_id)s nenà pÅidružena k instanci " +"%(instance_id)s" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "PÅesun %(migration_id)s nemohl být nalezen." + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "PÅesun nenalezen v instanci %(instance_id)s se stavem %(status)s." + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "Zásoba konzole %(pool_id)s nemohla být nalezena." + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" +"Zásoba konzole typu %(console_type)s pro výpoÄetnÃho hostitele " +"%(compute_host)s v hostitele proxy %(host)s nemohla být nalezena." + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "Konzole %(console_id)s nemohla být nalezena." + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "Konzole pro instanci %(instance_id)s nemohla být nalezena." + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" +"Konzole pro instanci %(instance_id)s v zásobÄ %(pool_id)s nemohla být " +"nalezena." + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "Neplatná konzole typu %(console_type)s " + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "Nalezeno nula typů instancÃ." + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "Instance typu %(instance_type_id)s nemohla být nalezena." + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "Instance typu s názvem %(instance_type_name)s nemohla být nalezena." + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "Konfigurace %(flavor_id)s nemohla být nalezena." + +#: cinder/exception.py:776 +#, fuzzy, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "Zóna %(zone_id)s nemohla být nalezena." + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "Filtr hostitelů plácinderÄe %(filter_name)s nemohl být nalezen." + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "Funkce nákladů plácinderÄe %(cost_fn_str)s nemohla být nalezena." + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "PÅÃznak váhy plácinderÄe nemohl být nalezen: %(flag_name)s" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "Instance %(instance_id)s nemá žádná metadata s klÃÄem %(metadata_key)s." + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" +"Instance typu %(instance_type_id)s nemá žádné dodateÄné specifikace s " +"klÃÄem %(extra_specs_key)s." + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "Objekt LDAP nemohl být nalezen" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "Uživatel LDAP %(user_id)s nemohl být nalezen." + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "Skupina LDAP %(group_id)s nemohla být nalezena." + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "Uživatel LDAP %(user_id)s nenà Älenem skupiny %(group_id)s." + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "Soubor %(file_path)s nemohl být nalezen." + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "Nalezeno nula souborů." + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "Nenalezen virtuálnà pÅepÃnaÄ sdružený se sÃÅ¥ovým adaptérem %(adapter)s." + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "SÃÅ¥ový adaptér %(adapter)s nemohl být nalezen." + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "TÅÃda %(class_name)s nemohla být nalezena: %(exception)s" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "Äinnost nenà povolena." + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "Nelze použÃt globálnà roli %(role_id)s" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "StÅÃdánà nenà povoleno pro snÃmky" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "Parametr rotation je vyžadován pro backup image_type" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "Dvojice klÃÄů %(key_name)s již existuje." + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "Uživatel %(user)s již existuje." + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "LDAP uživatel %(user)s již existuje." + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "LDAP skupina %(group)s již existuje." + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "Uživatel %(uid)s již je Älenem skupiny %(group_dn)s" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "Projekt %(project)s již existuje." + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "Instance %(name)s již existuje." + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "Instance typu %(name)s již existuje." + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "Typ svazku %(name)s již existuje." + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "%(path)s je ve sdÃleném úložiÅ¡ti: %(reason)s" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "Chyba pÅesunu" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "PoÅ¡kozené tÄlo zprávy: %(reason)s" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "Nelze najÃt nastavenà v %(path)s" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "Nelze naÄÃst aplikaci vloženà '%(name)s' z %(path)s" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "PÅi zmÄnÄ velikosti ji musà instance zmÄnit také!" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "Obraz je vÄtšà než typ instance povoluje" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "1 nebo vÃce Zón nemohlo požadavek dokonÄit" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "Typ pamÄti instance je pro požadovaný obraz pÅÃliÅ¡ malý." + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "Typ disku instance je pro požadovaný obraz pÅÃliÅ¡ malý." + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "Pro spuÅ¡tÄnà %(uuid)s je v uzlu výpoÄtu nedostatek volné pamÄti." + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "Nelze zÃskat metriky Å¡ÃÅky pásma/procesoru/disku pro tohoto hostitele." + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "Nebyl nalezen žádný platný hostitel. %(reason)s" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "Hostitel %(host)s nenà dostupný nebo neexistuje." + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "Kvóta pÅekroÄena" + +#: cinder/exception.py:958 +#, fuzzy, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "Agregát %(aggregate_id)s nemá hostitele %(host)s." + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "Agregát %(aggregate_id)s nemohl být nalezen." + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "Agregát %(aggregate_name)s již existuje." + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "Agregát %(aggregate_id)s nemá hostitele %(host)s." + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "Agregát %(aggregate_id)s nemá žádná metadata s klÃÄem %(metadata_key)s." + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "Hostitel %(host)s již je Älenem jiného agregátu." + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "Agregát %(aggregate_id)s již má hostitele %(host)s." + +#: cinder/exception.py:988 +#, fuzzy, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "ZjiÅ¡tÄn vÃce než jeden svazek s názvem %(vol_name)" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" +"Nelze vytvoÅit typ_svazku s názvem %(name)s a specifikacemi " +"%(extra_specs)s" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "Nelze vytvoÅit typ instance" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "Å patná odpovÄÄ od SolidFire API" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "Chyba v odpovÄdi SolidFire API: stav=%(status)s" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "Chyba v odpovÄdi SolidFire API: data=%(data)s" + +#: cinder/exception.py:1013 +#, fuzzy, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "ZjišťÄna existujÃcà vlan s id %(vlan)" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "Instance %(instance_id)s nemohla být nastavena." + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, fuzzy, python-format +msgid "Could not fetch image %(image)s" +msgstr "Kernel nenalezen v obrazu %(image_id)s." + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "zaÅÃzenà záznamu systému musà být jedno z: %s" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" +"PÅeskakovánà %(full_task_name)s, zbývá %(ticks_to_skip)s tiků do dalÅ¡Ãho " +"spuÅ¡tÄnÃ" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "SpuÅ¡tÄnà pravidelné úlohy %(full_task_name)s" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "Chyba pÅi %(full_task_name)s: %(e)s" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "Oznamovánà schopnostà plácinderÄům ..." + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "Soubor JSON pÅedstavujÃcà zásady" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "Kontrolované pravidlo, když požadované nenà nalezeno" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "ZaÄÃnajÃcà uzel %(topic)s (verze %(vcs_string)s)" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "VytváÅenà pÅipojenà zákaznÃka pro službu %s" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "UkonÄena služba bez záznamu v databázi" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "Objekt databáze služby zmizel, je znovu vytváÅen." + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "Obnoveno pÅipojenà modelového serveru!" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "modelový server je nedostupný" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "Ãplná sada PÅÃZNAKÅ®:" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "%(flag)s : SADA PŽÃZNAKÅ® " + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "VnitÅnà výjimka: %s" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "ZÃskávánà %s" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "ZÃskány neznámé argumenty klÃÄového slova pro utils.execute: %r" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "SpouÅ¡tÄnà pÅÃkazu (podproces): %s" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "Výsledek byl %s" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "%r selhalo. OpakovánÃ." + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "SpouÅ¡tÄnà pÅÃkazu (SSH): %s" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "ProstÅedà nenà podporováno pÅes SSH" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "process_input nenà podporován pÅes SSH" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "ladÄnà ve zpÄtném volánÃ: %s" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "Adresa mÃstnÃho spojenà nenalezena.: %s" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "Nelze zÃskat IP mÃstnÃho spojenà %(interface)s :%(ex)s" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "Neplatná podpůrná vrstva: %s" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "podpůrná vrstva: %s" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "v opakujÃcÃm volánÃ" + +#: cinder/utils.py:927 +#, fuzzy, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "Pokus zÃskat semafor \"%(lock)s\" pro zámek metody \"%(method)s\"" + +#: cinder/utils.py:931 +#, fuzzy, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "ZÃskán semafor \"%(lock)s\" pro zámek metody \"%(method)s\"" + +#: cinder/utils.py:935 +#, fuzzy, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "Pokus o zÃskánà zámku souboru \"%(lock)s\" pro zámek metody \"%(method)s\"" + +#: cinder/utils.py:942 +#, fuzzy, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "ZÃskán zámek souboru \"%(lock)s\" pro zámek metody \"%(method)s\"" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "OÄekáván objekt typu: %s" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "Neplatný server_string: %s" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "timefunc: '%(name)s' trvalo %(total_time).2f sek" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "Původnà výjimka je zahozena" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "TÅÃda %(fullname)s je zastaralá: %(msg)s" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "TÅÃda %(fullname)s je zastaralá" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "Funkce %(name)s v %(location)s je zastaralá: %(msg)s" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "Funkce %(name)s v %(location)s je zastaralá" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "%(name)s spuÅ¡tÄno v %(host)s:%(port)s" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "Zastavovánà serveru WSGI." + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "Zastavovánà prostého serveru TCP." + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "SpiuÅ¡tÄnà serveru TCP %(arg0)s na %(host)s:%(port)s" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "Server WSGI byl zastaven." + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "MusÃte zavést __call__" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "nedostupné" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "Navrácen neserializovatelný typ: %s" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "%(code)s: %(message)s" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "ObalovaÄchyb: %s" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "PÅÃliÅ¡ mnoho ovÄÅenà selhalo." + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" +"PÅÃstupový klÃÄ %(access_key)s %(failures)d krát selhal pÅi ovÄÅenà a " +"bude zablokován na %(lock_mins)d minut." + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "Podpis nenà zadán" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "PÅÃstupový klÃÄ nenà zadán" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "Chyba pÅi komunikaci s keystone" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "Selhánà ovÄÅenÃ: %s" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "Požadavek na ovÄÅenà pro %(uname)s:%(pname)s)" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "Äinnost: %s" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "arg: %(key)s\t\thod: %(value)s" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "NeoprávnÄnà požadavek pro ovladaÄ=%(controller)s a Äinnost=%(action)s" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "Vyvoláno InstanceNenalezena: %s" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "Vyvoláno SvazekNenalezen: %s" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "Vyvoláno SnÃmekNenalzen: %s" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "Vyvoláno Nenalezeno: %s" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "Vyvoláno ChybaApiEC2: %s" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "Vyvoláno DvojiceKlÃÄůExistuje: %s" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "Vyvoláno NeplatnáHodnotaParametru: %s" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "Vyvoláno NeplatnýROzsahPortů: %s" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "Vyvoláno NenÃOprávnÄno: %s" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "Vyvoláno NeplatnáOperace: %s" + +#: cinder/api/ec2/__init__.py:633 +#, fuzzy, python-format +msgid "QuotaError raised: %s" +msgstr "Vyvolána neznámá chyba: %s" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "Vyvolána neznámá chyba: %s" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "ProstÅedÃ: %s" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "Vyskytla se neznámá chyba. ProsÃm zopakujte Váš požadavek." + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" +"Nepodporovaný požadavek API: ovladaÄ = %(controller)s, Äinnost = " +"%(action)s" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "VytvoÅit snÃmek svazku %s" + +#: cinder/api/ec2/cloud.py:372 +#, fuzzy, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" +"Hodnota (%s) parametru GroupName je neplatná. Obsah je omezen na " +"alfanumerické znaky, mezery, pomlÄky a podtržÃtka." + +#: cinder/api/ec2/cloud.py:378 +#, fuzzy, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" +"Hodnota (%s) parametru GroupName je neplatná. Délka pÅekraÄuje maximum " +"255 znaků." + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "VytvoÅit dvojici klÃÄů %s" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "Imprtovat klÃÄ %s" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "Smazat dvojici klÃÄů %s" + +#: cinder/api/ec2/cloud.py:551 +#, fuzzy, python-format +msgid "Invalid CIDR" +msgstr "Neplatný cidr %(cidr)s." + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "Pro zadané parametry nenà žádné pravidlo." + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:725 +#, python-format +msgid "%s - This rule already exists in group" +msgstr "" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" +"Hodnota (%s) parametru GroupName je neplatná. Obsah je omezen na " +"alfanumerické znaky, mezery, pomlÄky a podtržÃtka." + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" +"Hodnota (%s) parametru GroupName je neplatná. Délka pÅekraÄuje maximum " +"255 znaků." + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "VytvoÅit bezpeÄnostnà skupinu %s" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "skupina %s již existuje" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "Smazat bezpeÄnostnà skupinu %s" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "ZÃskat výstup konzole pro instanci %s" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "VytvoÅit svazek ze snÃmku %s" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "VytvoÅit svazek o %s GB" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "PÅipojit svazek %(volume_id)s k instanci %(instance_id)s na %(device)s" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "Odpojit svazek %s" + +#: cinder/api/ec2/cloud.py:959 +#, fuzzy, python-format +msgid "Detach Volume Failed." +msgstr "Odpojit svazek %s" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "vlastnost nenà podporována: %s" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "svz = %s\n" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "PÅidÄlit adresu" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "Uvolnit adresu %s" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "PÅidÄlit adresu %(public_ip)s k instanci %(instance_id)s" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "OddÄlit adresu %s" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "Obraz musà být dostupný" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "BUde spuÅ¡tÄno ukonÄovánà insatncÃ" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "Restratovat instanci %r" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "Instance budou zastaveny" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "Instance budou spuÅ¡tÄny" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "ZruÅ¡enà registrace obrazu %s" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "Obraz %(image_location)s registrován s id %(image_id)s" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "uživatel nebo skupina nebyly zadány" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "podporována je pouze skupina \"all\"" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "operation_type musà být add nebo remove" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "Aktualizace publicity obrazu %s" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "Nelze zastavit instanci za %d sek" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "Nelze zÃskat metadata pro ip: %s" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "Zachycena chyba: %s" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "%(url)s vrácena s HTTP %(status)d" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "Musà být urÄena tÅÃda ExtensionManager" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "RozÅ¡ÃÅený zdroj: %s" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "RozÅ¡ÃÅenà %(ext_name)s: nelze rozÅ¡ÃÅit %(collection)s: Žádný takový zdroj" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "RozÅ¡ÃÅenà %(ext_name)s: rozÅ¡iÅovánà zdroje %(collection)s" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "%(user_id)s nelze nalézt se známkou '%(token)s'" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "%(user_id)s musà být správcem nebo Älenem %(project_id)s" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "Požadavky o ovÄÅenà musà být provádÄny proti verzi koÅenu (napÅ. /v2)." + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "Nelze najÃt %s v požadavku." + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "'%s' úspÄÅ¡nÄ ovÄÅeno" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "Uživatel nenalezen pomocà zadaného klÃÄe API." + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "Zadaný klÃÄ API je platný, ale ne pro uživatele '%(username)s'" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "parametr limit musà být celé ÄÃslo" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "parametr limit musà být kladný" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "parametr offset musà být celé ÄÃslo" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "parametr offset musà být kladný" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "znaÄka [%s] nenalezena" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "href %s neobsahuje verzi" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "Metadata obrazu pÅekraÄujà limit" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "Nelze '%(action)s' zatÃmco instance je %(attr)s %(state)s" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "Instance je v neplatném stavu pro '%(action)s'" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "OdmÃtnutà žádosti o snÃmek, snÃmky jsou nynà zakázány" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "SnÃmky instance nejsou v souÄasnosti povoleny." + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "NaÄteno rozÅ¡ÃÅenÃ: %s" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "Název roz: %s" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "PÅezdÃvká roz: %s" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "Popis roz: %s" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "Jmenný prostor roz: %s" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "Roz aktualizováno: %s" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "Výjimka pÅi naÄÃtánà rozÅ¡ÃÅenÃ: %s" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "NaÄÃtánà rozÅ¡ÃÅenà %s" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "Volánà továrny rozÅ¡ÃÅenà %s" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "Nelze naÄÃt rozšÞenà %(ext_factory)s: %(exc)s" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "Nelze naÄÃst rozÅ¡ÃÅenà %(classpath)s: %(exc)s" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "Nelze naÄÃst rozÅ¡ÃÅenà %(ext_name)s: %(exc)s" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "JSON nelze porozumÄt" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "XML nelze porozumÄt" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "pÅÃliÅ¡ mnoho klÃÄů tÄla" + +#: cinder/api/openstack/wsgi.py:582 +#, fuzzy, python-format +msgid "Exception handling resource: %s" +msgstr "RozÅ¡ÃÅený zdroj: %s" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "Vyvolána chyba: %s" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "Vyvolána výjimka HTTP: %s" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "V požadavku zadán nerozpoznaný Content-Type" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "V požadavku nezadán Content-Type" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "V požadavku zadáno prázdné tÄlo" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "Žádná taková Äinnost: %s" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "PoÅ¡kozené tÄlo požadavku" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "Nepodporovaný Content-Type" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "PoÅ¡kozená url požadavku" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "%(url)s vrátilo chybu: %(e)s" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "prvek nenà podÅazený" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "koÅenový prvek volà seznam" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" +"Neshoda stromu Å¡ablony; pÅidávánà sluhy %(slavetag)s k pánovi " +"%(mastertag)s" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "podtÅÃdy musà zavádÄt construct()!" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "ZavádÄnà správce rozÅ¡ÃÅenÃ." + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "Obraz nenalezen" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "Nsprávný formát tÄla požadavku" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "Neshoda s tÄlem požadavku a URI" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "TÄlo požadavku obsahuje pÅÃliÅ¡ mnoho položek" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "Neplatný klÃÄ metadata" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "Instance neexistuje" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "Instance nenà Älenem zadané sÃtÄ" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" +"Pouze %(value)s požadavky %(verb)s mohou být provedeny pro %(uri)s " +"každých %(unit_string)s." + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "Tento požadavek má omezen množstvÃ." + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "Server neexistuje" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "Položka metadat nenalezena" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "Neplatný stav serveru: %(status)s" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "Neplatná hodnota changes-since" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "PÅekroÄen limit osobnostnÃho souboru" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "Cesta osobnostnÃho souboru je pÅÃliÅ¡ dlouhá" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "Obsah osobnostnÃho souboru je pÅÃliÅ¡ dlouhý" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "Název serveru nenà ÅetÄzec nebo unicode" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "Název serveru je prázdný ÅetÄzec" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "Å patný formát osobnosti: chybà %s" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "Å patný formát osobnosti" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "Obsah osobnosti pro %s nemůže být dekódován" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "Å patný formát sÃtÃ: uuid sÃtÄ nenà ve správném formátu (%s)" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "Neplatná pevná IP adresa (%s)" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "Duplicitnà sÃtÄ (%s) nejosu povoleny" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "Å patný formát sÃtÄ: chybà %s" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "Å patný formát sÃtÄ" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "Obsah uživatelských dat nemůže být dekódován" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "accessIPv4 nenà ve správném formátu IPv4" + +#: cinder/api/openstack/compute/servers.py:601 +#, fuzzy +msgid "accessIPv6 is not proper IPv6 format" +msgstr "accessIPv4 nenà ve správném formátu IPv4" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "Název serveru nenà urÄen" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "Zadáno neplatné flavorRef." + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "Nelze najÃt požadovaný obraz" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "Zadán neplatný název_klÃÄe." + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "Instanci nebyla zmÄnÄna velikost." + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "Chyba v confirm-resize %s" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "Chyba v revert-resize %s" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "Argument 'type' pro restart nenà HARD Äi SOFT" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "Chybà argument 'type' pro restart" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "Chyba v restartu %s" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "Nelze najÃt požadovanou konfiguraci." + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "Resize vyžaduje zmÄnu velikosti." + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "PoÅ¡kozený objekt serveru" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "Chybà vlastnost imageRef" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "Zadáno neplatné imageRef." + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "Chybà vlastnost flavorRef" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "Nebylo zadáno adminPass" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "Neplatné adminPass" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "Nelze zpracovat metadata dvojic hodnot/klÃÄů." + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "Požadavek na zmÄnu velikosti má neplatnou vlastnost 'flavorRef'." + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "Požadavek na zmÄnu velikosti vyžaduje vlastnost 'flavorRef'." + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "Neplatné tÄlo požadavku" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "Nelze zpracovat imageRef z požadavku." + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "Instance nemohla být nalezena" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "Nelze najÃt obraz ke znovu sestavenÃ" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "Objekt createImage cyžaduje vlastnost name" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "Neplatná metadata" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "OdstraÅovánà voleb '%(unk_opt_str)s' z fronty" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "Compute.api::pauza %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "Compute.api::zruÅ¡ pauzu %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "compute.api::pÅeruÅ¡enà %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "compute.api::pokraÄovánà %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "Chyba v pÅesunu %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "Compute.api::reset_sÃtÄ %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "Server nenalezen" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "Compute.api::vložit_info_sÃtÄ %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "Compute.api::uzamÄenà %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "Compute.api::odemÄenà %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "Objekt createBackup vyžaduej vlastnost %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "PoÅ¡kozený objekt createBackup" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "Vlastnost createBackup 'rotation' musà být celé ÄÃslo" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "Instance nenalezena" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "host a block_migration musà být zadány." + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "Migrace za chodu instance %(id)s na hostitele %(host)s selhala" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, fuzzy, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" +"Nelze vytvoÅit typ_svazku s názvem %(name)s a specifikacemi " +"%(extra_specs)s" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "Agregáty nemajà Äinnost %s" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "Může být zÃskán pouze koÅenový certifikát." + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" +"Nelze zÃskat IP pro instance VPN, ujistÄte se, že nenà spuÅ¡tÄna a zkuste " +"to znovu za pár minut." + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "Chybà urÄenà typu" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "Neplatné urÄenà typu" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "%s musà být buÄ 'MANUAL' nebo 'AUTO'." + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "Server nenalezen." + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +#, fuzzy +msgid "Flavor not found." +msgstr "Server nenalezen." + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "Žádné tÄlo požadavku" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "Žádné dalšà plovoucà ip v zásobnÃku %s." + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "Žádné dalšà plovoucà ip nejsou dostupné." + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "Chybà parametr dict" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "Adresa nenà urÄena" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "K instanci nejsou pÅidruženy žádné pevné ip" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "PÅidruženà plovoucà ip selhalo" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "Neplatný stav: '%s'" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, fuzzy, python-format +msgid "Invalid mode: '%s'" +msgstr "Neplatný stav: '%s'" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "Neplatné nastavenà aktualizace: '%s'" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, fuzzy, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "Nastavovánà hostitele %(host)s na %(state)s." + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "Nastavovánà hostitele %(host)s na %(state)s." + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "Describe-resource je funkce pouze pro správce" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +msgid "Security group is still in use" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:46 +#, fuzzy, python-format +msgid "Instance type for vpn instances" +msgstr "Neplatná instance typu %(instance_type)s." + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +msgid "Cannot run any more instances of this type." +msgstr "" + +#: cinder/compute/api.py:259 +#, python-format +msgid "Can only run %s more instances of this type." +msgstr "" + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "" + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +#, fuzzy +msgid "Going to try to soft delete instance" +msgstr "Instance budou spuÅ¡tÄny" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +#, fuzzy +msgid "Going to try to terminate instance" +msgstr "BUde spuÅ¡tÄno ukonÄovánà insatncÃ" + +#: cinder/compute/api.py:977 +#, fuzzy +msgid "Going to try to stop instance" +msgstr "Instance budou zastaveny" + +#: cinder/compute/api.py:996 +#, fuzzy +msgid "Going to try to start instance" +msgstr "Instance budou spuÅ¡tÄny" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, fuzzy, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" +"Konzole pro instanci %(instance_id)s v zásobÄ %(pool_id)s nemohla být " +"nalezena." + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, fuzzy, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "Instance %(instance_id)s nenà v nouzovém režimu." + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, fuzzy, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "Agregát %(aggregate_id)s již má hostitele %(host)s." + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "" + +#: cinder/network/linux_net.py:1142 +#, fuzzy, python-format +msgid "Starting bridge %s " +msgstr "ZruÅ¡enà registrace obrazu %s" + +#: cinder/network/linux_net.py:1149 +#, fuzzy, python-format +msgid "Done starting bridge %s" +msgstr "ZruÅ¡enà registrace obrazu %s" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, fuzzy, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "Certifikát %(certificate_id)s nenalezen." + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, fuzzy, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "K instanci nejsou pÅidruženy žádné pevné ip" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "VolajÃcÃmu je vrácena výjimka: %s" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "rozbalený kontext: %s" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "obdrženo: %s" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "pro zprávu nenà metoda: %s" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "Pro zprávu nenà metoda: %s" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "MSG_ID je %s" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, fuzzy, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "Nastavovánà hostitele %(host)s na %(state)s." + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, fuzzy, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "Kvóta pÅekroÄena" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +msgid "Instance soft rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:696 +#, fuzzy +msgid "Failed to soft reboot instance." +msgstr "Nelze restartovat instanci" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "" + +#: cinder/virt/libvirt/connection.py:978 +#, fuzzy +msgid "Guest does not have a console available" +msgstr "Uživatel nemá správcovská oprávnÄnÃ" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +#, fuzzy +msgid "Unable to get updated status" +msgstr "Nelze vytvoÅit typ instance" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, fuzzy, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "Nelze použÃt globálnà roli %(role_id)s" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, fuzzy, python-format +msgid "VBD %s already detached" +msgstr "skupina %s již existuje" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, fuzzy, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "Nenalezeno žádné cÃlové id ve svazku %(volume_id)s." + +#: cinder/virt/xenapi/vm_utils.py:379 +#, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:392 +#, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:895 +#, fuzzy +msgid "Failed to fetch glance image" +msgstr "Nelze restartovat instanci" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +#, fuzzy +msgid "Starting instance" +msgstr "Instance budou spuÅ¡tÄny" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +#, fuzzy +msgid "Failed to spawn, rolling back" +msgstr "Nelze pozastavit instanci" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +msgid "Starting VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +msgid "Finished snapshot and upload for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:677 +#, fuzzy, python-format +msgid "Starting snapshot for VM" +msgstr "VytvoÅit snÃmek svazku %s" + +#: cinder/virt/xenapi/vmops.py:686 +#, fuzzy, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "Nelze vytvoÅit typ instance" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +msgid "Destroying VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, fuzzy, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "Instance %(instance_id)s nemohla být nastavena." + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +msgid "Injecting network info to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1495 +#, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +#, fuzzy +msgid "Volume status must be available or error" +msgstr "Obraz musà být dostupný" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +msgid "Volume Snapshot status must be available or error" +msgstr "" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, fuzzy, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "Obraz %(image_id)s je nepÅijatelný: %(reason)s" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +#, fuzzy +msgid "Connected to DFM server" +msgstr "Znovu pÅipojeno k frontÄ" + +#: cinder/volume/netapp.py:159 +#, fuzzy, python-format +msgid "Job failed: %s" +msgstr "Vyvoláno Nenalezeno: %s" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, python-format +msgid "No LUN ID for volume %s" +msgstr "" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, fuzzy, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "Nelze zÃskat metadata pro ip: %s" + +#: cinder/volume/netapp.py:614 +#, fuzzy, python-format +msgid "Failed to get host details for host ID %s" +msgstr "Nelze zÃskat metadata pro ip: %s" + +#: cinder/volume/netapp.py:620 +#, fuzzy, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "Nelze zÃskat metadata pro ip: %s" + +#: cinder/volume/netapp.py:625 +#, fuzzy, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "Nelze zÃskat metadata pro ip: %s" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +#, fuzzy +msgid "Bad response from server" +msgstr "Å patná odpovÄÄ od SolidFire API" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, fuzzy, python-format +msgid "Got response: %s" +msgstr "odpovÄÄ %s" + +#: cinder/volume/nexenta/volume.py:96 +#, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "PÅÃstupové parametry Cinder nebyly zadány." + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "Pole virtuálnÃho úložiÅ¡tÄ %(id)d nebylo nalezeno." + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "Pole virtuálnÃho úložiÅ¡tÄ %(name)s nebylo nalezeno." + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You can only" +#~ " run %s more instances of this " +#~ "type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to terminate %s" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "" + +#~ msgid "message %s" +#~ msgstr "zpráva %s" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "" + +#~ msgid "Publishing to route %s" +#~ msgstr "" + +#~ msgid "Declaring queue %s" +#~ msgstr "" + +#~ msgid "Declaring exchange %s" +#~ msgstr "" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "" + +#~ msgid "cool, it's a device" +#~ msgstr "" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "" + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Snapshotting VM %(vm_ref)s with label '%(label)s'..." +#~ msgstr "" + +#~ msgid "Created snapshot %(template_vm_ref)s from VM %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "Size for image %(image)s:%(virtual_size)d" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "" + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "" + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "" + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "" + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Finished snapshot and upload for VM %s" +#~ msgstr "" + +#~ msgid "Starting snapshot for VM %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Creating VIF for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "Volume status must be available" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/da/LC_MESSAGES/nova.po b/cinder/locale/da/LC_MESSAGES/nova.po new file mode 100644 index 000000000..5c5ba583c --- /dev/null +++ b/cinder/locale/da/LC_MESSAGES/nova.po @@ -0,0 +1,8203 @@ +# Danish translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2011-01-15 21:46+0000\n" +"Last-Translator: Soren Hansen <soren@linux2go.dk>\n" +"Language-Team: Danish <da@li.org>\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 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "Filnavn for privatnøgle" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "" + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "" + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "" + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "" + +#: cinder/exception.py:216 +#, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "" + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "" + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "" + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "" + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "" + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "" + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "" + +#: cinder/exception.py:334 +msgid "Failed to terminate instance" +msgstr "" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, python-format +msgid "Could not fetch image %(image)s" +msgstr "" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "" + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "" + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, python-format +msgid "QuotaError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "" + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:551 +msgid "Invalid CIDR" +msgstr "" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "" + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:725 +#, python-format +msgid "%s - This rule already exists in group" +msgstr "" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:959 +msgid "Detach Volume Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, python-format +msgid "Invalid mode: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +msgid "Security group is still in use" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:46 +msgid "Instance type for vpn instances" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +msgid "Cannot run any more instances of this type." +msgstr "" + +#: cinder/compute/api.py:259 +#, python-format +msgid "Can only run %s more instances of this type." +msgstr "" + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "" + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +msgid "Going to try to soft delete instance" +msgstr "" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +msgid "Going to try to terminate instance" +msgstr "" + +#: cinder/compute/api.py:977 +msgid "Going to try to stop instance" +msgstr "" + +#: cinder/compute/api.py:996 +msgid "Going to try to start instance" +msgstr "" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "" + +#: cinder/network/linux_net.py:1142 +#, python-format +msgid "Starting bridge %s " +msgstr "" + +#: cinder/network/linux_net.py:1149 +#, python-format +msgid "Done starting bridge %s" +msgstr "" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +#, fuzzy, python-format +msgid "Instance soft rebooted successfully." +msgstr "bind %s: slettet" + +#: cinder/virt/libvirt/connection.py:696 +msgid "Failed to soft reboot instance." +msgstr "" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "" + +#: cinder/virt/libvirt/connection.py:978 +msgid "Guest does not have a console available" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, python-format +msgid "VBD %s already detached" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:392 +#, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:895 +msgid "Failed to fetch glance image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +msgid "Starting instance" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +msgid "Failed to spawn, rolling back" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +msgid "Starting VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +msgid "Finished snapshot and upload for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:677 +msgid "Starting snapshot for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:686 +#, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +msgid "Destroying VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +msgid "Injecting network info to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1495 +#, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +msgid "Volume status must be available or error" +msgstr "" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +msgid "Volume Snapshot status must be available or error" +msgstr "" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "bind %s: slettet" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +msgid "Connected to DFM server" +msgstr "" + +#: cinder/volume/netapp.py:159 +#, python-format +msgid "Job failed: %s" +msgstr "" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, python-format +msgid "No LUN ID for volume %s" +msgstr "" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "" + +#: cinder/volume/netapp.py:614 +#, python-format +msgid "Failed to get host details for host ID %s" +msgstr "" + +#: cinder/volume/netapp.py:620 +#, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "" + +#: cinder/volume/netapp.py:625 +#, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, python-format +msgid "Got response: %s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:96 +#, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Zone %(zone_id)s could not be found." +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "" + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You can only" +#~ " run %s more instances of this " +#~ "type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to terminate %s" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Reconnected to queue" +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "response %s" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "" + +#~ msgid "message %s" +#~ msgstr "" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "" + +#~ msgid "Publishing to route %s" +#~ msgstr "" + +#~ msgid "Declaring queue %s" +#~ msgstr "" + +#~ msgid "Declaring exchange %s" +#~ msgstr "" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "" + +#~ msgid "cool, it's a device" +#~ msgstr "" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "" + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Snapshotting VM %(vm_ref)s with label '%(label)s'..." +#~ msgstr "" + +#~ msgid "Created snapshot %(template_vm_ref)s from VM %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "Size for image %(image)s:%(virtual_size)d" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "" + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "" + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "" + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "" + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Finished snapshot and upload for VM %s" +#~ msgstr "" + +#~ msgid "Starting snapshot for VM %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Creating VIF for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "Volume status must be available" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/de/LC_MESSAGES/nova.po b/cinder/locale/de/LC_MESSAGES/nova.po new file mode 100644 index 000000000..b9714c3e7 --- /dev/null +++ b/cinder/locale/de/LC_MESSAGES/nova.po @@ -0,0 +1,8208 @@ +# German translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2011-08-23 11:23+0000\n" +"Last-Translator: Thierry Carrez <thierry.carrez+lp@gmail.com>\n" +"Language-Team: German <de@li.org>\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 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "Dateiname der Root CA" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "Dateiname des Private Key" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "Wo wir unsere Schlüssel aufbewahren" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "Soll eine eigenständige CA für jedes Projekt verwendet werden?" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "Unerwarteter Fehler bei Ausführung des Kommandos." + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" +"%(description)s\n" +"Befehl: %(cmd)s\n" +"Exit-Code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "" + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "" + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "" + +#: cinder/exception.py:216 +#, fuzzy, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "keine Methode für diese Nachricht gefunden: %s" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "" + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "" + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "" + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "" + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "" + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "" + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "" + +#: cinder/exception.py:334 +msgid "Failed to terminate instance" +msgstr "" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, python-format +msgid "Could not fetch image %(image)s" +msgstr "" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "Das Service-Datenbank-Objekt ist verschwunden, es wird erneut erzeugt." + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "Alle vorhandenen FLAGS:" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "Hole %s" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "Führe Kommando (subprocess) aus: %s" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "Ergebnis war %s" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "" + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, python-format +msgid "QuotaError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "" + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:551 +msgid "Invalid CIDR" +msgstr "" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "" + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:725 +#, python-format +msgid "%s - This rule already exists in group" +msgstr "" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:959 +msgid "Detach Volume Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, python-format +msgid "Invalid mode: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +msgid "Security group is still in use" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "Verwende Project-Name = User-Name (%s)" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:46 +msgid "Instance type for vpn instances" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +msgid "Cannot run any more instances of this type." +msgstr "" + +#: cinder/compute/api.py:259 +#, python-format +msgid "Can only run %s more instances of this type." +msgstr "" + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "" + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +msgid "Going to try to soft delete instance" +msgstr "" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +msgid "Going to try to terminate instance" +msgstr "" + +#: cinder/compute/api.py:977 +msgid "Going to try to stop instance" +msgstr "" + +#: cinder/compute/api.py:996 +msgid "Going to try to start instance" +msgstr "" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "Instanz wurde bereits erstellt" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "Instanz %s: Rettung" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "Instanz %s pausiert" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "Instanz %s wird fortgesetzt" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "" + +#: cinder/network/linux_net.py:1142 +#, python-format +msgid "Starting bridge %s " +msgstr "" + +#: cinder/network/linux_net.py:1149 +#, python-format +msgid "Done starting bridge %s" +msgstr "" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "keine Methode für diese Nachricht gefunden: %s" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "keine Methode für diese Nachricht gefunden: %s" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "MSG_ID ist %s" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "Konnte Verbindung zum Hypervisor nicht öffnen" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +#, fuzzy, python-format +msgid "Instance soft rebooted successfully." +msgstr "Volume %s: erfolgreich erstellt" + +#: cinder/virt/libvirt/connection.py:696 +msgid "Failed to soft reboot instance." +msgstr "" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "" + +#: cinder/virt/libvirt/connection.py:978 +msgid "Guest does not have a console available" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, python-format +msgid "VBD %s already detached" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:392 +#, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:895 +msgid "Failed to fetch glance image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +msgid "Starting instance" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +msgid "Failed to spawn, rolling back" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +msgid "Starting VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +msgid "Finished snapshot and upload for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:677 +msgid "Starting snapshot for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:686 +#, fuzzy, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "Nicht möglich Volumen zur Instanze %s hinzuzufügen" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +msgid "Destroying VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +msgid "Injecting network info to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1495 +#, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "Nicht möglich Volumen zur Instanze %s hinzuzufügen" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "Einhängepunkt%(mountpoint)s zur Instanze %(instance_name)s hinzugefügt" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "Nicht möglich volume %s zufinden" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +msgid "Volume status must be available or error" +msgstr "" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +msgid "Volume Snapshot status must be available or error" +msgstr "" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "Volume %s: wird erstellt" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "Volume %s: erstelle Export" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "Volume %s: erfolgreich erstellt" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "Volume %s: entferne Export" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "Volume %s: wird entfernt" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "Volume %s: erfolgreich entfernt" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +msgid "Connected to DFM server" +msgstr "" + +#: cinder/volume/netapp.py:159 +#, python-format +msgid "Job failed: %s" +msgstr "" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, fuzzy, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "Nicht möglich volume %s zufinden" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, fuzzy, python-format +msgid "No LUN ID for volume %s" +msgstr "Nicht möglich volume %s zufinden" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "" + +#: cinder/volume/netapp.py:614 +#, python-format +msgid "Failed to get host details for host ID %s" +msgstr "" + +#: cinder/volume/netapp.py:620 +#, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "" + +#: cinder/volume/netapp.py:625 +#, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, python-format +msgid "Got response: %s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:96 +#, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Zone %(zone_id)s could not be found." +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "" + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You can only" +#~ " run %s more instances of this " +#~ "type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to terminate %s" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Reconnected to queue" +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "response %s" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "Betreff ist %s" + +#~ msgid "message %s" +#~ msgstr "Nachricht %s" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "" + +#~ msgid "Publishing to route %s" +#~ msgstr "" + +#~ msgid "Declaring queue %s" +#~ msgstr "" + +#~ msgid "Declaring exchange %s" +#~ msgstr "" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "" + +#~ msgid "cool, it's a device" +#~ msgstr "" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "" + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Snapshotting VM %(vm_ref)s with label '%(label)s'..." +#~ msgstr "" + +#~ msgid "Created snapshot %(template_vm_ref)s from VM %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "Size for image %(image)s:%(virtual_size)d" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "" + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "" + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "" + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "" + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Finished snapshot and upload for VM %s" +#~ msgstr "" + +#~ msgid "Starting snapshot for VM %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Creating VIF for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "Volume status must be available" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/en_AU/LC_MESSAGES/nova.po b/cinder/locale/en_AU/LC_MESSAGES/nova.po new file mode 100644 index 000000000..b9709b317 --- /dev/null +++ b/cinder/locale/en_AU/LC_MESSAGES/nova.po @@ -0,0 +1,8209 @@ +# English (Australia) translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2011-10-21 11:27+0000\n" +"Last-Translator: Tom Fifield <Unknown>\n" +"Language-Team: English (Australia) <en_AU@li.org>\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 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "Filename of root CA" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "Filename of private key" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "Where we keep our keys" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "Where we keep our root CA" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "Should we use a CA for each project?" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "Subject for certificate for users, %s for project, user, timestamp" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "Subject for certificate for projects, %s for project, timestamp" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "Flags path: %s" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "Unexpected error while running command." + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "" + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "" + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "" + +#: cinder/exception.py:216 +#, fuzzy, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "no method for message: %s" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "" + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "" + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "" + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "" + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "" + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "" + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "" + +#: cinder/exception.py:334 +#, fuzzy +msgid "Failed to terminate instance" +msgstr "Going to start terminating instances" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "User %(uid)s is already a member of the group %(group_dn)s" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, fuzzy, python-format +msgid "Could not fetch image %(image)s" +msgstr "Could not attach image to loopback: %s" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "Starting %(topic)s node (version %(vcs_string)s)" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "Service killed that has no database entry" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "The service database object disappeared, Recreating it." + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "Recovered model server connection!" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "model server went away" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "Inner Exception: %s" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "Fetching %s" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "Running cmd (subprocess): %s" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "Result was %s" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "Running cmd (SSH): %s" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "debug in callback: %s" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "Link Local address is not found.:%s" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "Couldn't get Link Local IP of %(interface)s :%(ex)s" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "Invalid backend: %s" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "backend %s" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "You must implement __call__" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "not available" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "Too many failed authentications." + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "Authentication Failure: %s" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "Authenticated Request For %(uname)s:%(pname)s)" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "action: %s" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "arg: %(key)s\t\tval: %(value)s" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "Unauthorised request for controller=%(controller)s and action=%(action)s" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "InstanceNotFound raised: %s" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "VolumeNotFound raised: %s" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "NotFound raised: %s" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, fuzzy, python-format +msgid "QuotaError raised: %s" +msgstr "Unexpected error raised: %s" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "Unexpected error raised: %s" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "An unknown error has occurred. Please try your request again." + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "Unsupported API request: controller = %(controller)s, action = %(action)s" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "Create key pair %s" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "Delete key pair %s" + +#: cinder/api/ec2/cloud.py:551 +msgid "Invalid CIDR" +msgstr "" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "Revoke security group ingress %s" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, fuzzy, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "Not enough parameters to build a valid rule." + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "No rule for the specified parameters." + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "Authorise security group ingress %s" + +#: cinder/api/ec2/cloud.py:725 +#, fuzzy, python-format +msgid "%s - This rule already exists in group" +msgstr "This rule already exists in group %s" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "Create Security Group %s" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "group %s already exists" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "Delete security group %s" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "Get console output for instance %s" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "Create volume of %s GB" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "Detach volume %s" + +#: cinder/api/ec2/cloud.py:959 +#, fuzzy, python-format +msgid "Detach Volume Failed." +msgstr "Detach volume %s" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "attribute not supported: %s" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "Allocate address" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "Release address %s" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "Associate address %(public_ip)s to instance %(instance_id)s" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "Disassociate address %s" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "Going to start terminating instances" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "Reboot instance %r" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "De-registering image %s" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "Registered image %(image_location)s with id %(image_id)s" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "user or group not specified" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "only group \"all\" is supported" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "operation_type must be add or remove" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "Updating image %s publicity" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "Failed to get metadata for ip: %s" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "Caught error: %s" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "Compute.api::pause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "Compute.api::unpause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "compute.api::suspend %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "compute.api::resume %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "Compute.api::reset_network %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "Compute.api::lock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "Compute.api::unlock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, fuzzy, python-format +msgid "Invalid mode: '%s'" +msgstr "Invalid backend: %s" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +#, fuzzy, python-format +msgid "Security group is still in use" +msgstr "Revoke security group ingress %s" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "Not enough parameters to build a valid rule." + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "This rule already exists in group %s" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "Attempted to instantiate singleton" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "Looking up user: %r" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "Failed authorisation for access key %s" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "Using project name = user name (%s)" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "failed authorisation: no project named %(pjid)s (user=%(uname)s)" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" +"Failed authorisation: user %(uname)s not admin and not member of project " +"%(pjname)s" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "Invalid signature for user %s" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "Must specify project" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "Adding role %(role)s to user %(uid)s in project %(pid)s" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "Adding sitewide role %(role)s to user %(uid)s" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "Removing role %(role)s from user %(uid)s on project %(pid)s" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "Removing sitewide role %(role)s from user %(uid)s" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "Created project %(name)s with manager %(manager_user)s" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "modifying project %s" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "Adding user %(uid)s to project %(pid)s" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "Remove user %(uid)s from project %(pid)s" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "Deleting project %s" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "Created user %(rvname)s (admin: %(rvadmin)r)" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "Deleting user %s" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "Access Key change for user %s" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "Secret Key change for user %s" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "Admin status set to %(admin)r for user %(uid)s" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "No vpn data for project %s" + +#: cinder/cloudpipe/pipelib.py:46 +#, fuzzy, python-format +msgid "Instance type for vpn instances" +msgstr "Get console output for instance %s" + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "Network to push into openvpn config" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "Netmask to push into openvpn config" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "Launching VPN for %s" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +#, fuzzy, python-format +msgid "Cannot run any more instances of this type." +msgstr "Instance quota exceeded. You can only run %s more instances of this type." + +#: cinder/compute/api.py:259 +#, fuzzy, python-format +msgid "Can only run %s more instances of this type." +msgstr "Instance quota exceeded. You can only run %s more instances of this type." + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "Creating a raw instance" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "Going to run %s instances..." + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +#, fuzzy, python-format +msgid "Going to try to soft delete instance" +msgstr "Going to try to terminate %s" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +#, fuzzy, python-format +msgid "Going to try to terminate instance" +msgstr "Going to try to terminate %s" + +#: cinder/compute/api.py:977 +#, fuzzy, python-format +msgid "Going to try to stop instance" +msgstr "Going to try to terminate %s" + +#: cinder/compute/api.py:996 +#, fuzzy, python-format +msgid "Going to try to start instance" +msgstr "Going to try to terminate %s" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "check_instance_lock: decorating: |%s|" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "check_instance_lock: locked: |%s|" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "check_instance_lock: admin: |%s|" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "check_instance_lock: executing: |%s|" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "check_instance_lock: not executing |%s|" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, fuzzy, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "After terminating instances: %s" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "Instance has already been created" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "Rebooting instance %s" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "instance %s: snapshotting" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "instance %s: rescuing" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "instance %s: unrescuing" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "instance %s: pausing" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "instance %s: unpausing" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "instance %s: retrieving diagnostics" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "instance %s: suspending" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "instance %s: resuming" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "instance %s: locking" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "instance %s: unlocking" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "instance %s: getting locked state" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "instance %s: reset network" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "Detaching volume from unknown instance %s" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "Adding console" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "Tried to remove non-existent console %(console_id)s." + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "Rebuilding xvp conf" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "Re-wrote %s" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "Stopping xvp" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "Starting xvp" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "Error starting xvp: %s" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "Restarting xvp" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "xvp not running..." + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "Use of empty request context is deprecated" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "python-migrate is not installed. Exiting." + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "Failed to decrypt private key: %s" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "Failed to decrypt initialisation vector: %s" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "Failed to decrypt image file %(image_file)s: %(err)s" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "Hupping dnsmasq threw %s" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "Pid %d is stale, relaunching dnsmasq" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "killing radvd threw %s" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "Pid %d is stale, relaunching radvd" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "Starting VLAN inteface %s" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "Starting Bridge interface for %s" + +#: cinder/network/linux_net.py:1142 +#, fuzzy, python-format +msgid "Starting bridge %s " +msgstr "Starting Bridge interface for %s" + +#: cinder/network/linux_net.py:1149 +#, fuzzy, python-format +msgid "Done starting bridge %s" +msgstr "Error starting xvp: %s" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "setting network host" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "IP %s released that was not leased" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "Returning exception %s to caller" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "unpacked context: %s" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "received %s" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "no method for message: %s" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "No method for message: %s" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "MSG_ID is %s" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "Must implement a fallback schedule" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "Running instances: %s" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "After terminating instances: %s" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "start address" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "Target %s allocated" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "Nested received %(queue)s, %(value)s" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "Nested return %s" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "Received %s" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "Failed to open connection to the hypervisor" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "Attempted to unfilter instance %s which is not filtered" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "Got exception: %s" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "instance %(instance_name)s: deleting instance files %(target)s" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "instance %s: rebooted" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "instance %s: rescued" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "instance %s: booted" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "instance %s: Creating image" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "instance %s: starting toXML method" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "instance %s: finished toXML method" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "Failed to mount filesystem: %s" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "Could not attach image to loopback: %s" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "No free nbd devices" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "nbd device %s did not show up" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "Connecting to libvirt: %s" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "Connection to libvirt broke" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +#, fuzzy, python-format +msgid "Instance soft rebooted successfully." +msgstr "instance %s: rebooted" + +#: cinder/virt/libvirt/connection.py:696 +msgid "Failed to soft reboot instance." +msgstr "" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "data: %(data)r, fpath: %(fpath)r" + +#: cinder/virt/libvirt/connection.py:978 +msgid "Guest does not have a console available" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "Unable to find an open port" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "%(text)s: _db_content => %(content)s" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "Raising NotImplemented" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "xenapi.fake does not have an implementation for %s" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "Calling %(localname)s %(impl)s" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "Calling getter %s" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "Found non-unique network for bridge %s" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "Found no network for bridge %s" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, fuzzy, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "Unable to detach volume %s" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "VBD not found in instance %s" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, fuzzy, python-format +msgid "VBD %s already detached" +msgstr "group %s already exists" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "Unable to unplug VBD %s" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "Unable to destroy VBD %s" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, fuzzy, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, fuzzy, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "Snapshotting VM %(vm_ref)s with label '%(label)s'..." + +#: cinder/virt/xenapi/vm_utils.py:392 +#, fuzzy, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "Created snapshot %(template_vm_ref)s from VM %(vm_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, fuzzy, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "Size for image %(image)s:%(virtual_size)d" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "Copying VDI %s to /boot/guest on dom0" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "Kernel/Ramdisk VDI %s destroyed" + +#: cinder/virt/xenapi/vm_utils.py:895 +msgid "Failed to fetch glance image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "Looking up vdi %s for PV kernel" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "VDI %s is still available" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "(VM_UTILS) xenserver vm state -> |%s|" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "(VM_UTILS) xenapi power_state -> |%s|" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "Re-scanning SR %s" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "VHD %(vdi_uuid)s has parent %(parent_ref)s" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "Plugging VBD %s ... " + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "Plugging VBD %s done." + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "Destroying VBD for VDI %s ... " + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "Destroying VBD for VDI %s done." + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "Running pygrub against %s" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "Found Xen kernel %s" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "No Xen kernel found. Booting HVM." + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "Writing partition table %s done." + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +#, fuzzy +msgid "Starting instance" +msgstr "Creating a raw instance" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +msgid "Failed to spawn, rolling back" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "Injecting file path: '%s'" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +#, fuzzy +msgid "Starting VM" +msgstr "Restarting xvp" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +#, fuzzy, python-format +msgid "Finished snapshot and upload for VM" +msgstr "Finished snapshot and upload for VM %s" + +#: cinder/virt/xenapi/vmops.py:677 +#, fuzzy, python-format +msgid "Starting snapshot for VM" +msgstr "Starting snapshot for VM %s" + +#: cinder/virt/xenapi/vmops.py:686 +#, fuzzy, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "Unable to attach volume to instance %s" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "kernel/ramdisk files removed" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +#, fuzzy +msgid "Destroying VM" +msgstr "Restarting xvp" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +#, fuzzy +msgid "Injecting network info to xenstore" +msgstr "setting network host" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, fuzzy, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "Creating VIF for VM %(vm_ref)s, network %(network_ref)s." + +#: cinder/virt/xenapi/vmops.py:1495 +#, fuzzy, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "Creating VIF for VM %(vm_ref)s, network %(network_ref)s." + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "OpenSSL error: %s" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "Unable to create Storage Repository" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "Introduced %(label)s as %(sr_ref)s." + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "Introducing %s..." + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "Unable to find SR from VBD %s" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "Unable to introduce VDI on SR %s" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "Unable to get record of VDI %s on" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "Unable to introduce VDI for SR %s" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "Mountpoint cannot be translated: %s" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "Unable to use SR %(sr_ref)s for instance %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "Unable to attach volume to instance %s" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "Detach_volume: %(instance_name)s, %(mountpoint)s" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "Unable to locate volume %s" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "Unable to detach volume %s" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +#, fuzzy +msgid "Volume status must be available or error" +msgstr "Volume status must be available" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +#, fuzzy +msgid "Volume Snapshot status must be available or error" +msgstr "Volume status must be available" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "Recovering from a failed execute. Try number %s" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "volume group %s doesn't exist" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "Could not find iSCSI export for volume %s" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "FAKE ISCSI: %s" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "rbd has no pool %s" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "Sheepdog is not working: %s" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "Sheepdog is not working" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "Re-exporting %s volumes" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "volume %s: skipping export" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "volume %s: creating" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "volume %(vol_name)s: creating logical volume of size %(vol_size)sG" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "volume %s: creating export" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "volume %s: created successfully" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "Volume is still attached" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "Volume is not local to this node" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "volume %s: removing export" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "volume %s: deleting" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "volume %s: deleted successfully" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, fuzzy, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "instance %s: snapshotting" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +#, fuzzy +msgid "Connected to DFM server" +msgstr "Reconnected to queue" + +#: cinder/volume/netapp.py:159 +#, fuzzy, python-format +msgid "Job failed: %s" +msgstr "NotFound raised: %s" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, fuzzy, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "Could not find iSCSI export for volume %s" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, fuzzy, python-format +msgid "No LUN ID for volume %s" +msgstr "Could not find iSCSI export for volume %s" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, fuzzy, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "Failed to get metadata for ip: %s" + +#: cinder/volume/netapp.py:614 +#, fuzzy, python-format +msgid "Failed to get host details for host ID %s" +msgstr "Failed to get metadata for ip: %s" + +#: cinder/volume/netapp.py:620 +#, fuzzy, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "Failed to get metadata for ip: %s" + +#: cinder/volume/netapp.py:625 +#, fuzzy, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "Failed to get metadata for ip: %s" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, fuzzy, python-format +msgid "Got response: %s" +msgstr "response %s" + +#: cinder/volume/nexenta/volume.py:96 +#, fuzzy, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "volume group %s doesn't exist" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Zone %(zone_id)s could not be found." +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "" + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "trying to destroy already destroyed instance: %s" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "Initing the Adapter Consumer for %s" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "topic is %s" + +#~ msgid "message %s" +#~ msgstr "message %s" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "(%(nm)s) publish (key: %(routing_key)s) %(message)s" + +#~ msgid "Publishing to route %s" +#~ msgstr "Publishing to route %s" + +#~ msgid "Declaring queue %s" +#~ msgstr "Declaring queue %s" + +#~ msgid "Declaring exchange %s" +#~ msgstr "Declaring exchange %s" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "Binding %(queue)s to %(exchange)s with key %(routing_key)s" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "Getting from %(queue)s: %(message)s" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "Task [%(name)s] %(task)s status: success %(result)s" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "virsh said: %r" + +#~ msgid "cool, it's a device" +#~ msgstr "cool, it's a device" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "Created VM %s..." + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "Created VM %(instance_name)s as %(vm_ref)s." + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "Creating VBD for VDI %s ... " + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "Creating VBD for VDI %s done." + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "VBD.unplug successful first time." + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "VBD.unplug rejected: retrying..." + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "VBD.unplug successful eventually." + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "Ignoring XenAPI.Failure in VBD.unplug: %s" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "Ignoring XenAPI.Failure %s" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "instance %s: Failed to spawn" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "Starting VM %s..." + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/en_GB/LC_MESSAGES/nova.po b/cinder/locale/en_GB/LC_MESSAGES/nova.po new file mode 100644 index 000000000..cb8d062f3 --- /dev/null +++ b/cinder/locale/en_GB/LC_MESSAGES/nova.po @@ -0,0 +1,8209 @@ +# English (United Kingdom) translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2012-03-30 11:10+0000\n" +"Last-Translator: Anthony Harrington <untaintableangel@hotmail.co.uk>\n" +"Language-Team: English (United Kingdom) <en_GB@li.org>\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 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "Filename of root CA" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "Filename of private key" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "Filename of root Certificate Revocation List" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "Where we keep our keys" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "Where we keep our root CA" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "Should we use a CA for each project?" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "Subject for certificate for users, %s for project, user, timestamp" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "Subject for certificate for projects, %s for project, timestamp" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "Flags path: %s" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "Unexpected error while running command." + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "DB exception wrapped." + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "An unknown exception occurred." + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "Failed to decrypt text" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "Failed to paginate through images from image service" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "Virtual Interface creation failed" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "5 attempts to create virtual interface with unique mac address failed" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "Connection to glance failed" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "Connection to melange failed" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "Not authorised." + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "User does not have admin privileges" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "Policy doesn't allow %(action)s to be performed." + +#: cinder/exception.py:216 +#, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "Unacceptable parameters." + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "Invalid snapshot" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "Volume %(volume_id)s is not attached to anything" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "Keypair data is invalid" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "Failed to load data into json format" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "The request is invalid." + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "Invalid signature %(signature)s for user %(user)s." + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "Invalid input received" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "Invalid instance type %(instance_type)s." + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "Invalid volume type" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "Invalid volume" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "Invalid IP protocol %(protocol)s." + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "Invalid content type %(content_type)s." + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "Invalid cidr %(cidr)s." + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "Invalid reuse of an RPC connection." + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "%(err)s" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "Instance %(instance_id)s is not running." + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "" + +#: cinder/exception.py:334 +msgid "Failed to terminate instance" +msgstr "" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, python-format +msgid "Could not fetch image %(image)s" +msgstr "" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "" + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "Full set of FLAGS:" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "Inner Exception: %s" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "Fetching %s" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "Running cmd (subprocess): %s" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "Result was %s" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "Running cmd (SSH): %s" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "debug in callback: %s" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "Link Local address is not found.:%s" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "Couldn't get Link Local IP of %(interface)s :%(ex)s" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "Invalid backend: %s" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "backend %s" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "" + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, python-format +msgid "QuotaError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "" + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:551 +#, fuzzy, python-format +msgid "Invalid CIDR" +msgstr "Invalid cidr %(cidr)s." + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "" + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:725 +#, python-format +msgid "%s - This rule already exists in group" +msgstr "" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "Get console output for instance %s" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:959 +msgid "Detach Volume Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "Compute.api::pause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "Compute.api::unpause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "compute.api::suspend %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "compute.api::resume %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "Compute.api::reset_network %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "Compute.api::lock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "Compute.api::unlock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, fuzzy, python-format +msgid "Invalid mode: '%s'" +msgstr "Invalid backend: %s" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +msgid "Security group is still in use" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:46 +#, fuzzy, python-format +msgid "Instance type for vpn instances" +msgstr "Invalid instance type %(instance_type)s." + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +msgid "Cannot run any more instances of this type." +msgstr "" + +#: cinder/compute/api.py:259 +#, python-format +msgid "Can only run %s more instances of this type." +msgstr "" + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "" + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +msgid "Going to try to soft delete instance" +msgstr "" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +msgid "Going to try to terminate instance" +msgstr "" + +#: cinder/compute/api.py:977 +msgid "Going to try to stop instance" +msgstr "" + +#: cinder/compute/api.py:996 +msgid "Going to try to start instance" +msgstr "" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "check_instance_lock: decorating: |%s|" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "check_instance_lock: locked: |%s|" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "check_instance_lock: admin: |%s|" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "check_instance_lock: executing: |%s|" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "check_instance_lock: not executing |%s|" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "Instance has already been created" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "Rebooting instance %s" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "instance %s: snapshotting" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "instance %s: rescuing" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "instance %s: pausing" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "instance %s: retrieving diagnostics" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "instance %s: suspending" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "instance %s: resuming" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "instance %s: locking" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "instance %s: unlocking" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "instance %s: getting locked state" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "instance %s: reset network" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "Detaching volume from unknown instance %s" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "Use of empty request context is deprecated" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "Hupping dnsmasq threw %s" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "Pid %d is stale, relaunching dnsmasq" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "killing radvd threw %s" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "Pid %d is stale, relaunching radvd" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "Starting VLAN inteface %s" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "Starting Bridge interface for %s" + +#: cinder/network/linux_net.py:1142 +#, fuzzy, python-format +msgid "Starting bridge %s " +msgstr "Starting Bridge interface for %s" + +#: cinder/network/linux_net.py:1149 +#, python-format +msgid "Done starting bridge %s" +msgstr "" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "Nested received %(queue)s, %(value)s" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "Nested return %s" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "Received %s" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "Failed to open connection to the hypervisor" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +#, fuzzy, python-format +msgid "Instance soft rebooted successfully." +msgstr "volume %s: created successfully" + +#: cinder/virt/libvirt/connection.py:696 +msgid "Failed to soft reboot instance." +msgstr "" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "" + +#: cinder/virt/libvirt/connection.py:978 +#, fuzzy +msgid "Guest does not have a console available" +msgstr "User does not have admin privileges" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "%(text)s: _db_content => %(content)s" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "Raising NotImplemented" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "xenapi.fake does not have an implementation for %s" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "Calling %(localname)s %(impl)s" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "Calling getter %s" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, fuzzy, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "Unable to detach volume %s" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "VBD not found in instance %s" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, python-format +msgid "VBD %s already detached" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "Unable to unplug VBD %s" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "Unable to destroy VBD %s" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, fuzzy, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, fuzzy, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "Snapshotting VM %(vm_ref)s with label '%(label)s'..." + +#: cinder/virt/xenapi/vm_utils.py:392 +#, fuzzy, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "Created snapshot %(template_vm_ref)s from VM %(vm_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, fuzzy, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "Size for image %(image)s:%(virtual_size)d" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "Copying VDI %s to /boot/guest on dom0" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "Kernel/Ramdisk VDI %s destroyed" + +#: cinder/virt/xenapi/vm_utils.py:895 +msgid "Failed to fetch glance image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "Looking up vdi %s for PV kernel" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "VDI %s is still available" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "(VM_UTILS) xenserver vm state -> |%s|" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "(VM_UTILS) xenapi power_state -> |%s|" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "Re-scanning SR %s" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "VHD %(vdi_uuid)s has parent %(parent_ref)s" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "Plugging VBD %s ... " + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "Plugging VBD %s done." + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "Destroying VBD for VDI %s ... " + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "Destroying VBD for VDI %s done." + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "Running pygrub against %s" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "Found Xen kernel %s" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "No Xen kernel found. Booting HVM." + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "Writing partition table %s done." + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +#, fuzzy, python-format +msgid "Starting instance" +msgstr "Rebooting instance %s" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +msgid "Failed to spawn, rolling back" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +msgid "Starting VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +msgid "Finished snapshot and upload for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:677 +msgid "Starting snapshot for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:686 +#, fuzzy, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "Unable to attach volume to instance %s" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +msgid "Destroying VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, fuzzy, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "Instance %(instance_id)s is not running." + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +msgid "Injecting network info to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, fuzzy, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "Creating VIF for VM %(vm_ref)s, network %(network_ref)s." + +#: cinder/virt/xenapi/vmops.py:1495 +#, fuzzy, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "Creating VIF for VM %(vm_ref)s, network %(network_ref)s." + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "Unable to use SR %(sr_ref)s for instance %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "Unable to attach volume to instance %s" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "Detach_volume: %(instance_name)s, %(mountpoint)s" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "Unable to locate volume %s" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "Unable to detach volume %s" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +#, fuzzy +msgid "Volume status must be available or error" +msgstr "Volume status must be available" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +#, fuzzy +msgid "Volume Snapshot status must be available or error" +msgstr "Volume status must be available" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "Re-exporting %s volumes" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "volume %s: skipping export" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "volume %s: creating" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "volume %(vol_name)s: creating lv of size %(vol_size)sG" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "volume %s: creating export" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "volume %s: created successfully" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "Volume is still attached" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "Volume is not local to this node" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "volume %s: removing export" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "volume %s: deleting" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "volume %s: deleted successfully" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, fuzzy, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "instance %s: snapshotting" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +msgid "Connected to DFM server" +msgstr "" + +#: cinder/volume/netapp.py:159 +#, python-format +msgid "Job failed: %s" +msgstr "" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, fuzzy, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "Unable to locate volume %s" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, fuzzy, python-format +msgid "No LUN ID for volume %s" +msgstr "Unable to locate volume %s" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "" + +#: cinder/volume/netapp.py:614 +#, python-format +msgid "Failed to get host details for host ID %s" +msgstr "" + +#: cinder/volume/netapp.py:620 +#, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "" + +#: cinder/volume/netapp.py:625 +#, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, python-format +msgid "Got response: %s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:96 +#, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Zone %(zone_id)s could not be found." +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "" + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You can only" +#~ " run %s more instances of this " +#~ "type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to terminate %s" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "trying to destroy already destroyed instance: %s" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Reconnected to queue" +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "response %s" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "" + +#~ msgid "message %s" +#~ msgstr "" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "(%(nm)s) publish (key: %(routing_key)s) %(message)s" + +#~ msgid "Publishing to route %s" +#~ msgstr "Publishing to route %s" + +#~ msgid "Declaring queue %s" +#~ msgstr "Declaring queue %s" + +#~ msgid "Declaring exchange %s" +#~ msgstr "Declaring exchange %s" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "Binding %(queue)s to %(exchange)s with key %(routing_key)s" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "Getting from %(queue)s: %(message)s" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "" + +#~ msgid "cool, it's a device" +#~ msgstr "" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "Created VM %s..." + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "Created VM %(instance_name)s as %(vm_ref)s." + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "Creating VBD for VDI %s ... " + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "Creating VBD for VDI %s done." + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "VBD.unplug successful first time." + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "VBD.unplug rejected: retrying..." + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "VBD.unplug successful eventually." + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "Ignoring XenAPI.Failure in VBD.unplug: %s" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "Ignoring XenAPI.Failure %s" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "instance %s: Failed to spawn" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "" + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Finished snapshot and upload for VM %s" +#~ msgstr "" + +#~ msgid "Starting snapshot for VM %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/es/LC_MESSAGES/nova.po b/cinder/locale/es/LC_MESSAGES/nova.po new file mode 100644 index 000000000..836900e35 --- /dev/null +++ b/cinder/locale/es/LC_MESSAGES/nova.po @@ -0,0 +1,8220 @@ +# Spanish translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2012-03-10 06:08+0000\n" +"Last-Translator: Oscar Rosario <oscar.inirio@gmail.com>\n" +"Language-Team: Spanish <es@li.org>\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 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "Nombre de fichero de la CA raÃz" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "Nombre de fichero de la clave privada" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "Donde guardamos nuestras claves" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "Dónde guardamos nuestra CA raÃz" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "¿DeberÃamos usar una CA para cada proyecto?" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "" +"Sujeto (Subject) para el certificado de usuarios, %s para el proyecto, " +"usuario, marca de tiempo" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "" +"Sujeto (Subject) para el certificado del proyecto, %s para el proyecto, " +"marca de tiempo" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "Ruta a las opciones: %s" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "Error inesperado mientras el comando se ejecutaba" + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" +"%(description)s\n" +"Comando: %(cmd)s\n" +"Código de salida: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "Una excepcion desconocida ha ocurrido" + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "Fallo al desencriptar el texto" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "Creacion de interfaz virtual fallida" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "Coneccion con glance fallida" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "No Autorizado" + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "El usuario no tiene privilegios de administrador" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "" + +#: cinder/exception.py:216 +#, fuzzy, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "no hay método para el mensaje: %s" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "Parametros inaceptables" + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "Captura no valida" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "Fallo al ingresar informacion en formato json" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "La petición es inválida." + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "Firma invalida %(signature)s para el usuario %(user)s" + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "Entrada invalida recibida" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "" + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "Rango de puertos invalido %(from_port)s:%(to_port)s. %(msg)s" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "Protocolo IP invalido %(protocol)s" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "Tipo de contenido invalido %(content_type)s." + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "Cidr %(cidr)s invalido" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "Reuso invalido de una coneccion RPC" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "La instacia %(instance_id)s no se esta ejecutando" + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "La instacia %(instance_id)s no esta suspendida" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "La instancia %(instance_id)s no esta en modo de rescate" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "Fallo al suspender la instancia" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "Fallo al resumir el servidor" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "Fallo a reinicia la instancia" + +#: cinder/exception.py:334 +#, fuzzy +msgid "Failed to terminate instance" +msgstr "Fallo a reinicia la instancia" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "El servicio no esta disponible en este momento" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "El servicio de computo no esta disponible en este momento" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" +"Incapaz de emigrar la instancia %(instance_id)s al actual anfitrion " +"(%(host)s)" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "El destino del anfitrion de computo no esta disponible en este momento" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "El anfitrion de computo no esta disponible en este momento" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "Informacion del CPU inaceptable" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "%(address)s no es una direccion IP v4/6 valida" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "Formato de disco %(disk_format)s no es aceptable" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "El usuario %(uid)s es actualmente miembro del grupo %(group_dn)s" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, fuzzy, python-format +msgid "Could not fetch image %(image)s" +msgstr "No se puede unir la imagen con el loopback: %s" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "Se detuvo un servicio sin entrada en la base de datos" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "El servicio objeto de base de datos ha desaparecido, recreándolo." + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "Recuperada la conexión al servidor de modelos." + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "el servidor de modelos se ha ido" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "Conjunto completo de opciones (FLAGS):" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "Excepción interna: %s" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "Obteniendo %s" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "Ejecutando cmd (subprocesos): %s" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "El resultado fue %s" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "corriendo cmd (SSH): %s" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "Depuración de la devolución de llamada: %s" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "No se encuentra la dirección del enlace local.:%s" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "No se pudo obtener enlace de la ip local de %(interface)s :%(ex)s" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "backend inválido: %s" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "backend %s" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "Demasiados intentos de autenticacion fallidos." + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "Fallo de autenticación: %s" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "acción: %s" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "No encontrado: %s" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, fuzzy, python-format +msgid "QuotaError raised: %s" +msgstr "Sucedió un error inexperado: %s" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "Sucedió un error inexperado: %s" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "Ha sucedido un error desconocido. Por favor repite el intento de nuevo." + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "Creando par de claves %s" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "Borrar para de claves %s" + +#: cinder/api/ec2/cloud.py:551 +#, fuzzy, python-format +msgid "Invalid CIDR" +msgstr "Cidr %(cidr)s invalido" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "Revocar ingreso al grupo de seguridad %s" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "No hay regla para los parámetros especificados." + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "Autorizar ingreso al grupo de seguridad %s" + +#: cinder/api/ec2/cloud.py:725 +#, fuzzy, python-format +msgid "%s - This rule already exists in group" +msgstr "Esta regla ya existe en el grupo %s" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "Crear Grupo de Seguridad %s" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "el grupo %s ya existe" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "Borrar grupo de seguridad %s" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "Obtener salida de la consola para la instancia %s" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "Crear volumen de %s GB" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "Desasociar volumen %s" + +#: cinder/api/ec2/cloud.py:959 +#, fuzzy, python-format +msgid "Detach Volume Failed." +msgstr "Desasociar volumen %s" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "atributo no soportado: %s" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "Asignar dirección" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "Liberar dirección %s" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "Desasociar dirección %s" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "Se va a iniciar la finalización de las instancias" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "Reiniciar instancia %r" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "Des-registrando la imagen %s" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "usuario o grupo no especificado" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "sólo el grupo \"all\" está soportado" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "operation_type debe ser añadir o eliminar" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "Actualizando imagen %s públicamente" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "Fallo al generar metadatos para la ip %s" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "Capturado error: %s" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "Compute.api::pause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "Compute.api::unpause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "compute.api::suspend %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "compute.api::resume %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "Compute.api::reset_network %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "Compute.api::lock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "Compute.api::unlock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, fuzzy, python-format +msgid "Invalid mode: '%s'" +msgstr "backend inválido: %s" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +#, fuzzy, python-format +msgid "Security group is still in use" +msgstr "Revocar ingreso al grupo de seguridad %s" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "Esta regla ya existe en el grupo %s" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "Intento de instanciar sigleton" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" +"Se ha intentado eliminar el último miembro de un grupo. Eliminando el " +"grupo %s en su lugar." + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "Buscando usuario: %r" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "Fallo de autorización para la clave de acceso %s" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "Utilizando nombre de proyecto = nombre de usuario (%s)" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "Firma invalida para el usuario %s" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "Debes especificar un proyecto" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "Creado el proyecto %(name)s con administrador %(manager_user)s" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "Modificando proyecto %s" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "Agregando usuario %(uid)s para el proyecto %(pid)s" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "Borrar usuario %(uid)s del proyecto %(pid)s" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "Borrando proyecto %s" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "Borrando usuario %s" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "Cambio de clave de acceso para el usuario %s" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "Cambio de clave secreta para el usuario %s" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "No hay datos vpn para el proyecto %s" + +#: cinder/cloudpipe/pipelib.py:46 +#, fuzzy, python-format +msgid "Instance type for vpn instances" +msgstr "Obtener salida de la consola para la instancia %s" + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "Red a insertar en la configuración de openvpn" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "Mascara de red a insertar en la configuración de openvpn" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "Lanzando VPN para %s" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +#, fuzzy, python-format +msgid "Cannot run any more instances of this type." +msgstr "" +"Quota de instancias superada. Sólo puedes ejecutar %s instancias más de " +"este tipo." + +#: cinder/compute/api.py:259 +#, fuzzy, python-format +msgid "Can only run %s more instances of this type." +msgstr "" +"Quota de instancias superada. Sólo puedes ejecutar %s instancias más de " +"este tipo." + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "Creando una instancia raw" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "Vamos a ejecutar %s insntacias..." + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +#, fuzzy, python-format +msgid "Going to try to soft delete instance" +msgstr "Vamos a ejecutar %s insntacias..." + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +#, fuzzy +msgid "Going to try to terminate instance" +msgstr "Se va a iniciar la finalización de las instancias" + +#: cinder/compute/api.py:977 +#, fuzzy, python-format +msgid "Going to try to stop instance" +msgstr "Vamos a ejecutar %s insntacias..." + +#: cinder/compute/api.py:996 +#, fuzzy, python-format +msgid "Going to try to start instance" +msgstr "Vamos a ejecutar %s insntacias..." + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "check_instance_lock: decorating: |%s|" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "check_instance_lock: locked: |%s|" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "check_instance_lock: admin: |%s|" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "check_instance_lock: ejecutando: |%s|" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "check_instance_lock: no ejecutando |%s|" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, fuzzy, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "Después de terminar las instancias: %s" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "La instancia ha sido creada previamente" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "Reiniciando instancia %s" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "instancia %s: creando snapshot" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "instancia %s: rescatando" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "instancia %s: pausando" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "instancia %s: continuando tras pausa" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "instancia %s: obteniendo los diagnosticos" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "instancia %s: suspendiendo" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "instancia %s: continuando" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "instancia %s: bloqueando" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "instancia %s: desbloqueando" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "instancia %s: pasando a estado bloqueado" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "instancia %s: reiniciar redes" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, fuzzy, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "La instancia %(instance_id)s no esta en modo de rescate" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "Desvinculando volumen de instancia desconocida %s" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "El uso de una petición de contexto vacÃa está en desuso" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "Excepción al recargar la configuración de dnsmasq: %s" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "El pid %d está pasado, relanzando dnsmasq" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "Matando radvd lanzado %s" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "Pid %d corrupto, relanzando radvd" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "Iniciando interfaz VLAN %s" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "Iniciando interfaz puente para %s" + +#: cinder/network/linux_net.py:1142 +#, fuzzy, python-format +msgid "Starting bridge %s " +msgstr "Iniciando interfaz puente para %s" + +#: cinder/network/linux_net.py:1149 +#, fuzzy, python-format +msgid "Done starting bridge %s" +msgstr "Des-registrando la imagen %s" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "configurando la red del host" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "contenido desempaquetado: %s" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "recibido %s" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "no hay método para el mensaje: %s" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "No hay método para el mensaje: %s" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "MSG_ID es %s" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "Debe de implementar un horario de reserva" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, fuzzy, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "La instacia %(instance_id)s no esta suspendida" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "Ejecutando instancias: %s" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "Después de terminar las instancias: %s" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "Destino %s asignado" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "Recibido %s" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "Fallo al abrir conexión con el hypervisor" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" +"Debes especificar xenapi_connection_url, xenapi_connection_username " +"(opcional), y xenapi_connection_password para usar connection_type=xenapi" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "Obtenida excepción %s" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "instancia %s: reiniciada" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "instancia %s: rescatada" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "instancia %s: arrancada" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "instancia %s: Creando imagen" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "instancia %s: comenzando método toXML" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "instancia %s: finalizado método toXML" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "Fallo al montar el sistema de ficheros: %s" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "No se puede unir la imagen con el loopback: %s" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "Conectando a libvirt: %s" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "Conexión a libvirt rota" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +#, fuzzy, python-format +msgid "Instance soft rebooted successfully." +msgstr "instancia %s: reiniciada" + +#: cinder/virt/libvirt/connection.py:696 +#, fuzzy +msgid "Failed to soft reboot instance." +msgstr "Fallo a reinicia la instancia" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "" + +#: cinder/virt/libvirt/connection.py:978 +#, fuzzy +msgid "Guest does not have a console available" +msgstr "El usuario no tiene privilegios de administrador" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "%(text)s: _db_content => %(content)s" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "Lanzando NotImplemented" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "xenapi.fake no tiene una implementación para %s" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "Llamando %(localname)s %(impl)s" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "Llanado al adquiridor %s" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" +"xenapi.fake no tiene una implementación para %s o ha sido llamada con un " +"número incorrecto de argumentos" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "Encontrada una red no única para el puente %s" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "No se ha encontrado red para el puente %s" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, fuzzy, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "Imposible desasociar volumen %s" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "VBD no encontrado en la instancia %s" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, fuzzy, python-format +msgid "VBD %s already detached" +msgstr "el grupo %s ya existe" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "Imposible desconectar VBD %s" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "Imposible destruir VBD %s" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, fuzzy, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "Creado el VBD %(vbd_ref)s para VM %(vm_ref)s, VDI %(vdi_ref)s" + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "Creado el VBD %(vbd_ref)s para VM %(vm_ref)s, VDI %(vdi_ref)s" + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" +"VDI creado %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s) " +"sobre %(sr_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, fuzzy, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "Creando snapshot de la VM %(vm_ref)s con etiqueta '%(label)s'..." + +#: cinder/virt/xenapi/vm_utils.py:392 +#, fuzzy, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "Instantánea creada %(template_vm_ref)s de la VM %(vm_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "Pidiendo xapi a subir %(vdi_uuids)s como ID %(image_id)s" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, fuzzy, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "Tamaño para imagen %(image)s:%(virtual_size)d" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "Copiando VDI %s a /boot/guest on dom0" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "Kernel/Ramdisk VDI %s destruÃdo" + +#: cinder/virt/xenapi/vm_utils.py:895 +#, fuzzy +msgid "Failed to fetch glance image" +msgstr "Fallo a reinicia la instancia" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "Buscando vid %s para el kernel PV" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "VDI %s está todavÃa disponible" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "(VM_UTILS) xenserver vm state -> |%s|" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "(VM_UTILS) xenapi power_state -> |%s|" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "Re-escaneando SR %s" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "VHD %(vdi_uuid)s tiene origen en %(parent_ref)s" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "Ejecutando pygrub contra %s" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "Kernel Xen Encontrado %s" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "Kernel Xen no encontrado. Reiniciando HVM" + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +#, fuzzy +msgid "Starting instance" +msgstr "Creando una instancia raw" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +#, fuzzy +msgid "Failed to spawn, rolling back" +msgstr "Fallo al suspender la instancia" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +msgid "Starting VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +#, fuzzy, python-format +msgid "Finished snapshot and upload for VM" +msgstr "Finalizado el snapshot y la subida de la VM %s" + +#: cinder/virt/xenapi/vmops.py:677 +#, fuzzy, python-format +msgid "Starting snapshot for VM" +msgstr "Comenzando snapshot para la VM %s" + +#: cinder/virt/xenapi/vmops.py:686 +#, fuzzy, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "Imposible adjuntar volumen a la instancia %s" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +msgid "Destroying VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, fuzzy, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "La instacia %(instance_id)s no esta suspendida" + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +#, fuzzy +msgid "Injecting network info to xenstore" +msgstr "configurando la red del host" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, fuzzy, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "Creando VIF para VM %(vm_ref)s, red %(network_ref)s." + +#: cinder/virt/xenapi/vmops.py:1495 +#, fuzzy, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "Creando VIF para VM %(vm_ref)s, red %(network_ref)s." + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "Imposible crear el repositorio de almacenamiento" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "Introduciendo %s..." + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "Imposible encontrar SR en VBD %s" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "Incapaz de insertar VDI en SR %s" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "Imposible obtener copia del VDI %s en" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "Inposible insertar VDI para SR %s" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "Punto de montaje no puede ser traducido: %s" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" +"No es posible crear el VDI en SR %(sr_ref)s para la instancia " +"%(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "No es posible usar SR %(sr_ref)s para la instancia %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "Imposible adjuntar volumen a la instancia %s" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "" +"El punto de montaje %(mountpoint)s esta unido a la instancia " +"%(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "Volume_separado: %(instance_name)s, %(mountpoint)s" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "Imposible encontrar volumen %s" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "Imposible desasociar volumen %s" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "" +"El punto de montaje %(mountpoint)s se desligó de la instancia " +"%(instance_name)s" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +#, fuzzy +msgid "Volume status must be available or error" +msgstr "El estado del volumen debe estar disponible" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +#, fuzzy +msgid "Volume Snapshot status must be available or error" +msgstr "El estado del volumen debe estar disponible" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "Recuperandose de una ejecución fallida. Intenta el número %s" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "el grupo de volumenes %s no existe" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "Falso ISCSI: %s" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "Exportando de nuevo los volumenes %s" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "volume %s: saltando exportación" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "volumen %s: creando" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "volume %(vol_name)s: creando lv del tamaño %(vol_size)sG" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "volumen %s: exportando" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "volumen %s: creado satisfactoriamente" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "El volumen todavÃa está asociado" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "Volumen no local a este nodo" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "volumen %s: eliminando exportación" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "volumen %s: eliminando" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "volumen %s: eliminado satisfactoriamente" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, fuzzy, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "instancia %s: creando snapshot" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +#, fuzzy +msgid "Connected to DFM server" +msgstr "Reconectado a la cola" + +#: cinder/volume/netapp.py:159 +#, fuzzy, python-format +msgid "Job failed: %s" +msgstr "No encontrado: %s" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, fuzzy, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "Imposible encontrar SR en VBD %s" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, fuzzy, python-format +msgid "No LUN ID for volume %s" +msgstr "Imposible encontrar volumen %s" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, fuzzy, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "Fallo al generar metadatos para la ip %s" + +#: cinder/volume/netapp.py:614 +#, fuzzy, python-format +msgid "Failed to get host details for host ID %s" +msgstr "Fallo al generar metadatos para la ip %s" + +#: cinder/volume/netapp.py:620 +#, fuzzy, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "Fallo al generar metadatos para la ip %s" + +#: cinder/volume/netapp.py:625 +#, fuzzy, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "Fallo al generar metadatos para la ip %s" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, fuzzy, python-format +msgid "Got response: %s" +msgstr "respuesta %s" + +#: cinder/volume/nexenta/volume.py:96 +#, fuzzy, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "el grupo de volumenes %s no existe" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Zone %(zone_id)s could not be found." +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "" + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to terminate %s" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "intentando finalizar una instancia que ya habÃa sido finalizada: %s" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "" + +#~ msgid "message %s" +#~ msgstr "mensaje %s" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "(%(nm)s) publica (key: %(routing_key)s) %(message)s" + +#~ msgid "Publishing to route %s" +#~ msgstr "Publicando la ruta %s" + +#~ msgid "Declaring queue %s" +#~ msgstr "Declarando cola %s" + +#~ msgid "Declaring exchange %s" +#~ msgstr "Declarando intercambio %s" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "Enlazando %(queue)s a %(exchange)s con la llave %(routing_key)s" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "Obtendiendo desde %(queue)s: %(message)s" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "virsh dijo: %r" + +#~ msgid "cool, it's a device" +#~ msgstr "genial, es un dispositivo" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "Creada VM %s..." + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "VM creada %(instance_name)s como %(vm_ref)s." + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "Creando VBD para VDI %s ... " + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "Creando VBF para VDI %s terminado" + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "VBD.Primera desconexión satisfactoria." + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "VBD. Desconexión rechazada: reintentándolo..." + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "VBD.Finalmente logro desconectar." + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "Instancia %s: no se pudo iniciar" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "Iniciando VM %s..." + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "Creado el VIF %(vif_ref)s para VM %(vm_ref)s, red %(network_ref)s." + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "Creando VBD para VM %(vm_ref)s, VDI %(vdi_ref)s ... " + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/fr/LC_MESSAGES/nova.po b/cinder/locale/fr/LC_MESSAGES/nova.po new file mode 100644 index 000000000..036363370 --- /dev/null +++ b/cinder/locale/fr/LC_MESSAGES/nova.po @@ -0,0 +1,8251 @@ +# French translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2012-04-06 14:54+0000\n" +"Last-Translator: EmmanuelLeNormand <manu@ubuntu-fr.org>\n" +"Language-Team: French <fr@li.org>\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 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "Nom du fichier contenant la racine de l'autorité de certification" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "Nom de fichier de la clé privée" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "Nom du fichier de la liste de révocation du Certificat Racine" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "Emplacement de sauvegarde des clefs" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "Emplacement de sauvegarde des racines d'autorité de certification" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "Doit-on utiliser une autorité de certification pour chaque projet ?" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "" +"Sujet pour les certificats utilisateurs, %s pour le projet, utilisateur, " +"timestamp" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "Sujet de certificat pour projets, %s pour le projet, timestamp" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "Chemin des propriétés: %s" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "Erreur imprévue lors de l'éxecution de la commande" + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" +"%(description)s\n" +"Commande : %(cmd)s\n" +"Valeur retournée : %(exit_code)s\n" +"Sortie standard : %(stdout)r\n" +"Sortie d'erreur : %(stderr)r" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "Une exception inconnue s'est produite." + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "Ãchec du décryptage du text" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "Ãchec de la pagination à travers les images depuis le service d'image" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "La création de l'Interface Virtuelle a échoué" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "" +"Les 5 tentatives de création de l'interface virtuelle avec une adresse " +"MAC unique ont échoué" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "La connexion à Glance a échoué" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "La connexion à Melange a échoué" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "Non autorisé." + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "Lâutilisateur n'a pas les privilèges administrateur" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "Le réglage des droits n'autorise pas %(action)s à être effectué(e)(s)" + +#: cinder/exception.py:216 +#, fuzzy, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "Pas de méthode pour le message : %s" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "Paramètres inacceptables." + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "Snapshot invalide" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "Le volume %(volume_id)s n'est lié à rien" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "La paire de clés de donnée n'est pas valide" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "Ãchec du chargement des données au format JSON" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "La requête est invalide." + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "La signature %(signature)s est invalide pour l'utilisateur %(user)s." + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "Entrée invalide reçue" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "L'instance de type %(instance_type)s est invalide." + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "Type de volume invalide" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "Volume invalide" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "La plage de port %(from_port)s:%(to_port)s. %(msg)s est invalide" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "Le protocole IP %(protocol)s est invalide" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "Le type de contenu %(content_type)s est invalide" + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "Le cidr %(cidr)s est invalide" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "Réutilisation invalide d'une connexion RPC" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "%(err)s" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" +"Impossible d'effectuer l'action '%(action)s' sur l'ensemble " +"%(aggregate_id)s. Raison: %(reason)s." + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" +"L'instance %(instance_uuid)s dans %(attr)s %(state)s. Impossible de " +"%(method)s pendant que l'instance est dans cet état." + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "L'instance %(instance_id)s ne fonctionne pas." + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "L'instance %(instance_id)s n'est pas suspendue" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "L'instance %(instance_id)s n'est pas en mode secours" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "Ãchec de la suspension de l'instance" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "Ãchec de la reprise du serveur" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "Ãchec du redémarrage de l'instance" + +#: cinder/exception.py:334 +#, fuzzy +msgid "Failed to terminate instance" +msgstr "Ãchec du redémarrage de l'instance" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "Le service est indisponible actuellement." + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "Le service de volume est indisponible actuellement." + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "Le service de calcul est indisponible actuellement." + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" +"Impossible de migrer l'instance (%(instance_id)s) vers l'hôte actuel " +"(%(host)s)." + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "L'hôte destinataire de calcul est indisponible actuellement." + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "L'hôte original de calcul est indisponible actuellement." + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "Le type de l'hyperviseur fourni n'est pas valide." + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" +"L'instance nécessite une version plus récente de l'hyperviseur que celle " +"fournie." + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "L'utilisateur %(uid)s est déjà membre du groupe %(group_dn)s" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, fuzzy, python-format +msgid "Could not fetch image %(image)s" +msgstr "Impossible de lier l'image au loopback : %s" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "Démarrage du noeud %(topic)s (version %(vcs_string)s)" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "Service détruit sans entrée dans la base de données" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "L'objet du service de base de données à disparru, re-création en cours." + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "Récupération du modelle de connexion serveur terminée!" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "Le modèle de serveur à disparu" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "Ensemble de propriétés complet :" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "Exception interne : %s" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "Récupèration de %s" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "Execution de la commande (sous-processus) : %s" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "Le résultat était %s" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "Execution de la cmd (SSH): %s" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "Debug dans le rappel : %s" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "L'adresse du lien local n'a pas été trouvé :%s" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "Impossible de trouver l'IP du lien local de %(interface)s :%(ex)s" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "Backend invalide : %s" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "backend %s" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "Vous devez implémenter __call__" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "non disponible" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "Trop d'erreur d'authentification" + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" +"La clef d'accès %(access_key)s a rencontrée %(failures)d echecs " +"d'authentification et sera par conséquent vérouillée pour %(lock_mins)d " +"minutes." + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "Echec d'authentification : %s" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "Requête authentifiée pour : %(uname)s:%(pname)s)" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "action: %s" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "arg: %(key)s\t\tval: %(value)s" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "" +"Requête non authorisé pour le controlleur=%(controller)s et " +"l'action=%(action)s" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "\"Instance non trouvée\" remontée : %s" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "\"Volume non trouvé\" remonté : %s" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "\"Non trouvé\" remonté : %s" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, fuzzy, python-format +msgid "QuotaError raised: %s" +msgstr "\"Erreur inopinée\" remontée : %s" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "\"Erreur inopinée\" remontée : %s" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "Une erreur inopinée à eu lieu. Merci d'essayer votre requête à nouveau." + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" +"Requête API non supportée : controleur = %(controller)s, action = " +"%(action)s" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "Création du bi-clef %s" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "Suppression du bi-clef %s" + +#: cinder/api/ec2/cloud.py:551 +#, fuzzy, python-format +msgid "Invalid CIDR" +msgstr "Le cidr %(cidr)s est invalide" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "Révocation de groupe de sécurité %s" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, fuzzy, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "Pas assez de parametres pour contruire un règle valide." + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "Pas de règle pour les paramètres spécifiés." + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "Authorisation du groupe de sécurité %s" + +#: cinder/api/ec2/cloud.py:725 +#, fuzzy, python-format +msgid "%s - This rule already exists in group" +msgstr "Cette règle existe déjà dans le groupe %s" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "Création du groupe de sécurité %s" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "le groupe %s existe déjà " + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "Suppression du groupe de sécurité %s" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "Récupération de la sortie de la console de l'instance %s" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "Création d'un volume de %s Go" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "" +"Montage du volume %(volume_id)s sur l'instance %(instance_id)s en tant " +"que %(device)s" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "Dé-montage du volume %s" + +#: cinder/api/ec2/cloud.py:959 +#, fuzzy, python-format +msgid "Detach Volume Failed." +msgstr "Dé-montage du volume %s" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "attribut non reconnu : %s" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "Allocation d'adresse" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "Désallocation de l'adresse %s" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "Association de l'adresse %(public_ip)s avec l'instance %(instance_id)s" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "Désassociation de l'adresse %s" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "Début de la destruction d'instance" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "Re-démarrage de l'instance %r" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "Dé-enregitrement de l'image %s" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "Image %(image_location)s enregistré avec l'id %(image_id)s" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "Utilisateur ou groupe non spécifié" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "Seul le group \"tous\" est supporté" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "" +"le type d'opération (operation_type) doit être ajout (add) ou suppression" +" (remove)" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "Mis à jour de la publication de l'image %s" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "Impossible de récupérer les méta-donnérs pour l'IP : %s" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "Erreur interceptée : %s" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "Compute.api::pause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "Compute.api::unpause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "compute.api::suspend %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "compute.api::resume %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "Compute.api::reset_network %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "Compute.api::lock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "Compute.api::unlock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, fuzzy, python-format +msgid "Invalid mode: '%s'" +msgstr "Backend invalide : %s" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +#, fuzzy, python-format +msgid "Security group is still in use" +msgstr "Révocation de groupe de sécurité %s" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "Pas assez de parametres pour contruire un règle valide." + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "Cette règle existe déjà dans le groupe %s" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "Tentative d'instanciation d'un singleton" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" +"Tentative de suppression du dernier membre d'un groupe. Essayez plutôt " +"de supprimer le group sur %s." + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "Recherche de l'utilisateur : %r" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "Autorisation refusée pour la clef d'accès %s" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "Nom de projet utilisé = nom d'utilisateur (%s)" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "" +"Autorisation refusée : pas de projet nommé %(pjid)s " +"(utilisateur=%(uname)s)" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" +"Autorisation refusée : utilisateur %(uname)s n'est ni admin ni membre du " +"projet %(pjname)s" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "Signature non valide pour l'utilisateur %s" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "Le projet doit être spécifié" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "Ajout du rôle %(role)s à l'utilisateur %(uid)s pour le projet %(pid)s" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "Ajout du rôle global %(role)s pour l'utilisateur %(uid)s" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "" +"Suppression du rôle %(role)s pour l'utilisateur %(uid)s dans le projet " +"%(pid)s" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "Suppression du role global %(role)s pour l'utilisateur %(uid)s" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "Création du projet %(name)s ayant pour manager %(manager_user)s" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "modification du projet %s" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "Ajout de l'utilisateur %(uid)s au projet %(pid)s" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "Suppression de l'utilisateur %(uid)s du projet %(pid)s" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "Suppression du projet %s" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "Utilisateur créé %(rvname)s (admin: %(rvadmin)r)" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "Suppression de l'utilisateur %s" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "Clef d'accès changée pour l'utilisateur %s" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "Clef secrète changée pour l'utilisateur %s" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "Statut admin changé en %(admin)r pour l'utilisateur %(uid)s" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "Pas de données VPN pour le projet %s" + +#: cinder/cloudpipe/pipelib.py:46 +#, fuzzy, python-format +msgid "Instance type for vpn instances" +msgstr "L'instance de type %(instance_type)s est invalide." + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "Réseau à passer à la configuration d'openvpn" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "Masque réseau à passer à la configuration d'openvpn" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "Démarrage du VPN pour %s" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +#, fuzzy, python-format +msgid "Cannot run any more instances of this type." +msgstr "" +"Quota d'instances dépassé. Vous ne pouvez éxécuter que %s instances de ce" +" type de plus." + +#: cinder/compute/api.py:259 +#, fuzzy, python-format +msgid "Can only run %s more instances of this type." +msgstr "" +"Quota d'instances dépassé. Vous ne pouvez éxécuter que %s instances de ce" +" type de plus." + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "Création d'une instance raw" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "Démarrage de %s instances..." + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +#, fuzzy, python-format +msgid "Going to try to soft delete instance" +msgstr "Va essayer d'arrêter %s" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +#, fuzzy, python-format +msgid "Going to try to terminate instance" +msgstr "Va essayer d'arrêter %s" + +#: cinder/compute/api.py:977 +#, fuzzy, python-format +msgid "Going to try to stop instance" +msgstr "Va essayer d'arrêter %s" + +#: cinder/compute/api.py:996 +#, fuzzy, python-format +msgid "Going to try to start instance" +msgstr "Va essayer d'arrêter %s" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "check_instance_lock: décoration : |%s|" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "check_instance_lock: vérouillé : |%s|" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "check_instance_lock: admin : |%s|" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "check_instance_lock: exécution : |%s|" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "check_instance_lock: ne s'éxécute pas |%s|" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, fuzzy, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "Après l'arrêt d'instances : %s" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "L'instance a déjà été crée" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "Redémarrage de l'instance %s" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "instance %s: création d'un instantané (snapshot)" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "instance %s: récupération" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "instance %s: dé-récupération" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "instance %s: mise en pause" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "instance %s: reprise après pause" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "instance %s: récupération des diagnostiques" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "instance %s: suspension" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "instance %s: reprise après suspension" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "instance %s: vérrouillage" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "instance %s: déverrouillage" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "instance %s: récupération de l'état de vérouillage" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "instance %s: redémarrage du réseau" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, fuzzy, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "L'instance %(instance_id)s n'est pas en mode secours" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "Démontage de volume d'une instance inconnue %s" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "Ajout de console" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "Tentative de suppression d'une console non existante %(console_id)s." + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "Reconstruction de la configuration xvp" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "Ré-écriture de %s" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "Arrêt xvp" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "Démarrage xvp" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "Erreur au démarrage xvp : %s" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "Re-démarrage xvp" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "xvp non actif..." + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "L'utilisation d'une requête de contexte vide est dévalué" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "python-migrate n'est pas installé. Fin d'éxécution." + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "Impossible de déchiffrer la clef privée : %s" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "Impossible de déchiffrer le vecteur d'initialisation : %s" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "Impossible de déchiffrer le fichier image %(image_file)s: %(err)s" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "Hupping dnsmasq à renvoyé %s" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "Pid %d est dépassé, re-démarrage de dnsmasq" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "La destruction de radvd à renvoyé %s" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "Pid %d est dépassé, re-démarrage radvd" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "Démarrage de l'interface VLAN %s" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "Démarrage de l'interface de Bridge %s" + +#: cinder/network/linux_net.py:1142 +#, fuzzy, python-format +msgid "Starting bridge %s " +msgstr "Démarrage de l'interface de Bridge %s" + +#: cinder/network/linux_net.py:1149 +#, fuzzy, python-format +msgid "Done starting bridge %s" +msgstr "Erreur au démarrage xvp : %s" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "réglage de l'hôte réseau" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "IP %s libérée qui n'était pas allouée" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "La somme du nombre de réseau et le début de vlan ne peut excéder 4094" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "Renvoi de l'exception %s à l'appelant" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "Contexte décompacté : %s" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "%s reçu" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "Pas de méthode pour le message : %s" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "Pas de méthode pour le message : %s" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "MSG_ID est %s" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "Doit mettre en oeuvre un calendrier de retrait" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, fuzzy, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "L'instance %(instance_id)s n'est pas suspendue" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "Instance actives : %s" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "Après l'arrêt d'instances : %s" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "adresse de départ" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "Destination %s allouée" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "Reception par Nested %(queue)s, %(value)s" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "Nested renvoi %s" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "%s Reçu" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "Ãchec lors de l'ouverture d'une connexion à l'hyperviseur" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "Tentative de suppression de filtre pour l'intance %s qui n'est pas filtrée" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" +"Doit spécifier xenapi_connection_url, xenapi_connection_username " +"(optionel), et xenapi_connection_password pour utiliser " +"connection_type=xenapi" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "Reçu exception : %s" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "instance %(instance_name)s: suppression des fichiers d'instance %(target)s" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "instance %s: re-démarrée" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "instance %s: récupérée" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "instance %s: a démarrée" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "instance %s : Création de l'image" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" +"instance %(inst_name)s : l'erreur d'injection de donné dans l'image " +"%(img_id)s (%(e)s) a été ignorée" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "instance %s: démarrage de la méthode toXML" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "instance %s: fin d'éxécution de la méthode toXML" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "Impossible de monter le système de fichier : %s" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "Impossible de lier l'image au loopback : %s" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "Pas de device nbd libre" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "Device nbd %s n'est pas apparu" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "Connexion à libvirt: %s" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "Connexion à libvirt interrompue" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +#, fuzzy, python-format +msgid "Instance soft rebooted successfully." +msgstr "instance %s: re-démarrée" + +#: cinder/virt/libvirt/connection.py:696 +#, fuzzy +msgid "Failed to soft reboot instance." +msgstr "Ãchec du redémarrage de l'instance" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "data: %(data)r, fpath: %(fpath)r" + +#: cinder/virt/libvirt/connection.py:978 +#, fuzzy +msgid "Guest does not have a console available" +msgstr "Lâutilisateur n'a pas les privilèges administrateur" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "Impossible de trouver un port ouvert" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "%(text)s: _db_content => %(content)s" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "Fonction non implémentée" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "xenapi.fake n'a pas d'implémentation pour %s" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "Appel %(localname)s %(impl)s" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "Appel du getter %s" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" +"xenapi.fake n'a pas d'implementation pour %s ou il a été appelé avec le " +"mauvais nombre d'arguments" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "Réseau non unique trouvé pour le bridge %s" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "Aucun réseau trouvé pour le bridge %s" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, fuzzy, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "Impossible de détacher le volume %s" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "VBD non trouvé dans l'instance %s" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, fuzzy, python-format +msgid "VBD %s already detached" +msgstr "le groupe %s existe déjà " + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "Impossible de deconnecter le VBD %s" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "Impossible de supprimer le VBD %s" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, fuzzy, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "VBD créé %(vbd_ref)s pour VM %(vm_ref)s, VDI %(vdi_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "VBD créé %(vbd_ref)s pour VM %(vm_ref)s, VDI %(vdi_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" +"VDI créé %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s) on" +" %(sr_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, fuzzy, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "" +"Création de l'instantané (snapshot) pour la VM %(vm_ref)s avec le label " +"'%(label)s'..." + +#: cinder/virt/xenapi/vm_utils.py:392 +#, fuzzy, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "Instantané (snapshot) créé %(template_vm_ref)s pour la VM %(vm_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "Demande de chargement à xapi de %(vdi_uuids)s en tant qu'ID %(image_id)s" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, fuzzy, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "Taille de l'image %(image)s:%(virtual_size)d" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "Copie de VDI %s vers /boot/guest sur dom0" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "Noyau/Ramdisk VDI %s détruit" + +#: cinder/virt/xenapi/vm_utils.py:895 +#, fuzzy +msgid "Failed to fetch glance image" +msgstr "Ãchec du redémarrage de l'instance" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "Recherche du VDI %s pour le PV kernel" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "Le VDI %s est toujours disponible" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "(VM_UTILS) état xenserver vm -> |%s|" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "(VM_UTILS) xenapi power_state -> |%s|" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "Re-parcours de SR %s" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "VHD %(vdi_uuid)s à pour parent %(parent_ref)s" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" +"L'UUID parent %(parent_uuid)s ne correspond pas au parent originel " +"%(original_parent_uuid)s, attente de coalesence..." + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "Connexion de VBD %s ... " + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "Connexion de VBD %s terminée." + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "Destruction de VBD pour la VDI %s ... " + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "Destruction de VBD pour la VDI %s terminée." + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "Exécution de pygrub sur %s" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "Kernel Xen %s trouvé" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "Pas de kernel Xen trouvé. Démarrage en HVM." + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "Ecriture de la table de partitionnement %s terminée." + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +#, fuzzy +msgid "Starting instance" +msgstr "Création d'une instance raw" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +#, fuzzy +msgid "Failed to spawn, rolling back" +msgstr "Ãchec de la suspension de l'instance" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "Injection du chemin d'accès : '%s'" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +#, fuzzy +msgid "Starting VM" +msgstr "Re-démarrage xvp" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +#, fuzzy, python-format +msgid "Finished snapshot and upload for VM" +msgstr "Fin de l'instantané et du chargement de VM %s" + +#: cinder/virt/xenapi/vmops.py:677 +#, fuzzy, python-format +msgid "Starting snapshot for VM" +msgstr "Début de création d'instantané (snapshot) pour la VM %s" + +#: cinder/virt/xenapi/vmops.py:686 +#, fuzzy, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "Impossible d'attacher le volume à l'instance %s" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "Fichiers noyau/ramdisk supprimés" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +#, fuzzy +msgid "Destroying VM" +msgstr "Re-démarrage xvp" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, fuzzy, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "L'instance %(instance_id)s n'est pas suspendue" + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +#, fuzzy +msgid "Injecting network info to xenstore" +msgstr "réglage de l'hôte réseau" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, fuzzy, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "Création du VIF pour la VM %(vm_ref)s, réseau %(network_ref)s." + +#: cinder/virt/xenapi/vmops.py:1495 +#, fuzzy, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "Création du VIF pour la VM %(vm_ref)s, réseau %(network_ref)s." + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "Erreur OpenSSL : %s" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "Impossible de créer le dépot de stockage" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "%(label)s introduit comme %(sr_ref)s." + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "Introduction de %s" + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "Impossible de trouver SR du VDB %s" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "Exception %(exc)s ignorée pendant l'obtention de PBDs pour %(sr_ref)s" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "Exception %(exc)s ignorée pendant la deconnexion du PBD %(pbd)s" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "Impossible d'introduire VDI sur SR %s" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "Impossible de récuppérer l'enregistrement du VDI %s sur" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "Impossible d'introduire le VDI pour SR %s" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "Le point de montage ne peut pas être traduit : %s" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" +"Impossible de créer VDI sur SR %(sr_ref)s pour l'instance " +"%(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "Impossible d'utiliser SR %(sr_ref)s pour l'instance %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "Impossible d'attacher le volume à l'instance %s" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "" +"Le point de montage %(mountpoint)s a été attaché à l'instance " +"%(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "Detach_volume: %(instance_name)s, %(mountpoint)s" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "Impossible de trouver le volume %s" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "Impossible de détacher le volume %s" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "" +"Le point de montage %(mountpoint)s à été détaché de l'instance " +"%(instance_name)s" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +#, fuzzy +msgid "Volume status must be available or error" +msgstr "Le status du volume doit être disponible" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +#, fuzzy +msgid "Volume Snapshot status must be available or error" +msgstr "Le status du volume doit être disponible" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "Récupération après une exécution erronée. Tentative numéro %s" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "Le groupe de volume %s n'existe pas" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "Imposible de trouver une exportation iSCSI pour le volume %s" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "FAUX ISCSI: %s" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "rbd n'as pas de file %s" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "Sheepdog n'est pas actif : %s" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "Sheepdog n'est pas actif" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "Ré-exportation de %s volumes" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "volume %s : exportation évitée" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "volume %s: création" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "volume %(vol_name)s: cÅeation d'un volume logique de %(vol_size)sG" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "volume %s: exportation en cours" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "volume %s: crée avec succès" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "Le volume est encore attaché" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "Le volume n'est pas local à ce noeud" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "volume %s: suppression de l'exportation" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "volume %s: suppression" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "volume %s: supprimé avec succès" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, fuzzy, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "instance %s: création d'un instantané (snapshot)" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +#, fuzzy +msgid "Connected to DFM server" +msgstr "Reconnection à la queue" + +#: cinder/volume/netapp.py:159 +#, fuzzy, python-format +msgid "Job failed: %s" +msgstr "\"Non trouvé\" remonté : %s" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, fuzzy, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "Imposible de trouver une exportation iSCSI pour le volume %s" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, fuzzy, python-format +msgid "No LUN ID for volume %s" +msgstr "Imposible de trouver une exportation iSCSI pour le volume %s" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, fuzzy, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "Impossible de récupérer les méta-donnérs pour l'IP : %s" + +#: cinder/volume/netapp.py:614 +#, fuzzy, python-format +msgid "Failed to get host details for host ID %s" +msgstr "Impossible de récupérer les méta-donnérs pour l'IP : %s" + +#: cinder/volume/netapp.py:620 +#, fuzzy, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "Impossible de récupérer les méta-donnérs pour l'IP : %s" + +#: cinder/volume/netapp.py:625 +#, fuzzy, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "Impossible de récupérer les méta-donnérs pour l'IP : %s" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, fuzzy, python-format +msgid "Got response: %s" +msgstr "réponse %s" + +#: cinder/volume/nexenta/volume.py:96 +#, fuzzy, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "Le groupe de volume %s n'existe pas" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Zone %(zone_id)s could not be found." +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "" + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "Tentative de destruction d'une instance déjà détruite: %s" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "Initialisation du Consomateur d'Adapteur pour %s" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "le sujet est %s" + +#~ msgid "message %s" +#~ msgstr "message %s" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "(%(nm)s) publication (key: %(routing_key)s) %(message)s" + +#~ msgid "Publishing to route %s" +#~ msgstr "Publication vers la route %s" + +#~ msgid "Declaring queue %s" +#~ msgstr "Déclaration de la queue %s" + +#~ msgid "Declaring exchange %s" +#~ msgstr "Déclaration de l'échange %s" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "" +#~ "Rattachement de %(queue)s vers %(exchange)s" +#~ " avec la clef %(routing_key)s" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "Récupération depuis %(queue)s: %(message)s" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "Tâche [%(name)s] %(task)s état : succès %(result)s" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "Tâche [%(name)s] %(task)s état : %(status)s %(error_info)s" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "virsh a retourné : %r" + +#~ msgid "cool, it's a device" +#~ msgstr "super, c'est un device" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "VM %s crée..." + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "VM %(instance_name)s crée en tant que %(vm_ref)s." + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "Création de VBD pour la VDI %s ... " + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "La création de VBD pour la VDI %s est terminée." + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "VBD.unplug terminé dés la première tentative." + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "VBD.unplug refusé : nouvel essai..." + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "VBD.unplug à enfin été achevée." + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "XenAPI.Failure ignorée dans VBD.unplug: %s" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "XenAPI.Failure %s ignorée" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "instance %s: n'a pas pu être crée" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "Démarrage de la VM %s..." + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "VIF créé %(vif_ref)s pour la VM %(vm_ref)s, network %(network_ref)s." + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "Création de VBD pour VM %(vm_ref)s, VDI %(vdi_ref)s ... " + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/it/LC_MESSAGES/nova.po b/cinder/locale/it/LC_MESSAGES/nova.po new file mode 100644 index 000000000..08fcd9be9 --- /dev/null +++ b/cinder/locale/it/LC_MESSAGES/nova.po @@ -0,0 +1,8210 @@ +# Italian translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2012-04-01 18:59+0000\n" +"Last-Translator: simone.sandri <lexluxsox@hotmail.it>\n" +"Language-Team: Italian <it@li.org>\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 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "Filename di root CA" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "Nome file della chiave privata" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "Dove si conservano le chiavi" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "Dove si conserva root CA" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "Si dovrebbe usare un CA per ogni progetto?" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "Soggetto per il certificato degli utenti, %s per progetto, utente, orario" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "Soggetto per il certificato dei progetti, %s per progetto, orario" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "Percorso dei flags: %s" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "Si e' verificato un errore inatteso durante l'esecuzione del comando." + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" +"%(description)s\n" +"Comando: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "E' stato riscontrato un errore sconosciuto" + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "" + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "L'utente non ha i privilegi dell'amministratore" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "" + +#: cinder/exception.py:216 +#, fuzzy, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "nessun metodo per il messaggio: %s" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "Parametri inaccettabili." + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "La richiesta non è valida." + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "" + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "E' stato ricevuto un input non valido" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "" + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "Tipo del volume non valido" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "Volume non valido" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "" + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "" + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "Impossibile sospendere l'istanza" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "Impossibile ripristinare il server" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "Impossibile riavviare l'istanza" + +#: cinder/exception.py:334 +#, fuzzy +msgid "Failed to terminate instance" +msgstr "Impossibile riavviare l'istanza" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, python-format +msgid "Could not fetch image %(image)s" +msgstr "" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "Servizio terminato che non ha entry nel database" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "Il servizio é scomparso dal database, ricreo." + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "Connessione al model server ripristinata!" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "model server é scomparso" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "Insieme di FLAGS:" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "Eccezione interna: %s" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "Prelievo %s" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "Esecuzione del comando (sottoprocesso): %s" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "Il risultato é %s" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "Eseguendo cmd (SSH): %s" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "debug in callback: %s" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "" + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, python-format +msgid "QuotaError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "" + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:551 +msgid "Invalid CIDR" +msgstr "" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "" + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:725 +#, python-format +msgid "%s - This rule already exists in group" +msgstr "" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:959 +msgid "Detach Volume Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "Compute.api::pause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "Compute.api::unpause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "compute.api::suspend %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "compute.api::resume %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "Compute.api::reset_network %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "Compute.api::lock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "Compute.api::unlock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, python-format +msgid "Invalid mode: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +msgid "Security group is still in use" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:46 +msgid "Instance type for vpn instances" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +msgid "Cannot run any more instances of this type." +msgstr "" + +#: cinder/compute/api.py:259 +#, python-format +msgid "Can only run %s more instances of this type." +msgstr "" + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "" + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +msgid "Going to try to soft delete instance" +msgstr "" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +msgid "Going to try to terminate instance" +msgstr "" + +#: cinder/compute/api.py:977 +#, fuzzy +msgid "Going to try to stop instance" +msgstr "Impossibile riavviare l'istanza" + +#: cinder/compute/api.py:996 +#, fuzzy +msgid "Going to try to start instance" +msgstr "Impossibile riavviare l'istanza" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "check_instance_lock: decorazione: |%s|" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "check_instance_lock: bloccato: |%s|" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "check_instance_lock: admin: |%s|" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "check_instance_lock: esecuzione: |%s|" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "check_instance_lock: non esecuzione |%s|" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "L'istanza é stata già creata" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "Riavviando l'istanza %s" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "istanza %s: creazione snapshot in corso" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "istanza %s: in pausa" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "istanza %s: fuori pausa" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "istanza %s: ricezione diagnostiche" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "istanza %s: sospensione in corso" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "istanza %s: ripristino" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "istanza %s: bloccato" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "istanza %s: sbloccato" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "istanza %s: ripristino rete" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "Avviando l'interfaccia VLAN %s" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "Avviando l'interfaccia Bridge per %s" + +#: cinder/network/linux_net.py:1142 +#, fuzzy, python-format +msgid "Starting bridge %s " +msgstr "Avviando l'interfaccia Bridge per %s" + +#: cinder/network/linux_net.py:1149 +#, python-format +msgid "Done starting bridge %s" +msgstr "" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "Sollevando eccezione %s al chiamante" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "contesto decompresso: %s" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "ricevuto %s" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "nessun metodo per il messaggio: %s" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "nessun metodo per il messagggio: %s" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "MSG_ID é %s" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "Fallita l'apertura della connessione verso l'hypervisor" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +#, fuzzy, python-format +msgid "Instance soft rebooted successfully." +msgstr "volume %s: creato con successo" + +#: cinder/virt/libvirt/connection.py:696 +#, fuzzy +msgid "Failed to soft reboot instance." +msgstr "Impossibile riavviare l'istanza" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "" + +#: cinder/virt/libvirt/connection.py:978 +#, fuzzy +msgid "Guest does not have a console available" +msgstr "L'utente non ha i privilegi dell'amministratore" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "Sollevando NotImplemented" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "Chiamando %(localname)s %(impl)s" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, fuzzy, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "Impossibile smontare il volume %s" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, python-format +msgid "VBD %s already detached" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:392 +#, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "Kernel/Ramdisk VDI %s distrutti" + +#: cinder/virt/xenapi/vm_utils.py:895 +#, fuzzy +msgid "Failed to fetch glance image" +msgstr "Impossibile riavviare l'istanza" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "Cercando vdi %s per kernel PV" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +#, fuzzy, python-format +msgid "Starting instance" +msgstr "Riavviando l'istanza %s" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +#, fuzzy +msgid "Failed to spawn, rolling back" +msgstr "Impossibile sospendere l'istanza" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +msgid "Starting VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +msgid "Finished snapshot and upload for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:677 +msgid "Starting snapshot for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:686 +#, fuzzy, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "Impossibile montare il volume all'istanza %s" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +msgid "Destroying VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +msgid "Injecting network info to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1495 +#, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "Impossible creare il VDI su SR %(sr_ref)s per l'istanza %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "Impossibile usare SR %(sr_ref)s per l'istanza %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "Impossibile montare il volume all'istanza %s" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "Mountpoint %(mountpoint)s montato all'istanza %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "Detach_volume: %(instance_name)s, %(mountpoint)s" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "Impossibile localizzare il volume %s" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "Impossibile smontare il volume %s" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "Mountpoint %(mountpoint)s smontato dall'istanza %(instance_name)s" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +#, fuzzy +msgid "Volume status must be available or error" +msgstr "Lo stato del volume deve essere disponibile" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +#, fuzzy +msgid "Volume Snapshot status must be available or error" +msgstr "Lo stato del volume deve essere disponibile" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "volume %s: creazione in corso" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "volume %s: creazione in corso per l'esportazione" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "volume %s: creato con successo" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "Volume ancora collegato" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "volume %s: rimuovendo" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "volume %s: rimosso con successo" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, fuzzy, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "istanza %s: creazione snapshot in corso" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +#, fuzzy +msgid "Connected to DFM server" +msgstr "Riconnesso alla coda" + +#: cinder/volume/netapp.py:159 +#, python-format +msgid "Job failed: %s" +msgstr "" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, fuzzy, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "Impossibile localizzare il volume %s" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, fuzzy, python-format +msgid "No LUN ID for volume %s" +msgstr "Impossibile localizzare il volume %s" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "" + +#: cinder/volume/netapp.py:614 +#, python-format +msgid "Failed to get host details for host ID %s" +msgstr "" + +#: cinder/volume/netapp.py:620 +#, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "" + +#: cinder/volume/netapp.py:625 +#, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, fuzzy, python-format +msgid "Got response: %s" +msgstr "risposta %s" + +#: cinder/volume/nexenta/volume.py:96 +#, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Zone %(zone_id)s could not be found." +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "" + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You can only" +#~ " run %s more instances of this " +#~ "type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to terminate %s" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "Provando a distruggere una istanza già distrutta: %s" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "Inizializzando il Consumer Adapter per %s" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "argomento é %s" + +#~ msgid "message %s" +#~ msgstr "messaggio %s" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "" + +#~ msgid "Publishing to route %s" +#~ msgstr "Pubblicando sulla route %s" + +#~ msgid "Declaring queue %s" +#~ msgstr "Dichiarando la coda %s" + +#~ msgid "Declaring exchange %s" +#~ msgstr "Dichiarando il centralino %s" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "" + +#~ msgid "cool, it's a device" +#~ msgstr "" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "Creata VM %s.." + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "Creata VM %(instance_name)s come %(vm_ref)s" + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Snapshotting VM %(vm_ref)s with label '%(label)s'..." +#~ msgstr "" + +#~ msgid "Created snapshot %(template_vm_ref)s from VM %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "Size for image %(image)s:%(virtual_size)d" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "" + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "" + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "" + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "Istanza %s: esecuzione fallita..." + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "" + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Finished snapshot and upload for VM %s" +#~ msgstr "" + +#~ msgid "Starting snapshot for VM %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Creating VIF for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/ja/LC_MESSAGES/nova.po b/cinder/locale/ja/LC_MESSAGES/nova.po new file mode 100644 index 000000000..65a927593 --- /dev/null +++ b/cinder/locale/ja/LC_MESSAGES/nova.po @@ -0,0 +1,8196 @@ +# Japanese translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2011-08-23 11:22+0000\n" +"Last-Translator: Thierry Carrez <thierry.carrez+lp@gmail.com>\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "ã«ã¼ãCAã®ãã¡ã¤ã«å" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "ãã©ã¤ãã¼ããã¼ã®ãã¡ã¤ã«å" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "ãã¼ãæ ¼ç´ãããã¹" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "ã«ã¼ãCAãæ ¼ç´ãããã¹" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "ããã¸ã§ã¯ããã¨ã«CAã使ç¨ãããå¦ãã®ãã©ã°" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "ã¦ã¼ã¶ã®è¨¼ææ¸ã®ãµãã¸ã§ã¯ãã%s ã¯ããã¸ã§ã¯ããã¦ã¼ã¶ãã¿ã¤ã ã¹ã¿ã³ã" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "ããã¸ã§ã¯ãã®è¨¼ææ¸ã®ãµãã¸ã§ã¯ãã%s ã¯ããã¸ã§ã¯ããããã³ã¿ã¤ã ã¹ã¿ã³ã" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "Flags ã®ãã¹: %s" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "ã³ãã³ãå®è¡ã«ããã¦äºæããªãã¨ã©ã¼ãçºçãã¾ããã" + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" +"%(description)s\n" +"ã³ãã³ã: %(cmd)s\n" +"çµäºã³ã¼ã: %(exit_code)s\n" +"æ¨æºåºå: %(stdout)r\n" +"æ¨æºã¨ã©ã¼åºå: %(stderr)r" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "" + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "" + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "" + +#: cinder/exception.py:216 +#, fuzzy, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "ã¡ãã»ã¼ã¸ %s ã«å¯¾ããã¡ã½ãããåå¨ãã¾ããã" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "" + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "" + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "" + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "" + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "" + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "" + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "" + +#: cinder/exception.py:334 +#, fuzzy +msgid "Failed to terminate instance" +msgstr "ã¤ã³ã¹ã¿ã³ã¹çµäºå¦çãéå§ãã¾ãã" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "ã¦ã¼ã¶ %(uid)s ã¯ãã§ã«ã°ã«ã¼ã %(group_dn)s ã®ã¡ã³ãã§ãã" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, fuzzy, python-format +msgid "Could not fetch image %(image)s" +msgstr "ã¤ã¡ã¼ã¸ãã«ã¼ããã㯠%s ã«ã¢ã¿ããã§ãã¾ããã" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "%(topic)s ãã¼ããéå§ãã¦ãã¾ã (ãã¼ã¸ã§ã³ %(vcs_string)s)" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "ãã¼ã¿ãã¼ã¹ã«ã¨ã³ããªã®åå¨ããªããµã¼ãã¹ãçµäºãã¾ãã" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "ãµã¼ãã¹ãã¼ã¿ãã¼ã¹ãªãã¸ã§ã¯ããæ¶æ» ãã¾ãããå使ãã¾ãã" + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "ã¢ãã«ãµã¼ãã¸ã®æ¥ç¶ã復æ§ãã¾ããã" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "ã¢ãã«ãµã¼ããæ¶æ» ãã¾ããã" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "FLAGSã®ä¸è¦§:" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "å å´ã§çºçããä¾å¤ï¼ %s" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "ãã¡ã¤ã«ããã§ããï¼ %s" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "ã³ãã³ãå®è¡(subprocess): %s" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "ã³ãã³ãå®è¡çµæï¼ %s" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "ã³ãã³ãï¼SSH)ãå®è¡: %s" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "ã³ã¼ã«ããã¯ä¸ã®ãããã°: %s" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "ãªã³ã¯ãã¼ã«ã«ã¢ãã¬ã¹ãè¦ã¤ããã¾ãã: %s" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "%(interface)s ã®ãã¼ã«ã«IPã¢ãã¬ã¹ã®ãªã³ã¯ãåå¾ã§ãã¾ãã:%(ex)s" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "䏿£ãªããã¯ã¨ã³ãã§ã: %s" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "ããã¯ã¨ã³ã㯠%s ã§ãã" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "__call__ ãå®è£ ããªããã°ãªãã¾ãã" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "å©ç¨ã§ãã¾ãã" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "èªè¨¼å¤±æã®åæ°ãå¤ããã¾ãã" + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "ã¢ã¯ã»ã¹ãã¼ %(access_key)s 㯠%(failures)d åèªè¨¼ã«å¤±æãã¾ããã®ã§ã%(lock_mins)d åéããã¯ãã¾ãã" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "%s ã®èªè¨¼ã«å¤±æãã¾ããã" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "%(uname)s ç¨ã®èªè¨¼ãªã¯ã¨ã¹ã:%(pname)s)" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "ã¢ã¯ã·ã§ã³(action): %s" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "弿°: %(key)s\t\tå¤: %(value)s" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "ã³ã³ããã¼ã©=%(controller)s ã¨ã¢ã¯ã·ã§ã³=%(action)s ç¨ã®è¨±å¯ããã¦ããªããªã¯ã¨ã¹ã" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "InstanceNotFound ãçºè¡ããã¾ãã: %s" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "VolumeNotFound ãçºè¡ããã¾ãã: %s" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "NotFound çºç: %s" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, fuzzy, python-format +msgid "QuotaError raised: %s" +msgstr "äºæããªãã¨ã©ã¼çºç: %s" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "äºæããªãã¨ã©ã¼çºç: %s" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "æªç¥ã®ã¨ã©ã¼ãçºçãã¾ãããå度ãªã¯ã¨ã¹ããå®è¡ãã¦ãã ããã" + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "æªãµãã¼ãã® API ãªã¯ã¨ã¹ã: ã³ã³ããã¼ã© = %(controller)s, ã¢ã¯ã·ã§ã³ = %(action)s" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "Create key pair: ãã¼ã㢠%s ã使ãã¾ãã" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "Delete key pair: ãã¼ã㢠%s ãåé¤ãã¾ãã" + +#: cinder/api/ec2/cloud.py:551 +msgid "Invalid CIDR" +msgstr "" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "Revoke security group ingress: ã»ãã¥ãªãã£ã°ã«ã¼ãè¨±å¯ %s ã®åæ¶" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, fuzzy, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "æå¹ãªã«ã¼ã«ã使ããçºã®ååãªãã©ã¡ã¼ã¿ãããã¾ãã" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "æå®ããããã©ã¡ã¼ã¿ã«è©²å½ããã«ã¼ã«ãããã¾ããã" + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "Authorize security group ingress: ã»ãã¥ãªãã£ã°ã«ã¼ãè¨±å¯ %s" + +#: cinder/api/ec2/cloud.py:725 +#, fuzzy, python-format +msgid "%s - This rule already exists in group" +msgstr "æå®ãããã«ã¼ã«ã¯æ¢ã«ã°ã«ã¼ã %s ã«åå¨ãã¦ãã¾ãã" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "Create Security Group: ã»ãã¥ãªãã£ã°ã«ã¼ã %s ã使ãã¾ãã" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "ã°ã«ã¼ã %s ã¯æ¢ã«åå¨ãã¦ãã¾ãã" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "Delete security group: ã»ãã¥ãªãã£ã°ã«ã¼ã %s ãåé¤ãã¾ãã" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "Get console output: ã¤ã³ã¹ã¿ã³ã¹ %s ã®ã³ã³ã½ã¼ã«åºåãåå¾ãã¾ãã" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "Create volume: %s GBã®ããªã¥ã¼ã ã使ãã¾ãã" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "ããªã¥ã¼ã %(volume_id)s ãã¤ã³ã¹ã¿ã³ã¹ %(instance_id)s ã®ããã¤ã¹ %(device)s ã«æ¥ç¶" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "Detach volume: ããªã¥ã¼ã %s ããã¿ãããã¾ã" + +#: cinder/api/ec2/cloud.py:959 +#, fuzzy, python-format +msgid "Detach Volume Failed." +msgstr "Detach volume: ããªã¥ã¼ã %s ããã¿ãããã¾ã" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "ã¢ããªãã¥ã¼ã %s ã¯ãµãã¼ãããã¦ãã¾ããã" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "Allocate address: ã¢ãã¬ã¹ãå²ãå½ã¦ã¾ãã" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "Release address: ã¢ãã¬ã¹ %s ãéæ¾ãã¾ãã" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %(instance_id)s ã«ã¢ãã¬ã¹ %(public_ip)s ãå²ãå½ã¦" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "Disassociate address: ã¢ãã¬ã¹ %s ã®é¢é£ä»ããè§£é¤ãã¾ãã" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "ã¤ã³ã¹ã¿ã³ã¹çµäºå¦çãéå§ãã¾ãã" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "Reboot instance: ã¤ã³ã¹ã¿ã³ã¹ %r ãåèµ·åãã¾ãã" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "De-registering image: ã¤ã¡ã¼ã¸ %s ãç»é²è§£é¤ãã¾ãã" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "ã¤ã¡ã¼ã¸ %(image_location)s ã ID %(image_id)s ã§ç»é²ããã¾ãã" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "ã¦ã¼ã¶ã¾ãã¯ã°ã«ã¼ããæå®ããã¦ãã¾ããã" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "ã°ã«ã¼ã \"all\" ã®ã¿ãµãã¼ãããã¦ãã¾ãã" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "operation_type 㯠add ã¾ã㯠remove ã®ä½ããã§ããå¿ è¦ãããã¾ãã" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "ã¤ã¡ã¼ã¸ %s ã®å ¬éè¨å®ãæ´æ°ãã¾ãã" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "ip %s ã«å¯¾ããã¡ã¿ãã¼ã¿ã®åå¾ã«å¤±æãã¾ããã" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "ã¨ã©ã¼ %s ããã£ãããã¾ããã" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "ä¾å¤: Compute.api::pause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "ä¾å¤: Compute.api::unpause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "ä¾å¤: compute.api::suspend %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "ä¾å¤: compute.api::resume %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "ä¾å¤: Compute.api::reset_network %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "ä¾å¤: Compute.api::lock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "ä¾å¤: Compute.api::unlock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, fuzzy, python-format +msgid "Invalid mode: '%s'" +msgstr "䏿£ãªããã¯ã¨ã³ãã§ã: %s" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +#, fuzzy, python-format +msgid "Security group is still in use" +msgstr "Revoke security group ingress: ã»ãã¥ãªãã£ã°ã«ã¼ãè¨±å¯ %s ã®åæ¶" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "æå¹ãªã«ã¼ã«ã使ããçºã®ååãªãã©ã¡ã¼ã¿ãããã¾ãã" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "æå®ãããã«ã¼ã«ã¯æ¢ã«ã°ã«ã¼ã %s ã«åå¨ãã¦ãã¾ãã" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "ã·ã³ã°ã«ãã³ãã¤ã³ã¹ã¿ã³ã¹åãããã¨ãã¾ããã" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "ã°ã«ã¼ãã®æå¾ã®ã¡ã³ãã¼ãåé¤ãããã¨ãã¾ããã代ããã«ã°ã«ã¼ã %s ãåé¤ãã¦ãã ããã" + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "ã¦ã¼ã¶ %r ãæ¤ç´¢ãã¾ãã" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "Failed authorization: ã¢ã¯ã»ã¹ãã¼ %s ã®èªè¨¼ã«å¤±æãã¾ããã" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "ã¦ã¼ã¶å (%s) ãããã¸ã§ã¯ãåã¨ãã¦ä½¿ç¨ãã¾ãã" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "許å¯ããã¾ãã: %(pjid)s ã¨ããåç§°ã®ããã¸ã§ã¯ãã¯ããã¾ãã (ã¦ã¼ã¶=%(uname)s)" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "許å¯ããã¾ãã: ã¦ã¼ã¶ %(uname)s ã¯ç®¡çè ã§ãããã¸ã§ã¯ã %(pjname)s ã®ã¡ã³ãã§ãããã¾ããã" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "Invalid signature: ã¦ã¼ã¶ %s ã®ç½²åã䏿£ã§ãã" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "ããã¸ã§ã¯ããæå®ãã¦ãã ããã" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "ããã¸ã§ã¯ã %(pid)s ã®ã¦ã¼ã¶ %(uid)s ã«ãã¼ã« %(role)s ãä»ä¸ãã¾ãã" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "ãµã¤ãå ±éã®ãã¼ã« %(role)s ãã¦ã¼ã¶ %(uid)s ã«ä»ä¸ãã¾ãã" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "ããã¸ã§ã¯ã %(pid)s ã®ã¦ã¼ã¶ %(uid)s ãããã¼ã« %(role)s ãåé¤ãã¾ãã" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "ã¦ã¼ã¶ %(uid)s ãããµã¤ãå ±éã®ãã¼ã« %(role)s ãåé¤ãã¾ãã" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "ããã¸ã§ã¯ã %(name)s ã管çè %(manager_user)s ã§ä½æãã¾ããã" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "modifying project: ããã¸ã§ã¯ã %s ãæ´æ°ãã¾ãã" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "ã¦ã¼ã¶ %(uid)s ãããã¸ã§ã¯ã %(pid)s ã«è¿½å ãã¾ãã" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "ã¦ã¼ã¶ %(uid)s ãããã¸ã§ã¯ã %(pid)s ããåé¤ãã¾ãã" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "Deleting project: ããã¸ã§ã¯ã %s ãåé¤ãã¾ãã" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "ã¦ã¼ã¶ %(rvname)s ã使ãã¾ããã(管çè : %(rvadmin)r)" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "Deleting user: ã¦ã¼ã¶ %s ãåé¤ãã¾ãã" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "Access Key change: ã¦ã¼ã¶ %s ã®ã¢ã¯ã»ã¹ãã¼ãæ´æ°ãã¾ãã" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "Secret Key change: ã¦ã¼ã¶ %s ã®ã·ã¼ã¯ã¬ãããã¼ãæ´æ°ãã¾ãã" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "ã¦ã¼ã¶ %(uid)s ã«å¯¾ãã¦ç®¡çè ç¶æ ã %(admin)r ã«è¨å®ããã¾ããã" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "ããã¸ã§ã¯ã %s ã«é¢ããvpnãã¼ã¿ãããã¾ããã" + +#: cinder/cloudpipe/pipelib.py:46 +#, fuzzy, python-format +msgid "Instance type for vpn instances" +msgstr "Get console output: ã¤ã³ã¹ã¿ã³ã¹ %s ã®ã³ã³ã½ã¼ã«åºåãåå¾ãã¾ãã" + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "openvpnã®è¨å®ã«å ¥ãããããã¯ã¼ã¯ã®å¤" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "openvpnã®è¨å®ã«å ¥ããããããã¹ã¯ã®å¤" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "%s ç¨ã®VPNãèµ·åãã¾ãã" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +#, fuzzy, python-format +msgid "Cannot run any more instances of this type." +msgstr "ã¤ã³ã¹ã¿ã³ã¹ã®ã¯ãªã¼ã¿ãè¶ ãã¾ããããã®ã¿ã¤ãã«ããã¦ã¯ã㨠%s ã¤ã³ã¹ã¿ã³ã¹ããå®è¡ã§ãã¾ããã" + +#: cinder/compute/api.py:259 +#, fuzzy, python-format +msgid "Can only run %s more instances of this type." +msgstr "ã¤ã³ã¹ã¿ã³ã¹ã®ã¯ãªã¼ã¿ãè¶ ãã¾ããããã®ã¿ã¤ãã«ããã¦ã¯ã㨠%s ã¤ã³ã¹ã¿ã³ã¹ããå®è¡ã§ãã¾ããã" + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "raw instanceãçæãã¾ãã" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "%s åã®ã¤ã³ã¹ã¿ã³ã¹ã®èµ·åãå§ãã¾ãâ¦" + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +#, fuzzy, python-format +msgid "Going to try to soft delete instance" +msgstr "%s ã忢ãããã¨ãã¦ãã¾ã" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +#, fuzzy, python-format +msgid "Going to try to terminate instance" +msgstr "%s ã忢ãããã¨ãã¦ãã¾ã" + +#: cinder/compute/api.py:977 +#, fuzzy, python-format +msgid "Going to try to stop instance" +msgstr "%s ã忢ãããã¨ãã¦ãã¾ã" + +#: cinder/compute/api.py:996 +#, fuzzy, python-format +msgid "Going to try to start instance" +msgstr "%s ã忢ãããã¨ãã¦ãã¾ã" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "check_instance_lock: decorating: |%s|" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "check_instance_lock: locked: |%s|" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "check_instance_lock: admin: |%s|" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "check_instance_lock: executing: |%s|" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "check_instance_lock: not executing |%s|" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, fuzzy, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %s ãçµäºããå¾ã§ãã" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ã¯æ¢ã«çæããã¦ãã¾ãã" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "Rebooting instance: ã¤ã³ã¹ã¿ã³ã¹ %s ãåèµ·åãã¾ãã" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "snapshotting: ã¤ã³ã¹ã¿ã³ã¹ %s ã®ã¹ãããã·ã§ãããåå¾ä¸" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "Rescuing: ã¤ã³ã¹ã¿ã³ã¹ %s ãã¬ã¹ãã¥ã¼ãã¾ãã" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "Unrescuing: ã¤ã³ã¹ã¿ã³ã¹ %s ãã¢ã³ã¬ã¹ãã¥ã¼ãã¾ãã" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "pausing: ã¤ã³ã¹ã¿ã³ã¹ %s ã䏿忢ãã¾ãã" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "unpausing: ã¤ã³ã¹ã¿ã³ã¹ %s ã®ä¸æåæ¢ãè§£é¤ãã¾ãã" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "retrieving diagnostics: ã¤ã³ã¹ã¿ã³ã¹ %s ã®è¨ºææ å ±ãåå¾ãã¾ãã" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "suspending: ã¤ã³ã¹ã¿ã³ã¹ %s ããµã¹ãã³ããã¾ãã" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "resuming: ã¤ã³ã¹ã¿ã³ã¹ %s ãã¬ã¸ã¥ã¼ã ãã¾ãã" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "locking: ã¤ã³ã¹ã¿ã³ã¹ %s ãããã¯ãã¾ãã" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "unlocking: ã¤ã³ã¹ã¿ã³ã¹ %s ã®ããã¯ãè§£é¤ãã¾ãã" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "getting locked state: ã¤ã³ã¹ã¿ã³ã¹ %s ã®ããã¯ãåå¾ãã¾ããã" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %s: ãããã¯ã¼ã¯ããªã»ãããã¾ã" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "ããªã¥ã¼ã ãæªç¥ã®ã¤ã³ã¹ã¿ã³ã¹ %s ãããã¿ãããã¾ãã" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "ã³ã³ã½ã¼ã«ã追å ãã¦ãã¾ã" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "åå¨ããªãã³ã³ã½ã¼ã« %(console_id)s ãåé¤ãããã¨ãã¾ãã" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "xvp è¨å®ãåæ§ç¯ãã¦ãã¾ã" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "%s ãå度æ¸ãè¾¼ã¿ã¾ãã" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "xvp ã忢ãã¦ãã¾ã" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "xvp ãéå§ãã¦ãã¾ã" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "xvp ã®éå§ä¸ã«ã¨ã©ã¼: %s" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "xvp ãåèµ·åãã¦ãã¾ã" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "xvp ãå®è¡ããã¦ãã¾ããâ¦" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "Request context ã空ã¨ãããã¨ã¯éæ¨å¥¨ã§ãã" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "python-migrate ãã¤ã³ã¹ãã¼ã«ããã¦ãã¾ãããçµäºãã¾ãã" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "ãã©ã¤ãã¼ããã¼ã®å¾©å·ã«å¤±æãã¾ãã: %s" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "åæåãã¯ã¿ã®å¾©å·ã«å¤±æãã¾ãã: %s" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "ã¤ã¡ã¼ã¸ãã¡ã¤ã« %(image_file)s ã®å¾©å·ã«å¤±æãã¾ãã: %(err)s" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "dnsmasqã«å¯¾ãã¦hupãéä¿¡ãã¾ããã %s ãçºçãã¾ããã" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "Pid %d ã¯ç¡å¹ã§ããdnsmasqãåå®è¡ãã¾ãã" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "radvd 忢ã %s ä¾å¤ãçºè¡ãã¾ãã" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "Pid %d ãã¹ãã¼ã«ãã¦ããã®ã§ radvd ãåå®è¡ãã¦ãã¾ãâ¦" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "VLANã¤ã³ã¿ãã§ã¼ã¹ %s ãéå§ãã¾ãã" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "%s ç¨ã®ããªãã¸ã¤ã³ã¿ãã§ã¼ã¹ãéå§ãã¾ãã" + +#: cinder/network/linux_net.py:1142 +#, fuzzy, python-format +msgid "Starting bridge %s " +msgstr "%s ç¨ã®ããªãã¸ã¤ã³ã¿ãã§ã¼ã¹ãéå§ãã¾ãã" + +#: cinder/network/linux_net.py:1149 +#, fuzzy, python-format +msgid "Done starting bridge %s" +msgstr "xvp ã®éå§ä¸ã«ã¨ã©ã¼: %s" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "ãããã¯ã¼ã¯ãã¹ãã®è¨å®ããã¾ãã" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "ãªã¼ã¹ãã¦ããªãIP %s ãéæ¾ããã¾ããã" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "ãããã¯ã¼ã¯ã®æ°ã¨VLANã®éå§çªå·ã®å㯠4094 ãã大ããã§ãã¾ããã" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "å¼ã³åºãå ã« ä¾å¤ %s ãè¿å´ãã¾ãã" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "context %s ãã¢ã³ããã¯ãã¾ããã" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "åä¿¡ï¼ %s" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "ã¡ãã»ã¼ã¸ %s ã«å¯¾ããã¡ã½ãããåå¨ãã¾ããã" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "ã¡ãã»ã¼ã¸ %s ã«å¯¾ããã¡ã½ãããåå¨ãã¾ããã" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "MSG_ID㯠%s ã§ãã" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "äºåã®(fallback)ã¹ã±ã¸ã¥ã¼ã©ãå®è£ ããå¿ è¦ãããã¾ãã" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %s ã¯å®è¡ä¸ã§ãã" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %s ãçµäºããå¾ã§ãã" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "éå§ã¢ãã¬ã¹" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "ã¿ã¼ã²ãã %s ãã¢ãã±ã¼ããã¾ããã" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "Nested received %(queue)s, %(value)s" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "ãã¹ãããæ»ãå¤: %s" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "%s ãåä¿¡ã" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "ãã¤ãã¼ãã¤ã¶ã¸ã®æ¥ç¶ã«å¤±æãã¾ããã" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "ãã£ã«ã¿ããã¦ããªãã¤ã³ã¹ã¿ã³ã¹ %s ã®ãã£ã«ã¿è§£é¤ã試è¡ãã¾ãã" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" +"connection_type=xenapi ã使ç¨ããã«ã¯ã以ä¸ã®æå®ãå¿ è¦ã§ãï¼ xenapi_connection_url, " +"xenapi_connection_username (ãªãã·ã§ã³), xenapi_connection_password" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "ä¾å¤ %s ãçºçãã¾ããã" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %(instance_name)s: ã¤ã³ã¹ã¿ã³ã¹ãã¡ã¤ã«ç¾¤ %(target)s ãåé¤ãã¦ãã¾ã" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "ã¤ã³ã¹ã¿ã³ã¹%s: åèµ·åãã¾ããã" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %s: rescued" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %s: èµ·åãã¾ããã" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %s ã®ã¤ã¡ã¼ã¸ãçæãã¾ãã" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %(inst_name)s: ã¤ã¡ã¼ã¸ %(img_id)s ã¸ã®ãã¼ã¿åãè¾¼ã¿ã®ã¨ã©ã¼ãç¡è¦ãã¦ãã¾ã (%(e)s)" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %s: toXML ã¡ã½ãããéå§ã" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %s: toXML ã¡ã½ãããå®äºã" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "ãã¡ã¤ã«ã·ã¹ãã %s ã®ãã¦ã³ãã«å¤±æãã¾ããã" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "ã¤ã¡ã¼ã¸ãã«ã¼ããã㯠%s ã«ã¢ã¿ããã§ãã¾ããã" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "空ãã® nbd ããã¤ã¹ãããã¾ãã" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "nbd ããã¤ã¹ %s ãåºç¾ãã¾ãã" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "libvirt %s ã¸æ¥ç¶ãã¾ãã" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "libvirtã¸ã®æ¥ç¶ãåãã¦ãã¾ãã" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +#, fuzzy, python-format +msgid "Instance soft rebooted successfully." +msgstr "ã¤ã³ã¹ã¿ã³ã¹%s: åèµ·åãã¾ããã" + +#: cinder/virt/libvirt/connection.py:696 +msgid "Failed to soft reboot instance." +msgstr "" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "ãã¼ã¿: %(data)r, ãã¡ã¤ã«ãã¹: %(fpath)r" + +#: cinder/virt/libvirt/connection.py:978 +msgid "Guest does not have a console available" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "éãããã¼ããè¦ã¤ããã¾ãã" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "%(text)s: _db_content => %(content)s" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "NotImplemented ä¾å¤ãçºçããã¾ãã" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "xenapi.fake ã«ã¯ %s ãå®è£ ããã¦ãã¾ããã" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "%(localname)s %(impl)s ãå¼ã³åºãã¾ãã" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "getter %s ãã³ã¼ã«ãã¾ãã" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "xenapi.fake ã« %s ã«é¢ããå®è£ ããªããã弿°ã®æ°ã誤ã£ã¦ãã¾ãã" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "ããªã㸠%s ã«å¯¾ãã¦ããªãã¸ãè¤æ°åå¨ãã¾ãã" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "ããªã㸠%s ã«å¯¾ãããããã¯ã¼ã¯ãåå¨ãã¾ããã" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, fuzzy, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "ããªã¥ã¼ã %s ãåæ(detach)ã§ãã¾ãã" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %s ã®VBDãè¦ã¤ããã¾ããã" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, fuzzy, python-format +msgid "VBD %s already detached" +msgstr "ã°ã«ã¼ã %s ã¯æ¢ã«åå¨ãã¦ãã¾ãã" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "VBD %s ã® unplug ã«å¤±æãã¾ããã" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "VBD %s ã®åé¤ã«å¤±æãã¾ããã" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, fuzzy, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "VM %(vm_ref)s, VDI %(vdi_ref)s ç¨ä»®æ³ãããã¯ããã¤ã¹(VBD) %(vbd_ref)s ã使ãã¾ããã" + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "VM %(vm_ref)s, VDI %(vdi_ref)s ç¨ä»®æ³ãããã¯ããã¤ã¹(VBD) %(vbd_ref)s ã使ãã¾ããã" + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" +"%(sr_ref)s ä¸ã« VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, " +"%(read_only)s) ã使ãã¾ããã" + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, fuzzy, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "ã©ãã« '%(label)s' ä»ã VM %(vm_ref)s ã®ã¹ãããã·ã§ããã使ãã¦ãã¾ãâ¦" + +#: cinder/virt/xenapi/vm_utils.py:392 +#, fuzzy, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "VM %(vm_ref)s ããã¹ãããã·ã§ãã %(template_vm_ref)s ã使ãã¾ããã" + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "ID %(image_id)s ã¨ã㦠%(vdi_uuids)s ã®ã¢ãããã¼ãã®çºã« xapi ãåãåãããã¦ãã¾ã" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, fuzzy, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "ã¤ã¡ã¼ã¸ %(image)s ã®ãµã¤ãº:%(virtual_size)d" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "ãã¡ã¤ã³0 ä¸ã® /boot/guest ã« VDI %s ãã³ãã¼ä¸" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "ã«ã¼ãã«/RAMãã£ã¹ã¯ VDI %s ãåé¤ããã¾ãã" + +#: cinder/virt/xenapi/vm_utils.py:895 +msgid "Failed to fetch glance image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "PV kernelã®vdi %s ãåå¾ãã¾ãã" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "VDI %s ã¯ä¾ç¶ã¨ãã¦åå¨ãã¦ãã¾ãã" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "(VM_UTILS) xenserver ã® vm state -> |%s|" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "(VM_UTILS) xenapi ã® power_state -> |%s|" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "SR %s ãåã¹ãã£ã³ãã¾ãã" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "VHD %(vdi_uuid)s ã®è¦ªã¯ %(parent_ref)s ã§ã" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "親 %(parent_uuid)s ãå ã ã®è¦ª %(original_parent_uuid)s ã¨ä¸è´ãã¾ããã使ãå¾ æ©ãã¦ãã¾ãâ¦" + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "VBD %s ãæ¥ç¶ãã¦ãã¾ã⦠" + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "ä»®æ³ãããã¯ããã¤ã¹(VBD) %s ã®æ¥ç¶ãå®äºãã¾ããã" + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "VDI %s ç¨ã®ä»®æ³ãããã¯ããã¤ã¹(VBD)ãåé¤ãã¦ãã¾ã⦠" + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "VDI %s ç¨ã®ä»®æ³ãããã¯ããã¤ã¹(VBD)ã®åé¤ãå®äºãã¾ããã" + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "%s ã«å¯¾ã㦠pygrub ãå®è¡ãã¦ãã¾ã" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "Xen Kernel %s ãè¦ã¤ããã¾ããã" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "" +"No Xen kernel found. Booting HVM.\r\n" +"Xen ç¨ã«ã¼ãã«ãè¦ã¤ããã¾ãããå®å ¨ä»®æ³åã¢ã¼ã(HVM)ã§èµ·åãã¦ãã¾ãã" + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "ãã¼ãã£ã·ã§ã³ãã¼ãã« %s ã®æ¸ãè¾¼ã¿ãå®äºãã¾ããã" + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +#, fuzzy +msgid "Starting instance" +msgstr "raw instanceãçæãã¾ãã" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +msgid "Failed to spawn, rolling back" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "ãã¡ã¤ã«ãã¹ '%s' ãåãè¾¼ãã§ãã¾ã" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +#, fuzzy +msgid "Starting VM" +msgstr "xvp ãåèµ·åãã¦ãã¾ã" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +#, fuzzy, python-format +msgid "Finished snapshot and upload for VM" +msgstr "VM %s ã®ã¹ãããã·ã§ããã¨ã¢ãããã¼ããå®äºãã¾ããã" + +#: cinder/virt/xenapi/vmops.py:677 +#, fuzzy, python-format +msgid "Starting snapshot for VM" +msgstr "VM %s ã«å¯¾ããã¹ãããã·ã§ãããéå§ãã¾ãã" + +#: cinder/virt/xenapi/vmops.py:686 +#, fuzzy, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %s ã«ããªã¥ã¼ã ãæ¥ç¶(attach)ã§ãã¾ããã" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "ã«ã¼ãã«/RAMãã£ã¹ã¯ãã¡ã¤ã«ãåé¤ããã¾ãã" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +#, fuzzy +msgid "Destroying VM" +msgstr "xvp ãåèµ·åãã¦ãã¾ã" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +#, fuzzy +msgid "Injecting network info to xenstore" +msgstr "ãããã¯ã¼ã¯ãã¹ãã®è¨å®ããã¾ãã" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, fuzzy, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "VM %(vm_ref)s, network %(network_ref)s ç¨ä»®æ³ã¤ã³ã¿ã¼ãã§ã¼ã¹(VIF)ã使ãã¦ãã¾ãã" + +#: cinder/virt/xenapi/vmops.py:1495 +#, fuzzy, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "VM %(vm_ref)s, network %(network_ref)s ç¨ä»®æ³ã¤ã³ã¿ã¼ãã§ã¼ã¹(VIF)ã使ãã¦ãã¾ãã" + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "OpenSSL ã¨ã©ã¼: %s" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "Storage Repository ã使ã§ãã¾ããã" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "%(sr_ref)s ã¨ã㦠%(label)s ãå°å ¥ãã¾ãã" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "%s ã introduce ãã¾ãâ¦" + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "VBD %s ãã SRãåå¾ã§ãã¾ããã" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "%(sr_ref)s ç¨ã®ç©çãããã¯ããã¤ã¹(PBD)å徿ã«ä¾å¤ %(exc)s ãç¡è¦ãã¦ãã¾ã" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "ç©çãããã¯ããã¤ã¹(PBD) %(pbd)s ã®åãå¤ãæã«ä¾å¤ %(exc)s ãç¡è¦ãã¦ãã¾ã" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "SR %s ã®VDIã®introduceãã§ãã¾ããã" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "VDI %s ã®ã¬ã³ã¼ããåå¾ã§ãã¾ããã" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "SR %s ã®VDIãintroduceã§ãã¾ããã" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "ãã¦ã³ããã¤ã³ãã夿ã§ãã¾ããã %s" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %(instance_name)s ç¨ã®SR %(sr_ref)s ã«ããã VDI ã使ã§ãã¾ãã" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %(instance_name)s ç¨ã®SR %(sr_ref)s ã使ç¨ã§ãã¾ãã" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %s ã«ããªã¥ã¼ã ãæ¥ç¶(attach)ã§ãã¾ããã" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %(instance_name)s ã«ãã¦ã³ããã¤ã³ã %(mountpoint)s ãæ¥ç¶(attach)ãã¾ãã" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "ããªã¥ã¼ã åæ: %(instance_name)s, %(mountpoint)s" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "ããªã¥ã¼ã %s ã®åå¨ã確èªã§ãã¾ããã" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "ããªã¥ã¼ã %s ãåæ(detach)ã§ãã¾ãã" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "ã¤ã³ã¹ã¿ã³ã¹ %(instance_name)s ãããã¦ã³ããã¤ã³ã %(mountpoint)s ãåæ(detach)ãã¾ãã" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +#, fuzzy +msgid "Volume status must be available or error" +msgstr "ããªã¥ã¼ã ã®ã¹ãã¼ã¿ã¹(status)㯠available ã§ãªããã°ãªãã¾ããã" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +#, fuzzy +msgid "Volume Snapshot status must be available or error" +msgstr "ããªã¥ã¼ã ã®ã¹ãã¼ã¿ã¹(status)㯠available ã§ãªããã°ãªãã¾ããã" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "å®è¡å¤±æãããªã«ããªã¼ãã¾ãã%s åç®ã®ãã©ã¤ã" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "ããªã¥ã¼ã ã°ã«ã¼ã%sãåå¨ãã¾ããã" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "ããªã¥ã¼ã %s ç¨ã® iSCSI ã¨ã¯ã¹ãã¼ããè¦ã¤ããã¾ãã" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "å½ã®ISCSI: %s" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "rbd ã«ãã¼ã« %s ãããã¾ããã" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "Sheepdog ãåä½ãã¦ãã¾ãã: %s" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "Sheepdog ãæ©è½ãã¦ãã¾ãã" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "%s åã®ããªã¥ã¼ã ãåã¨ã¯ã¹ãã¼ããã¾ãã" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "ããªã¥ã¼ã %s ã®ã¨ãã¹ãã¼ããã¹ããããã¾ãã" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "ããªã¥ã¼ã %sã使ãã¾ãã" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "ããªã¥ã¼ã %(vol_name)s: ãµã¤ãº %(vol_size)sG ã®lvã使ãã¾ãã" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "ããªã¥ã¼ã %s ãã¨ã¯ã¹ãã¼ããã¾ãã" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "ããªã¥ã¼ã %s ã®ä½æã«æåãã¾ããã" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "ããªã¥ã¼ã ã¯ã¢ã¿ãããããã¾ã¾ã§ãã" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "ããªã¥ã¼ã ã¯ãã®ãã¼ãã®ãã¼ã«ã«ã§ã¯ããã¾ããã" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "ããªã¥ã¼ã %s ã®ã¨ã¯ã¹ãã¼ããè§£é¤ãã¾ãã" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "ããªã¥ã¼ã %s ãåé¤ãã¾ãã" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "ããªã¥ã¼ã %s ã®åé¤ã«æåãã¾ããã" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, fuzzy, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "snapshotting: ã¤ã³ã¹ã¿ã³ã¹ %s ã®ã¹ãããã·ã§ãããåå¾ä¸" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +#, fuzzy +msgid "Connected to DFM server" +msgstr "ãã¥ã¼ã«åæ¥ç¶ãã¾ããã" + +#: cinder/volume/netapp.py:159 +#, fuzzy, python-format +msgid "Job failed: %s" +msgstr "NotFound çºç: %s" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, fuzzy, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "ããªã¥ã¼ã %s ç¨ã® iSCSI ã¨ã¯ã¹ãã¼ããè¦ã¤ããã¾ãã" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, fuzzy, python-format +msgid "No LUN ID for volume %s" +msgstr "ããªã¥ã¼ã %s ç¨ã® iSCSI ã¨ã¯ã¹ãã¼ããè¦ã¤ããã¾ãã" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, fuzzy, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "ip %s ã«å¯¾ããã¡ã¿ãã¼ã¿ã®åå¾ã«å¤±æãã¾ããã" + +#: cinder/volume/netapp.py:614 +#, fuzzy, python-format +msgid "Failed to get host details for host ID %s" +msgstr "ip %s ã«å¯¾ããã¡ã¿ãã¼ã¿ã®åå¾ã«å¤±æãã¾ããã" + +#: cinder/volume/netapp.py:620 +#, fuzzy, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "ip %s ã«å¯¾ããã¡ã¿ãã¼ã¿ã®åå¾ã«å¤±æãã¾ããã" + +#: cinder/volume/netapp.py:625 +#, fuzzy, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "ip %s ã«å¯¾ããã¡ã¿ãã¼ã¿ã®åå¾ã«å¤±æãã¾ããã" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, fuzzy, python-format +msgid "Got response: %s" +msgstr "å¿ç %s" + +#: cinder/volume/nexenta/volume.py:96 +#, fuzzy, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "ããªã¥ã¼ã ã°ã«ã¼ã%sãåå¨ãã¾ããã" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Zone %(zone_id)s could not be found." +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "" + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "æ¢ã«æ¶å»æ¸ã¿ã®ã¤ã³ã¹ã¿ã³ã¹%sãæ¶å»ãããã¨ãã¾ããã" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "%sã®ã¢ããã¿ã¼ã³ã³ã·ã¥ã¼ãã¼(Adapter Consumer)ãåæåãã¦ãã¾ãã" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "topic 㯠%s ã§ãã" + +#~ msgid "message %s" +#~ msgstr "ã¡ãã»ã¼ã¸ %s" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "(%(nm)s) å ¬é (ãã¼: %(routing_key)s) %(message)s" + +#~ msgid "Publishing to route %s" +#~ msgstr "ã«ã¼ã %s ã¸ãããªãã·ã¥" + +#~ msgid "Declaring queue %s" +#~ msgstr "queue %s ã®å®£è¨" + +#~ msgid "Declaring exchange %s" +#~ msgstr "exchange %s ã®å®£è¨" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "ãã¼ %(routing_key)s ä»ãã§ %(exchange)s ã« %(queue)s ããã¤ã³ããã¦ãã¾ã" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "%(queue)s ããåå¾ãã¦ãã¾ã: %(message)s" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "ã¿ã¹ã¯ [%(name)s] %(task)s ç¶æ : æå %(result)s" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "ã¿ã¹ã¯ [%(name)s] %(task)s ç¶æ : %(status)s %(error_info)s" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "virsh ã®åºå: %r" + +#~ msgid "cool, it's a device" +#~ msgstr "ããã¤ã¹ã§ãã" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "VM %s ã使ãã¾ãã" + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "%(vm_ref)s ã¨ã㦠VM %(instance_name)s ã使ãã¦ãã¾ã" + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "VDI %s ç¨ã« VBD ã使ãã¦ãã¾ã⦠" + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "VDI %s ç¨ VBD ã®ä½æãå®äºãã¾ããã" + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "VBD.unplug ã¯ï¼åç®ã§æåãã¾ããã" + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "VBD.unplug ãæå¦ããã¾ãã: å試è¡ãã¦ãã¾ãâ¦" + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "VBD.unplug ã¯æçµçã«æåãã¾ããã" + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "VBD.unplug ä¸ã® XenAPI.Failure ãç¡è¦ãã¦ãã¾ã: %s" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "XenAPI.Failure %s ãç¡è¦ãã¦ãã¾ã" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "ã¤ã³ã¹ã¿ã³ã¹ %s: èµ·åã«å¤±æãã¾ãã" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "VM %s ãéå§ãã¾ãâ¦" + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "VM %(vm_ref)s, network %(network_ref)s ç¨ VIF %(vif_ref)s ã使ãã¾ããã" + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "VM %(vm_ref)s, VDI %(vdi_ref)s ç¨ VBD ã使ãã¦ãã¾ã⦠" + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/ko/LC_MESSAGES/nova.po b/cinder/locale/ko/LC_MESSAGES/nova.po new file mode 100644 index 000000000..0c934a398 --- /dev/null +++ b/cinder/locale/ko/LC_MESSAGES/nova.po @@ -0,0 +1,8207 @@ +# Korean translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2011-12-16 04:42+0000\n" +"Last-Translator: Zhongyue Luo <lzyeval@gmail.com>\n" +"Language-Team: Korean <ko@li.org>\n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "CA 루í¸ì íì¼ì´ë¦" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "ë¹ë°í¤ì íì¼ëª " + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "í¤ë¥¼ ì ì¥íë ê²½ë¡" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "CA 루í¸ë¥¼ ì ì¥íë ê²½ë¡" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "ê° íë¡ì í¸ë§ë¤ CA를 ì¬ì©íìê² ìµëê¹?" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "íëê·¸ ê²½ë¡: %s" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "ëª ë ¹ ì¤íëì¤ ì측íì§ ëª»í ìë¬ê° ë°ìíìµëë¤" + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "" + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "" + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "" + +#: cinder/exception.py:216 +#, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "" + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "" + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "" + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "" + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "" + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "" + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "" + +#: cinder/exception.py:334 +msgid "Failed to terminate instance" +msgstr "" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, python-format +msgid "Could not fetch image %(image)s" +msgstr "" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "" + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "" + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, python-format +msgid "QuotaError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "" + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:551 +msgid "Invalid CIDR" +msgstr "" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "" + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:725 +#, python-format +msgid "%s - This rule already exists in group" +msgstr "" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:959 +msgid "Detach Volume Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "Compute.api::pause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "Compute.api::unpause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "compute.api::suspend %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "compute.api::resume %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "Compute.api::reset_network %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "Compute.api::lock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "Compute.api::unlock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, python-format +msgid "Invalid mode: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +msgid "Security group is still in use" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:46 +msgid "Instance type for vpn instances" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +msgid "Cannot run any more instances of this type." +msgstr "" + +#: cinder/compute/api.py:259 +#, python-format +msgid "Can only run %s more instances of this type." +msgstr "" + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "" + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +msgid "Going to try to soft delete instance" +msgstr "" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +msgid "Going to try to terminate instance" +msgstr "" + +#: cinder/compute/api.py:977 +msgid "Going to try to stop instance" +msgstr "" + +#: cinder/compute/api.py:996 +msgid "Going to try to start instance" +msgstr "" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "check_instance_lock: decorating: |%s|" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "check_instance_lock: locked: |%s|" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "check_instance_lock: admin: |%s|" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "check_instance_lock: executing: |%s|" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "check_instance_lock: not executing |%s|" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "ì¸ì¤í´ì¤ê° ì´ë¯¸ ìì±ëììµëë¤" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "ì¸ì¤í´ì¤ %s를 ì¬ë¶í í©ëë¤" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "ì¸ì¤í´ì¤ %s: ì¤ë ì· ì ì¥ì¤" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "" + +#: cinder/network/linux_net.py:1142 +#, python-format +msgid "Starting bridge %s " +msgstr "" + +#: cinder/network/linux_net.py:1149 +#, python-format +msgid "Done starting bridge %s" +msgstr "" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +msgid "Instance soft rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:696 +msgid "Failed to soft reboot instance." +msgstr "" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "" + +#: cinder/virt/libvirt/connection.py:978 +msgid "Guest does not have a console available" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, fuzzy, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "%s 볼륨 íì°©ì ì¤í¨íìµëë¤" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, python-format +msgid "VBD %s already detached" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:392 +#, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:895 +msgid "Failed to fetch glance image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +#, fuzzy, python-format +msgid "Starting instance" +msgstr "ì¸ì¤í´ì¤ %s를 ì¬ë¶í í©ëë¤" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +msgid "Failed to spawn, rolling back" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +msgid "Starting VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +msgid "Finished snapshot and upload for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:677 +msgid "Starting snapshot for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:686 +#, fuzzy, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "%s ì¸ì¤í´ì¤ì 볼륨ì¥ì°© í ì ììµëë¤" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +msgid "Destroying VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +msgid "Injecting network info to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1495 +#, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "%(instance_name)s ì¸ì¤í´ì¤ì %(sr_ref)s SRì ëí VDI ìì±ì´ ì¤í¨íìµëë¤" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "%(instance_name)s ì¸ì¤í´ì¤ì %(sr_ref)s SRì ì¬ì© í ì ììµëë¤" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "%s ì¸ì¤í´ì¤ì 볼륨ì¥ì°© í ì ììµëë¤" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "%(instance_name)s ì¸ì¤í´ì¤ì %(mountpoint)s ë§ì´í¸ì§ì ì´ ì¥ì°©ëììµëë¤" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "볼륨 íì°©: %(instance_name)s, %(mountpoint)s" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "%s 볼륨ì ì°¾ìì ììµëë¤" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "%s 볼륨 íì°©ì ì¤í¨íìµëë¤" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "%(instance_name)s ì¸ì¤í´ì¤ì %(mountpoint)s ë§ì´í¸ì§ì ì´ íì°©ëììµëë¤" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +#, fuzzy +msgid "Volume status must be available or error" +msgstr "볼륨ì ìí를 ì ì ììµëë¤" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +#, fuzzy +msgid "Volume Snapshot status must be available or error" +msgstr "볼륨ì ìí를 ì ì ììµëë¤" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, fuzzy, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "ì¸ì¤í´ì¤ %s: ì¤ë ì· ì ì¥ì¤" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +msgid "Connected to DFM server" +msgstr "" + +#: cinder/volume/netapp.py:159 +#, python-format +msgid "Job failed: %s" +msgstr "" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, fuzzy, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "%s 볼륨ì ì°¾ìì ììµëë¤" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, fuzzy, python-format +msgid "No LUN ID for volume %s" +msgstr "%s 볼륨ì ì°¾ìì ììµëë¤" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "" + +#: cinder/volume/netapp.py:614 +#, python-format +msgid "Failed to get host details for host ID %s" +msgstr "" + +#: cinder/volume/netapp.py:620 +#, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "" + +#: cinder/volume/netapp.py:625 +#, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, python-format +msgid "Got response: %s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:96 +#, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Zone %(zone_id)s could not be found." +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "" + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You can only" +#~ " run %s more instances of this " +#~ "type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to terminate %s" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "ì¸ì¤í´ì¤ %sê° ì´ë¯¸ ìì ëììµëë¤" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Reconnected to queue" +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "response %s" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "" + +#~ msgid "message %s" +#~ msgstr "" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "" + +#~ msgid "Publishing to route %s" +#~ msgstr "" + +#~ msgid "Declaring queue %s" +#~ msgstr "" + +#~ msgid "Declaring exchange %s" +#~ msgstr "" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "" + +#~ msgid "cool, it's a device" +#~ msgstr "" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "" + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Snapshotting VM %(vm_ref)s with label '%(label)s'..." +#~ msgstr "" + +#~ msgid "Created snapshot %(template_vm_ref)s from VM %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "Size for image %(image)s:%(virtual_size)d" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "" + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "" + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "" + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "ì¸ì¤í´ì¤ %s: ìì±ì ì¤í¨íìµëë¤" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "" + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Finished snapshot and upload for VM %s" +#~ msgstr "" + +#~ msgid "Starting snapshot for VM %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Creating VIF for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/nova.pot b/cinder/locale/nova.pot new file mode 100644 index 000000000..2f94b7e3d --- /dev/null +++ b/cinder/locale/nova.pot @@ -0,0 +1,7463 @@ +# Translations template for cinder. +# Copyright (C) 2012 ORGANIZATION +# This file is distributed under the same license as the cinder project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2012. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: cinder 2012.2\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2012-04-08 23:04+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" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "" + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "" + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "" + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "" + +#: cinder/exception.py:216 +#, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "" + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "" + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "" + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "" + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "" + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "" + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "" + +#: cinder/exception.py:334 +msgid "Failed to terminate instance" +msgstr "" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, python-format +msgid "Could not fetch image %(image)s" +msgstr "" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "" + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "" + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, python-format +msgid "QuotaError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "" + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:551 +msgid "Invalid CIDR" +msgstr "" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "" + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:725 +#, python-format +msgid "%s - This rule already exists in group" +msgstr "" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:959 +msgid "Detach Volume Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, python-format +msgid "Invalid mode: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +msgid "Security group is still in use" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:46 +msgid "Instance type for vpn instances" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +msgid "Cannot run any more instances of this type." +msgstr "" + +#: cinder/compute/api.py:259 +#, python-format +msgid "Can only run %s more instances of this type." +msgstr "" + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "" + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +msgid "Going to try to soft delete instance" +msgstr "" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +msgid "Going to try to terminate instance" +msgstr "" + +#: cinder/compute/api.py:977 +msgid "Going to try to stop instance" +msgstr "" + +#: cinder/compute/api.py:996 +msgid "Going to try to start instance" +msgstr "" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "" + +#: cinder/network/linux_net.py:1142 +#, python-format +msgid "Starting bridge %s " +msgstr "" + +#: cinder/network/linux_net.py:1149 +#, python-format +msgid "Done starting bridge %s" +msgstr "" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +msgid "Instance soft rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:696 +msgid "Failed to soft reboot instance." +msgstr "" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "" + +#: cinder/virt/libvirt/connection.py:978 +msgid "Guest does not have a console available" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, python-format +msgid "VBD %s already detached" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:392 +#, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:895 +msgid "Failed to fetch glance image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +msgid "Starting instance" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +msgid "Failed to spawn, rolling back" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +msgid "Starting VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +msgid "Finished snapshot and upload for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:677 +msgid "Starting snapshot for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:686 +#, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +msgid "Destroying VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +msgid "Injecting network info to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1495 +#, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +msgid "Volume status must be available or error" +msgstr "" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +msgid "Volume Snapshot status must be available or error" +msgstr "" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +msgid "Connected to DFM server" +msgstr "" + +#: cinder/volume/netapp.py:159 +#, python-format +msgid "Job failed: %s" +msgstr "" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, python-format +msgid "No LUN ID for volume %s" +msgstr "" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "" + +#: cinder/volume/netapp.py:614 +#, python-format +msgid "Failed to get host details for host ID %s" +msgstr "" + +#: cinder/volume/netapp.py:620 +#, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "" + +#: cinder/volume/netapp.py:625 +#, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, python-format +msgid "Got response: %s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:96 +#, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + diff --git a/cinder/locale/pt_BR/LC_MESSAGES/nova.po b/cinder/locale/pt_BR/LC_MESSAGES/nova.po new file mode 100644 index 000000000..899b9e6b7 --- /dev/null +++ b/cinder/locale/pt_BR/LC_MESSAGES/nova.po @@ -0,0 +1,8208 @@ +# Brazilian Portuguese translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2012-02-06 21:07+0000\n" +"Last-Translator: Adriano Steffler <Unknown>\n" +"Language-Team: Brazilian Portuguese <pt_BR@li.org>\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 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "Nome do arquivo da CA raiz" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "Nome do arquivo da chave privada" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "Aonde armazenamos nossas chaves" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "Onde mantemos nosso CA raiz" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "Devemos usar um CA para cada projeto?" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "Assunto do certificado para usuários, %s para projeto, usuário, timestamp" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "Assunto do certificado para projetos, %s para projeto, timestamp" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "Localização dos sinalizadores: %s" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "Erro inesperado ao executar o comando." + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" +"%(description)s\n" +"Comando: %(cmd)s\n" +"Código de saÃda: %(exit_code)s\n" +"SaÃda padrão: %(stdout)r\n" +"Erro: %(stderr)r" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "" + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "" + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "" + +#: cinder/exception.py:216 +#, fuzzy, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "sem método para mensagem: %s" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "" + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "" + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "" + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "" + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "" + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "" + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "" + +#: cinder/exception.py:334 +#, fuzzy +msgid "Failed to terminate instance" +msgstr "Começando a terminar instâncias" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "Usuário %(uid)s já é um membro do grupo %(group_dn)s" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, python-format +msgid "Could not fetch image %(image)s" +msgstr "" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "Encerrado serviço que não tem entrada na base de dados" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "O objeto da base de dados do serviço desapareceu, Recriando." + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "Recuperada conexão servidor de modelo." + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "servidor de modelo perdido" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "Conjunto completo de FLAGS:" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "Exceção interna: %s" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "Buscando %s" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "Executando comando (subprocesso): %s" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "Resultado foi %s" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "Executando o comando (SSH): %s" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "depuração em retorno de chamada: %s" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "Endereço para Link Local não encontrado: %s" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "Não foi possÃvel atribuir um IP para o Link Local de %(interface)s :%(ex)s" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "Backend inválido: %s" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "backend %s" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "Muitas falhas de autenticação." + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "Falha de Autenticação: %s" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "ação: %s" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "NotFound lançado: %s" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, fuzzy, python-format +msgid "QuotaError raised: %s" +msgstr "Erro inexperado lançado: %s" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "Erro inexperado lançado: %s" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "Ocorreu um erro desconhecido. Por favor tente sua requisição cindermente." + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "Criar par de chaves %s" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "Remover par de chaves %s" + +#: cinder/api/ec2/cloud.py:551 +msgid "Invalid CIDR" +msgstr "" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "Revogado entrada do grupo de segurança %s" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "Não existe regra para os parâmetros especificados" + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "Autorizada entrada do grupo de segurança %s" + +#: cinder/api/ec2/cloud.py:725 +#, fuzzy, python-format +msgid "%s - This rule already exists in group" +msgstr "Esta regra já existe no grupo %s" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "Criar Grupo de Segurança %s" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "group %s já existe" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "Excluir grupo de segurança %s" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "Obter saÃda do console para instância %s" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "Criar volume de %s GB" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "Desanexar volume %s" + +#: cinder/api/ec2/cloud.py:959 +#, fuzzy, python-format +msgid "Detach Volume Failed." +msgstr "Desanexar volume %s" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "atributo não suportado: %s" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "Alocar endereço" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "Liberar endereço %s" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "Desatribuir endereço %s" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "Começando a terminar instâncias" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "Reiniciar instância %r" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "Removendo o registro da imagem %s" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "usuário ou grupo não especificado" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "apenas o grupo \"all\" é suportado" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "operation_type deve ser add ou remove" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "Atualizando publicidade da imagem %s" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "Falha ao obter metadados para o ip: %s" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "Capturado o erro: %s" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "Compute.api::pause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "Compute.api::unpause %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "compute.api::suspend %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "compute.api::resume %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "Compute.api::reset_network %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "Compute.api::lock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "Compute.api::unlock %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, fuzzy, python-format +msgid "Invalid mode: '%s'" +msgstr "Backend inválido: %s" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +#, fuzzy, python-format +msgid "Security group is still in use" +msgstr "Revogado entrada do grupo de segurança %s" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "Esta regra já existe no grupo %s" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "Tentativa de instanciar singleton" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" +"Tentatica de remover o último membto de um grupo. Ao invés disso " +"excluindo o grupo %s." + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "Procurando usuário: %r" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "Falha de autorização para chave de acesso %s" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "Usando nome do projeto = nome do usuário (%s)" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "Assinatura inválida para usuário %s" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "Deve especificar projeto" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "modificando projeto %s" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "Adicionando usuário %(uid)s ao projeto %(pid)s" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "Remover usuário %(uid)s do projeto %(pid)s" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "Excluindo projeto %s" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "Apagando usuário %s" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:46 +#, fuzzy, python-format +msgid "Instance type for vpn instances" +msgstr "Obter saÃda do console para instância %s" + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "Executando VPN para %s" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +msgid "Cannot run any more instances of this type." +msgstr "" + +#: cinder/compute/api.py:259 +#, python-format +msgid "Can only run %s more instances of this type." +msgstr "" + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "" + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +#, fuzzy +msgid "Going to try to soft delete instance" +msgstr "Começando a terminar instâncias" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +#, fuzzy +msgid "Going to try to terminate instance" +msgstr "Começando a terminar instâncias" + +#: cinder/compute/api.py:977 +msgid "Going to try to stop instance" +msgstr "" + +#: cinder/compute/api.py:996 +#, fuzzy +msgid "Going to try to start instance" +msgstr "Começando a terminar instâncias" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "check_instance_lock: decorating: |%s|" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "check_instance_lock: locked: |%s|" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "check_instance_lock: admin: |%s|" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "check_instance_lock: executando: |%s|" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "check_instance_lock: not executando |%s|" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "A instância já foi criada" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "Reiniciando a instância %s" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "instância %s: fazendo um snapshot" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "instância %s: resgatando" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "instância %s: desfazendo o resgate" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "instância %s: pausando" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "instância %s: saindo do pause" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "instância %s: recuperando os diagnósticos" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "instância %s: suspendendo" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "instância %s: resumindo" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "instância %s: bloqueando" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "instância %s: desbloqueando" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "instância %s: obtendo estado de bloqueio" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "instância %s: reset da rede" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "Desconectando volume da instância desconhecida %s" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "Adicionando console" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "Pid %d está ultrapassado, reiniciando dnsmasq" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "Pid %d está ultrapassado, reiniciando radvd" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "Iniciando a VLAN %s" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "Iniciando a Bridge para %s" + +#: cinder/network/linux_net.py:1142 +#, fuzzy, python-format +msgid "Starting bridge %s " +msgstr "Iniciando a Bridge para %s" + +#: cinder/network/linux_net.py:1149 +#, fuzzy, python-format +msgid "Done starting bridge %s" +msgstr "Removendo o registro da imagem %s" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "Retornando exceção %s ao método de origem" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "conteúdo descompactado: %s" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "recebido %s" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "sem método para mensagem: %s" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "Sem método para mensagem: %s" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "MSG_ID é %s" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "Falha ao abrir a conexão com o hypervisor" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +#, fuzzy, python-format +msgid "Instance soft rebooted successfully." +msgstr "volume %s: criado com sucesso" + +#: cinder/virt/libvirt/connection.py:696 +msgid "Failed to soft reboot instance." +msgstr "" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "" + +#: cinder/virt/libvirt/connection.py:978 +msgid "Guest does not have a console available" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "ImpossÃvel localizar uma porta aberta" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "%(text)s: _db_content => %(content)s" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "Aumento não implementado" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "xenapi.fake não tem uma implementação para %s" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "Chamando %(localname)s %(impl)s" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "Chamando o pai %s" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" +"xenapi.fake não tem implementação para %s ou foi chamado com um número de" +" argumentos inválido" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "Encontrado múltiplas redes para a bridge %s" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "Não foi encontrada rede para bridge %s" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, fuzzy, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "Não é possÃvel desconectar o volume %s" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "O VBD não foi encontrado na instância %s" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, fuzzy, python-format +msgid "VBD %s already detached" +msgstr "group %s já existe" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "Não é possÃvel desconectar o VBD %s" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "Não é possÃvel destruir o VBD %s" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, fuzzy, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "VBD %(vbd_ref)s criado para VM %(vm_ref)s, VDI %(vdi_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "VBD %(vbd_ref)s criado para VM %(vm_ref)s, VDI %(vdi_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" +"VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s) no SR " +"%(sr_ref)s criada com sucesso." + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, fuzzy, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "Fazendo um snapshot da VM %(vm_ref)s com rótulo '%(label)s'..." + +#: cinder/virt/xenapi/vm_utils.py:392 +#, fuzzy, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "Snapshot %(template_vm_ref)s criado a partir da VM %(vm_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "" +"Solicitando à xapi para realizar upload da imagem %(vdi_uuids)s com ID " +"%(image_id)s" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, fuzzy, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "Tamanho da imagem %(image)s:%(virtual_size)d" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "Copiando o VDI %s de /boot/guest no dom0" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "Kernel/Ramdisk %s destruidos" + +#: cinder/virt/xenapi/vm_utils.py:895 +msgid "Failed to fetch glance image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "Verificando o vdi %s para kernel PV" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "O VDI %s continua disponÃvel" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "(VM_UTILS) xenserver vm state -> |%s|" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "(VM_UTILS) xenapi power_state -> |%s|" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "Re-escaneando SR %s" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "O VHD %(vdi_uuid)s tem pai %(parent_ref)s" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "Conectando VBD %s ... " + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "O VDB %s foi conectado." + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "Destruindo VBD para o VDI %s ... " + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "O VBD para o VDI %s foi destruÃdo." + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "Rodando pygrub cindermente %s" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "Kernel Xen encontrado: %s" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "Kernel Xen não encontrado. Iniciando como HVM." + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +#, fuzzy, python-format +msgid "Starting instance" +msgstr "Reiniciando a instância %s" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +msgid "Failed to spawn, rolling back" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +msgid "Starting VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +msgid "Finished snapshot and upload for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:677 +msgid "Starting snapshot for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:686 +#, fuzzy, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "Não é possÃvel anexar o volume na instância %s" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +msgid "Destroying VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +msgid "Injecting network info to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, fuzzy, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "Criando a VIF para VM %(vm_ref)s, rede %(network_ref)s." + +#: cinder/virt/xenapi/vmops.py:1495 +#, fuzzy, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "Criando a VIF para VM %(vm_ref)s, rede %(network_ref)s." + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "Erro de OpenSSL: %s" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "Introduzindo %s..." + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "Ponto de montagem não pode ser traduzido: %s" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" +"Não é possÃvel criar o VDI no SR %(sr_ref)s para a instância " +"%(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "Não é possÃvel usar o SR %(sr_ref)s para a instância %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "Não é possÃvel anexar o volume na instância %s" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "Ponto de montagem %(mountpoint)s conectada à instância %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "Detach_volume: %(instance_name)s, %(mountpoint)s" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "Não é possÃvel localizar o volume %s" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "Não é possÃvel desconectar o volume %s" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "Ponto de montagem %(mountpoint)s desanexada da instância %(instance_name)s" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +#, fuzzy +msgid "Volume status must be available or error" +msgstr "O status do volume parece estar disponÃvel" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +#, fuzzy +msgid "Volume Snapshot status must be available or error" +msgstr "O status do volume parece estar disponÃvel" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "Re-exportando %s volumes" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "volume %s: ignorando export" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "volume %s: criando" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "volume %(vol_name)s: criando lv com tamanho %(vol_size)sG" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "volume %s: criando o export" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "volume %s: criado com sucesso" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "O volume continua atachado" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "O volume não pertence à este node" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "volume %s: removendo export" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "volume %s: removendo" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "volume %s: remoção realizada com sucesso" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, fuzzy, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "instância %s: fazendo um snapshot" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +#, fuzzy +msgid "Connected to DFM server" +msgstr "Reconectado à fila" + +#: cinder/volume/netapp.py:159 +#, fuzzy, python-format +msgid "Job failed: %s" +msgstr "NotFound lançado: %s" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, fuzzy, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "Não é possÃvel localizar o volume %s" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, fuzzy, python-format +msgid "No LUN ID for volume %s" +msgstr "Não é possÃvel localizar o volume %s" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, fuzzy, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "Falha ao obter metadados para o ip: %s" + +#: cinder/volume/netapp.py:614 +#, fuzzy, python-format +msgid "Failed to get host details for host ID %s" +msgstr "Falha ao obter metadados para o ip: %s" + +#: cinder/volume/netapp.py:620 +#, fuzzy, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "Falha ao obter metadados para o ip: %s" + +#: cinder/volume/netapp.py:625 +#, fuzzy, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "Falha ao obter metadados para o ip: %s" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, fuzzy, python-format +msgid "Got response: %s" +msgstr "resposta %s" + +#: cinder/volume/nexenta/volume.py:96 +#, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Zone %(zone_id)s could not be found." +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "" + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You can only" +#~ " run %s more instances of this " +#~ "type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to terminate %s" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "tentando destruir instância já destruida: %s" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "Iniciando o Adaptador Consumidor para %s" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "topico é %s" + +#~ msgid "message %s" +#~ msgstr "mensagem %s" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "(%(nm)s) publicar (key: %(routing_key)s) %(message)s" + +#~ msgid "Publishing to route %s" +#~ msgstr "Publicando para rota %s" + +#~ msgid "Declaring queue %s" +#~ msgstr "Declarando fila %s" + +#~ msgid "Declaring exchange %s" +#~ msgstr "Declarando troca %s" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "Ligação %(queue)s para %(exchange)s com chave %(routing_key)s" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "Recebendo de %(queue)s: %(message)s" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "" + +#~ msgid "cool, it's a device" +#~ msgstr "" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "VM %s criada..." + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "VM %(instance_name)s criada como %(vm_ref)s." + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "Criando VBD para VDI %s ... " + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "O VBD para VDI %s foi criado." + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "" + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "" + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "Ignorando XenAPI.Failure em VBD.unplug: %s" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "instância %s: falha na geração" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "" + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Finished snapshot and upload for VM %s" +#~ msgstr "" + +#~ msgid "Starting snapshot for VM %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "VIF %(vif_ref)s criada para VM %(vm_ref)s, rede %(network_ref)s." + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "Criando VBD para VM %(vm_ref)s, VDI %(vdi_ref)s ... " + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/ru/LC_MESSAGES/nova.po b/cinder/locale/ru/LC_MESSAGES/nova.po new file mode 100644 index 000000000..bc639e4f1 --- /dev/null +++ b/cinder/locale/ru/LC_MESSAGES/nova.po @@ -0,0 +1,8304 @@ +# Russian translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2012-03-25 09:34+0000\n" +"Last-Translator: Eugene Marshal <Unknown>\n" +"Language-Team: Russian <ru@li.org>\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" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "ÐÐ¼Ñ Ñайла коÑневого ÑенÑÑа ÑеÑÑиÑикаÑии" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "ÐÐ¼Ñ Ñайла ÑекÑеÑного клÑÑа" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "ÐÐ¼Ñ Ñайла коÑневого ÑпиÑка оÑзÑва ÑеÑÑиÑикаÑов" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "ÐÑÑÑ Ðº клÑÑам" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "ÐеÑÑо ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð°Ñего коÑневого ÑенÑÑа ÑеÑÑиÑикаÑии" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "ÐÐ¾Ð»Ð¶Ð½Ñ Ð»Ð¸ Ð¼Ñ Ð¸ÑполÑзоваÑÑ ÑенÑÑ ÑеÑÑиÑикаÑии Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ пÑоекÑа?" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "" +"Тема Ð´Ð»Ñ ÑеÑÑиÑикаÑов полÑзоваÑелей, %s Ð´Ð»Ñ Ð¿ÑоекÑа, полÑзоваÑелÑ, " +"вÑеменной меÑки" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "Тема Ð´Ð»Ñ ÑеÑÑиÑикаÑов пÑоекÑов, %s Ð´Ð»Ñ Ð¿ÑоекÑа, вÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¼ÐµÑка" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "РаÑположение Ñлагов: %s" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "ÐÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð¾Ñибка пÑи вÑполнении командÑ." + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" +"%(description)s\n" +"Ðоманда: %(cmd)s\n" +"Ðод вÑÑ Ð¾Ð´Ð°: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "ÐбнаÑÑжено неизвеÑÑное иÑклÑÑение." + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "ÐÑибка деÑиÑÑовки ÑекÑÑа" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "ÐÑибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ð¸ÑÑÑалÑного инÑеÑÑейÑа" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "" +"5 безÑÑпеÑнÑÑ Ð¿Ð¾Ð¿ÑÑок ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ð¸ÑÑÑалÑного инÑеÑÑейÑа Ñ ÑникалÑнÑм " +"mac-адÑеÑом" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "Сбой ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ glance" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "Сбой ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ c melange" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "Ðе авÑоÑизиÑовано." + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "ÐолÑзоваÑÐµÐ»Ñ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑÑаÑивнÑÑ Ð¿Ñивилегий" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "ÐолиÑика не допÑÑÐºÐ°ÐµÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ %(action)s." + +#: cinder/exception.py:216 +#, fuzzy, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "ЯдÑо не найдено Ð´Ð»Ñ Ð¾Ð±Ñаза %(image_id)s." + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "ÐедопÑÑÑимÑе паÑамеÑÑÑ." + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "ÐедопÑÑÑимÑй Ñнимок" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "Том %(volume_id)s никÑда не пÑиÑоединÑн" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "ÐÑибка загÑÑзки даннÑÑ Ð² ÑоÑÐ¼Ð°Ñ json" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "ÐедопÑÑÑимÑй запÑоÑ." + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "ÐедопÑÑÑÐ¸Ð¼Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑ %(signature)s Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ %(user)s." + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "ÐедопÑÑÑимÑй Ñип копии %(instance_type)s." + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "ÐедопÑÑÑимÑй Ñип Ñома" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "ÐедопÑÑÑимÑй Ñом" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "ÐедопÑÑÑимÑй диапазон поÑÑов %(from_port)s:%(to_port)s. %(msg)s" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "ÐедопÑÑÑимÑй пÑоÑокол IP %(protocol)s." + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "ÐедопÑÑÑимÑй Ñип ÑодеÑжимого %(content_type)s." + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "ÐедопÑÑÑимÑй cidr %(cidr)s." + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" + +#: cinder/exception.py:301 +#, fuzzy, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "ÐопÑÑÑимÑй Ñзел не найден. %(reason)s" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" +"ÐÐ¾Ð¿Ð¸Ñ %(instance_uuid)s в %(attr)s %(state)s. Ðевозможно %(method)s во " +"вÑÐµÐ¼Ñ Ð½Ð°Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¸ в ÑÑом ÑоÑÑоÑнии." + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "ÐÐ¾Ð¿Ð¸Ñ %(instance_id)s не вÑполнÑеÑÑÑ." + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "ÐÐ¾Ð¿Ð¸Ñ %(instance_id)s не пеÑеведена в Ñежим пÑиоÑÑановлениÑ." + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "ÐÐ¾Ð¿Ð¸Ñ %(instance_id)s не пеÑеведена в Ñежим воÑÑÑановлениÑ" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "ÐÑибка пÑиоÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¸" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "ÐÑибка Ð²Ð¾Ð·Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑабоÑÑ ÑеÑвеÑа" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "ÐÑибка пеÑезагÑÑзки копии" + +#: cinder/exception.py:334 +#, fuzzy +msgid "Failed to terminate instance" +msgstr "ÐÑибка пеÑезагÑÑзки копии" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "РданнÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑлÑжба недоÑÑÑпна." + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "СлÑжба Ñомов в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½ÐµÐ´Ð¾ÑÑÑпна." + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "СлÑжба Compute недоÑÑÑпна в наÑÑоÑÑее вÑемÑ." + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "Ðевозможно пеÑемеÑÑиÑÑ ÐºÐ¾Ð¿Ð¸Ñ (%(instance_id)s) на ÑекÑÑий Ñзел (%(host)s)." + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "ÐазнаÑеннÑй Ñзел compute недоÑÑÑпен в наÑÑоÑÑее вÑемÑ." + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "ÐÑÑ Ð¾Ð´Ð½Ñй Ñзел compute недоÑÑÑпен в наÑÑоÑÑее вÑемÑ." + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "Ðопии Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð° Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑÑÐ¸Ñ Ð³Ð¸Ð¿ÐµÑвизоÑа, вмеÑÑо пÑедоÑÑавленной." + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" +"ÐÑедоÑÑавленнÑй адÑÐµÑ Ð´Ð¸Ñка (%(path)s) Ñже ÑÑÑеÑÑвÑеÑ, но ожидалоÑÑ, ÑÑо " +"оÑÑÑÑÑÑвÑеÑ." + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "ÐедопÑÑÑимое ÑазмеÑение пÑедоÑÑавленного ÑÑÑÑойÑÑва (%(path)s)." + +#: cinder/exception.py:381 +#, fuzzy, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "ÐедопÑÑÑимое ÑазмеÑение пÑедоÑÑавленного ÑÑÑÑойÑÑва (%(path)s)." + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "ÐедопÑÑÑимÑе ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¦ÐУ" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "%(address)s не ÑвлÑеÑÑÑ Ð´Ð¾Ð¿ÑÑÑимÑм IP-адÑеÑом в4/6." + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "ФоÑмаÑиÑование диÑка %(disk_format)s недопÑÑÑимо" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "ÐбÑаз %(image_id)s недопÑÑÑим: %(reason)s" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "ÐÐ¾Ð¿Ð¸Ñ %(instance_id)s недопÑÑÑима: %(reason)s" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "Ec2 id %(ec2_id)s недопÑÑÑим." + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "РеÑÑÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½." + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "ÐÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñй Ñлаг %(flag)s не назнаÑен." + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "Том %(volume_id)s не найден." + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "Ðе найден Ñом Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %(instance_id)s." + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "Том %(volume_id)s не Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑаданнÑÑ Ñ ÐºÐ»ÑÑом %(metadata_key)s." + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "Тип Ñома %(volume_type_id)s не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½." + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "Тип Ñома под названием %(volume_type_name)s не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½." + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" +"Тип Ñома %(volume_type_id)s не Ð¸Ð¼ÐµÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¾ÑобенноÑÑей Ñ ÐºÐ»ÑÑом" +" %(extra_specs_key)s." + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "Снимок %(snapshot_id)s не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½." + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "Ñдаление Ñома %(volume_name)s, коÑоÑÑй Ð¸Ð¼ÐµÐµÑ Ñнимок" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "ÐÑÑÑÑÑÑвÑÐµÑ Ð´Ð¸Ñк в %(location)s" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "Ðевозможно найÑи обÑабоÑÑик Ð´Ð»Ñ Ñома %(driver_type)s." + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "ÐедопÑÑÑимÑй обÑаз href %(image_href)s." + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "ÐбÑаз %(image_id)s не найден." + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "ЯдÑо не найдено Ð´Ð»Ñ Ð¾Ð±Ñаза %(image_id)s." + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "ÐолÑзоваÑÐµÐ»Ñ %(user_id)s не найден." + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "ÐÑÐ¾ÐµÐºÑ %(project_id)s не найден." + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "ÐолÑзоваÑÐµÐ»Ñ %(user_id)s не ÑвлÑеÑÑÑ ÑÑаÑÑником пÑоекÑа %(project_id)s." + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "ÐолномоÑÐ¸Ñ %(role_id)s не могÑÑ Ð±ÑÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ñ." + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "Ðевозможно найÑи SR Ð´Ð»Ñ ÑÑениÑ/запиÑи VDI." + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "%(req)s Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑеÑи." + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "СеÑÑ %(network_id)s не найдена." + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "СеÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ð° Ð´Ð»Ñ Ð¼Ð¾ÑÑа %(bridge)s" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "СеÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ð° Ð´Ð»Ñ uuid %(uuid)s" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "СеÑÑ Ð½Ðµ найдена Ñ cidr %(cidr)s." + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "СеÑÑ Ð½Ðµ найдена Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %(instance_id)s." + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "СеÑи не опÑеделенÑ." + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" +"Ðли uuid %(network_uuid)s ÑеÑи не пÑедоÑÑавлено или не пÑиÑвоено пÑоекÑÑ " +"%(project_id)s." + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "Узел не назнаÑен ÑеÑи (%(network_id)s)." + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "ÐедопÑÑÑимÑй ÑикÑиÑованнÑй IP-адÑÐµÑ %(address)s." + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "ÐапиÑÑ DNS %(name)s Ñже ÑÑÑеÑÑвÑÐµÑ Ð² домене %(domain)s." + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "ÐнÑеÑÑÐµÐ¹Ñ %(interface)s не найден." + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "СеÑÑиÑÐ¸ÐºÐ°Ñ %(certificate_id)s не найден." + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "СлÑжба %(service_id)s не найдена." + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "Узел %(host)s не найден." + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "Узел Ñompute %(host)s не найден." + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "ÐлÑÑ Ð´Ð¾ÑÑÑпа %(access_key)s не найден." + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "ÐвоÑа не найдена" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "ÐвоÑа пÑоекÑа %(project_id)s не найдена." + +#: cinder/exception.py:696 +#, fuzzy, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "ÐлаÑÑ %(class_name)s не найден: %(exception)s" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "ÐÑÑппа безопаÑноÑÑи %(security_group_id)s не найдена." + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" +"ÐÑÑппа безопаÑноÑÑи %(security_group_id)s не найдена Ð´Ð»Ñ Ð¿ÑоекÑа " +"%(project_id)s." + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "ÐÑÑппа безопаÑноÑÑи Ñ Ð¿Ñавилом %(rule_id)s не найдена." + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" +"ÐÑÑппа безопаÑноÑÑи %(security_group_id)s Ñже аÑÑоÑииÑована Ñ ÐºÐ¾Ð¿Ð¸ÐµÐ¹ " +"%(instance_id)s" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" +"ÐÑÑппа безопаÑноÑÑи %(security_group_id)s не аÑÑоÑииÑована Ñ ÐºÐ¾Ð¿Ð¸ÐµÐ¹ " +"%(instance_id)s" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "ÐеÑемеÑение %(migration_id)s не найдено." + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "ÐеÑемеÑение не найдено Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %(instance_id)s в ÑоÑÑоÑнии %(status)s." + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "ÐÑл конÑоли %(pool_id)s не найден." + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "ÐонÑÐ¾Ð»Ñ %(console_id)s не найдена." + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "ÐонÑÐ¾Ð»Ñ Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %(instance_id)s не найдена." + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "ÐонÑÐ¾Ð»Ñ Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %(instance_id)s в пÑле %(pool_id)s не найдена." + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "ÐедопÑÑÑимÑй Ñип конÑоли %(console_type)s " + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "Тип копии %(instance_type_id)s не найден." + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "Тип копии Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼ %(instance_type_name)s не найден." + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, fuzzy, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "Ðона %(zone_id)s не найдена." + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "ÐÐ¾Ð¿Ð¸Ñ %(instance_id)s не Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑаданнÑÑ Ñ ÐºÐ»ÑÑом %(metadata_key)s." + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "ÐбÑÐµÐºÑ LDAP не найден" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "ÐолÑзоваÑÐµÐ»Ñ LDAP %(user_id)s не найден." + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "ÐÑÑппа LDAP %(group_id)s не найдена." + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "ÐолÑзоваÑÐµÐ»Ñ LDAP %(user_id)s не ÑвлÑеÑÑÑ ÑÑаÑÑником гÑÑÐ¿Ð¿Ñ %(group_id)s." + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "Файл %(file_path)s не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½." + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" +"Ðе найден виÑÑÑалÑнÑй пеÑеклÑÑаÑÐµÐ»Ñ Ð°ÑÑоÑииÑованнÑй Ñ ÑеÑевÑм адапÑеÑом " +"%(adapter)s." + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "СеÑевой адапÑÐµÑ %(adapter)s не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½." + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "ÐлаÑÑ %(class_name)s не найден: %(exception)s" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "ÐейÑÑвие не ÑазÑеÑено." + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "Ðевозможно иÑполÑзоваÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑе полномоÑÐ¸Ñ %(role_id)s" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "ÐолÑзоваÑÐµÐ»Ñ %(user)s Ñже ÑÑÑеÑÑвÑеÑ." + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "ÐолÑзоваÑÐµÐ»Ñ LDAP %(user)s Ñже ÑÑÑеÑÑвÑеÑ." + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "ÐÑÑппа LDAP %(group)s Ñже ÑÑÑеÑÑвÑеÑ." + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "ÐолÑзоваÑÐµÐ»Ñ %(uid)s Ñже ÑвлÑеÑÑÑ ÑÑаÑÑником гÑÑÐ¿Ð¿Ñ %(group_dn)s" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "ÐÑÐ¾ÐµÐºÑ %(project)s Ñже ÑÑÑеÑÑвÑеÑ." + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "ÐÐ¾Ð¿Ð¸Ñ %(name)s Ñже ÑÑÑеÑÑвÑеÑ." + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "Тип копии %(name)s Ñже ÑÑÑеÑÑвÑеÑ." + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "Тип Ñома %(name)s Ñже ÑÑÑеÑÑвÑеÑ." + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "%(path)s ÑаÑполагаеÑÑÑ Ð½Ð° обÑедоÑÑÑпном накопиÑеле: %(reason)s" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "ÐÑибка пеÑемеÑениÑ" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "ÐепÑавилÑное Ñело ÑообÑениÑ: %(reason)s" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "Ðевозможно найÑи конÑигÑÑаÑÐ¸Ñ Ð¿Ð¾ адÑеÑÑ %(path)s" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "ÐÑи изменении ÑазмеÑа, копии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ ÑазмеÑ!" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "ÐбÑаз болÑÑе, Ñем допÑÑÑимо Ð´Ð»Ñ ÑÑого Ñипа копии" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "1-а или неÑколÑко зон не могÑÑ Ð·Ð°Ð²ÐµÑÑиÑÑ Ð·Ð°Ð¿ÑоÑ" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "ÐедоÑÑаÑоÑно памÑÑи на Ñзле ÑеÑи compute Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑка %(uuid)s." + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "ÐопÑÑÑимÑй Ñзел не найден. %(reason)s" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "Узел %(host)s не ÑабоÑÐ°ÐµÑ Ð¸Ð»Ð¸ не ÑÑÑеÑÑвÑеÑ." + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "ÐÑевÑÑена квоÑа" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" +"Ðевозможно ÑоздаÑÑ volume_type Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ %(name)s и ÑпеÑиÑикаÑиÑми " +"%(extra_specs)s" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "ÐÐ¾Ð¿Ð¸Ñ %(instance_id)s не найдена." + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, fuzzy, python-format +msgid "Could not fetch image %(image)s" +msgstr "ÐолÑÑение обÑаза %(image)s" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" +"ÐÑопÑÑк %(full_task_name)s, %(ticks_to_skip)s Ñаз оÑÑалоÑÑ, Ð´Ð»Ñ " +"пÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑледÑÑÑего запÑÑка" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "ÐапÑÑк повÑоÑÑÑÑегоÑÑ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ %(full_task_name)s" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "ÐÑибка во вÑÐµÐ¼Ñ %(full_task_name)s: %(e)s" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "ÐапÑÑк Ñзла ÑеÑи (веÑÑÐ¸Ñ %(vcs_string)s) %(topic)s" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "СлÑжба завеÑÑила ÑабоÑÑ Ð¸Ð·-за оÑÑÑÑÑÑÐ²Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ " + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "ÐбÑÐµÐºÑ ÑеÑвиÑа в базе даннÑÑ Ð¾ÑÑÑÑÑÑвÑеÑ, ÐовÑоÑное Ñоздание." + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "ÐолнÑй Ð½Ð°Ð±Ð¾Ñ Ð¤ÐÐÐÐÐ:" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "Ðложенное иÑклÑÑение: %s" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "ÐолÑÑение %s" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "ÐÑинÑÑÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑнÑе аÑгÑменÑÑ ÐºÐ»ÑÑевого Ñлова Ð´Ð»Ñ utils.execute: %r" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "ÐÑполнение ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ (ÑÑбпÑоÑеÑÑ): %s" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "РезÑлÑÑÐ°Ñ %s" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "%r оÑибка. ÐÑполнÑеÑÑÑ Ð¿Ð¾Ð²ÑоÑ." + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "ÐÑполнение ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ (SSH): %s" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "СÑеда не поддеÑживаеÑÑÑ Ñ Ð¸ÑполÑзованием SSH" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "process_input не поддеÑживаеÑÑÑ Ñ Ð¸ÑполÑзованием SSH" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "оÑладка в обÑаÑном вÑзове: %s" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "ÐедопÑÑÑимÑй внÑÑÑенний инÑеÑÑейÑ: %s" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "внÑÑÑенний инÑеÑÑÐµÐ¹Ñ %s" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "ÐжидалÑÑ Ð¾Ð±ÑÐµÐºÑ Ñипа: %s" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "ÐедопÑÑÑÐ¸Ð¼Ð°Ñ server_string: %s" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "timefunc: '%(name)s' занÑла %(total_time).2f Ñ." + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "ÐÑÑ Ð¾Ð´Ð½Ð¾Ðµ иÑклÑÑение бÑло ÑбÑоÑено" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "ÐлаÑÑ %(fullname)s ÑÑÑаÑел: %(msg)s" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "ÐлаÑÑ %(fullname)s ÑÑÑаÑел" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "ФÑнкÑÐ¸Ñ %(name)s в %(location)s ÑÑÑаÑела: %(msg)s" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "ФÑнкÑÐ¸Ñ %(name)s в %(location)s ÑÑÑаÑела" + +#: cinder/utils.py:1681 +#, fuzzy, python-format +msgid "Could not remove tmpdir: %s" +msgstr "ÐÑибка ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑейнеÑа: %s" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "ÐÑполнÑеÑÑÑ %(name)s на %(host)s:%(port)s" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "ÐÑполнÑеÑÑÑ Ð¾ÑÑанов ÑеÑвеÑа WSGI." + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "ÐÑполнÑеÑÑÑ Ð¾ÑÑанов ÑеÑвеÑа TCP." + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "ÐапÑÑк TCP ÑеÑвеÑа %(arg0)s на %(host)s:%(port)s" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "СеÑÐ²ÐµÑ WSGI бÑл оÑÑановлен." + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "недоÑÑÑпно" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "СлиÑком много неÑдаÑнÑÑ Ð¿Ð¾Ð¿ÑÑок аÑÑенÑиÑикаÑии." + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "ÐÑибка аÑÑенÑиÑикаÑии: %s" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "ÐапÑÐ¾Ñ Ð°ÑÑенÑиÑикаÑии Ð´Ð»Ñ %(uname)s:%(pname)s)" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "дейÑÑвие: %s" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "" +"ÐеавÑоÑизиÑованнÑй запÑÐ¾Ñ Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑоллеÑа=%(controller)s и " +"дейÑÑвиÑ=%(action)s" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, python-format +msgid "QuotaError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "" +"ÐÑоизоÑла неизвеÑÑÐ½Ð°Ñ Ð¾Ñибка. ÐожалÑйÑÑа, попÑÑайÑеÑÑ Ð¿Ð¾Ð²ÑоÑиÑÑ Ð²Ð°Ñ " +"запÑоÑ." + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" +"ÐеподдеÑживаемÑй запÑÐ¾Ñ API: конÑÑÐ¾Ð»Ð»ÐµÑ = %(controller)s, дейÑÑвие = " +"%(action)s" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "СоздаÑÑ Ñнимок Ñома %s" + +#: cinder/api/ec2/cloud.py:372 +#, fuzzy, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" +"ÐнаÑение (%s) Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа GroupName недопÑÑÑимо. СодеÑжание огÑаниÑено " +"бÑквенно-ÑиÑÑовÑми Ñимволами, пÑобелами, ÑиÑе и подÑÑÑкиваниÑми." + +#: cinder/api/ec2/cloud.py:378 +#, fuzzy, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" +"ÐнаÑение (%s) Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа GroupName недопÑÑÑимо. Ðлина пÑевÑÑÐ°ÐµÑ " +"макÑималÑно допÑÑÑимое знаÑение 255." + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "Создание паÑÑ ÐºÐ»ÑÑей %s" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "ÐмпоÑÑиÑоваÑÑ ÐºÐ»ÑÑ %s" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "Удаление паÑÑ ÐºÐ»ÑÑей %s" + +#: cinder/api/ec2/cloud.py:551 +#, fuzzy, python-format +msgid "Invalid CIDR" +msgstr "ÐедопÑÑÑимÑй cidr %(cidr)s." + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, fuzzy, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "ÐедоÑÑаÑоÑно паÑамеÑÑов Ð´Ð»Ñ ÑбоÑа пÑавилÑного пÑавила." + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "ÐÑÑÑÑÑÑвÑÐµÑ Ð¿Ñавило Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð°ÑамеÑÑов." + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:725 +#, fuzzy, python-format +msgid "%s - This rule already exists in group" +msgstr "ÐÑо пÑавило Ñже ÑÑÑеÑÑвÑÐµÑ Ð² гÑÑппе %s" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" +"ÐнаÑение (%s) Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа GroupName недопÑÑÑимо. СодеÑжание огÑаниÑено " +"бÑквенно-ÑиÑÑовÑми Ñимволами, пÑобелами, ÑиÑе и подÑÑÑкиваниÑми." + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" +"ÐнаÑение (%s) Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа GroupName недопÑÑÑимо. Ðлина пÑевÑÑÐ°ÐµÑ " +"макÑималÑно допÑÑÑимое знаÑение 255." + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "СоздаÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи %s" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "гÑÑппа %s Ñже ÑÑÑеÑÑвÑеÑ" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "УдалиÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи %s" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "ÐолÑÑиÑÑ ÐºÐ¾Ð½ÑолÑнÑй вÑвод Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %s" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "СоздаÑÑ Ñом из Ñнимка %s" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "Создание Ñаздела %s ÐÐ" + +#: cinder/api/ec2/cloud.py:921 +#, fuzzy +msgid "Delete Failed" +msgstr "ÐÑибка ÑозданиÑ" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "ÐодклÑÑиÑÑ Ñом %(volume_id)s Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %(instance_id)s на %(device)s" + +#: cinder/api/ec2/cloud.py:939 +#, fuzzy +msgid "Attach Failed." +msgstr "ÐÑибка ÑозданиÑ" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "ÐÑÑоединиÑÑ Ñом %s" + +#: cinder/api/ec2/cloud.py:959 +#, fuzzy, python-format +msgid "Detach Volume Failed." +msgstr "ÐÑÑоединиÑÑ Ñом %s" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "аÑÑÑибÑÑ Ð½Ðµ поддеÑживаеÑÑÑ: %s" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "ÐÑделиÑÑ Ð°Ð´ÑеÑ" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "ÐÑиÑвоиÑÑ Ð°Ð´ÑÐµÑ %s" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "ÐÑиÑвоиÑÑ Ð°Ð´ÑÐµÑ %(public_ip)s копии %(instance_id)s" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "ÐÑклÑÑиÑÑ Ð°Ð´ÑÐµÑ %s" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "ÐбÑаз должен бÑÑÑ Ð´Ð¾ÑÑÑпен" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "ÐÑполнение завеÑÑÐµÐ½Ð¸Ñ ÑабоÑÑ ÐºÐ¾Ð¿Ð¸Ð¹" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "ÐеÑезагÑÑзиÑÑ ÐºÐ¾Ð¿Ð¸Ñ %r" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "ÐÑполнение оÑÑановки копий" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "ÐÑполнение запÑÑка копий" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "ÐÑклÑÑение ÑегиÑÑÑаÑии обÑаза %s" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "ÐаÑегиÑÑÑиÑованнÑй обÑаз %(image_location)s Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом %(image_id)s" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "не Ñказан полÑзоваÑÐµÐ»Ñ Ð¸Ð»Ð¸ гÑÑппа" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "поддеÑживаеÑÑÑ ÑолÑко гÑÑппа \"вÑе(all)\"" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "Ðбновление оÑведомлÑнноÑÑи об обÑазе %s" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "Ðевозможно оÑÑановиÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð² ÑеÑении %d Ñ." + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "ÐÑибка полÑÑÐµÐ½Ð¸Ñ Ð¼ÐµÑаданнÑÑ Ð´Ð»Ñ ip: %s" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "ÐбнаÑÑжена оÑибка: %s" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "%(url)s возвÑаÑил Ñ HTTP %(status)d" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "РаÑÑиÑеннÑй ÑеÑÑÑÑ: %s" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" +"РаÑÑиÑение %(ext_name)s: Ðевозможно ÑаÑÑиÑиÑÑ ÑеÑÑÑÑ %(collection)s: ÐÐµÑ " +"Ñакого ÑеÑÑÑÑа" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "РаÑÑиÑение %(ext_name)s ÑаÑÑиÑение ÑеÑÑÑÑа: %(collection)s" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "%(user_id)s не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½ Ñ Ñокеном '%(token)s'" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "%(user_id)s должен бÑÑÑ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑÑаÑоÑом или ÑÑаÑÑником %(project_id)s" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "РзапÑоÑе невозможно найÑи %s." + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "ÐÑÑенÑиÑикаÑÐ¸Ñ '%s' вÑполнена" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "Ðе найден полÑзоваÑÐµÐ»Ñ Ñ Ð¿ÑедоÑÑавленнÑм API клÑÑом." + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "ÐÑедоÑÑавленнÑй клÑÑ API допÑÑÑим, но не Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ '%(username)s'" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "маÑÐºÐµÑ [%s] не найден" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "href %s не ÑодеÑÐ¶Ð¸Ñ Ð²ÐµÑÑиÑ" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, fuzzy, python-format +msgid "Converted networks: %s" +msgstr "ÐепÑÐµÐ´Ð²Ð¸Ð´ÐµÐ½Ð½Ð°Ñ Ð¾Ñибка: %s" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "Ðевозможно '%(action)s', когда ÐºÐ¾Ð¿Ð¸Ñ Ð² %(attr)s %(state)s" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "ÐÐ¾Ð¿Ð¸Ñ Ð² недопÑÑÑимом ÑоÑÑоÑнии Ð´Ð»Ñ '%(action)s'" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "ÐÑклонение запÑоÑа Ñнимка, Ñнимки в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¾ÑклÑÑенÑ" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "Снимки копии в наÑÑоÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑимÑ." + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "ÐагÑÑженное ÑаÑÑиÑение: %s" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "ÐагÑÑзка ÑаÑÑиÑÐµÐ½Ð¸Ñ %s" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "ÐÑибка загÑÑзки ÑаÑÑиÑÐµÐ½Ð¸Ñ %(ext_factory)s: %(exc)s" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "ÐÑибка загÑÑзки ÑаÑÑиÑÐµÐ½Ð¸Ñ %(ext_name)s: %(exc)s" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, fuzzy, python-format +msgid "Exception handling resource: %s" +msgstr "РаÑÑиÑеннÑй ÑеÑÑÑÑ: %s" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "РзапÑоÑе пÑедоÑÑавлен не ÑаÑпознаннÑй Ñип-ÑодеÑжимого" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "Тип ÑодеÑжимого не пÑедоÑÑавлен в запÑоÑе" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "ÐÑÑÑое Ñело пÑедоÑÑавлено в запÑоÑе" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "ÐепÑавилÑное Ñело запÑоÑа" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "Ðе поддеÑживаемÑй Ñип ÑодеÑжимого" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "ÐепÑавилÑнÑй запÑÐ¾Ñ url" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "%(url)s возвÑаÑил оÑибкÑ: %(e)s" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ðµ ÑвлÑеÑÑÑ Ð¿Ð¾Ñомком" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "ÐниÑиализаÑÐ¸Ñ Ð´Ð¸ÑпеÑÑеÑа ÑаÑÑиÑений." + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "обÑаз не найден." + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "ÐепÑавилÑнÑй ÑоÑÐ¼Ð°Ñ Ñела запÑоÑа" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "Тело запÑоÑа и URI не ÑовпадаÑÑ" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "Тело запÑоÑа ÑодеÑÐ¶Ð¸Ñ Ð¸Ð·Ð±ÑÑоÑное колиÑеÑÑво обÑекÑов" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "ÐепÑавилÑнÑй клÑÑ Ð¼ÐµÑаданнÑÑ " + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "ÐÐ¾Ð¿Ð¸Ñ Ð½Ðµ ÑÑÑеÑÑвÑеÑ" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "ÐÐ¾Ð¿Ð¸Ñ Ð½Ðµ ÑвлÑеÑÑÑ ÑÑаÑÑником заданной ÑеÑи" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" +"ТолÑко %(value)s %(verb)s запÑоÑ(ов) могÑÑ Ð±ÑÑÑ ÑÐ´ÐµÐ»Ð°Ð½Ñ Ð´Ð»Ñ %(uri)s, " +"каждÑе %(unit_string)s." + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "СеÑÐ²ÐµÑ Ð½Ðµ ÑÑÑеÑÑвÑеÑ" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "ÐÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼ÐµÑаданнÑÑ Ð½Ðµ найден" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "ÐедопÑÑÑимое ÑоÑÑоÑние ÑеÑвеÑа: %(status)s" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "ÐÐ¼Ñ ÑеÑвеÑа ÑвлÑеÑÑÑ Ð¿ÑÑÑой ÑÑÑокой" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "ÐедопÑÑÑимÑй ÑеÑевой ÑоÑмаÑ: ÑеÑевой uuid Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐ¿ÑавилÑнÑй ÑоÑÐ¼Ð°Ñ (%s)" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "ÐедопÑÑÑимÑй ÑикÑиÑованнÑй IP-адÑÐµÑ (%s)" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "ÐÑбликаÑÑ ÑеÑей (%s) не ÑазÑеÑенÑ" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "ÐедопÑÑÑимÑй ÑеÑевой ÑоÑмаÑ: оÑÑÑÑÑÑвÑÐµÑ %s" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "ÐедопÑÑÑимÑй ÑеÑевой ÑоÑмаÑ" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "СодеÑжимое даннÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´ÐµÑиÑÑовано" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "ÐÐ¼Ñ ÑеÑвеÑа не задано" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "ÐÑедоÑÑавлен недопÑÑÑимÑй flavorRef." + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "Ðевозможно найÑи запÑоÑеннÑй обÑаз" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "ÐÑедоÑÑавлен недопÑÑÑимÑй key_name." + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "С копией не пÑоизводилоÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ ÑазмеÑа." + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "ÐÑÑÑÑÑÑвÑÐµÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ñипа 'type' Ð´Ð»Ñ Ð¿ÐµÑезагÑÑзки" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "ÐÑибка пÑи пеÑезагÑÑзке %s" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "Ðзменение ÑазмеÑа ÑÑебÑÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑÑма." + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "ÐепÑавилÑнÑй обÑÐµÐºÑ ÑеÑвеÑа" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "ÐÑÑÑÑÑÑвÑÐµÑ Ð°ÑÑибÑÑ imageRef" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "ÐÑÑÑÑÑÑвÑÐµÑ Ð°ÑÑибÑÑ flavorRef" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "adminPass не бÑл задан" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "ÐедопÑÑÑимÑй adminPass" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "ÐапÑÐ¾Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑазмеÑа Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑимÑй аÑÑибÑÑ 'flavorRef'." + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "ÐапÑоÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ ÑазмеÑа ÑÑебÑÑÑ Ð°ÑÑибÑÑ 'flavorRef'." + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "ÐедопÑÑÑимÑй запÑÐ¾Ñ Ñела" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "ÐÐ¾Ð¿Ð¸Ñ Ð½Ðµ найдена" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "ÐедопÑÑÑимÑе меÑаданнÑе" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "Удаление паÑамеÑÑов '%(unk_opt_str)s' из запÑоÑа" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "ÐÑибка пеÑемеÑÐµÐ½Ð¸Ñ %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "СеÑÐ²ÐµÑ Ð½Ðµ найден" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "ÐÐ¾Ð¿Ð¸Ñ Ð½Ðµ найдена" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, fuzzy, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" +"Ðевозможно ÑоздаÑÑ volume_type Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ %(name)s и ÑпеÑиÑикаÑиÑми " +"%(extra_specs)s" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, fuzzy, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "ÐÑибка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð°Ð³ÐµÐ½Ñа: %(resp)r" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "СеÑÐ²ÐµÑ Ð½Ðµ найден." + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +#, fuzzy +msgid "Flavor not found." +msgstr "СеÑÐ²ÐµÑ Ð½Ðµ найден." + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "ÐÐµÑ Ñела запÑоÑа" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "ÐдÑÐµÑ Ð½Ðµ задан" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "ÐедопÑÑÑимое ÑоÑÑоÑние: '%s'" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, fuzzy, python-format +msgid "Invalid mode: '%s'" +msgstr "ÐедопÑÑÑимое ÑоÑÑоÑние: '%s'" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "ÐедопÑÑÑимÑй паÑамеÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ: '%s'" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, fuzzy, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "ÐеÑевод Ñзла %(host)s в %(state)s." + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "ÐеÑевод Ñзла %(host)s в %(state)s." + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "Узел не найден" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "ÐÑÑÑÑÑÑвÑÐµÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ 'networkId' Ð´Ð»Ñ addFixedIp" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "ÐÑÑÑÑÑÑвÑÐµÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ 'address' Ð´Ð»Ñ removeFixedIp" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "Ðевозможно найÑи адÑÐµÑ %r" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "ÐÑклÑÑение ÑеÑи Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом %s" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "СеÑÑ Ð½Ðµ найдена" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "ÐÑобÑажение ÑеÑи Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом %s" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "Удаление ÑеÑи Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом %s" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +#, fuzzy, python-format +msgid "Security group is still in use" +msgstr "ÐÑÑппа безопаÑноÑÑи (%s) не найдена" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "ÐÑÑппа безопаÑноÑÑи %s Ñже ÑÑÑеÑÑвÑеÑ" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "ÐÑÑппа безопаÑноÑÑи %s не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑой." + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "ÐÑÑппа безопаÑноÑÑи (%s) не найдена" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "ÐедоÑÑаÑоÑно паÑамеÑÑов Ð´Ð»Ñ ÑбоÑа пÑавилÑного пÑавила." + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "ÐÑо пÑавило Ñже ÑÑÑеÑÑвÑÐµÑ Ð² гÑÑппе %s" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "ÐÑавило (%s) не найдено" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "ÐÑÑппа безопаÑноÑÑи не задана" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "Ðаименование гÑÑÐ¿Ð¿Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи не Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑÑÑÑÑвоваÑÑ" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "vol=%s" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "УдалиÑÑ Ñом Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом: %s" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "ÐÑиÑоединиÑÑ Ñом %(volume_id)s к копии %(server_id)s на %(device)s" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "УдалиÑÑ Ñнимок Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом: %s" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "СоздаÑÑ Ñнимок из Ñома %s" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" +"ÐопÑÑка Ñдаление поÑледнего ÑÑаÑÑника гÑÑппÑ. ÐÑÐ´ÐµÑ Ð²Ñполнено Ñдаление " +"гÑÑÐ¿Ð¿Ñ Ð² %s." + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "ÐоиÑк полÑзоваÑелÑ: %r" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "ÐÑибка авÑоÑизаÑии Ð´Ð»Ñ ÐºÐ»ÑÑа доÑÑÑпа %s" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "оÑибка авÑоÑизаÑии: Ð½ÐµÑ Ð¿ÑоекÑа под названием %(pjid)s (user=%(uname)s)" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" +"ÐÑибка авÑоÑизаÑии: полÑзоваÑÐµÐ»Ñ %(uname)s не ÑвлÑеÑÑÑ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑÑаÑоÑом и " +"не ÑвлÑеÑÑÑ ÑÑаÑÑником пÑоекÑа %(pjname)s" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "подпиÑÑ: %s" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "Ðе допÑÑÑÐ¸Ð¼Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ %s" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "ÐÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑказаÑÑ Ð¿ÑоекÑ" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "Ðобавление полномоÑий %(role)s Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ %(uid)s в пÑоекÑе %(pid)s" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "Удаление полномоÑий %(role)s Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ %(uid)s в пÑоекÑе %(pid)s" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "СозданнÑй пÑÐ¾ÐµÐºÑ %(name)s Ñ Ð´Ð¸ÑпеÑÑеÑом %(manager_user)s" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "изменение пÑоекÑа %s" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "Ðобавление полÑзоваÑÐµÐ»Ñ %(uid)s в пÑÐ¾ÐµÐºÑ %(pid)s" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "ÐÑклÑÑиÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ %(uid)s из пÑоекÑа %(pid)s" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "Удаление пÑоекÑа %s" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "СозданнÑй полÑзоваÑÐµÐ»Ñ %(rvname)s (admin: %(rvadmin)r)" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "Удаление полÑзоваÑÐµÐ»Ñ %s" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "Режим админиÑÑÑаÑоÑа назнаÑен %(admin)r Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ %(uid)s" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "ÐÐµÑ vpn даннÑÑ Ð´Ð»Ñ Ð¿ÑоекÑа %s" + +#: cinder/cloudpipe/pipelib.py:46 +#, fuzzy, python-format +msgid "Instance type for vpn instances" +msgstr "ÐедопÑÑÑимÑй Ñип копии %(instance_type)s." + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "ÐапÑÑк VPN Ð´Ð»Ñ %s" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "Ðевозможно найÑи Ñзел Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %s" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" +"ÐÑевÑÑена квоÑа Ð´Ð»Ñ %(pid)s, попÑÑка назнаÑиÑÑ %(num_metadata)s ÑвойÑÑв " +"меÑаданнÑÑ " + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" +"ÐÑевÑÑена квоÑа Ð´Ð»Ñ %(pid)s, пÑевÑÑено клÑÑевое ÑвойÑÑво меÑаданнÑÑ Ð¸Ð»Ð¸ " +"знаÑение" + +#: cinder/compute/api.py:257 +#, fuzzy +msgid "Cannot run any more instances of this type." +msgstr "" +"ÐÑевÑÑена квоÑа копий. ÐÑ Ð½Ðµ можеÑе запÑÑÑиÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе копии ÑÑого " +"Ñипа." + +#: cinder/compute/api.py:259 +#, fuzzy, python-format +msgid "Can only run %s more instances of this type." +msgstr "ÐÑевÑÑена квоÑа копий. ÐÑ Ð¼Ð¾Ð¶ÐµÑе запÑÑÑиÑÑ ÑолÑко %s копий ÑÑого Ñипа." + +#: cinder/compute/api.py:261 +#, fuzzy, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "ÐÑевÑÑена квоÑа Ð´Ð»Ñ %(pid)s, попÑÑка вÑполниÑÑ %(min_count)s копий" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "Создание необÑабоÑанной копии" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "ÐÑполнÑÐµÑ Ð·Ð°Ð¿ÑÑк %s копий..." + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "bdm %s" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "block_device_mapping %s" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "ÐÑпÑавка опеÑаÑии ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð² ÑаÑпиÑание Ð´Ð»Ñ %(pid)s/%(uid)s's" + +#: cinder/compute/api.py:871 +#, fuzzy +msgid "Going to try to soft delete instance" +msgstr "ÐÑполнение запÑÑка копий" + +#: cinder/compute/api.py:891 +#, fuzzy, python-format +msgid "No host for instance, deleting immediately" +msgstr "ÐÑÑÑÑÑÑвÑÐµÑ Ñзел Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %s, немедленное Ñдаление" + +#: cinder/compute/api.py:939 +#, fuzzy, python-format +msgid "Going to try to terminate instance" +msgstr "ÐÑÐ´ÐµÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¿ÑÑка завеÑÑиÑÑ ÑабоÑÑ %s" + +#: cinder/compute/api.py:977 +#, fuzzy, python-format +msgid "Going to try to stop instance" +msgstr "ÐопÑÑка оÑÑановиÑÑ %s" + +#: cinder/compute/api.py:996 +#, fuzzy, python-format +msgid "Going to try to start instance" +msgstr "ÐопÑÑка запÑÑÑиÑÑ %s" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "ÐÐ¾Ð¿Ð¸Ñ %(instance_uuid)s не оÑÑановлена. (%(vm_state)s" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "ÐоиÑк по: %s" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "Тип обÑаза не ÑаÑпознан %s" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" +"УÑÑаÑевÑий Ñип копии %(current_instance_type_name)s, новÑй Ñип копии " +"%(new_instance_type_name)s" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "ÐÑибка ÐÐ: %s" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "ÐÐ¾Ð¿Ð¸Ñ Ñипа %s не найдена Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑдалениÑ" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "check_instance_lock: оÑоÑмление: |%s|" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" +"check_instance_lock: аÑгÑменÑÑ: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "check_instance_lock: заблокиÑован: |%s|" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "check_instance_lock: админиÑÑÑаÑоÑ: |%s|" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "check_instance_lock: иÑполнение: |%s|" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "Ðевозможно загÑÑзиÑÑ Ð´ÑÐ°Ð¹Ð²ÐµÑ Ð²Ð¸ÑÑÑализаÑии: %s" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "ÐÑÐ°Ð¹Ð²ÐµÑ Ð³Ð¸Ð¿ÐµÑвизоÑа не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ñавила бÑандмаÑÑÑа" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, fuzzy, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "иÑклÑÑение завеÑÑÐ°ÐµÑ ÑабоÑÑ ÐºÐ¾Ð¿Ð¸Ð¸ %(instance_uuid)s" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "ÐÐ¾Ð¿Ð¸Ñ %s не найдена." + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "ÐÐ¾Ð¿Ð¸Ñ Ñже бÑла Ñоздана" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" +"ÐбÑаз '%(image_id)s' ÑазмеÑом %(size_bytes)d, пÑевÑÑÐ°ÐµÑ exceeded " +"instance_type допÑÑÑимÑй ÑÐ°Ð·Ð¼ÐµÑ %(allowed_size_bytes)d" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "ÐÑопÑÑк DiskNotFound: %s" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "завеÑÑение ÑабоÑÑ bdm %s" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "%s. УÑÑановка ÑоÑÑоÑÐ½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¸ vm_state на ERROR" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "Ðбновление ÑбоÑки %s" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "ÐеÑезагÑÑзка копии %s" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" +"попÑÑка пеÑезагÑÑзки не вÑполнÑемой копии: %(instance_uuid)s (ÑоÑÑоÑние: " +"%(state)s ожидалоÑÑ: %(running)s)" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %s: вÑполнение Ñнимка" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" +"попÑÑка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñнимка не вÑполнÑемой копии: %(instance_uuid)s " +"(ÑоÑÑоÑние: %(state)s ожидалоÑÑ: %(running)s)" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "Ðайдено %(num_images)d обÑазов (ÑоÑаÑиÑ: %(rotation)d)" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "Удаление обÑаза %s" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "Ðевозможно назнаÑиÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑÑаÑоÑа. ÐÐ¾Ð¿Ð¸Ñ %s не вÑполнÑеÑÑÑ" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "ÐÐ¾Ð¿Ð¸Ñ %s: ÐазнаÑение админиÑÑÑаÑивного паÑолÑ" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "set_admin_password не Ñеализован в ÑÑой дÑайвеÑе." + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "ÐÑибка назнаÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑÐ¾Ð»Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑÑаÑоÑа" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %(instance_uuid)s: обновление агенÑа до %(url)s" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "назнаÑение ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð¸ÑÑоÑником!" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %s: пеÑемеÑение" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %s: пÑиоÑÑановление" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %s: ÑнÑÑие Ñ Ð¿ÑиоÑÑановлениÑ" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %s: пÑинÑÑие диагноÑÑики" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %s: пÑиоÑÑановление" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %s: возобновление" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %s: блокиÑование" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %s: ÑазблокиÑование" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %s: полÑÑение заблокиÑованного ÑоÑÑоÑниÑ" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %s: ÑбÑÐ¾Ñ ÑеÑи" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %s: полÑÑение конÑоли vnc" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, fuzzy, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %(instance_uuid)s: обновление агенÑа до %(url)s" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, fuzzy, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "ÐÐ¾Ð¿Ð¸Ñ %(instance_id)s не пеÑеведена в Ñежим воÑÑÑановлениÑ" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "ÐÑÑоединение Ñома Ð¾Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑной копии %s" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" +"Создание вÑеменного Ñайла %s Ð´Ð»Ñ Ð¾Ð¿Ð¾Ð²ÐµÑÐµÐ½Ð¸Ñ Ð´ÑÑÐ³Ð¸Ñ Ñзлов ÑеÑи compute о " +"Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи пÑиÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñого же Ñ ÑанилиÑа." + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "plug_vifs() оÑибка %(cnt)d.Ðо %(max_retry)d попÑÑок Ð´Ð»Ñ %(hostname)s." + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "ÐапÑÑено post_live_migration().." + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" +"ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑвидеÑÑ Ð¾ÑÐ¸Ð±ÐºÑ \"libvirt: оÑибка QEMU: Ðомен не найден: " +"оÑÑÑÑÑÑвÑÐµÑ Ð´Ð¾Ð¼ÐµÐ½ Ñ ÑооÑвеÑÑÑвÑÑÑим именем.\" ÐÑа оÑибка Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ " +"безопаÑно пÑопÑÑена." + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "Ðбновление вÑеменнÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»Ð¾ÑÑ Ð¿ÑопÑÑканиÑ" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "Ðбновление ÑоÑÑоÑÐ½Ð¸Ñ Ñзла" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" +"Ðайдено %(num_db_instances)s в базе даннÑÑ Ð¸ %(num_vm_instances)s в " +"гипеÑвизоÑе." + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "FLAGS.reclaim_instance_interval <= 0, пÑопÑÑк..." + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" +"Ðе ÑаÑпознанное знаÑение '%(action)s' Ð´Ð»Ñ " +"FLAGS.running_deleted_instance_action" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "Ðобавление конÑоли" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "ÐÑполнена попÑÑка ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÑÑÑеÑÑвÑÑÑей конÑоли %(console_id)s." + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "ÐопÑÑка ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÑÑÑеÑÑвÑÑÑей конÑоли %(console_id)s." + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "Удаление конÑоли %(console_id)s." + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "Ðбновление ÑбоÑки xvp conf" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "ÐÑполнение оÑÑанова xvp" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "ÐапÑÑк xvp" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "ÐÑибка запÑÑка xvp: %s" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "ÐÑполнение пеÑезагÑÑзки xvp" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "xvp не вÑполнÑеÑÑÑ..." + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "Удаление Ñокена Ñ Ð¸ÑÑÑкÑим ÑÑоком: (%s)" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "ÐолÑÑеннÑй Ñокен: %(token)s, %(token_dict)s)" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "ÐÑовеÑка Ñокена: %(token)s, %(token_valid)s)" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "ÐеÑаÑпознанное знаÑение read_deleted '%s'" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "python-migrate не ÑÑÑановлен. ÐÑÑ Ð¾Ð´." + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, fuzzy, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "ÐÑибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ SQL (%(connstring)s). %(attempts)d попÑÑок оÑÑалоÑÑ." + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "ÑÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð½ÑеÑÑейÑа не добавлен в ÑаблиÑÑ ÑеÑей" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "ТаблиÑа |%s| не Ñоздана!" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "СÑÐ¾Ð»Ð±ÐµÑ VIF не добавлен в ÑаблиÑÑ fixed_ips" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "ÑÑÐ¾Ð»Ð±ÐµÑ Ð¿ÑиоÑиÑеÑа не добавлен в ÑаблиÑÑ ÑеÑей" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "огÑаниÑÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑнего клÑÑа не могÑÑ Ð±ÑÑÑ ÑдаленÑ" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "ÑÑÐ¾Ð»Ð±ÐµÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ добавлен в ÑаблиÑÑ ÐºÐ¾Ð¿Ð¸Ð¹" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "ÑÑÐ¾Ð»Ð±ÐµÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ добавлен в ÑаблиÑÑ compute_nodes" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "Ðе Ð²Ð»Ð°Ð´ÐµÐ»ÐµÑ Ð¾Ð±Ñаза" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "ÐÑибка загÑÑзки %(image_location)s в %(image_path)s" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "ÐÑибка ÑаÑÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ %(image_location)s в %(image_path)s" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "ÐÑибка извлеÑÐµÐ½Ð¸Ñ %(image_location)s в %(image_path)s" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "ÐÑибка вÑгÑÑзки %(image_location)s в %(image_path)s" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "ÐÑибка деÑиÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð»Ð¸Ñного клÑÑа: %s" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "ÐÑибка деÑиÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²ÐµÐºÑоÑа иниÑиализаÑии: %s" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "ÐÑибка деÑиÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñайла обÑаза %(image_file)s: %(err)s" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "РобÑазе небезопаÑнÑе имена Ñайлов" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "ÐедопÑÑÑимÑй mac Ð´Ð»Ñ to_global_ipv6: %s" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "ÐедопÑÑÑимÑй пÑеÑÐ¸ÐºÑ Ð´Ð»Ñ to_global_ipv6: %s" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "ÐедопÑÑÑимÑй project_id Ð´Ð»Ñ to_global_ipv6: %s" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "ÐÑÐ¾Ñ Ð´ÑÐ°Ð¹Ð²ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑолÑко запиÑи Ñипа 'a'." + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "ÐÑедпÑинÑÑа ÑдалиÑÑ ÑепоÑÐºÑ %s, коÑоÑÐ°Ñ Ð½Ðµ ÑÑÑеÑÑвÑеÑ" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "ÐеизвеÑÑÐ½Ð°Ñ ÑепоÑка: %r" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" +"ÐÑедпÑинÑÑа попÑÑка ÑдалиÑÑ Ð¿Ñавило, коÑоÑого Ñам неÑ: %(chain)r %(rule)r" +" %(wrap)r %(top)r" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "ÐапÑÑк инÑеÑÑейÑа VLAN %s" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "ÐапÑÑк моÑÑа инÑеÑÑейÑа Ð´Ð»Ñ %s" + +#: cinder/network/linux_net.py:1142 +#, fuzzy, python-format +msgid "Starting bridge %s " +msgstr "ÐапÑÑк копии %s" + +#: cinder/network/linux_net.py:1149 +#, fuzzy, python-format +msgid "Done starting bridge %s" +msgstr "ÐÑибка запÑÑка xvp: %s" + +#: cinder/network/linux_net.py:1167 +#, fuzzy, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "ÐÑибка оÑÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ vif копии '%s'" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, fuzzy, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "СеÑÑиÑÐ¸ÐºÐ°Ñ %(certificate_id)s не найден." + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "ÐнÑеÑÑÐµÐ¹Ñ %(interface)s не найден" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "ÐдÑÐµÑ |%(address)s| не вÑделен" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "ÐдÑÐµÑ |%(address)s| не вÑделен ваÑÐµÐ¼Ñ Ð¿ÑоекÑÑ |%(project)s|" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "ÐÑевÑÑена квоÑа Ð´Ð»Ñ %s, попÑÑка вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð°Ð´ÑеÑа" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "Ðомен |%(domain)s| Ñже ÑÑÑеÑÑвÑеÑ, изменение Ð·Ð¾Ð½Ñ Ð½Ð° |%(av_zone)s|." + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "Ðомен |%(domain)s| Ñже ÑÑÑеÑÑвÑеÑ, изменение пÑоекÑа на |%(project)s|." + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "ÑÑÑановка ÑеÑевого Ñзла" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "иÑклÑÑение ÑеÑевÑÑ ÑаÑпÑеделений Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ |%s|" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" +"instance-dns-zone ÑвлÑеÑÑÑ |%(domain)s|, коÑоÑÑй ÑаÑполагаеÑÑÑ Ð² " +"доÑÑÑпной зоне |%(zone)s|. ÐÐ¾Ð¿Ð¸Ñ |%(instance)s| ÑаÑположена в зоне " +"|%(zone2)s|. ÐапиÑÑ DNS не бÑÐ´ÐµÑ Ñоздана." + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "ÐÑендованнÑй IP |%(address)s|" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "ÐÑиÑвоеннÑй IP |%(address)s|" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "cidr Ñже иÑполÑзÑеÑÑÑ" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" +"запÑоÑÐµÐ½Ð½Ð°Ñ cidr (%(cidr)s) конÑликÑÑÐµÑ Ñ ÑÑÑеÑÑвÑÑÑей ÑÑпеÑ-ÑеÑÑÑ " +"(%(super)s)" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" +"запÑоÑÐµÐ½Ð½Ð°Ñ cidr (%(cidr)s) конÑликÑÑÐµÑ Ñ ÑÑÑеÑÑвÑÑÑей, менÑÑей cidr " +"(%(smaller)s)" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "СеÑÑ Ñже ÑÑÑеÑÑвÑеÑ!" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "СеÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ð¸ÑклÑÑена из пÑоекÑа %s пеÑед Ñдалением" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" +"СеÑевой диапазон недоÑÑаÑоÑен Ð´Ð»Ñ ÑооÑвеÑÑÑÐ²Ð¸Ñ %(num_networks)s. Ð Ð°Ð·Ð¼ÐµÑ " +"ÑеÑи %(network_size)s" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "ÐÑÐ¾Ñ Ð´ÑÐ°Ð¹Ð²ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑолÑко Ñип 'a'" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "ÐбÑÐµÐºÑ Quantum не найден: %s" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "СеÑвеÑÐ½Ð°Ñ %(status_code)s оÑибка: %(data)s" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "Ðевозможно подклÑÑиÑÑÑÑ Ðº ÑеÑвеÑÑ. ÐÑинÑÑа оÑибка: %s" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "ÑеÑевÑе ÑаÑпÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %s" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "СеÑÐ²ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑил оÑибкÑ: %s" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "ÐÑибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑеÑевой запиÑи" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "ÐÐµÑ ÑеÑи Ñ net_id = %s" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, fuzzy, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "иÑклÑÑение ÑеÑевÑÑ ÑаÑпÑеделений Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ |%s|" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" +"ÐодклÑÑение инÑеÑÑейÑа %(interface_id)s к ÑеÑи %(net_id)s Ð´Ð»Ñ " +"%(tenant_id)s" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "Удаление поÑÑа %(port_id)s в ÑеÑи %(net_id)s Ð´Ð»Ñ %(tenant_id)s" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "%s не в допÑÑÑимÑÑ Ð¿ÑиоÑиÑеÑÐ°Ñ " + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" +"Ðеполадка '%(e)s', попÑÑка оÑпÑавиÑÑ Ð² ÑиÑÑÐµÐ¼Ñ Ñведомлений. " +"ÐагÑÑзка=%(payload)s" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "ÐозвÑÐ°Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ %s вÑзÑваÑÑемÑ" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "неизвлеÑÑннÑй конÑекÑÑ: %s" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "полÑÑено %s" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "не опÑеделен меÑод Ð´Ð»Ñ ÑообÑениÑ: %s" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "Ðе опÑеделен меÑод Ð´Ð»Ñ ÑообÑениÑ: %s" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "ÐÑполнение аÑÐ¸Ð½Ñ Ñонного вÑзова %s ..." + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "MSG_ID is %s" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "ÐÑпÑавка оповеÑÐµÐ½Ð¸Ñ Ð½Ð° %s..." + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" +"УдалÑÐ½Ð½Ð°Ñ Ð¾Ñибка: %(exc_type)s %(value)s\n" +"%(traceback)s." + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "ÐовÑоÑное подклÑÑение к ÑеÑвеÑÑ AMQP на %(hostname)s:%(port)d" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "ÐодклÑÑение к ÑеÑвеÑÑ AMQP на %(hostname)s:%(port)d" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" +"Ðевозможно подклÑÑиÑÑÑÑ Ðº ÑеÑвеÑÑ AMQP на %(hostname)s:%(port)d поÑле " +"%(max_retries)d попÑÑок: %(err_str)s" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" +"AMQP ÑеÑÐ²ÐµÑ Ð½Ð° %(hostname)s:%(port)d недоÑÑÑпен: %(err_str)s. ÐовÑоÑÐ½Ð°Ñ " +"попÑÑка ÑеÑез %(sleep_time)d ÑекÑнд." + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "ÐÑибка обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑебиÑÐµÐ»Ñ ÑÐµÐ¼Ñ '%(topic)s': %(err_str)s" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "ÐÑибка пÑинÑÑÐ¸Ñ ÑообÑÐµÐ½Ð¸Ñ Ð¸Ð· оÑеÑеди: %s" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "ÐÑибка пÑбликаÑии ÑообÑÐµÐ½Ð¸Ñ Ð² ÑÐµÐ¼Ñ '%(topic)s': %(err_str)s" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "Ðевозможно подклÑÑиÑÑÑÑ Ðº ÑеÑвеÑÑ AMQP: %s " + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "ÐÑполнÑеÑÑÑ Ð»Ð¸ ÑооÑвеÑÑÑвÑÑÑÐ°Ñ ÑлÑжба?" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "Ðевозможно найÑи дÑÑгой compute" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "Ñзел %(dest)s неÑовмеÑÑим Ñ Ð¸ÑÑ Ð¾Ð´Ð½Ñм Ñзлом %(src)s." + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "ÐопÑÑка ÑобÑаÑÑ %(num_instances)d копиÑ(й)" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "ÐÑÑилÑÑÑÐ¾Ð²Ð°Ð½Ñ %(hosts)s" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, fuzzy, python-format +msgid "Host filter passes for %(host)s" +msgstr "ÐÑÑилÑÑÑÐ¾Ð²Ð°Ð½Ñ %(hosts)s" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "ÐÑинÑÑо ÑлÑжебное обновление Ð´Ð»Ñ %(service_name)s Ð¾Ñ %(host)s." + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "host_manager Ñеализован ÑолÑко Ð´Ð»Ñ 'compute'" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "ÐÐµÑ ÑлÑÐ¶Ð±Ñ Ð´Ð»Ñ compute ID %s" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "ÐÑибка schedule_%(method)s: %(ex)s" + +#: cinder/scheduler/manager.py:159 +#, fuzzy, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "ÐÐ¾Ð¿Ð¸Ñ %(instance_uuid)s не оÑÑановлена. (%(vm_state)s" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "Ðевозможно декодиÑоваÑÑ Ð¿Ð°ÑамеÑÑÑ ÑаÑпиÑаниÑ: '%(e)s'" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "ÐмиÑаÑÐ¸Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ (ÑÑбпÑоÑеÑÑ): %s" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "ÐмиÑаÑÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¿Ñивела к иÑклÑÑÐµÐ½Ð¸Ñ %s" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "ÐÑÐ²ÐµÑ Ð½Ð° имиÑаÑÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² stdout='%(stdout)s' stderr='%(stderr)s'" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "ÐÑполнÑемÑе копии: %s" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "ÐоÑле завеÑÑÐµÐ½Ð¸Ñ ÑабоÑÑ ÐºÐ¾Ð¿Ð¸Ð¹: %s" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "ÐнÑÑÑеннÑÑ Ð¾Ñибка" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "ÐоÑле пÑинÑдиÑелÑного завеÑÑÐµÐ½Ð¸Ñ ÑабоÑÑ ÐºÐ¾Ð¿Ð¸Ð¹: %s" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "IPv4" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "IPv6" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "пÑоекÑ" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "Ðевозможно подÑвеÑдиÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ ÑкÑпоÑÑиÑованного Ñома:%s." + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "ÐаданнÑе даннÑе: %s" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "ÐÑоговÑе даннÑе: %s" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "Создание Ñайлов в %s Ð´Ð»Ñ Ð¸Ð¼Ð¸ÑаÑии гоÑÑевого агенÑа" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "Удаление Ñайлов имиÑаÑии гоÑÑевого агенÑа в %s" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, fuzzy, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "ÐÑевÑÑена квоÑа" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "_ÑоздаÑÑ: %s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "_ÑдалиÑÑ: %s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "_get: %s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "_get_all: %s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "test_snapshot_create: param=%s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "test_snapshot_create: resp_dict=%s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "test_snapshot_create_force: param=%s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "test_snapshot_create_force: resp_dict=%s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "test_snapshot_show: resp=%s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "test_snapshot_detail: resp_dict=%s" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" +"%(message)s\n" +"Ðод ÑоÑÑоÑниÑ: %(_status)s\n" +"Тело: %(_body)s" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "ÐÑибка аÑÑенÑиÑикаÑии" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "ÐÑибка авÑоÑизаÑии" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "обÑÐµÐºÑ Ð½Ðµ найден" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "ÐÑполнение %(method)s на %(relative_url)s" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "Тело: %s" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "%(auth_uri)s => код %(http_status)s" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "%(relative_uri)s => код %(http_status)s" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "ÐепÑедвиденнÑй код ÑоÑÑоÑниÑ" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "ÐекодиÑование JSON: %s" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "ÐолÑÑено %s" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "ÐÑибка оÑкÑÑÑÐ¸Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ c гипеÑвизоÑом" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "ÐапиÑÑ Compute_service Ñоздана Ð´Ð»Ñ %s " + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "ÐапиÑÑ Compute_service обновлена Ð´Ð»Ñ %s " + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "ÐÑполненое обновление пÑавил бÑандмаÑÑÑа поÑÑавÑика" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "Ðобавление пÑавила гÑÑÐ¿Ð¿Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи: %r" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "Ðобавление пÑавила поÑÑавÑика: %s" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "ÐÑибка анализа 'qemu-img info'." + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "ÐÑеобÑазование в необÑабоÑаннÑй, но ÑекÑÑий ÑоÑÐ¼Ð°Ñ %s" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" +"ÐÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑказаÑÑ vmwareapi_host_ip,vmwareapi_host_username и " +"vmwareapi_host_password useconnection_type=vmwareapi" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "Ð vmwareapi:_create_session, пÑинÑÑо ÑÑо иÑклÑÑение: %s" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "Ð vmwareapi:_call_method, пÑинÑÑо ÑÑо иÑклÑÑение: %s" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "СоÑÑоÑние задаÑи [%(task_name)s] %(task_ref)s: гоÑово" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "СоÑÑоÑние задаÑи [%(task_name)s] %(task_ref)s: оÑибка %(error_info)s" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "Ð vmwareapi:_poll_task, пÑинÑÑа ÑÑа оÑибка %s" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" +"ÐÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑказаÑÑ xenapi_connection_url, xenapi_connection_username " +"(необÑзаÑелÑно) и xenapi_connection_password Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ " +"connection_type=xenapi" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "ÐапÑÑк Ñзла на XenServer не поддеÑживаеÑÑÑ." + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" +"Ðевозможно вÑполниÑÑ Ð²Ñ Ð¾Ð´ в XenAPI (недоÑÑаÑоÑно Ñвободного меÑÑа на " +"Dom0?)" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "ÐÑклÑÑение: %s" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "Ðомен %s не ÑÑÑеÑÑвÑеÑ" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %(instance_name)s: Ñдаление Ñайлов копии %(target)s" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ %s: Создание обÑаза" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" +"Ðевозможно полÑÑиÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ЦÐУ, Ñак как ÑÑа возможноÑÑÑ Ð½Ðµ " +"Ñеализована Ð´Ð»Ñ ÑÑой плаÑÑоÑмÑ. ÐÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð¼Ð¾Ð¶Ð½Ð¾ безопаÑно пÑопÑÑÑиÑÑ." + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "Ð½ÐµÑ Ð½Ð°ÑÑÑоенного ÑовмеÑÑимого обÑабоÑÑика обÑаза" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "неизвеÑÑнÑй обÑабоÑÑик обÑаза диÑка: %s" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "обÑаз Ñже пÑиÑоединÑн" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "ÐÑибка монÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñайловой ÑиÑÑемÑ: %s" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "ÐÑибка ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑейнеÑа: %s" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "неподдеÑживаемÑй Ñаздел: %s" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "Ðевозможно пÑикÑепиÑÑ Ð¾Ð±Ñаз Ð´Ð»Ñ Ð·Ð°Ð¼ÑканиÑ: %s" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "ÑÐ°Ð·Ð´ÐµÐ»Ñ Ð½Ðµ найдена" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "ÐÐµÑ ÑвободнÑÑ ÑÑÑÑойÑÑв nbd" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "оÑибка qemu-nbd: %s" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "ÐодклÑÑение к libvirt: %s" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "Ðеполадка Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑением к libvirt" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +#, fuzzy, python-format +msgid "Instance soft rebooted successfully." +msgstr "Ñнимок %s: Ñоздание завеÑÑено" + +#: cinder/virt/libvirt/connection.py:696 +#, fuzzy +msgid "Failed to soft reboot instance." +msgstr "ÐÑибка пеÑезагÑÑзки копии" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" +"ÐÐ°Ð¹Ð´ÐµÐ½Ñ %(migration_count)d неподÑвеÑждÑннÑÑ Ð¿ÐµÑемеÑений, ÑÑаÑÑе " +"%(confirm_window)d ÑекÑнд" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "ÐвÑомаÑиÑеÑкие подÑвеÑждение пеÑемеÑÐµÐ½Ð¸Ñ %d" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "" + +#: cinder/virt/libvirt/connection.py:978 +#, fuzzy +msgid "Guest does not have a console available" +msgstr "ÐолÑзоваÑÐµÐ»Ñ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑÑаÑивнÑÑ Ð¿Ñивилегий" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "Создание изобÑажениÑ" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "block_device_list %s" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" +"ÐÑибка libvirt во вÑÐµÐ¼Ñ Ð¿Ð¾Ð¸Ñка %(instance_name)s: [Ðод оÑибки " +"%(error_code)s] %(ex)s" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "ÑÑÑаÑевÑÐ°Ñ Ð²ÐµÑÑÐ¸Ñ libvirt (не поддеÑживаеÑÑÑ getVersion)" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "'<cpu>' должно бÑÑÑ 1, но %d\n" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +#, fuzzy, python-format +msgid "Instance running successfully." +msgstr "ÐÐ¾Ð¿Ð¸Ñ %s: вÑполнение" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" +"ÐодÑÐ»Ñ Libvirt не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð³ÑÑжен. NWFilterFirewall не бÑÐ´ÐµÑ ÑабоÑаÑÑ" +" надлежаÑим обÑазом." + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "nwfilter(%(instance_filter_name)s) длÑ%(name)s не найден." + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "ÐÑандмаÑÑÑ iptables: ÐаÑÑÑойка базовой ÑилÑÑÑаÑии" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "Ðевозможно найÑи оÑкÑÑÑÑй поÑÑ" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "ÐÑибка оÑÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ vif копии '%s'" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "iSCSI-ÑÑÑÑойÑÑво не найдено в %s" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" +"Том ISCSI не найден в: %(mount_device)s. ÐÑÐ´ÐµÑ Ð²Ñполнена повÑоÑÐ½Ð°Ñ " +"пÑовеÑка и попÑÑка. ÐовÑоÑение: %(tries)s" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "Ðайден Ñзел iSCSI %(mount_device)s (поÑле %(tries)s повÑоÑнÑÑ Ð¿ÑовеÑок)" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "%(text)s: _db_content => %(content)s" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "СвойÑÑво %(attr)s не назнаÑено Ð´Ð»Ñ ÑпÑавлÑемого обÑекÑа %(objName)s" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "ÐÑÑÑÑÑÑвÑÑÑ Ð·Ð°ÑегиÑÑÑиÑованнÑе ÐÐ" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "ÐавеÑÑение ÑеанÑа Ñ Ð½ÐµÐ¿Ð¾Ð»Ð°Ð´ÐºÐ°Ð¼Ð¸ или Ñже завеÑÑÑнного ÑеанÑа: %s" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "Ð¡ÐµÐ°Ð½Ñ Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐ¿Ð¾Ð»Ð°Ð´ÐºÐ¸" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "ÐедопÑÑÑимÑй ÑеанÑ" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr " ÐÑÑÑÑÑÑвÑÑÑ Ð·Ð°ÑегиÑÑÑиованнÑе виÑÑÑалÑнÑе маÑинÑ" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "Ðевозможно импоÑÑиÑоваÑÑ suds." + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "ÐÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ задаÑÑ vmwareapi_wsdl_loc" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "ÐÑклÑÑение в %s " + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "ÐеÑеÑÐµÐ½Ñ ÐºÐ¾Ð¿Ð¸Ð¹" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "ÐÑего %s копий" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "Создание ÐÐ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ %s на Ñзле ESX" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "Создание ÐÐ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ %s на Ñзле ESX" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "ÐклÑÑение пиÑÐ°Ð½Ð¸Ñ Ð½Ð° копии ÐÐ %s" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "ÐиÑание вклÑÑено на копии ÐÐ %s" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "Создание Ñнимка копии ÐÐ %s " + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "Создание Ñнимка копии ÐÐ %s " + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "ÐÑгÑÑзка обÑаза %s" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "ÐÑгÑÑженнÑй обÑаз %s" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "Удаление вÑеменного Ñайла vmdk %s" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "УдалÑннÑй вÑеменнÑй Ñайл vmdk %s" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ Ð½Ðµ вклÑÑена" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "ÐеÑезагÑÑзка гоÑÑевой ÐС ÐÐ %s" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "ÐÑполнена пеÑезагÑÑзка гоÑÑевой ÐС ÐÐ %s" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "ÐÑполнение безоÑказной пеÑезагÑÑзки ÐÐ %s" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ - %s не пÑедÑÑавлена" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "ÐÑклÑÑение пиÑÐ°Ð½Ð¸Ñ ÐÐ %s" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "ÐиÑание ÐÐ %s вÑклÑÑено" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "ÐÑклÑÑение ÑегиÑÑÑаÑии ÐÐ %s" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "ÐезаÑегиÑÑÑиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÐÐ %s" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "ÐÑиоÑÑановка ÐÐ %s " + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "ÐÑиоÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ ÐÐ %s " + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "ÐиÑание копии вÑклÑÑено и ÑледоваÑелÑно она не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑиоÑÑановлена." + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "Ðозобновление ÑабоÑÑ ÐÐ %s" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "РабоÑа ÐÐ %s возобновлена " + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ Ð½Ðµ в пÑиоÑÑановленном ÑоÑÑоÑнии" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "Создание папки Ñ Ð°Ð´ÑеÑом %s" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "Создана папка Ñ Ð°Ð´ÑеÑом %s" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "ÐолÑÑение ÑазмеÑа обÑаза Ð´Ð»Ñ Ð¾Ð±Ñаза %s" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "ÐÑинÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð¾Ð±Ñаза %(size)s Ð´Ð»Ñ Ð¾Ð±Ñаза %(image)s" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "xenapi.fake не Ð¸Ð¼ÐµÐµÑ ÑеализаÑии Ð´Ð»Ñ %s" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "ÐÑполнÑеÑÑÑ Ð²Ñзов %(localname)s %(impl)s" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "ÐÑполнÑеÑÑÑ Ð²Ñзов getter %s" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" +"xenapi.fake не Ð¸Ð¼ÐµÐµÑ ÑеализаÑии Ð´Ð»Ñ %s или бÑл вÑзван Ñ Ð¸ÑполÑзованием " +"непÑавилÑнÑм ÑиÑлом аÑгÑменÑов" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "Ðевозможно пÑинÑÑÑ SR Ð´Ð»Ñ ÑÑого Ñзла: %s" + +#: cinder/virt/xenapi/host.py:169 +#, fuzzy, python-format +msgid "Unable to get updated status" +msgstr "Ðевозможно полÑÑиÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»Ñнное ÑоÑÑоÑние: %s" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "ÐÑзов %(method)s возвÑаÑил оÑибкÑ: %(e)s." + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "Ðайдена не ÑникалÑÐ½Ð°Ñ ÑеÑÑ Ð´Ð»Ñ name_label %s" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "Ðайдена не ÑникалÑÐ½Ð°Ñ ÑеÑÑ Ð´Ð»Ñ Ð¼Ð¾ÑÑа %s" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "Ðе найдена ÑеÑÑ Ð´Ð»Ñ Ð¼Ð¾ÑÑа %s" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, fuzzy, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "Ðевозможно найÑи Ñзел Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %s" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, fuzzy, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "Ðевозможно иÑполÑзоваÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑе полномоÑÐ¸Ñ %(role_id)s" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +#, fuzzy, python-format +msgid "Created VM" +msgstr "_ÑоздаÑÑ: %s" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "VBD не найдено Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %s" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, fuzzy, python-format +msgid "VBD %s already detached" +msgstr "гÑÑппа %s Ñже ÑÑÑеÑÑвÑеÑ" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "Ðевозможно оÑÑоединиÑÑ VBD %s" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "Ðевозможно ликвидиÑоваÑÑ VBD %s" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, fuzzy, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "Создана VBD %(vbd_ref)s Ð´Ð»Ñ ÐÐ %(vm_ref)s, VDI %(vdi_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "Создана VBD %(vbd_ref)s Ð´Ð»Ñ ÐÐ %(vm_ref)s, VDI %(vdi_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "Ðевозможно ликвидиÑоваÑÑ VDI %s" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" +"Создан VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s) " +"на %(sr_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, fuzzy, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "ÐÑÑÑÑÑÑвÑÐµÑ Ð¿ÐµÑвиÑнÑй VDI длÑ%(vm_ref)s" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, fuzzy, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "Снимок ÐÐ %(vm_ref)s Ñ Ð¼ÐµÑкой '%(label)s'..." + +#: cinder/virt/xenapi/vm_utils.py:392 +#, fuzzy, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "Создан Ñнимок %(template_vm_ref)s из ÐÐ %(vm_ref)s." + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "ÐапÑÐ¾Ñ xapi Ð´Ð»Ñ Ð²ÑгÑÑзки %(vdi_uuids)s в каÑеÑÑве ID %(image_id)s" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "ÐапÑÐ¾Ñ xapi на пÑиÑм обÑаза vhd %(image)s" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" +"xapi 'download_vhd' возвÑаÑил VDI Ñипа '%(vdi_type)s' Ñ UUID " +"'%(vdi_uuid)s'" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" +"Ð Ð°Ð·Ð¼ÐµÑ Ð¾Ð±Ñаза %(size_bytes)d пÑевÑÑÐ°ÐµÑ Ð´Ð¾Ð¿ÑÑÑимÑй instance_type ÑÐ°Ð·Ð¼ÐµÑ " +"%(allowed_size_bytes)d" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, fuzzy, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "ÐолÑÑение обÑаза %(image)s" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" +"ÐÑевÑÑен ÑÐ°Ð·Ð¼ÐµÑ ÑдÑа/Ramdisk обÑаза: %(vdi_size)d байÑ, макÑ. " +"%(max_size)d байÑ" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "ÐопиÑование VDI %s в /boot/guest на dom0" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "ЯдÑо/Ramdisk VDI %s ликвидиÑован" + +#: cinder/virt/xenapi/vm_utils.py:895 +#, fuzzy +msgid "Failed to fetch glance image" +msgstr "ÐÑибка пеÑезагÑÑзки копии" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "ÐбнаÑÑжен %(image_type_str)s ÑоÑÐ¼Ð°Ñ Ð´Ð»Ñ Ð¾Ð±Ñаза %(image_ref)s" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "ÐоиÑк vdi %s Ð´Ð»Ñ ÑдÑа PV" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "ÐеизвеÑÑнÑй ÑоÑÐ¼Ð°Ñ Ð¾Ð±Ñаза %(disk_image_type)s" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "VDI %s до ÑÐ¸Ñ Ð¿Ð¾Ñ Ð´Ð¾ÑÑÑпен" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "ÐовÑоÑÐ½Ð°Ñ Ð¿ÑовеÑка SR %s" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "Ðевозможно найÑи SR Ñипа ÑодеÑжимого ISO" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "ISO: поиÑк SR %(sr_rec)s" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "ISO: не ÑодеÑжимое iso Ñипа" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "ISO: SR Ñ Ð»Ð¾ÐºÐ°Ð»Ñной PBD" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "ÐÑÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ñи Ñоздании ÑÑÑÑойÑÑва %s" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "ÐодÑоединение VBD %s ... " + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "ÐодÑоединение VBD %s вÑполнено." + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "VBD %(vbd_ref)s подÑоединено как %(orig_dev)s" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" +"VBD %(vbd_ref)s подÑоединено в непÑавилÑнÑй dev, изменение назнаÑÐµÐ½Ð¸Ñ Ð½Ð° " +"%(dev)s" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "ÐиквидиÑование VBD Ð´Ð»Ñ VDI %s ... " + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "ÐиквидиÑование VBD Ð´Ð»Ñ VDI %s завеÑÑено." + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "Ðайдено ÑдÑо Xen %s" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "ЯдÑо Xen не найдено. ÐагÑÑзка HVM." + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "РазделÑ:" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr " %(num)s: %(ptype)s %(size)d ÑекÑоÑов" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" +"ÐапиÑÑ ÑаблиÑÑ Ñазделов %(primary_first)d %(primary_last)d в " +"%(dev_path)s..." + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "ÐапиÑÑ ÑаблиÑÑ Ñазделов %s вÑполнена." + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "СÑедÑÑва XenServer не ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð² ÑÑÐ¾Ñ Ð¾Ð±Ñаз" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" +"ÐÑибка пÑиÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñайловой ÑиÑÑÐµÐ¼Ñ (ожидаемо Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¹ не на базе " +"linux): %s" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, fuzzy, python-format +msgid "Updating progress to %(progress)d" +msgstr "Ðбновление вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¸ '%(instance_uuid)s' до %(progress)d" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" +"ÐÑедпÑинÑÑа попÑÑка вклÑÑÐµÐ½Ð¸Ñ Ð½ÐµÑÑÑеÑÑвÑÑÑей копии, копии Ñ Ð½ÐµÐ¿Ð¾Ð»Ð°Ð´ÐºÐ°Ð¼Ð¸ Ñ" +" иденÑиÑикаÑоÑом %s" + +#: cinder/virt/xenapi/vmops.py:233 +#, fuzzy, python-format +msgid "Starting instance" +msgstr "ÐапÑÑк копии %s" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "Удаление ÑдÑа/ramdisk Ñайлов из dom0" + +#: cinder/virt/xenapi/vmops.py:358 +#, fuzzy +msgid "Failed to spawn, rolling back" +msgstr "ÐÑибка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñома в базе даннÑÑ " + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +#, fuzzy, python-format +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" +"ÐвÑомаÑиÑеÑÐºÐ°Ñ Ð½Ð°ÑÑÑойка диÑка Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %(instance_uuid)s, вÑполнÑеÑÑÑ " +"попÑÑка Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑазмеÑа Ñаздела..." + +#: cinder/virt/xenapi/vmops.py:515 +#, fuzzy, python-format +msgid "Invalid value for injected_files: %r" +msgstr "ÐедопÑÑÑимое знаÑение Ð´Ð»Ñ injected_files: '%s'" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "ÐаÑÑÑойка паÑÐ¾Ð»Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑÑаÑоÑа" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "ÐоÑÑÑановление ÑеÑи" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +#, fuzzy +msgid "Starting VM" +msgstr "ÐÑполнение пеÑезагÑÑзки xvp" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "ÐапÑÐ¾Ñ Ð²ÐµÑÑии агенÑа" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "ÐеÑÑÐ¸Ñ Ð°Ð³ÐµÐ½Ñа копии: %s" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "Ðбновление агенÑа до %s" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "opaque_ref не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð¿ÑеделÑн Ð´Ð»Ñ '%s'." + +#: cinder/virt/xenapi/vmops.py:670 +#, fuzzy, python-format +msgid "Finished snapshot and upload for VM" +msgstr "ÐоÑовÑй Ñнимок и вÑгÑÑзка Ð´Ð»Ñ ÐÐ %s" + +#: cinder/virt/xenapi/vmops.py:677 +#, fuzzy, python-format +msgid "Starting snapshot for VM" +msgstr "ÐапÑÑк Ñнимка Ð´Ð»Ñ ÐÐ %s" + +#: cinder/virt/xenapi/vmops.py:686 +#, fuzzy, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "Ðевозможно найÑи Ñзел Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %s" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "ÐÑибка пеÑемеÑÐµÐ½Ð¸Ñ vhd на новÑй Ñзел" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "Ðзменение ÑазмеÑа VDI %(cow_uuid)s Ñ %(old_gb)dÐРдо %(new_gb)dÐÐ" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "Ðзменение ÑазмеÑа VDI %(vdi_uuid)s Ñ %(old_gb)dÐРдо %(new_gb)dÐÐ" + +#: cinder/virt/xenapi/vmops.py:901 +#, fuzzy, python-format +msgid "Resize complete" +msgstr "Ðзменение ÑазмеÑа копии %s завеÑÑено" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "ÐÑибка запÑоÑа веÑÑии агенÑа: %(resp)r" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "ÐÑибка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð°Ð³ÐµÐ½Ñа: %(resp)r" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "ÐÑибка обмена клÑÑей: %(resp)r" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "ÐÑибка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°ÑолÑ: %(resp)r" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "Ðевозможно найÑи VBD Ð´Ð»Ñ ÐÐ" + +#: cinder/virt/xenapi/vmops.py:1097 +#, fuzzy, python-format +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" +"ÐÐ¾Ð¿Ð¸Ñ %(instance_uuid)s иÑполÑзÑÐµÑ RAW или VHD, пÑопÑÑк ÑдÑа и Ñдаление " +"ramdisk" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ ÑодеÑÐ¶Ð¸Ñ ÑдÑо или ramdisk, но не оба" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "ÑÐ°Ð¹Ð»Ñ ÑдÑа/ramdisk ÑдаленÑ" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +#, fuzzy +msgid "Destroying VM" +msgstr "ÐÑполнение пеÑезагÑÑзки xvp" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "ÐРне пÑедоÑÑавлена, пÑопÑÑк вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð»Ð¸ÐºÐ²Ð¸Ð´Ð°Ñии..." + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "ÐÐ¾Ð¿Ð¸Ñ Ð² ÑоÑÑоÑнии Ñежима воÑÑÑановлениÑ: %s" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +#, fuzzy, python-format +msgid "Automatically hard rebooting" +msgstr "ÐвÑомаÑиÑеÑÐºÐ°Ñ Ð±ÐµÐ·Ð¾ÑÐºÐ°Ð·Ð½Ð°Ñ Ð¿ÐµÑезагÑÑзка %d" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, fuzzy, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "ÐавеÑÑение ÑабоÑÑ ÐÐ Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %(instance_uuid)s" + +#: cinder/virt/xenapi/vmops.py:1379 +#, fuzzy, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "ÐÐ¾Ð¿Ð¸Ñ %(instance_id)s не найдена" + +#: cinder/virt/xenapi/vmops.py:1383 +#, fuzzy, python-format +msgid "In ERROR state" +msgstr "ÐÑибка ÐÐ: %s" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "Ðевозможно полÑÑиÑÑ ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ пÑопÑÑкной ÑпоÑобноÑÑи." + +#: cinder/virt/xenapi/vmops.py:1469 +#, fuzzy +msgid "Injecting network info to xenstore" +msgstr "ÑÑÑановка ÑеÑевого Ñзла" + +#: cinder/virt/xenapi/vmops.py:1483 +#, fuzzy +msgid "Creating vifs" +msgstr "Создание изобÑажениÑ" + +#: cinder/virt/xenapi/vmops.py:1492 +#, fuzzy, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "Создание VIF Ð´Ð»Ñ ÐÐ %(vm_ref)s, ÑеÑÑ %(network_ref)s." + +#: cinder/virt/xenapi/vmops.py:1495 +#, fuzzy, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "Создание VIF Ð´Ð»Ñ ÐÐ %(vm_ref)s, ÑеÑÑ %(network_ref)s." + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, fuzzy, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" +"ÐÑзов агенÑом %(method)s возвÑаÑил недопÑÑÑимÑй оÑвеÑ: %(ret)r. VM " +"id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" + +#: cinder/virt/xenapi/vmops.py:1566 +#, fuzzy, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" +"ÐÐ ÐÐЯ ÐÐ ÐСТÐЯ: СÑок вÑзова %(method)s иÑÑÑк. VM id=%(instance_uuid)s; " +"args=%(args)r" + +#: cinder/virt/xenapi/vmops.py:1570 +#, fuzzy, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" +"ÐÐ Ð ÐÐÐÐÐÐÐÐÐÐ: ÐÑзов %(method)s не поддеÑживаеÑÑÑ Ð°Ð³ÐµÐ½Ñом. VM " +"id=%(instance_uuid)s; args=%(args)r" + +#: cinder/virt/xenapi/vmops.py:1575 +#, fuzzy, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "ÐÑзов %(method)s возвÑаÑил оÑибкÑ: %(e)s." + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "ÐÑибка OpenSSL: %s" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "Ñоздание sr в volume_utils" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "Ñип = %s" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "наименование = %s" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "Создано %(label)s как %(sr_ref)s." + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "Ðевозможно ÑоздаÑÑ ÑепозиÑоÑий Ñ ÑанилиÑа" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "внедÑение sr в volume_utils" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "внедÑÑн %(label)s в каÑеÑÑве %(sr_ref)s." + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "Создание pbd Ð´Ð»Ñ SR" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "ÐодклÑÑение SR" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "Ðевозможно внедÑиÑÑ Ð ÐµÐ¿Ð¾Ð·Ð¸ÑоÑий Ñ ÑанениÑ" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "Ðевозможно полÑÑиÑÑ SR Ñ Ð¸ÑполÑзованием uuid" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "ÐабÑвание SR %s..." + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "Ðевозможно забÑÑÑ Ð ÐµÐ¿Ð¾Ð·Ð¸ÑоÑий Ñ ÑанениÑ" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "ÐнедÑение %s..." + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "Ðевозможно найÑи SR из VBD %s" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "ÐÑопÑÑк иÑклÑÑÐµÐ½Ð¸Ñ %(exc)s пÑи полÑÑении PBD Ð´Ð»Ñ %(sr_ref)s" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "ÐÑопÑÑк иÑклÑÑÐµÐ½Ð¸Ñ %(exc)s пÑи оÑÑоединении PBD %(pbd)s" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "Ðевозможно внедÑиÑÑ VDI на SR %s" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "Ðевозможно полÑÑиÑÑ Ð·Ð°Ð¿Ð¸ÑÑ VDI %s на" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "Ðевозможно внедÑиÑÑ VDI Ð´Ð»Ñ SR %s" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "ÐÑибка поиÑка vdis в SR %s" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "ÐÑибка поиÑка vbd Ð´Ð»Ñ vdi %s" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "Ðевозможно полÑÑиÑÑ ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð½Ð°Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ %(data)s, %(mountpoint)s" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "ТоÑка подклÑÑÐµÐ½Ð¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑеведена: %s" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "Создание SR %s" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "Ðевозможно ÑоздаÑÑ SR" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "Ðевозможно полÑÑиÑÑ Ð·Ð°Ð¿Ð¸ÑÑ SR" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "ÐнедÑение SR %s" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "SR найдено в базе даннÑÑ xapi. ÐÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи во внедÑении" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "Ðевозможно внедÑиÑÑ SR" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "ÐÑовеÑка SR %s" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "SR %s не найден в базе даннÑÑ xapi" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "Ðевозможно забÑÑÑ SR" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "Ðевозможно ÑоздаÑÑ VDI на SR %(sr_ref)s Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "Ðевозможно иÑполÑзоваÑÑ SR %(sr_ref)s Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "Ðевозможно пÑиÑоединиÑÑ Ñом Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %s" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "ТоÑка подклÑÑÐµÐ½Ð¸Ñ %(mountpoint)s пÑиÑоединена к копии %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "Ðевозможно найÑи Ñом %s" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "Ðевозможно оÑÑоединиÑÑ Ñом %s" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "Ðевозможно ликвидиÑоваÑÑ vbd %s" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "ÐÑибка оÑиÑÑки SR %s" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "ТоÑка подклÑÑÐµÐ½Ð¸Ñ %(mountpoint)s оÑÑоединена Ð¾Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %(instance_name)s" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "ÐÑибка в ÑоглаÑении: %s" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "ÐедопÑÑÑимÑй запÑоÑ: %s" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "ÐапÑоÑ: %s" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "ÐапÑÐ¾Ñ Ñделан Ñ Ð¾ÑÑÑÑÑÑвÑÑÑим Ñокеном: %s" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "ÐапÑÐ¾Ñ Ñделан Ñ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑимÑм Ñокеном: %s" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "ÐепÑÐµÐ´Ð²Ð¸Ð´ÐµÐ½Ð½Ð°Ñ Ð¾Ñибка: %s" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "ÐапÑÑк Ñзла ÑеÑи cinder-xvpvncproxy (веÑÑÐ¸Ñ %s)" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "ÐÑевÑÑена квоÑа Ð´Ð»Ñ %(pid)s, попÑÑка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñома %(size)sG" + +#: cinder/volume/api.py:137 +#, fuzzy +msgid "Volume status must be available or error" +msgstr "СоÑÑоÑние Ñома должно бÑÑÑ Ð´Ð¾ÑÑÑпно" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +#, fuzzy +msgid "Volume Snapshot status must be available or error" +msgstr "СоÑÑоÑние Ñома должно бÑÑÑ Ð´Ð¾ÑÑÑпно" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "ÐоÑÑÑановление поÑле недопÑÑÑимого вÑполнениÑ. ÐопÑÑка Ð½Ð¾Ð¼ÐµÑ %s" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "Ñом гÑÑÐ¿Ð¿Ñ %s не ÑÑÑеÑÑвÑеÑ" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "Ðевозможно найÑи ÑкÑпоÑÑиÑование iSCSI Ð´Ð»Ñ Ñома %s" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" +"Ðевозможно подÑвеÑдиÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑа ÑкÑпоÑÑиÑованного " +"Ñома:%(volume_id)s." + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "rbd не Ð¸Ð¼ÐµÐµÑ Ð¿Ñла %s" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "Sheepdog не вÑполнÑеÑÑÑ: %s" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "Sheepdog не вÑполнÑеÑÑÑ" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "LoggingVolumeDriver: %s" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "ÐовÑоÑное ÑкÑпоÑÑиÑование %s Ñомов" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "Ñом %s: пÑопÑÑк ÑкÑпоÑÑиÑованиÑ" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "Ñом %s: Ñоздание" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "Ñом %(vol_name)s: Ñоздание lv обÑÑмом %(vol_size)sG" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "Ñом %s: Ñоздание ÑкÑпоÑÑиÑованиÑ" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "Ñом %s: Ñоздание завеÑÑено" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "Том до ÑÐ¸Ñ Ð¿Ð¾Ñ Ð¿ÑиÑоединÑн" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "Ñом %s: Ñдаление ÑкÑпоÑÑиÑованиÑ" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "Ñом %s: Ñдаление" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "Ñом %s: Ñом занÑÑ" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "Ñом %s: Ñдаление завеÑÑено" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "Ñнимок %s: Ñоздание" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "Ñнимок %(snap_name)s: Ñоздание" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "Ñнимок %s: Ñоздание завеÑÑено" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "Ñнимок %s: Ñдаление" + +#: cinder/volume/manager.py:214 +#, fuzzy, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "Ñнимок %s: Ñоздание завеÑÑено" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "Ñнимок %s: Ñдаление вÑполнено" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "ÐÑовеÑка возможноÑÑей Ñома" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "ÐбнаÑÑÐ¶ÐµÐ½Ñ Ð½Ð¾Ð²Ñе возможноÑÑи: %s" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "ÐÑиÑÑиÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "ÐÑинÑÑо Ñведомление {%s}" + +#: cinder/volume/netapp.py:79 +#, fuzzy, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "ÐбÑаз %(image_id)s недопÑÑÑим: %(reason)s" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +#, fuzzy +msgid "Connected to DFM server" +msgstr "ÐеÑеподлÑÑено к оÑеÑеди" + +#: cinder/volume/netapp.py:159 +#, python-format +msgid "Job failed: %s" +msgstr "" + +#: cinder/volume/netapp.py:240 +#, fuzzy +msgid "Failed to provision dataset member" +msgstr "ÐÑибка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ " + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, fuzzy, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "ÐÑибка поиÑка vbd Ð´Ð»Ñ vdi %s" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, fuzzy, python-format +msgid "No LUN ID for volume %s" +msgstr "Ðевозможно найÑи ÑкÑпоÑÑиÑование iSCSI Ð´Ð»Ñ Ñома %s" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, fuzzy, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "ÐÑибка полÑÑÐµÐ½Ð¸Ñ Ð¼ÐµÑаданнÑÑ Ð´Ð»Ñ ip: %s" + +#: cinder/volume/netapp.py:614 +#, fuzzy, python-format +msgid "Failed to get host details for host ID %s" +msgstr "ÐÑибка полÑÑÐµÐ½Ð¸Ñ Ð¼ÐµÑаданнÑÑ Ð´Ð»Ñ ip: %s" + +#: cinder/volume/netapp.py:620 +#, fuzzy, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "ÐÑибка полÑÑÐµÐ½Ð¸Ñ Ð¼ÐµÑаданнÑÑ Ð´Ð»Ñ ip: %s" + +#: cinder/volume/netapp.py:625 +#, fuzzy, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "ÐÑибка полÑÑÐµÐ½Ð¸Ñ Ð¼ÐµÑаданнÑÑ Ð´Ð»Ñ ip: %s" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "ÐадайÑе san_password или san_private_key" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "san_ip должен бÑÑÑ Ð½Ð°Ð·Ð½Ð°Ñен" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "LUID не найден Ð´Ð»Ñ %(zfs_poolname)s. ÐÑвод=%(out)s" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "ÐозвÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CLIQ %s" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" +"ÐепÑавилÑнÑй оÑÐ²ÐµÑ Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CLIQ %(verb)s %(cliq_args)s. " +"РезÑлÑÑаÑ=%(out)s" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "ÐÑибка вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CLIQ %(verb)s %(cliq_args)s. РезÑлÑÑаÑ=%(out)s" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" +"ÐепÑедвиденное колиÑеÑÑво виÑÑÑалÑнÑÑ ip Ð´Ð»Ñ ÐºÐ»Ð°ÑÑеÑа %(cluster_name)s. " +"РезÑлÑÑаÑ=%(_xml)s" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ Ñоме: %(volume_name)s => %(volume_attributes)s" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "local_path не поддеÑживаеÑÑÑ" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "Ðевозможно опÑеделиÑÑ Ð¿ÑÐ¾ÐµÐºÑ Ð´Ð»Ñ Ñома %s, невозможно ÑкÑпоÑÑиÑоваÑÑ" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "ÐÑибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ sr %s...пÑодолжение" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "ÐÑибка ÑозданиÑ" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "ÐÑибка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ " + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "ÐÑибка внедÑÐµÐ½Ð¸Ñ sr %s...пÑодолжение" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "XenSMDriver Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ xenapi Ñоединение" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "ÐÑибка наÑала ÑеанÑа" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "Том бÑÐ´ÐµÑ Ñоздан во внÑÑÑеннем инÑеÑÑейÑе - %d" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "ÐÑибка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñома в базе даннÑÑ " + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "Ðевозможно ÑоздаÑÑ Ñом" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "ÐÑибка ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ vdi" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "ÐÑибка ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñома в базе даннÑÑ " + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "ÐÑибка поиÑка Ñома в базе даннÑÑ " + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "ÐÑибка поиÑка внÑÑÑеннего инÑеÑÑейÑа в базе даннÑÑ " + +#: cinder/volume/nexenta/__init__.py:27 +#, fuzzy, python-format +msgid "Nexenta SA returned the error" +msgstr "СеÑÐ²ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑил оÑибкÑ: %s" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, fuzzy, python-format +msgid "Sending JSON data: %s" +msgstr "ÐаданнÑе даннÑе: %s" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, fuzzy, python-format +msgid "Got response: %s" +msgstr "оÑÐ²ÐµÑ %s" + +#: cinder/volume/nexenta/volume.py:96 +#, fuzzy, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "Ñом гÑÑÐ¿Ð¿Ñ %s не ÑÑÑеÑÑвÑеÑ" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "ÐаÑамеÑÑÑ Ð´Ð¾ÑÑÑÐ¿Ñ Cinder не заданÑ." + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "ÐиÑÑÑалÑнÑй маÑÑив Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ %(id)d не найден." + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "ÐиÑÑÑалÑнÑй маÑÑив Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ %(name)s не найден." + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "Тело не пÑедоÑÑавлено" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "СоздаÑÑ VSA %(display_name)s Ñипа %(vc_type)s" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "УдалиÑÑ VSA Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом: %s" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "ÐÑÑоÑииÑоваÑÑ Ð°Ð´ÑÐµÑ %(ip)s Ñ VSA %(id)s" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "ÐÑклÑÑиÑÑ Ð°Ð´ÑÐµÑ Ð´Ð»Ñ VSA %(id)s" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "%(obj)s Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом %(id)s не найден" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" +#~ "%(obj)s Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом %(id)s оÑноÑиÑÑÑ " +#~ "к VSA %(own_vsa_id)s и не VSA " +#~ "%(vsa_id)s." + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "Index. vsa_id=%(vsa_id)s" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "СоздаÑÑ Ñом %(size)s ÐРиз VSA ID %(vsa_id)s" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "ÐбновиÑÑ %(obj)s Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом: %(id)s, изменениÑ: %(changes)s" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "ÐÑинÑдиÑелÑное Ñдаление вм %(instance_uuid)s, даже еÑли она Ñдалена" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" +#~ "ÐÐ¾Ð¿Ð¸Ñ %(instance_uuid)s не ÑÑÑеÑÑвÑÐµÑ Ð² " +#~ "ÐÐ, но бÑÐ´ÐµÑ Ð²Ñполнено вÑклÑÑение " +#~ "иÑполÑзÑÑ Ð¾ÑобÑй конÑекÑÑ" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "попÑÑка ликвидаÑии Ñже ликвидиÑованной копии: %s" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "Ðевозможно пеÑейÑи на пÑедÑдÑÑÑÑ Ð²ÐµÑÑÐ¸Ñ Ð±ÐµÐ· поÑеÑи даннÑÑ " + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" +#~ "СеÑÐ²ÐµÑ AMQP на %(fl_host)s:%(fl_port)d " +#~ "недоÑÑÑпен: %(e)s. ÐÑеÑÐµÐ´Ð½Ð°Ñ Ð¿Ð¾Ð¿ÑÑка ÑеÑез " +#~ "%(fl_intv)d ÑекÑнд." + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" +#~ "Ðевозможно подклÑÑиÑÑÑÑ Ðº ÑеÑвеÑÑ AMQP " +#~ "поÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ %(tries)d попÑÑок. ÐавеÑÑение" +#~ " ÑабоÑÑ." + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "ÐÑибка полÑÑÐµÐ½Ð¸Ñ ÑообÑÐµÐ½Ð¸Ñ Ð¸Ð· оÑеÑеди: %s" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "Ñема %s" + +#~ msgid "message %s" +#~ msgstr "ÑообÑение %s" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "_filter_hosts: %(request_spec)s" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "Ðа Ñзле %s недоÑÑаÑоÑно Ñвободного меÑÑа. ÐÑопÑÑк" + +#~ msgid "Filter hosts: %s" +#~ msgstr "ФилÑÑÑ Ñзлов: %s" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "ÐÑбÑано макÑ. колиÑеÑÑво Ñзлов (%d)" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "Том обеÑпеÑÐµÐ½Ð¸Ñ %(name)s ÑазмеÑом %(size)s ÐРна Ñзле %(host)s" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "%(i)d: Том %(name)s" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "ÐÑибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñомов" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "Том не-VSA %d" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "ÐÑибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñома" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "ÐозможноÑÑÑ Ð´Ð»Ñ Ñома, обÑÑмом %(size)s, не вÑбÑана" + +#~ msgid "Host %s:" +#~ msgstr "Узел %s:" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" +#~ "\tÐиÑк %(qosgrp)-25s: вÑего %(total)2s, " +#~ "занÑÑо %(used)2s, Ñвободно %(free)2s. " +#~ "ÐоÑÑÑпнÑй обÑÑм %(avail)-5s" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "\t LeastUsedHost: ÐаилÑÑÑий Ñзел: %(best_host)s. (занÑÑо %(min_used)s)" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" +#~ "\t MostAvailCap: ÐаилÑÑÑий Ñзел: " +#~ "%(best_host)s. (доÑÑÑпно %(max_avail)s %(type_str)s)" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "" + +#~ msgid "Publishing to route %s" +#~ msgstr "" + +#~ msgid "Declaring queue %s" +#~ msgstr "ÐбÑÑвление оÑеÑеди %s" + +#~ msgid "Declaring exchange %s" +#~ msgstr "ÐбÑÑвление ÑоÑки обмена %s" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "ÐолÑÑение из %(queue)s: %(message)s" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "ТеÑÑ: user_data = %s" + +#~ msgid "_create: param=%s" +#~ msgstr "_create: param=%s" + +#~ msgid "Host %s" +#~ msgstr "Узел %s" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "ÐÑовеÑка: обеÑпеÑение vol %(name)s на Ñзле %(host)s" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "\t vol=%(vol)s" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "ТеÑÑ: запÑÐ¾Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ VSA: vsa_id=%(vsa_id)s values=%(values)s" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "ТеÑÑ: Создание Ñома: %s" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "ТеÑÑ: Том полÑÑÐ°ÐµÑ Ð·Ð°Ð¿ÑоÑ: id=%(volume_id)s" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "ТеÑÑ: ÐапÑÐ¾Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñома: id=%(volume_id)s знаÑениÑ=%(values)s" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "ТеÑÑ: Том полÑÑаеÑ: id=%(volume_id)s" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "СоÑÑоÑние задаÑи [%(name)s] %(task)s: гоÑово %(result)s" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "СоÑÑоÑние задаÑи [%(name)s] %(task)s: %(status)s %(error_info)s" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "" + +#~ msgid "cool, it's a device" +#~ msgstr "" + +#~ msgid "Unable to read LXC console" +#~ msgstr "Ðевозможно пÑоÑиÑаÑÑ ÐºÐ¾Ð½ÑÐ¾Ð»Ñ LXC" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" +#~ "в xml...\n" +#~ ":%s " + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "Ð¡Ð¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ ÐÐ %s..." + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "Ð¡Ð¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ ÐÐ %(instance_name)s как %(vm_ref)s." + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "Создание оÑобого CDROM VBD Ð´Ð»Ñ ÐÐ %(vm_ref)s, VDI %(vdi_ref)s ... " + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" +#~ "Создана VBD на оÑнове CDROM %(vbd_ref)s" +#~ " Ð´Ð»Ñ ÐÐ %(vm_ref)s, VDI %(vdi_ref)s." + +#~ msgid "Image Type: %s" +#~ msgstr "Тип обÑаза: %s" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "ISO: Ðайден sr, возможно ÑодеÑжаÑий обÑаз ISO" + +#~ msgid "Size for image %(image)s:%(virtual_size)d" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "Создание VBD Ð´Ð»Ñ VDI %s ... " + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "Создание VBD Ð´Ð»Ñ VDI %s вÑполнено." + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "" + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "" + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "ÐÑопÑÑк XenAPI.Failure в VBD.unplug: %s" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "ÐÑопÑÑк XenAPI.Failure %s" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "ÐапÑÑк ÐÐ %s..." + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "ÐÐ¾Ð¿Ð¸Ñ %s: ожидание запÑÑка" + +#~ msgid "Resources to remove:%s" +#~ msgstr "РеÑÑÑÑÑ Ð´Ð»Ñ ÑдалениÑ:%s" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "ÐÑопÑÑк ликвидаÑии VDI Ð´Ð»Ñ %s" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "ÐиквидиÑование VDI Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %(instance_uuid)s" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "ÐÐ¾Ð¿Ð¸Ñ %(instance_uuid)s ÐРликвидиÑована" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "ÐиквидиÑование ÐÐ Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ %(instance_uuid)s" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "Ñоздание vif(s) Ð´Ð»Ñ Ð²Ð¼: |%s|" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "Создан VIF %(vif_ref)s Ð´Ð»Ñ ÐÐ %(vm_ref)s, ÑеÑÑ %(network_ref)s." + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" +#~ "ÐÑзов %(method)s возвÑаÑил оÑибкÑ: %(e)s. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "Создание VBD Ð´Ð»Ñ ÐÐ %(vm_ref)s, VDI %(vdi_ref)s ... " + +#~ msgid "Error destroying VDI" +#~ msgstr "ÐÑибка ликвидаÑии VDI" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "\tТом %s не ÑвлÑеÑÑÑ VSA Ñомом" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "\tСоздание Ñома FE VSA %s - ниÑего не вÑполнÑÑÑ" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "ÐÑибка VSA BE create_volume Ð´Ð»Ñ %s" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "VSA BE create_volume Ð´Ð»Ñ %s вÑполнено" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "\tУдаление FE VSA Ñома %s - ниÑего не вÑполнÑÑÑ" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "ÐÑибка VSA BE delete_volume Ð´Ð»Ñ %s" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "VSA BE delete_volume Ð´Ð»Ñ %s вÑполнено" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "\tТом FE VSA %s ÑоздаÑÑ ÑкÑпоÑÑиÑование - ниÑего не вÑполнÑÑÑ" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "\tТом FE VSA %s ÑдалиÑÑ ÑкÑпоÑÑиÑование - ниÑего не вÑполнÑÑÑ" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "ÐÑибка пÑиÑма Ñведений QoS" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "*** ÐкÑпеÑименÑалÑнÑй код VSA ***" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "ÐапÑоÑенное колиÑеÑÑво VC (%d) избÑÑоÑно. ÐазнаÑение по ÑмолÑаниÑ" + +#~ msgid "Creating VSA: %s" +#~ msgstr "Создание VSA: %s" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: СоздаÑÑ " +#~ "Ñом %(vol_name)s, %(vol_size)d ÐÐ, Ñип " +#~ "%(vol_type_id)s" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "VSA ID %(vsa_id)d: ÐбновиÑÑ ÑоÑÑоÑние VSA на %(status)s" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "VSA ID %(vsa_id)d: ÐбновиÑÑ Ð²Ñзов VSA" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "Ðобавление %(add_cnt)s VC в VSA %(vsa_name)s." + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "Удаление %(del_cnt)s VC из VSA %(vsa_name)s." + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "VSA ID %(vsa_id)s: Удаление %(direction)s Ñома %(vol_name)s" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "Ðевозможно ÑдалиÑÑ Ñом %s" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" +#~ "VSA ID %(vsa_id)s: ÐÑинÑдиÑелÑное Ñдаление." +#~ " %(direction)s Ñом %(vol_name)s" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "ÐÑполнение завеÑÑÐµÐ½Ð¸Ñ ÑабоÑÑ VSA ID %s" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "VSA ID %(vsa_id)s: УдалиÑÑ ÐºÐ¾Ð¿Ð¸Ñ %(name)s" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "СоздаÑÑ Ð²Ñзов полÑÑеннÑй Ð´Ð»Ñ VSA %s" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "ÐÑибка поиÑка VSA %(vsa_id)d" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "VSA ID %(vsa_id)s: Создан накопиÑÐµÐ»Ñ %(vol_id)s. СоÑÑоÑние %(status)s" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "ÐакопиÑÐµÐ»Ñ %(vol_name)s (%(vol_disp_name)s) в Ñазе ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ - подождиÑе" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/tl/LC_MESSAGES/nova.po b/cinder/locale/tl/LC_MESSAGES/nova.po new file mode 100644 index 000000000..206650836 --- /dev/null +++ b/cinder/locale/tl/LC_MESSAGES/nova.po @@ -0,0 +1,8200 @@ +# Tagalog translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2011-08-23 11:21+0000\n" +"Last-Translator: Thierry Carrez <thierry.carrez+lp@gmail.com>\n" +"Language-Team: Tagalog <tl@li.org>\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 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "Kailangan bang gumamit ng CA bawat proyekto?" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "Merong hindi-inaasahang pagkakamali habang tumatakbo ang command." + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "" + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "" + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "" + +#: cinder/exception.py:216 +#, fuzzy, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "walang paraan para sa mensahe: %s" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "" + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "" + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "" + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "" + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "" + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "" + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "" + +#: cinder/exception.py:334 +msgid "Failed to terminate instance" +msgstr "" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, python-format +msgid "Could not fetch image %(image)s" +msgstr "" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "" + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "" + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, python-format +msgid "QuotaError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "" + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:551 +msgid "Invalid CIDR" +msgstr "" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "" + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:725 +#, python-format +msgid "%s - This rule already exists in group" +msgstr "" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:959 +msgid "Detach Volume Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, python-format +msgid "Invalid mode: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +msgid "Security group is still in use" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:46 +msgid "Instance type for vpn instances" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +msgid "Cannot run any more instances of this type." +msgstr "" + +#: cinder/compute/api.py:259 +#, python-format +msgid "Can only run %s more instances of this type." +msgstr "" + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "" + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +msgid "Going to try to soft delete instance" +msgstr "" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +msgid "Going to try to terminate instance" +msgstr "" + +#: cinder/compute/api.py:977 +msgid "Going to try to stop instance" +msgstr "" + +#: cinder/compute/api.py:996 +msgid "Going to try to start instance" +msgstr "" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "" + +#: cinder/network/linux_net.py:1142 +#, python-format +msgid "Starting bridge %s " +msgstr "" + +#: cinder/network/linux_net.py:1149 +#, python-format +msgid "Done starting bridge %s" +msgstr "" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "natanggap %s" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "walang paraan para sa mensahe: %s" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "Walang paraan para sa mensahe: %s" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +msgid "Instance soft rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:696 +msgid "Failed to soft reboot instance." +msgstr "" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "" + +#: cinder/virt/libvirt/connection.py:978 +msgid "Guest does not have a console available" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, python-format +msgid "VBD %s already detached" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:392 +#, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:895 +msgid "Failed to fetch glance image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +msgid "Starting instance" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +msgid "Failed to spawn, rolling back" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +msgid "Starting VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +msgid "Finished snapshot and upload for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:677 +msgid "Starting snapshot for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:686 +#, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +msgid "Destroying VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +msgid "Injecting network info to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1495 +#, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +msgid "Volume status must be available or error" +msgstr "" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +msgid "Volume Snapshot status must be available or error" +msgstr "" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +#, fuzzy +msgid "Connected to DFM server" +msgstr "Muling kumonekta sa queue" + +#: cinder/volume/netapp.py:159 +#, python-format +msgid "Job failed: %s" +msgstr "" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, python-format +msgid "No LUN ID for volume %s" +msgstr "" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "" + +#: cinder/volume/netapp.py:614 +#, python-format +msgid "Failed to get host details for host ID %s" +msgstr "" + +#: cinder/volume/netapp.py:620 +#, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "" + +#: cinder/volume/netapp.py:625 +#, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, python-format +msgid "Got response: %s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:96 +#, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Zone %(zone_id)s could not be found." +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "" + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You can only" +#~ " run %s more instances of this " +#~ "type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to terminate %s" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "response %s" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "" + +#~ msgid "message %s" +#~ msgstr "" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "" + +#~ msgid "Publishing to route %s" +#~ msgstr "" + +#~ msgid "Declaring queue %s" +#~ msgstr "" + +#~ msgid "Declaring exchange %s" +#~ msgstr "" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "" + +#~ msgid "cool, it's a device" +#~ msgstr "" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "" + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Snapshotting VM %(vm_ref)s with label '%(label)s'..." +#~ msgstr "" + +#~ msgid "Created snapshot %(template_vm_ref)s from VM %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "Size for image %(image)s:%(virtual_size)d" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "" + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "" + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "" + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "" + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Finished snapshot and upload for VM %s" +#~ msgstr "" + +#~ msgid "Starting snapshot for VM %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Creating VIF for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "Volume status must be available" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/tr/LC_MESSAGES/nova.po b/cinder/locale/tr/LC_MESSAGES/nova.po new file mode 100644 index 000000000..e2212c4ce --- /dev/null +++ b/cinder/locale/tr/LC_MESSAGES/nova.po @@ -0,0 +1,8202 @@ +# Turkish translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2011-12-14 18:10+0000\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: Turkish <tr@li.org>\n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "" + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "" + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "" + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "" + +#: cinder/exception.py:216 +#, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "" + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "" + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "" + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "" + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "" + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "" + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "" + +#: cinder/exception.py:334 +msgid "Failed to terminate instance" +msgstr "" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, python-format +msgid "Could not fetch image %(image)s" +msgstr "" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "" + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "" + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, python-format +msgid "QuotaError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "" + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:551 +msgid "Invalid CIDR" +msgstr "" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "" + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:725 +#, python-format +msgid "%s - This rule already exists in group" +msgstr "" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:959 +msgid "Detach Volume Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, python-format +msgid "Invalid mode: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +msgid "Security group is still in use" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:46 +msgid "Instance type for vpn instances" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +msgid "Cannot run any more instances of this type." +msgstr "" + +#: cinder/compute/api.py:259 +#, python-format +msgid "Can only run %s more instances of this type." +msgstr "" + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "" + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +msgid "Going to try to soft delete instance" +msgstr "" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +msgid "Going to try to terminate instance" +msgstr "" + +#: cinder/compute/api.py:977 +msgid "Going to try to stop instance" +msgstr "" + +#: cinder/compute/api.py:996 +msgid "Going to try to start instance" +msgstr "" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "" + +#: cinder/network/linux_net.py:1142 +#, python-format +msgid "Starting bridge %s " +msgstr "" + +#: cinder/network/linux_net.py:1149 +#, python-format +msgid "Done starting bridge %s" +msgstr "" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +msgid "Instance soft rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:696 +msgid "Failed to soft reboot instance." +msgstr "" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "" + +#: cinder/virt/libvirt/connection.py:978 +msgid "Guest does not have a console available" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, python-format +msgid "VBD %s already detached" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:392 +#, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:895 +msgid "Failed to fetch glance image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +msgid "Starting instance" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +msgid "Failed to spawn, rolling back" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +msgid "Starting VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +msgid "Finished snapshot and upload for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:677 +msgid "Starting snapshot for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:686 +#, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +msgid "Destroying VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +msgid "Injecting network info to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1495 +#, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +msgid "Volume status must be available or error" +msgstr "" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +msgid "Volume Snapshot status must be available or error" +msgstr "" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +msgid "Connected to DFM server" +msgstr "" + +#: cinder/volume/netapp.py:159 +#, python-format +msgid "Job failed: %s" +msgstr "" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, python-format +msgid "No LUN ID for volume %s" +msgstr "" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "" + +#: cinder/volume/netapp.py:614 +#, python-format +msgid "Failed to get host details for host ID %s" +msgstr "" + +#: cinder/volume/netapp.py:620 +#, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "" + +#: cinder/volume/netapp.py:625 +#, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, python-format +msgid "Got response: %s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:96 +#, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Zone %(zone_id)s could not be found." +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "" + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You can only" +#~ " run %s more instances of this " +#~ "type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to terminate %s" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Reconnected to queue" +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "response %s" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "" + +#~ msgid "message %s" +#~ msgstr "" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "" + +#~ msgid "Publishing to route %s" +#~ msgstr "" + +#~ msgid "Declaring queue %s" +#~ msgstr "" + +#~ msgid "Declaring exchange %s" +#~ msgstr "" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "" + +#~ msgid "cool, it's a device" +#~ msgstr "" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "" + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Snapshotting VM %(vm_ref)s with label '%(label)s'..." +#~ msgstr "" + +#~ msgid "Created snapshot %(template_vm_ref)s from VM %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "Size for image %(image)s:%(virtual_size)d" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "" + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "" + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "" + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "" + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Finished snapshot and upload for VM %s" +#~ msgstr "" + +#~ msgid "Starting snapshot for VM %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Creating VIF for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "Volume status must be available" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/uk/LC_MESSAGES/nova.po b/cinder/locale/uk/LC_MESSAGES/nova.po new file mode 100644 index 000000000..1af157a1c --- /dev/null +++ b/cinder/locale/uk/LC_MESSAGES/nova.po @@ -0,0 +1,8199 @@ +# Ukrainian translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2011-08-23 11:21+0000\n" +"Last-Translator: Thierry Carrez <thierry.carrez+lp@gmail.com>\n" +"Language-Team: Ukrainian <uk@li.org>\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" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "Ðм'Ñ ÑÐ°Ð¹Ð»Ñ ÑекÑеÑного клÑÑа" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "ШлÑÑ Ð´Ð¾ збеÑÐµÐ¶ÐµÐ½Ð¸Ñ ÐºÐ»ÑÑÑв" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "ÐеоÑÑкÑвана помилка пÑи Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸." + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "" + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "" + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "" + +#: cinder/exception.py:216 +#, fuzzy, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "без поÑÑÐ´ÐºÑ Ð´Ð»Ñ Ð¿Ð¾Ð²ÑдомленÑ: %s" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "" + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "" + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "" + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "" + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "" + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "" + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "" + +#: cinder/exception.py:334 +msgid "Failed to terminate instance" +msgstr "" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, python-format +msgid "Could not fetch image %(image)s" +msgstr "" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "" + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "ÐанадÑо багаÑо Ð½ÐµÐ²Ð´Ð°Ð»Ð¸Ñ Ð°ÑÑенÑиÑÑкаÑÑй." + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, python-format +msgid "QuotaError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "" + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:551 +msgid "Invalid CIDR" +msgstr "" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "" + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:725 +#, fuzzy, python-format +msgid "%s - This rule already exists in group" +msgstr "Це пÑавило вже ÑÑнÑÑ Ð² гÑÑÐ¿Ñ %s" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "ÐилÑÑиÑи гÑÑÐ¿Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ %s" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "СÑвоÑиÑи ÑоздÑл на %s ÐÐ" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "ÐÑд'ÑднаÑи Ñом %s" + +#: cinder/api/ec2/cloud.py:959 +#, fuzzy, python-format +msgid "Detach Volume Failed." +msgstr "ÐÑд'ÑднаÑи Ñом %s" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "лиÑе гÑÑпа \"вÑÑ\" пÑдÑÑимÑÑÑÑÑÑ" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, python-format +msgid "Invalid mode: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +msgid "Security group is still in use" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "Це пÑавило вже ÑÑнÑÑ Ð² гÑÑÐ¿Ñ %s" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:46 +msgid "Instance type for vpn instances" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +msgid "Cannot run any more instances of this type." +msgstr "" + +#: cinder/compute/api.py:259 +#, python-format +msgid "Can only run %s more instances of this type." +msgstr "" + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "" + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +msgid "Going to try to soft delete instance" +msgstr "" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +msgid "Going to try to terminate instance" +msgstr "" + +#: cinder/compute/api.py:977 +msgid "Going to try to stop instance" +msgstr "" + +#: cinder/compute/api.py:996 +msgid "Going to try to start instance" +msgstr "" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "" + +#: cinder/network/linux_net.py:1142 +#, python-format +msgid "Starting bridge %s " +msgstr "" + +#: cinder/network/linux_net.py:1149 +#, python-format +msgid "Done starting bridge %s" +msgstr "" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "оÑÑимано %s" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "без поÑÑÐ´ÐºÑ Ð´Ð»Ñ Ð¿Ð¾Ð²ÑдомленÑ: %s" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "Ðез поÑÑÐ´ÐºÑ Ð´Ð»Ñ Ð¿Ð¾Ð²ÑдомленÑ: %s" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "MSG_ID %s" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +msgid "Instance soft rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:696 +msgid "Failed to soft reboot instance." +msgstr "" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "" + +#: cinder/virt/libvirt/connection.py:978 +msgid "Guest does not have a console available" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, python-format +msgid "VBD %s already detached" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:392 +#, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:895 +msgid "Failed to fetch glance image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +msgid "Starting instance" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +msgid "Failed to spawn, rolling back" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +msgid "Starting VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +msgid "Finished snapshot and upload for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:677 +msgid "Starting snapshot for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:686 +#, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +msgid "Destroying VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +msgid "Injecting network info to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1495 +#, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +msgid "Volume status must be available or error" +msgstr "" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +msgid "Volume Snapshot status must be available or error" +msgstr "" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +#, fuzzy +msgid "Connected to DFM server" +msgstr "Ðновлено з'ÑÐ´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ ÑеÑги" + +#: cinder/volume/netapp.py:159 +#, python-format +msgid "Job failed: %s" +msgstr "" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, python-format +msgid "No LUN ID for volume %s" +msgstr "" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "" + +#: cinder/volume/netapp.py:614 +#, python-format +msgid "Failed to get host details for host ID %s" +msgstr "" + +#: cinder/volume/netapp.py:620 +#, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "" + +#: cinder/volume/netapp.py:625 +#, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, fuzzy, python-format +msgid "Got response: %s" +msgstr "вÑдповÑÐ´Ñ %s" + +#: cinder/volume/nexenta/volume.py:96 +#, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Zone %(zone_id)s could not be found." +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "" + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You can only" +#~ " run %s more instances of this " +#~ "type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to terminate %s" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "заголовок %s" + +#~ msgid "message %s" +#~ msgstr "повÑÐ´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ %s" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "" + +#~ msgid "Publishing to route %s" +#~ msgstr "" + +#~ msgid "Declaring queue %s" +#~ msgstr "ÐголоÑÐµÐ½Ð½Ñ ÑеÑги %s" + +#~ msgid "Declaring exchange %s" +#~ msgstr "ÐголоÑÐµÐ½Ð½Ñ ÑоÑки обмÑÐ½Ñ %s" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "" + +#~ msgid "cool, it's a device" +#~ msgstr "" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "" + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Snapshotting VM %(vm_ref)s with label '%(label)s'..." +#~ msgstr "" + +#~ msgid "Created snapshot %(template_vm_ref)s from VM %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "Size for image %(image)s:%(virtual_size)d" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "" + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "" + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "" + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "" + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Finished snapshot and upload for VM %s" +#~ msgstr "" + +#~ msgid "Starting snapshot for VM %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Creating VIF for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "Volume status must be available" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/locale/zh_CN/LC_MESSAGES/nova.po b/cinder/locale/zh_CN/LC_MESSAGES/nova.po new file mode 100644 index 000000000..165b7b5e1 --- /dev/null +++ b/cinder/locale/zh_CN/LC_MESSAGES/nova.po @@ -0,0 +1,8064 @@ +# Chinese (Simplified) translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2012-04-03 23:36+0000\n" +"Last-Translator: cheesecake <Unknown>\n" +"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "æ ¹è¯ä¹¦çæä»¶å" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "ç§é¥æä»¶å" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "æ ¹è¯ä¹¦æ¤éå表çæä»¶å" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "ä¿åå¯é¥çä½ç½®" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "ä¿åæ ¹è¯ä¹¦çä½ç½®" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "æ¯å¦æ¯ä¸ªé¡¹ç®é½ä½¿ç¨è®¤è¯æå¨ï¼" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "ç¨æ·è¯ä¹¦çæ é¢ï¼%s 便¬¡åå«ä¸ºé¡¹ç®ï¼ç¨æ·ï¼æ¶é´æ³" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "项ç®è¯ä¹¦çæ é¢ï¼%s 便¬¡åå«ä¸ºé¡¹ç®ï¼æ¶é´æ³" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "æ è®°æå¨è·¯å¾ï¼%s" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "è¿è¡å½ä»¤æ¶åºç°æå¤é误" + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" +"%(description)s\n" +"å½ä»¤ï¼%(cmd)s\n" +"éåºä»£ç ï¼%(exit_code)s\n" +"æ åè¾åºï¼%(stdout)r\n" +"æ åé误è¾åºï¼%(stderr)r" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "æ°æ®åºå¼å¸¸è¢«å 裹ã" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "åçæªç¥å¼å¸¸ã" + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "è§£å¯ææ¬å¤±è´¥" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "æ æ³å¨éåæå¡ä¸ç¿»é¡µ" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "èææ¥å£å建失败" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "ç¨å¯ä¸macå°å5次å°è¯åå»ºèææ¥å£å¤±è´¥" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "è¿æ¥å°glance失败" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "è¿æ¥å°melange失败" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "æªææã" + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "ç¨æ·æ²¡æç®¡çåæé" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "æ¿çä¸å 许 %(action)s 被æ§è¡ã" + +#: cinder/exception.py:216 +#, fuzzy, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "没æä¸ºéå %(image_id)s æ¾å°å æ ¸ã" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "æ æ³æ¥åçåæ°ã" + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "æ æçå¿«ç §" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "å· %(volume_id)s 没æéå ä»»ä½ä¸è¥¿" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "å¯é¥å¯¹æ°æ®æ æ" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "ææ°æ®å 载为jsonæ ¼å¼å¤±è´¥" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "è¯·æ±æ æã" + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "æ æç¾å %(signature)s éå¯¹ç¨æ·æ¯ %(user)s" + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "æ¶å°æ æçè¾å ¥" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "æ æçå®ä¾ç±»å %(instance_type)sã" + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "æ æçå·ç±»å" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "æ æçå·" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "æ æç端å£èå´ %(from_port)s:%(to_port)s. %(msg)s" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "æ æçIPåè®® %(protocol)sã" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "æ æçå 容类å %(content_type)sã" + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "æ æçcidr %(cidr)sã" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "æ æçRPCè¿æ¥éç¨ã" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "%(err)s" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "æ æ³æ§è¡action '%(action)s' äºèå %(aggregate_id)s ä¸ãåå ï¼ %(reason)sã" + +#: cinder/exception.py:301 +#, fuzzy, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "æ¾ä¸å°ææä¸»æºï¼åå æ¯ %(reason)sã" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "å®ä¾ %(instance_uuid)s å¤äº%(attr)s %(state)s ä¸ã该å®ä¾å¨è¿ç§ç¶æä¸ä¸è½æ§è¡ %(method)sã" + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "å®ä¾ %(instance_id)s 没æè¿è¡ã" + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "å®ä¾ %(instance_id)s 没ææèµ·ã" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "å®ä¾ %(instance_id)s ä¸å¨ææ´æ¨¡å¼ã" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "æèµ·å®ä¾å¤±è´¥" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "æå¡å¨æ¢å¤å¤±è´¥" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "éæ°å¯å¨å®ä¾å¤±è´¥" + +#: cinder/exception.py:334 +#, fuzzy +msgid "Failed to terminate instance" +msgstr "éæ°å¯å¨å®ä¾å¤±è´¥" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "该æ¶å»æå¡æ æ³ä½¿ç¨ã" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "该æ¶å»å·æå¡æ æ³ä½¿ç¨ã" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "该æ¶å»è®¡ç®æå¡æ æ³ä½¿ç¨ã" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "æ æ³æå®ä¾ (%(instance_id)s) è¿ç§»å°å½åä¸»æº (%(host)s)ã" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "该æ¶å»ç®æ 计ç®ä¸»æºæ æ³ä½¿ç¨ã" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "该æ¶å»åå§è®¡ç®ä¸»æºæ æ³ä½¿ç¨ã" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "æä¾çèææºç®¡çç¨åºç±»åæ æã" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "该å®ä¾éè¦æ¯å½åçæ¬æ´æ°çèææºç®¡çç¨åºã" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "æä¾çç£çè·¯å¾ (%(path)s) å·²ç»åå¨ï¼é¢è®¡æ¯ä¸åå¨çã" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "æä¾ç设å¤è·¯å¾ (%(path)s) æ¯æ æçã" + +#: cinder/exception.py:381 +#, fuzzy, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "æä¾ç设å¤è·¯å¾ (%(path)s) æ¯æ æçã" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "æ æ³æ¥åçCPUä¿¡æ¯" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "%(address)s 䏿¯ææçIP v4/6å°åã" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "VLANæ ç¾å¯¹äºç«¯å£ç»%(bridge)s æ¯ä¸éåçãé¢è®¡çVLANæ ç¾æ¯ %(tag)sï¼ä½ä¸ç«¯å£ç»å ³èçæ¯ %(pgroup)sã" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" +"å å«ç«¯å£ç» %(bridge)s çvSwitch没æä¸é¢è®¡çç©çéé å¨å ³èãé¢è®¡çvSwitchæ¯ %(expected)sï¼ä½å ³èçæ¯ " +"%(actual)sã" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "ç£çæ ¼å¼ %(disk_format)s ä¸è½æ¥å" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "éå %(image_id)s æ æ³æ¥åï¼åå æ¯ï¼ %(reason)s" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "å®ä¾ %(instance_id)s æ æ³æ¥åï¼åå æ¯ï¼ %(reason)s" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "Ec2 id %(ec2_id)s æ æ³æ¥åã" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "èµæºæ²¡ææ¾å°ã" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "è¦æ±çæ è®° %(flag)s 没æè®¾ç½®ã" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "å· %(volume_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:435 +#, fuzzy, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "æ æ³æ¾å°å¸æ· %(account_name) on Solidfire 设å¤" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "没æä¸ºå®ä¾ %(instance_id)s æ¾å°å·ã" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "å· %(volume_id)s 没æå«é® %(metadata_key)s çå æ°æ®ã" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "æ²¡ææ¾å°å·ç±»åã" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "å·ç±»å %(volume_type_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "å为 %(volume_type_name)s çå·ç±»åæ²¡ææ¾å°ã" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "å·ç±»å %(volume_type_id)s 没æé¢å¤è¯´æé® %(extra_specs_key)s ã" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "å¿«ç § %(snapshot_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "æ£å¨å é¤æå¿«ç §çå· %(volume_name)s" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "没æä¸ºå· %(volume_id)s æ¾å°ç®æ idã" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "å¨ %(location)s 没æç£ç" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "æ æ³ä¸º %(driver_type)s å·æ¾å°å¥æã" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "æ æçéåhref %(image_href)sã" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "æäºéåéè¿hrefsåå¨ã该apiçæ¬ä¸æ¯ææ¾ç¤ºéåhrefsã" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "éå %(image_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "没æä¸ºéå %(image_id)s æ¾å°å æ ¸ã" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "ç¨æ· %(user_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "é¡¹ç® %(project_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "ç¨æ· %(user_id)s 䏿¯é¡¹ç® %(project_id)s çæåã" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "è§è² %(role_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "æ²¡ææ¾å°åå¨åºæ¥è¯»åVDIã" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "å建ç½ç» %(req)s æ¯å¿ è¦çã" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "ç½ç» %(network_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "æ æ³ä¸ºæ¡¥ %(bridge)s æ¾å°ç½ç»" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "æ æ³ä¸ºuuid %(uuid)s æ¾å°ç½ç»" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "æ æ³ä¸ºcidr %(cidr)s æ¾å°ç½ç»ã" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "æ æ³ä¸ºå®ä¾ %(instance_id)s æ¾å°ç½ç»ã" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "没æç½ç»å®ä¹ã" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "æè ç½ç»uuid %(network_uuid)sä¸åå¨ï¼æè 宿²¡æåé ç»é¡¹ç® %(project_id)sã" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "ä¸»æºæ²¡æè®¾ç½®äºç½ç» (%(network_id)s)ã" + +#: cinder/exception.py:566 +#, fuzzy, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "ç½ç» %s å卿´»è·ç端å£ï¼æ æ³å é¤" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "æ æ³æ¾å°èææºä½¿ç¨çæ°æ®åå¨å¼ç¨ã" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "没æåºå®IPä¸id %(id)s å ³èã" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "没æä¸ºå°å %(address)s æ¾å°åºå®IPã" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "å®ä¾ %(instance_id)s 没æåºå®ipã" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "ç½ç»ä¸»æº %(host)s å¨ç½ç» %(network_id)s 䏿²¡æåºå®ipã" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "å®ä¾ %(instance_id)s 没æåºå®ip '%(ip)s'ã" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "ä¸»æº %(host)s 没æåºå®IPã" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "åºå®IPå°å (%(address)s) å¨ç½ç» (%(network_uuid)s) ä¸ä¸åå¨ã" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "åºå®IPå°å %(address)s å·²å¨ä½¿ç¨ã" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "åºå®IPå°å %(address)s æ æã" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "没æåºå®ipå¯ç¨ã" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "æ¾ä¸å°åºå®IPã" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "æ¾ä¸å°éåid %(id)s çæµ®å¨IPã" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "DNS å ¥å£ %(name)s å·²ç»å¨åä¸ %(domain)s åå¨ã" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "æ¾ä¸å°éåå°å %(address)s çæµ®å¨ipã" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "没æä¸ºä¸»æº %(host)s æ¾å°æµ®å¨IPã" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "æ²¡ææµ®å¨IPå¯ç¨ã" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "æµ®å¨ip %(address)s å·²è¢«å ³èã" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "æµ®å¨ip %(address)s 没æè¢«å ³èã" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "æ²¡ææµ®å¨ipåå¨ã" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "æ¥å£ %(interface)sæ²¡ææ¾å°ã" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "å¯é¥å¯¹ %(name)s 没æä¸ºç¨æ· %(user_id)s æ¾å°ã" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "è¯ä¹¦ %(certificate_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "æå¡ %(service_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "ä¸»æº %(host)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "计ç®ä¸»æº %(host)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "æ²¡ææ¾å°äºè¿å¶ %(binary)s å¨ä¸»æº %(host)s ä¸ã" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "认è¯ä»¤ç %(token)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "访é®å¯é¥ %(access_key)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "é 颿²¡ææ¾å°ã" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "没æä¸ºé¡¹ç® %(project_id)s æ¾å°é é¢ã" + +#: cinder/exception.py:696 +#, fuzzy, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "æ¾ä¸å°ç±» %(class_name)s ï¼å¼å¸¸ %(exception)s" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "å®å ¨ç» %(security_group_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "æ²¡ææ¾å°å®å ¨ç» %(security_group_id)s éå¯¹é¡¹ç® %(project_id)s ã" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "带æè§å %(rule_id)s çå®å ¨ç»æ²¡ææ¾å°ã" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "å®å ¨ç» %(security_group_id)s å·²ç»ä¸å®ä¾ %(instance_id)s å ³èã" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "å®å ¨ç» %(security_group_id)s 没æä¸å®ä¾ %(instance_id)s å ³èã" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "è¿ç§» %(migration_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "没æä¸ºå®ä¾ %(instance_id)s æ¾å°è¿ç§»å ¶ç¶æä¸º %(status)s ã" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "æ§å¶å°æ± %(pool_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "æ²¡ææ¾å°ç±»åæ¯ %(console_type)s çæ§å¶å°æ± é对计ç®ä¸»æº %(compute_host)s å¨ä»£çä¸»æº %(host)s ä¸ã" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "æ§å¶å°%(console_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "没æä¸ºå®ä¾ %(instance_id)s æ¾å°æ§å¶å°ã" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "没æä¸ºå®ä¾ %(instance_id)s 卿± %(pool_id)s 䏿¾å°æ§å¶å°ã" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "æ æçæ§å¶å°ç±»å %(console_type)s " + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "æ²¡ææ¾å°å®ä¾ç±»åã" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "å®ä¾ç±»å %(instance_type_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "å为 %(instance_type_name)s çå®ä¾ç±»åæ²¡ææ¾å°ã" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "ç±»å %(flavor_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:776 +#, fuzzy, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "åºå %(zone_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "è°åº¦å¨ä¸»æºè¿æ»¤å¨ %(filter_name)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "è°åº¦å¨çææ¬å½æ° %(cost_fn_str)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "æªæ¾å°è°åº¦å¨çæéæ è®°ï¼%(flag_name)s" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "å®ä¾ %(instance_id)s 没æé®ä¸º %(metadata_key)s çå æ°æ®ã" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "å®ä¾ç±»å %(instance_type_id)s 没æé¢å¤ç é®ä¸º%(extra_specs_key)s çè§æ ¼è¯´æã" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "æªå®ä¹LDAP对象" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "æ²¡ææ¾å°LDAPç¨æ· %(user_id)sã" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "æ²¡ææ¾å°LDAPç¨æ·ç» %(group_id)sã" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "LDAPç¨æ· %(user_id)s 䏿¯ %(group_id)s çç»æåã" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "æ¾ä¸å°æä»¶ %(file_path)sã" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "没æ¾å°æä»¶" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "æªæ¾å°ä¸ç½ç»éé å¨ %(adapter)s å ³èçèæäº¤æ¢æºã" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "æªæ¾å°ç½ç»éé å¨ %(adapter)sã" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "æ¾ä¸å°ç±» %(class_name)s ï¼å¼å¸¸ %(exception)s" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "æä½ä¸å 许ã" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "æ æ³ä½¿ç¨å ¨å±è§è² %(role_id)s" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "å¿«ç §ä¸å 许循ç¯ã" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "å¤ä»½ image_type è¦æ±å¾ªç¯åæ°ã" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "å¯é¥å¯¹ %(key_name)s å·²ç»åå¨ã" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "ç¨æ· %(user)s å·²åå¨ã" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "LDAPç¨æ· %(user)s å·²ç»åå¨ã" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "LDAPç¨æ·ç» %(group)s å·²ç»åå¨ã" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "ç¨æ· %(uid)s å·²ç»æ¯ ç» %(group_dn)s ä¸çæå" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "é¡¹ç® %(project)s å·²ç»åå¨ã" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "å®ä¾ %(name)s å·²ç»åå¨ã" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "å®ä¾ç±»å %(name)s å·²ç»åå¨ã" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "å·ç±»å %(name)s å·²ç»åå¨ã" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "%(path)s å¨å ±äº«åå¨ä¸ï¼%(reason)s" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "è¿ç§»é误" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "éè¯¯æ ¼å¼çæ¶æ¯ä½ï¼ %(reason)s" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "å¨ %(path)s æ¾ä¸å°é ç½®æä»¶ã" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "æ æ³ä»è·¯å¾ %(path)s ä¸å è½½åºç¨ '%(name)s'" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "è°æ´æ¶å®ä¾ç大å°å¿ é¡»è¦åçååã" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "é忝å®ä¾ç±»åæå 许ç大ã" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "1个æå¤ä¸ªåºåæ æ³å®æè¯·æ±ã" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "å®ä¾ç±»åçå åå¯¹äºæè¯·æ±çéå太å°ã" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "å®ä¾ç±»åçç£çå¯¹äºæè¯·æ±çéå太å°ã" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "没æè¶³å¤çå¯ç¨å 忥å¯å¨è®¡ç®èç¹ %(uuid)sã" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "æ æ³è·åæ¤ä¸»æºç带宽ãCPUåç£çææ ã" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "æ¾ä¸å°ææä¸»æºï¼åå æ¯ %(reason)sã" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "ä¸»æº %(host)s 没æå¯å¨æè ä¸åå¨ã" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "è¶ åºé é¢" + +#: cinder/exception.py:958 +#, fuzzy, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "èå %(aggregate_id)s没æä¸»æº %(host)sã" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "æ¾ä¸å°èå %(aggregate_id)sã" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "èå %(aggregate_name)s å·²ç»åå¨ã" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "èå %(aggregate_id)s没æä¸»æº %(host)sã" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "èå %(aggregate_id)s 没æé®ä¸º %(metadata_key)s çå æ°æ®ã" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "ä¸»æº %(host)s å·²ç»æ¯å¦å¤ä¸ä¸ªèåçæåã" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "èå %(aggregate_id)så·²ç»æä¸»æº %(host)sã" + +#: cinder/exception.py:988 +#, fuzzy, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "æ£æµå°ä¸æ¢ä¸ä¸ªå称为 %(vol_name) çå·ã" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "æ æ³å建å称为 %(name)s è§æ ¼ä¸º %(extra_specs)s çå·ç±»åã" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "æ æ³å建å®ä¾ç±»åã" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "æ¥èªSolidFire APIçé误ååº" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "SolidFire APIååºéåçé误ï¼status=%(status)s" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "SolidFire APIååºéåçé误ï¼data=%(data)s" + +#: cinder/exception.py:1013 +#, fuzzy, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "æ£æµå°å·²åå¨çid为%(vlan) vlan" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "å®ä¾ %(instance_id)s æ²¡ææ¾å°ã" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, fuzzy, python-format +msgid "Could not fetch image %(image)s" +msgstr "è·åéå %(image)s" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "syslog设å¤å¿ é¡»ä½ä¸ºä¸ä¸ª %s ã" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "è·³è¿ %(full_task_name)sï¼å°ä¸æ¬¡è¿è¡è¿å©ä¸%(ticks_to_skip)s è·³ã" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "æ£å¨è¿è¡å¨ææ§ä»»å¡ %(full_task_name)s" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "å¨ %(full_task_name)s æé´åççé误ï¼%(e)s" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "åè°åº¦å¨éæ¥è½åã" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "JSONæä»¶è¡¨ç¤ºçç¥ã" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "请æ±çè§åæ¾ä¸å°æ¶çæ£æ¥ç¼ºçè§åã" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "å¯å¨ %(topic)s èç¹ (çæ¬ %(vcs_string)s)" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "为æå¡ %s å建æ¶è´¹è " + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "å æ æ°æ®åºè®°å½ï¼æå¡å·²è¢«ä¸æ¢" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "æå¡æ°æ®åºå¯¹è±¡æ¶å¤±ï¼æ£å¨éæ°å建ã" + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "䏿¨¡åæå¡å¨(model server)çè¿æ¥å·²æ¢å¤ï¼" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "失å»ä¸æ¨¡åæå¡å¨çè¿æ¥" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "æ è®°å ¨éï¼" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "%(flag)sï¼æ è®°éå " + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "å å±å¼å¸¸ï¼%s" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "æ£å¨æå %s" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "åç°æªç¥ç utils.execute å ³é®ååæ°ï¼%r" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "æ£å¨è¿è¡cmd (subprocess)ï¼%s" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "è¿è¡ç»æä¸º %s" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "%r 失败ï¼éè¯ã" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "è¿è¡cmd (SSH)ï¼%s" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "SSHä¸ä¸æ¯æç¯å¢åé" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "SSHä¸ä¸æ¯æçè¿ç¨è¾å ¥åæ°ã" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "åè°ä¸debugï¼%s" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "æ¬å°IPå°åæ²¡ææ¾å°ï¼%s" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "æ æ³è¿æ¥å° %(interface)s çæ¬å°IPï¼%(ex)s" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "æ æçåå°ï¼%s" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "åå° %s" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "循ç¯è°ç¨ä¸ã" + +#: cinder/utils.py:927 +#, fuzzy, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "æ£å¨è¯å¾è·åä¿¡å·é \"%(lock)s\" ä¸ºæ¹æ³ \"%(method)s\"...é" + +#: cinder/utils.py:931 +#, fuzzy, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "è·å¾ä¿¡å·é \"%(lock)s\" ä¸ºæ¹æ³ \"%(method)s\" ...é" + +#: cinder/utils.py:935 +#, fuzzy, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "æ£å¨ è¯å¾è·åé \"%(lock)s\" ä¸ºæ¹æ³ \"%(method)s\"...é" + +#: cinder/utils.py:942 +#, fuzzy, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "è·å¾æä»¶é \"%(lock)s\" ä¸ºæ¹æ³ \"%(method)s\"...é" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "ææç对象类åï¼%s" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "䏿£ç¡®çserver_stringï¼%s" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "timefuncï¼'%(name)s' ç¨äº%(total_time).2f ç§" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "æ£å¨ä¸¢å¼åæ¥çå¼å¸¸ã" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "ç±» %(fullname)s æ¯ä¸æ¨èçï¼%(msg)s" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "ç±» %(fullname)s æ¯ä¸æ¨èç" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "彿° %(name)s å¨%(location)s éçæ¯ä¸æ¨èçï¼%(msg)s" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "彿° %(name)s å¨%(location)s éçæ¯ä¸æ¨èç" + +#: cinder/utils.py:1681 +#, fuzzy, python-format +msgid "Could not remove tmpdir: %s" +msgstr "ç§»é¤å®¹å¨å¤±è´¥ï¼%s" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "å¯å¨%(name)s ä½ç½®å¨ %(host)s:%(port)s" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "å ³éWSGIæå¡å¨" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "æ£å¨åæ¢è£¸TCPæå¡å¨ã" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "æ£å¨å¯å¨TCPæå¡å¨ %(arg0)s ä½ç½®å¨%(host)s:%(port)s" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "WSGIæå¡å¨å·²ç»åæ¢ã" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "ä½ å¿ é¡»æ§è¡ __call__" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "ä¸å¯ç¨" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "è¿åçnon-serializeableç±»åï¼%s" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "%(code)s: %(message)s" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "FaultWrapper: %s" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "认è¯å¤±è´¥è¿å¤" + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "访é®å¯é¥ %(access_key)s æé误 %(failures)dï¼è®¤è¯å¤±è´¥å°è¢«éå® %(lock_mins)d åéã" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "ç¾å没ææä¾" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "访é®å¯é¥æ²¡ææä¾" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "ä¸keystone交æµå¤±è´¥" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "认è¯å¤±è´¥ï¼%s" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "为%(uname)s:%(pname)s éªè¯éè¿ç请æ±" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "æ§è¡: %s" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "arg: %(key)s\t\tval: %(value)s" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "为controller=%(controller)s 以å action=%(action)sæªéªè¯ç请æ±" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "å¼èµ·å¼å¸¸ InstanceNotFound: %s" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "å¼èµ·å¼å¸¸ VolumeNotFound: %s" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "å¼èµ·å¼å¸¸ SnapshotNotFound: %s" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "å¼èµ·å¼å¸¸ NotFound: %s" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "å¼èµ·å¼å¸¸ EC2APIError: %s" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "å¼èµ·å¼å¸¸ KeyPairExists: %s" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "å¼èµ·å¼å¸¸ InvalidParameterValue: %s" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "å¼èµ·å¼å¸¸ InvalidPortRange: %s" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "å¼èµ·å¼å¸¸ NotAuthorized: %s" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "å¼èµ·å¼å¸¸ InvalidRequest: %s" + +#: cinder/api/ec2/__init__.py:633 +#, fuzzy, python-format +msgid "QuotaError raised: %s" +msgstr "å¼èµ·æå¤çé误ï¼%s" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "å¼èµ·æå¤çé误ï¼%s" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "Environment: %s" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "åçäºä¸ä¸ªæªç¥çé误. 请éè¯ä½ ç请æ±." + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "䏿¯æçAPI请æ±ï¼controller = %(controller)sï¼action = %(action)s" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "åå»ºå· %s çå¿«ç §" + +#: cinder/api/ec2/cloud.py:372 +#, fuzzy, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "åæ°GroupNameçå¼ (%s) æ æãå å®¹ä» éäºå«æåæ¯æ°åçå符ï¼ç©ºæ ¼ï¼ç ´æå·åä¸å线ã" + +#: cinder/api/ec2/cloud.py:378 +#, fuzzy, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "åæ°GroupNameçå¼ (%s) æ æãé¿åº¦è¶ è¿äºä¸é255ã" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "å建å¯é¥å¯¹ %s" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "å¯¼å ¥å¯é¥ %s" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "å é¤å¯é¥å¯¹ %s" + +#: cinder/api/ec2/cloud.py:551 +#, fuzzy +msgid "Invalid CIDR" +msgstr "æ æç" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "æ¤é %s å®å ¨ç»å ¥å£æé" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, fuzzy, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "åæ°ä¸å¤å建ææè§åã" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "对ç»å®çåæ°æ ç¹å®è§åã" + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "ææ %s å®å ¨ç»å ¥å£æé" + +#: cinder/api/ec2/cloud.py:725 +#, fuzzy, python-format +msgid "%s - This rule already exists in group" +msgstr "è¿æ¡è§åå·²ç»åå¨äºç»%s ä¸" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "åæ°GroupNameçå¼ (%s) æ æãå å®¹ä» éäºå«æåæ¯æ°åçå符ï¼ç©ºæ ¼ï¼ç ´æå·åä¸å线ã" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "åæ°GroupNameçå¼ (%s) æ æãé¿åº¦è¶ è¿äºä¸é255ã" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "å建å®å ¨ç» %s" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "å®å ¨ç» %s å·²ç»åå¨" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "å é¤å®å ¨ç» %s" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "è·åå®ä¾ %s æ§å¶å°è¾åº" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "ä»å¿«ç § %s å建å·" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "å建 %s GBçå·" + +#: cinder/api/ec2/cloud.py:921 +#, fuzzy +msgid "Delete Failed" +msgstr "å建失败" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "æå· %(volume_id)s éå å°å®ä¾ %(instance_id)s ä¸ä½ç½®å¨ %(device)s" + +#: cinder/api/ec2/cloud.py:939 +#, fuzzy +msgid "Attach Failed." +msgstr "å建失败" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "åç¦»å· %s" + +#: cinder/api/ec2/cloud.py:959 +#, fuzzy, python-format +msgid "Detach Volume Failed." +msgstr "åç¦»å· %s" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "屿§ä¸æ¯æ: %s" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "vol = %s\n" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "åé å°å" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "éæ¾å°å %s" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "æå°å %(public_ip)s å ³èå°å®ä¾ %(instance_id)s" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "åæ¶å°å %s çå ³è" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "éåå¿ é¡»å¯ç¨ã" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "åå¤å¼å§ç»æ¢å®ä¾" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "éå¯å®ä¾ %r" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "åå¤åæ¢å®ä¾" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "åå¤å¯å¨å®ä¾" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "è§£é¤éå %s çæ³¨å" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "ç¨id %(image_id)s 注åéå %(image_location)s" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "ç¨æ·æè ç»æ²¡æç¡®å®" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "ä» ä» æ¯æç»\"all\"" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "operation_typeå¿ é¡»æ·»å æè ç§»é¤" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "æ£å¨æ´æ°éå %s ç publicity 屿§" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "æ æ³å¨ %d ç§å 忢å®ä¾" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "为ipï¼ %sè·åå æ°æ®å¤±è´¥" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "æå°é误ï¼%s" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "%(url)s éHTTP %(status)dè¿å" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "å¿ é¡»æç¡®ä¸ä¸ªExtensionManagerç±»" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "æ©å±èµæºï¼%s" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "æ©å±%(ext_name)sï¼æ æ³æ©å±èµæº %(collection)sï¼æ²¡æé£ç§èµæº" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "æ©å±èµæºçæ©å± %(ext_name)sï¼%(collection)s" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "%(user_id)s éè¿ä»¤ç '%(token)s' æ¯æ¾ä¸å°ç" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "%(user_id)s å¿ é¡»æ¯ %(project_id)s ç管çåæè æå" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "认è¯è¯·æ±å¿ é¡»é对rootçæ¬(ä¾å¦ /v2)ã" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "请æ±ä¸æ¾ä¸å° %s" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "æåéªè¯ '%s'" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "没æä¸ºæä¾çAPIå¯é¥æ¾å°ç¨æ·ã" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "æä¾çAPIå¯é¥ææï¼ä½å¹¶ä¸æ¯ç»ç¨æ· '%(username)s' çã" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "limit åæ°å¿ é¡»æ¯æ´æ°" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "limitåæ°å¿ é¡»æ¯æ£æ°" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "offset åæ°å¿ é¡»æ¯æ´æ°" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "offset åæ°å¿ é¡»æ¯æ£æ°" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "æ²¡ææ¾å°æ è®° [%s]" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "href %s ä¸å å«çæ¬" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "è¶ è¿éåå æ°æ®éå¶" + +#: cinder/api/openstack/common.py:295 +#, fuzzy, python-format +msgid "Converting nw_info: %s" +msgstr "å®ä¾çnetwork_infoï¼|%s|" + +#: cinder/api/openstack/common.py:305 +#, fuzzy, python-format +msgid "Converted networks: %s" +msgstr "æå¤é误ï¼%s" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "'%(action)s' é对å¤äº %(attr)s %(state)s çå®ä¾æ¯æ æ³è¿è¡" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "å®ä¾é对 '%(action)s' å¤äºæ æç¶æ" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "æç»å¿«ç §è¯·æ±ï¼å¿«ç §å½åæªè¢«æ¿æ´»" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "该æ¶å»å®ä¾å¿«ç §æ¯ä¸å 许çã" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "å è½½çæ©å±ï¼%s" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "Ext name: %s" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "Ext alias: %s" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "Ext æè¿°: %s" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "Ext å½å空é´: %s" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "Ext updated: %s" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "å è½½æ©å±åçå¼å¸¸ï¼%s" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "æ£å¨å è½½æ©å± %s" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "è°ç¨æ©å±å·¥å %s" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "å è½½æ©å± %(ext_factory)s 失败ï¼%(exc)s" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "å è½½æ©å± %(classpath)s 失败ï¼%(exc)s" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "å è½½æ©å± %(ext_name)s 失败ï¼%(exc)s" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "æ æ³çè§£JSON" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "æ æ³çè§£XML" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "è¿å¤ä¸»ä½å¯é¥" + +#: cinder/api/openstack/wsgi.py:582 +#, fuzzy, python-format +msgid "Exception handling resource: %s" +msgstr "æ©å±èµæºï¼%s" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "é误æåº: %s" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "HTTP å¼å¸¸æåºï¼%s" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "请æ±ä¸æä¾äºæ æ³è¯å«ç Content-Type" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "请æ±ä¸æ²¡ææä¾ Content-Type" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "请æ±ä¸æ²¡ææä¾ä¸»ä½" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "没æè¯¥å¨ä½ï¼%s" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "éè¯¯æ ¼å¼ç请æ±ä¸»ä½" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "䏿¯æçContent-Type" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "éè¯¯æ ¼å¼ç请æ±url" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "%(url)sè¿åé误ï¼%(e)s" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "å ç´ ä¸æ¯åèç¹" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "æ ¹å ç´ éæ©å表" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "æ¨¡æ¿æ°ä¸å¹é ï¼æslave %(slavetag)s æ·»å å°master %(mastertag)s" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "subclasseså¿ é¡»æ§è¡construct()!" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "æ£å¨åå§åæ©å±ç®¡çåã" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "éåæ²¡ææ¾å°ã" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "䏿£ç¡®ç请æ±ä¸»ä½æ ¼å¼" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "请æ±ä¸»ä½åURIä¸å¹é " + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "请æ±ä¸»ä½å å«å¤ªå¤items" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "æ æçå æ°æ®é®" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "å®ä¾ä¸åå¨" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "å®ä¾å¹¶ä¸æ¯æå®ç½ç»çæå" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "åªè½æ %(value)s 个 %(verb)s 请æ±åéç» %(uri)s é宿¯æ¯ä¸ä¸ª %(unit_string)sã" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "è¿ä¸ªè¯·æ±åå°é¢çéå¶ã" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "æå¡å¨ä¸åå¨" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "å æ°æ®é¡¹ç®æªæ¾å°" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "æ æçæå¡å¨ç¶æï¼%(status)s" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "æ æçchanges-sinceå¼" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "è¶ è¿ä¸ªæ§åæä»¶éå¶" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "个æ§åæä»¶è·¯å¾å¤ªé¿" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "个æ§åæä»¶å 容太é¿" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "æå¡å¨åç§°ä¸æ¯å符串æè unicode" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "æå¡å¨åç§°æ¯ç©ºä¸²" + +#: cinder/api/openstack/compute/servers.py:509 +#, fuzzy +msgid "Server name must be less than 256 characters." +msgstr "å¯é¥å¯¹åç§°é¿åº¦å¿ é¡»å¨1å°255个å符ä¹é´" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "é误ç个æ§åæ ¼å¼ï¼ä¸¢å¤± %s" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "æåç个æ§åæ ¼å¼" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "个æ§å %s çå å®¹æ æ³è§£ç " + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "æåçç½ç»æ ¼å¼ï¼ç½ç» uuid æ ¼å¼ä¸æ£ç¡® (%s)" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "䏿£ç¡®çåºå® IP å°å(%s)" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "ä¸å 许éå¤çç½ç»(%s)" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "é误çç½ç»æ ¼å¼ï¼ä¸¢å¤±%s" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "é误çç½ç»æ ¼å¼" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "Userdata å å®¹æ æ³è§£ç " + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "accessIPv4 䏿¯æ£ç¡®çIPv4æ ¼å¼" + +#: cinder/api/openstack/compute/servers.py:601 +#, fuzzy +msgid "accessIPv6 is not proper IPv6 format" +msgstr "accessIPv4 䏿¯æ£ç¡®çIPv4æ ¼å¼" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "æå¡å¨åç§°æªå®ä¹" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "æä¾äºæ æçflavorRefã" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "æ æ³æ¾å°è¯·æ±çéå" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "æä¾äºæ æçkey_nameã" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "å®ä¾è¿æ²¡æè°æ´å¤§å°ã" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "confirm-resizeä¸çé误 %s" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "revert-resizeä¸çé误 %s" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "éå¯çåæ°'type'æ¢ä¸æ¯HARDä¹ä¸æ¯SOFT" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "缺å°éå¯çåæ°'type'" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "éå¯ä¸é误 %s" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "æ æ³æ¾å°è¯·æ±çç±»åã" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "è°æ´å¤§å°éè¦å°ºå¯¸çæ¹åã" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "éè¯¯æ ¼å¼çæå¡å¨å®ä½" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "缺å°å±æ§imageRef" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "æä¾äºæ æçimageRefã" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "缺å°å±æ§flavorRef" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "没æç¡®å®adminPass" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "æ æçadminPass" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "æ æ³è§£æå æ°æ®é®/å¼å¯¹" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "è°æ´å¤§å°è¯·æ±ä¸ç屿§'flavorRef'æ æã" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "è°æ´å¤§å°è¯·æ±è¦æ±æå±æ§'flavorRef'ã" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "æ æç请æ±ä¸»ä½" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "æ æ³è§£æè¯·æ±ä¸çimageRefã" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "æ æ³æ¾å°å®ä¾" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "æ æ³æ¾å°ç¨æ¥éæ°å建çéå" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "å®ä½createImageéè¦å±æ§name" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "æ æçå æ°æ®" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "æ£å¨ä»æ¥è¯¢è¯å¥ä¸ç§»é¤é项 '%(unk_opt_str)s'" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "Compute.api::æå %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "Compute.api::åæ¶æå %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "compute.api::æèµ· %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "compute.api::resume %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "è¿ç§»é误 %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "Compute.api::reset_network %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "æ²¡ææ¾å°æå¡å¨" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "Compute.api::inject_network_info %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "compute.api::å é %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "compute.api::è§£é %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "å®ä½createBackupéè¦æå±æ§ %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "éè¯¯æ ¼å¼çå®ä½createBackup" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "createBackupç屿§ 'rotation'å¿ é¡»æ¯æ´æ°" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "æ²¡ææ¾å°å®ä¾" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "hostä¸block_migrationå¿ é¡»ç¡®å®" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "å®ä¾ %(id)s å°ä¸»æº %(host)s ç卿è¿ç§»å¤±è´¥" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, fuzzy, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "æ æ³å建å称为 %(name)s è§æ ¼ä¸º %(extra_specs)s çå·ç±»åã" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, fuzzy, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "æ´æ°ä»£ç失败ï¼%(resp)r" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "èåæ²¡æå¨ä½ %s" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "åªææ ¹è¯ä¹¦è½è¢«è·åã" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "æ æ³ä¸ºVPNå®ä¾ç³è¯·IPï¼ç¡®ä¿å®ä¾æ²¡æè¿è¡ï¼è¿ä¸ä¼å¿åè¯ã" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "缺å°ç±»åè§è" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "æ æçç±»åè§è" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "%s å¿ é¡»æ¯'MANUAL' æè 'AUTO'ã" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "æ²¡ææ¾å°æå¡å¨ã" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +#, fuzzy +msgid "Flavor not found." +msgstr "æ²¡ææ¾å°æå¡å¨ã" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "没æè¯·æ±ä¸»ä½" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "æ± %s ä¸å·²ç»æ²¡ææµ®å¨ipã" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "æ²¡ææ´å¤çæµ®å¨ipã" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "缺å°åæ° dict" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "å°å没ææå®" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "没æåºå®ipä¸å®ä¾å ³è" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "å ³èæµ®å¨ip失败" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "æ æçç¶æï¼'%s'" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, fuzzy, python-format +msgid "Invalid mode: '%s'" +msgstr "æ æçç¶æï¼'%s'" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "æ æçæ´æ°è®¾ç½®ï¼'%s'" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, fuzzy, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "æä¸»æº %(host)s 设置为 %(state)sã" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "æä¸»æº %(host)s 设置为 %(state)sã" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "Describe-resourceæ¯åªæç®¡çåæè½æ§è¡çåè½ã" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "æ²¡ææ¾å°ä¸»æº" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "å¯é¥å¯¹åç§°é¿åº¦å¿ é¡»å¨1å°255个å符ä¹é´" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "å¯é¥å¯¹ '%s' å·²ç»åå¨ã" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "addFixedIp缺å°åæ°'networkId'" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "removeFixedIp缺å°åæ°'address'" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "æ æ³æ¾å°å°å %r" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "ç½ç»ä¸å å«å¨ä½ %s" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "为idæ¯ %s çç½ç»è§£é¤å ³è" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "æ²¡ææ¾å°ç½ç»" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "æ¾ç¤ºidæ¯ %s çç½ç»" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "æ£å¨å é¤idæ¯ %s çç½ç»" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "éè¯¯æ ¼å¼ç scheduler_hints 屿§" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "å®å ¨ç»idåºè¯¥æ¯æ´æ°" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +#, fuzzy +msgid "Security group is still in use" +msgstr "å®å ¨ç»idåºè¯¥æ¯æ´æ°" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "å®å ¨ç» %s å·²ç»åå¨" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "å®å ¨ç» %s æ¢ä¸æ¯å符串ä¹ä¸æ¯unicode" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "å®å ¨ç» %s ä¸è½ä¸ºç©ºã" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "å®å ¨ç» %s ä¸è½æ¯255个å符æ´é¿ã" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "ç¶ç»id䏿¯æ´æ°" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "æ²¡ææ¾å°å®å ¨ç» (%s)" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "åæ°ä¸å¤å建ææè§åã" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "è¿æ¡è§åå·²ç»åå¨äºç»%s ä¸" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "ç¶ç»idæè ç»id䏿¯æ´æ°" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "è§åid䏿¯æ´æ°" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "æ²¡ææ¾å°è§å (%s)" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "没ææå®å®å ¨ç»" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "å®å ¨ç»åç§°ä¸è½æ¯ç©º" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "å¯å¨å®ä¾ %r" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "忢å®ä¾ %r" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "vol=%s" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "å é¤id为 %s çå·" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "æå· %(volume_id)s éå å°å®ä¾ %(server_id)s ç %(device)s 设å¤ä¸" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "å é¤id为 %s çå¿«ç §" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "ä¸ºå· %s åå»ºå¿«ç §" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "è¯å¾å®ä¾ååä¾" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "å°è¯å é¤ç»ä¸æåä¸ä¸ªæåï¼ç¨å é¤ç» %s æ¥ä»£æ¿ã" + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "æ¥æ¾ç¨æ·ï¼%r" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "访é®å¯é¥ %s ææå¤±è´¥" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "使ç¨ç¨æ·åç§°æ¥ä½ä¸ºé¡¹ç®åç§° (%s)" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "ææå¤±è´¥ï¼æ²¡ææ¤é¡¹ç®åç§° %(pjid)s (user=%(uname)s)" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "ææå¤±è´¥ï¼ç¨æ· %(uname)s 䏿¯ç®¡çåï¼ä¹ä¸æ¯é¡¹ç® %(pjname)s çæå" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "user.secret: %s" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "expected_signature: %s" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "ç¾å: %s" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "ç¨æ· %s çç¾åæ æ" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "host_only_signature: %s" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "å¿ é¡»æå®é¡¹ç®" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "ä¸ºç¨æ· %(uid)s æ·»å è§è² %(role)s ç¨æ·ä½ç½®å¨%(pid)s 项ç®é" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "æ·»å å ¨å±è§è² %(role)s ç»ç¨æ· %(uid)s" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "ç§»é¤ç¨æ· %(uid)s çè§è² %(role)s ç¨æ·ä½ç½®æ¯å¨é¡¹ç® %(pid)s é" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "ç§»é¤å ¨å±è§è² %(role)s 对象æ¯ç¨æ· %(uid)s" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "åå»ºé¡¹ç® %(name)s éè¿ç®¡çå %(manager_user)s" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "æ£å¨ä¿®æ¹é¡¹ç® %s" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "æ·»å ç¨æ· %(uid)s å°é¡¹ç®%(pid)s" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "ç§»é¤ç¨æ· %(uid)s äºé¡¹ç® %(pid)s ä¸" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "å é¤é¡¹ç® %s" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "å·²åå»ºç¨æ· %(rvname)s (admin: %(rvadmin)r)" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "å é¤ç¨æ· %s" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "ä¿®æ¹ç¨æ· %s ç访é®å¯é¥" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "ä¿®æ¹ç¨æ· %s çç§é¥" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "å°ç®¡çåç¶æè®¾ç½®ä¸º %(admin)r ç®çæ¯éå¯¹ç¨æ· %(uid)s" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "没æ %s 项ç®çvpnæ°æ®" + +#: cinder/cloudpipe/pipelib.py:46 +#, fuzzy, python-format +msgid "Instance type for vpn instances" +msgstr "æ æçå®ä¾ç±»å %(instance_type)sã" + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "cloudpipeå®ä¾çå¯å¨èæ¬æ¨¡æ¿" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "ç½ç»å°åå·²åå ¥openvpné ç½®" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "åç½æ©ç å·²åå ¥openvpné ç½®" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "å¯å¨VPN %s" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "æªæå®è®¡ç®å®¿ä¸»æº" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "æ æ³æ¾å°å®ä¾ %s ç宿主æº" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "%(pid)s å·²ç»è¶ è¿é é¢ï¼è¯å¾è®¾ç½® %(num_metadata)s ä¸ªå æ°æ®å±æ§" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "%(pid)s å·²ç»è¶ è¿é é¢ï¼å æ°æ®å±æ§é®æå¼å¤ªé¿" + +#: cinder/compute/api.py:257 +#, fuzzy +msgid "Cannot run any more instances of this type." +msgstr "è¶ è¿å®ä¾çé é¢ãæ¨æ æ³è¿è¡æ´å¤æ¤ç±»åçå®ä¾ã" + +#: cinder/compute/api.py:259 +#, fuzzy, python-format +msgid "Can only run %s more instances of this type." +msgstr "è¶ è¿å®ä¾çé é¢ãæ¨åªè½åè¿è¡ %s 个æ¤ç±»åçå®ä¾ã" + +#: cinder/compute/api.py:261 +#, fuzzy, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "%(pid)s å·²ç»è¶ è¿é é¢ï¼è¯å¾è¿è¡ %(min_count)s 个å®ä¾" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "æ£å¨å建裸å®ä¾" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "ä½¿ç¨ Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "åå¤è¿è¡ %s 个å®ä¾" + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "bdm %s" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "block_device_mapping %s" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "为 %(pid)s/%(uid)s åè°åº¦å¨åéå建å½ä»¤" + +#: cinder/compute/api.py:871 +#, fuzzy, python-format +msgid "Going to try to soft delete instance" +msgstr "åå¤å°è¯è½¯å é¤å®ä¾ %s" + +#: cinder/compute/api.py:891 +#, fuzzy, python-format +msgid "No host for instance, deleting immediately" +msgstr "没ææç®¡å®ä¾ %sï¼ç«å»å é¤" + +#: cinder/compute/api.py:939 +#, fuzzy, python-format +msgid "Going to try to terminate instance" +msgstr "åå¤å°è¯ç»æ¢å®ä¾ %s" + +#: cinder/compute/api.py:977 +#, fuzzy, python-format +msgid "Going to try to stop instance" +msgstr "åå¤å°è¯åæ¢å®ä¾ %s" + +#: cinder/compute/api.py:996 +#, fuzzy, python-format +msgid "Going to try to start instance" +msgstr "åå¤å°è¯å¯å¨å®ä¾ %s" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "å®ä¾ %(instance_uuid)s 没æåæ¢ã(%(vm_state)s" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "æç´¢æ¡ä»¶ï¼ %s" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "æ æ³è¯å«éåç±»å %s" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "flavor_id为空ãåå®å¨è¿ç§»ã" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "æ§çå®ä¾ç±»å %(current_instance_type_name)sï¼æ°çå®ä¾ç±»å %(new_instance_type_name)s" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "åå¨å¤ä¸ªåºå®IPï¼ä½¿ç¨ç¬¬ä¸ä¸ªï¼%s" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "åå»ºåæ°å¿ é¡»æ¯æ£æ´æ°" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "æ°æ®åºé误ï¼%s" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "æªæ¾å°è¦å é¤çå®ä¾ç±»å %s" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "check_instance_lock: decorating: |%s|" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "check_instance_lock: éå®: |%s|" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "check_instance_lock: admin: |%s|" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "check_instance_lock: æ§è¡ä¸: |%s|" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "check_instance_lock: æªæ§è¡ |%s|" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "æ æ³å è½½èæé©±å¨ï¼%s" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "å½åç¶ææ¯ %(drv_state)sï¼æ°æ®åºç¶ææ¯ %(db_state)sã" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "cinder-computeéå¯åï¼å®ä¾æ£å¨éå¯ã" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "èææºç®¡çç¨åºé©±å¨ä¸æ¯æé²ç«å¢è§å" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "æ£å¨æ£æ¥ç¶æ" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "æ£å¨è®¾ç½® bdm %s" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, fuzzy, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "ç»æ¢å®ä¾ %(instance_uuid)s æ¶åçå¼å¸¸" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "æªæ¾å°å®ä¾ %s" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "å®ä¾å·²ç»å建" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" +"éå '%(image_id)s' ç大å°ä¸º %(size_bytes)d ï¼è¶ è¿å®ä¾ç±»å instance_type æå 许çå¤§å° " +"%(allowed_size_bytes)d" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "æ£å¨å¯å¨èææº" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "å®ä¾è·³è¿ç½ç»åé " + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "å®ä¾ç½ç»è®¾ç½®å¤±è´¥" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "å®ä¾çnetwork_infoï¼|%s|" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "å®ä¾å设å¤è®¾ç½®å¤±è´¥" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "å®ä¾ç产失败" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "éæ¾å®ä¾çç½ç»" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "%(action_str)s å®ä¾" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "忽ç¥å¼å¸¸ DiskNotFound: %s" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "ç»æ¢bdm %s" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "%sãæå®ä¾ç vm_state设置为ERROR" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "æ æ³é建å®ä¾ [%(instance_uuid)s]ï¼å 为ç»å®çéåä¸åå¨ã" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "æ æ³éæ°å建å®ä¾ [%(instance_uuid)s]: %(exc)s" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "æ£å¨éæ°å建å®ä¾ %s" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "æ£å¨éå¯èææº %s" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "è¯å¾éå¯ä¸ä¸ªæ²¡æè¿è¡çå®ä¾ï¼%(instance_uuid)s (ç¶æï¼%(state)s é¢è®¡ï¼%(running)s)" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "å®ä¾ %s: å¿«ç §ä¸" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "è¯å¾ä¸ºä¸ä¸ªæ²¡æè¿è¡çå®ä¾å¿«ç §ï¼%(instance_uuid)s (ç¶æï¼%(state)s é¢è®¡ï¼%(running)s)" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "æ¾å° %(num_images)d 个éå (rotation: %(rotation)d)" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "è½®æ¢åº%d个å¤ä»½" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "æ£å¨å é¤éå %s" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "设置管çåå¯ç 失败ãå®ä¾ %s 没æè¿è¡" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "å®ä¾ %sï¼Rootå¯ç 已设置" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "该驱å¨ä¸è½æ§è¡set_admin_passwordã" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "设置管çåå¯ç åºé" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" +"è¯å¾æä¸ä¸ªæä»¶æ³¨å ¥å°æ²¡æè¿è¡çå®ä¾ï¼%(instance_uuid)s (ç¶æ: %(current_power_state)s é¢è®¡: " +"%(expected_state)s)" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "å®ä¾ %(instance_uuid)sï¼ææä»¶æ³¨å ¥ %(path)s" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" +"è¯å¾æ´æ°æ²¡æè¿è¡çå®ä¾ä¸ç代çï¼%(instance_uuid)s (ç¶æ: %(current_power_state)s é¢è®¡: " +"%(expected_state)s)" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "å®ä¾ %(instance_uuid)sï¼æ£å¨æä»£çæ´æ°å° %(url)s" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "å®ä¾ %sï¼æ£å¨ææ´ä¸" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "å®ä¾ %sï¼åæ¶ææ´" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "ç®æ 䏿¥æºä¸æ ·ã" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "å®ä¾ %sï¼æ£å¨è¿ç§»" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "å®ä¾ %s: æå" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "å®ä¾ %s: åæ¶æ«å" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "å®ä¾ %s ï¼è·åè¯æ" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "å®ä¾ %sï¼æèµ·" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "å®ä¾ %s: æ¢å¤ä¸" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "å®ä¾%s:éå®ä¸" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "å®ä¾%s:åæ¶éå®" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "å®ä¾%sï¼è·åéå®çç¶æ" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "å®ä¾%s:éç½®ç½ç»" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "å®ä¾ %sï¼æ³¨å ¥ç½ç»ä¿¡æ¯" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "å°æ³¨å ¥çnetwork_infoï¼|%s|" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "å®ä¾ %sï¼æ£å¨è·å¾VNCæ§å¶å°" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "å· %(volume_id)s æ£å¨ %(mountpoint)s ä¸å¯å¨" + +#: cinder/compute/manager.py:1703 +#, fuzzy, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "æ£å¨æå· %(volume_id)s éå å° %(mountpoint)s" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "æ£å¨æå· %(volume_id)s éå å° %(mountpoint)s" + +#: cinder/compute/manager.py:1714 +#, fuzzy, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "%(mountpoint)s éå 失败ï¼ç§»é¤ä¸" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "%(mountpoint)s éå 失败ï¼ç§»é¤ä¸" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "å· %(volume_id)s ä»æè½½ç¹ %(mp)s å离" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "仿ªç¥å®ä¾%sä¸å离å·" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "å建tmpfile %s æ¥éç¥å ¶ä»ç计ç®èç¹éè¦æè½½ç¸åçåå¨ã" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "å®ä¾æ²¡æå·ã" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "plug_vifs() 失败%(cnt)d 次ãæå¤éæ°å°è¯ %(max_retry)d 次å¨ä¸»æº %(hostname)sã" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "é¢å¨çº¿è¿ç§»å¨%(dest)s失败" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "post_live_migration()å·²ç»å¯å¨ã" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "æ²¡ææ¾å°floating_ip" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "æ²¡ææ¾å°floating_ip" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" +"å¨çº¿è¿ç§»ï¼æå¤çéè¯¯ï¼æ æ³ç»§æ¿æµ®å¨ipã\n" +"%(e)s" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "æå®ä¾è¿ç§»å° %(dest)s æå宿ã" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" +"ä½ ä¼çå°é误âlibvirt: QEMU error: Domain not found: no domain with matching " +"nameãâè¿ä¸ªé误å¯ä»¥æ¾å¿ç忽ç¥ã" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "è¿ç§»åæä½å¯å¨" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "æ´æ°å¸¦å®½ä½¿ç¨ç¼å" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "æ´æ°ä¸»æºç¶æ" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "卿°æ®åºä¸æ¾å° %(num_db_instances)s个å®ä¾ï¼å¨èææºç®¡çç¨åºæ¾å° %(num_vm_instances)s 个å®ä¾ã" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +#, fuzzy, python-format +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "æ°æ®åºä¸åç°å®ä¾ %(name)s ï¼ä½æ¯èææºç®¡çç¨åºä¸ç¥éã设置å çµç¶æä¸ºNOSTATE" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "FLAGS.reclaim_instance_interval <= 0ï¼è·³è¿..." + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "åæ¶å é¤çå®ä¾" + +#: cinder/compute/manager.py:2458 +#, fuzzy, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "æ£æµæ ç¾å为 '%(name_label)s' çå®ä¾ï¼è¿äºå®ä¾è¢«æ è¯ä¸ºDELETEDå´ä»ç¶åå¨äºä¸»æºä¸ã" + +#: cinder/compute/manager.py:2465 +#, fuzzy, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "鿝æ ç¾å为 '%(name_label)s' çå®ä¾ï¼è¿äºå®ä¾è¢«æ è¯ä¸ºDELETEDå´ä»ç¶åå¨äºä¸»æºä¸ã" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "æ æ³è¯å«çFLAGS.running_deleted_instance_actionçåå¼ '%(action)s'" + +#: cinder/compute/manager.py:2542 +#, fuzzy, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "èå %(aggregate_id)så·²ç»æä¸»æº %(host)sã" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "éççç½ç»ä¿¡æ¯ nw_info è¦æ±ä½¿ç¨ IPv4 åç½" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "æ£å¨æ·»å æ§å¶å°" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "å°è¯å é¤ä¸åå¨çæ§å¶å°%(console_id)sã" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "å°è¯å é¤ä¸åå¨çæ§å¶å°%(console_id)sã" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "å 餿§å¶å°%(console_id)sã" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "é建xvpé ç½®" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "éå%s" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "忢xvp" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "æ£å¨å¯å¨xvp" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "å¯å¨xvpåçé误ï¼%s" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "éå¯xvp" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "xvpä¸å¨è¿è¡ä¸" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "å é¤è¿æä»¤çï¼(%s)" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "æ¥æ¶å°ä»¤çï¼%(token)s, %(token_dict)s)" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "æ£æ¥ä»¤çï¼%(token)s, %(token_valid)s)" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "使ç¨ç©ºç请æ±ä¸ä¸ææ¯ä¸æ¨èç" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "æ æ³è¯å«ç read_deleted åå¼â%sâ" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "ä¸»æº %(host)s 没æè®¡ç®èç¹" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "没æid为%(sm_backend_id)sçåå°é ç½®" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "没æ sm_flavor è°ç¨ %(sm_flavor)s" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "没æid为 %(volume_id)s ç sm_volume" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "没æå®è£ python-migrateãæ£éåºã" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "versionåºè¯¥æ¯æ´æ°" + +#: cinder/db/sqlalchemy/session.py:137 +#, fuzzy, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "SQLè¿æ¥å¤±è´¥ (%(connstring)s)ãè¿å© %(attempts)d 次ã" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "interface åæ²¡æå å ¥networks 表ä¸" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "表 |%s| 没æå建" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "VIF åæ²¡æå å ¥å° fixed_ips 表ä¸" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "ä¸ºç§»å¨ mac_addresses |%s| å å ¥å表" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "å¤é®çº¦ææ æ³æ·»å " + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "å¤é®çº¦ææ æ³å é¤" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "priorityåæ²¡æå å ¥å° networks 表ä¸" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "å¤é®çº¦ææ æ³å»é¤" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "progressåæ²¡æå å ¥å°å®ä¾è¡¨ä¸" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "æ æ³æ flavorid 转åä¸ºæ´æ°ï¼%sã设置 flavorid æç±»ä¼¼æ´æ°çå符串æ¥é级ã" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "instance_info_caches 没æå 餿" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "progress åæ²¡æå å ¥å° compute_nodes 表ä¸" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "dns_domains 表没æå é¤" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +#, fuzzy +msgid "quota_classes table not dropped" +msgstr "instance_info_caches 没æå 餿" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "glanceæå¡å¨è¿æ¥é误ï¼éè¯ä¸" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "è¾¾å°æå¤§å°è¯æ¬¡æ°" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "æ£å¨Glanceä¸å建éåãå æ°æ® %s å·²ç»ä¼ å ¥ã" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "为Glance è¿è¡æ ¼å¼ååçå æ°æ® %s" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "ä»Glanceè¿åç为Baseæ ¼å¼åçå æ°æ® %s" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "䏿¯éåææè " + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "%(timestamp)s 没æéµå¾ªä»»ä½ç¾åæ ¼å¼ï¼%(iso_formats)s" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "æ %(image_location)s ä¸è½½å° %(image_path)s失败" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "è§£å¯ %(image_location)s å° %(image_path)s失败" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "è§£å %(image_location)s å° %(image_path)s 失败" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "ä¸ä¼ %(image_location)s å° %(image_path)s 失败" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "è§£å¯ç§é¥å¤±è´¥ï¼%s" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "è§£å¯åå§åvector失败ï¼%s" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "è§£å¯éåæä»¶ %(image_file)s 失败ï¼%(err)s" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "éåä¸ä¸å®å ¨çæä»¶å" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "é误çto_global_ipv6 macï¼%s" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "é误çto_global_ipv6åç¼ï¼%s" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "é误çto_global_ipv6 oject_idï¼%s" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "驱å¨ä» æ¯æå ¥å£ç±»å 'a'ã" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "è¯å¾ç§»é¤ä¸åå¨çé¾ %sã" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "æªç¥é¾ï¼%r" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "è¯å¾ç§»é¤ä¸åå¨çè§åï¼%(chain)r %(rule)r %(wrap)r %(top)r" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "IPTablesManager.applyæå宿" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "æèµ·è¿ç¨ dnsmasq æ¶æåº %s" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "Pid %d è¿æäºï¼éæ°å¯å¨dnsmasq" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "ææè¿ç¨ radvd æ¶æåº %s" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "Pid %d è¿æäºï¼éæ°å¯å¨radvd" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "æ£å¨å¼å¯VLANæ¥å£ %s" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "æ£å¨ä¸º %s å¼å¯æ¡¥æ¥å£" + +#: cinder/network/linux_net.py:1142 +#, fuzzy, python-format +msgid "Starting bridge %s " +msgstr "ä¿è¯æ¡¥ %s" + +#: cinder/network/linux_net.py:1149 +#, fuzzy, python-format +msgid "Done starting bridge %s" +msgstr "ä¿è¯æ¡¥ %s" + +#: cinder/network/linux_net.py:1167 +#, fuzzy, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "ç§»é¤å®ä¾â%sâçèæç½ç»è®¾å¤æ¶å¤±è´¥" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, fuzzy, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "è¯ä¹¦ %(certificate_id)s æ²¡ææ¾å°ã" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "æ²¡ææ¾å°æ¥å£ %(interface)s" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "为å®ä¾ |%s| åé æµ®å¨IP" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "为å®ä¾ |%s| éæ¾æµ®å¨IP" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "å°å |%(address)s| 没æåé " + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "å°å |%(address)s| 没æåé ç»ä½ çé¡¹ç® |%(project)s|" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "%s çé é¢è¶ åºï¼å°è¯åé å°å" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "æ°æ®åºä¸ä¸è´ï¼DNSå|%s| å¨Cinderæ°æ®åºä¸æ³¨åï¼ä½æ¯å¯¹æµ®å¨æè å®ä¾DNS驱å¨åä¸å¯è§ãå°è¢«å¿½ç¥ã" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "å |%(domain)s| å·²ç»åå¨ï¼æåºåæ¹å为 |%(av_zone)s|ã" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "å |%(domain)s| å·²ç»åå¨ï¼æé¡¹ç®æ¹å为 |%(project)s|ã" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "è§£é¤ %s è¿æåºå®ipçå ³è" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "设置ç½ç»ä¸»æº" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "为å®ä¾ |%s| çç½è·¯åé " + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "为å®ä¾ |%(instance_id)s| è·åçç½ç»ï¼|%(networks)s|" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "为å®ä¾ |%s| è§£é¤ç½ç»åé " + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" +"instance-dns-zoneæ¯ |%(domain)s|ï¼è¯¥åä½äºåºå |%(zone)s| ä¸ãå®ä¾|%(instance)s| å¨åºå " +"|%(zone2)s| éãæ²¡æDNSè®°å½å°å建ã" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "ç§ç¨çIP |%(address)s|" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "没æå ³èçIP %s 被ç§ç¨äº" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "没æåé çIP |%s| 被ç§ç¨äº" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "éæ¾çIP |%(address)s|" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "没æå ³èçIP %s è¢«éæ¾äº" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "没æç§ç¨çIP %s è¢«éæ¾äº" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "cidr å·²ç»å¨ä½¿ç¨" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "请æ±çcidr (%(cidr)s) ä¸å·²åå¨çè¶ ç½ç» (%(super)s) å²çª" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "请æ±çcidr (%(cidr)s) ä¸å·²åå¨çè¾å°çcidr (%(smaller)s) å²çª" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "ç½ç»å·²ç»åå¨ã" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "ç½è·¯å¨å é¤åå¿ é¡»ä¸é¡¹ç® %s è§£é¤å ³è" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "ç½ç»æ°éä¸VLANèµ·å§æ°ä¹åä¸è½å¤§äº4049" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "ç½ç»èå´ä¸å¤å¤èä¸éå %(num_networks)sãç½ç»å¤§å°æ¯ %(network_size)sã" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "驱å¨ä» æ¯æç±»å 'a'" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "ç§æ·ID没æè®¾" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "Quantum客æ·è¯·æ±ï¼%(method)s %(action)s" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "Quantumå®ä½æ²¡ææ¾å°ï¼%s" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "æå¡å¨ %(status_code)s é误ï¼%(data)s" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "æ æ³è¿æ¥å°æå¡å¨ãåºç°é误ï¼%s" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "æ æ³ååºååtype = '%s' ç对象" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "QuantumManager 没æä½¿ç¨ 'multi_host' åæ°ã" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "QuantumManager è¦æ±æ¯æ¬¡è°ç¨ä» å建ä¸ä¸ªç½è½ã" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "QuantumManager 没æä½¿ç¨ 'vlan_start' åæ°ã" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "QuantumManager 没æä½¿ç¨ 'vpn_start' åæ°ã" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "QuantumManager 没æä½¿ç¨ 'bridge' åæ°ã" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "QuantumManager 没æä½¿ç¨ 'bridge_interface' åæ°ã" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "QuantumManager è¦æ±ä¸ä¸ªææç (.1) ç½å ³å°åã" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "æ æ³ä¸ºç§æ· '%(q_tenant_id)s' æ¾å°å·²åå¨ç net-idæ¯ '%(quantum_net_id)s' çquantumç½ç»" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "å®ä¾ %s çç½ç»åé " + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "å®ä¾ç端å£åæ¶åé 失败ï¼|%(instance_id)s|, port_id: |%(port_id)s|" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "å®ä¾çipamåæ¶åé 失败ï¼|%(instance_id)s|, vif_uuid: |%(vif_uuid)s|" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "æå¡å¨è¿åé误ï¼%s" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "melangeæå¡çè¿æ¥é误ï¼éè¯" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" +"å¨ç½ç» |%(network_id)s| ä¸åé IPå°åï¼è¯¥ç½ç»å±äº |%(network_tenant_id)s|ï¼ åé IPç»è¯¥vif " +"|%(vif_id)s|ï¼ å ¶ä¸macæ¯ |%(mac_address)s| æå±é¡¹ç® |%(project_id)s| " + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "è°ç¨get_project_and_global_net_idsæ¶ project_idå¿ é¡»æ¯é空ã" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "å建ç½ç»å ¥å£çé误" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "没ænet_id = %sçç½ç»" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, fuzzy, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "没æä¸ºvif %sidåæ¶åé åºå®IP" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "å°è¿æ¥æ¥å£ %(interface_id)s è¿æ¥å°net %(net_id)s éå¯¹ç§æ· %(tenant_id)s" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "ç«¯å£ %(port_id)s å¨net %(net_id)s ä¸å é¤ï¼éå¯¹ç§æ·æ¯ %(tenant_id)s" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "%s ä¸å¨ææçä¼å 级" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "Problem '%(e)s' è¯å¾åéå°éç¥ç³»ç»ãPayload=%(payload)s" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "Problem '%(e)s' è¯å¾åéå°éç¥é©±å¨ %(driver)sã" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "è¿å %s å¼å¸¸ç»è°ç¨è " + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "æªæå çä¸ä¸æï¼%s" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "å·²æ¥æ¶ %s" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "没æéç¨äºæ¶æ¯çæ¹æ³ï¼%s" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "没æéç¨äºæ¶æ¯çæ¹æ³ï¼%s" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "å¨ %s å弿¥call" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "æ¶æ¯ID(MSG_ID)æ¯ %s" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "å¨ %s å弿¥cast" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "å弿¥fanout cast" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "æ£å¨ %s ä¸åééç¥" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" +"è¿ç¨é误ï¼%(exc_type)s %(value)s\n" +"%(traceback)sã" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "çå¾ RPCååºè¿åè¶ æ¶" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "æ£å¨éæ°è¿æ¥ä½äº %(hostname)s:%(port)d çAMQPæå¡å¨" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "è¿æ¥å°ä½äº %(hostname)s:%(port)d çAMQPæå¡å¨" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" +"æ æ³è¿æ¥å°ä½äº%(hostname)s:%(port)dçAMQP serverï¼å°è¯å·²ç» %(max_retries)d " +"次ï¼%(err_str)s" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "ä½äº%(hostname)s:%(port)dçAMQPæå¡å¨ä¸å¯è¾¾ï¼%(err_str)sã%(sleep_time)d ç§éå请åå°è¯ã" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "为topic '%(topic)s'å£°ææ¶è´¹è 失败ï¼%(err_str)s" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "çå¾ RPCååºè¶ æ¶ï¼%s" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "ä»éå䏿¶è´¹æ¶æ¯å¤±è´¥ï¼%s" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "ç»topic '%(topic)s'å叿¶æ¯å¤±è´¥ï¼%(err_str)s" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "æ æ³è¿æ¥å°AMQPæå¡å¨ï¼%s " + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "è¿æ¥å° %s çAMQPæå¡å¨" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "é建AMQPéå" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "æ£ç¡®çæå¡å¨è¿è¡åï¼" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "æ æ³æ¾å°å¦ä¸ä¸ªè®¡ç®èç¹" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "æâ%(method)sâææ¾å¨å·%(host)s\"" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "æâ%(method)sâææ¾å¨ä¸»æº \"%(host)s\"" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "æâ%(method)sâææ¾å¨ç½ç» \"%(host)s\"" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "æâ%(method)sâææ¾å¨ %(topic)s \"%(host)s\"" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "å¿ é¡»å®ç°ä¸ä¸ªåæ» schedule" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "ååå¨è¿ç§»æ æ³å¨å ±äº«åå¨ä½¿ç¨" + +#: cinder/scheduler/driver.py:330 +#, fuzzy +msgid "Live migration can not be used without shared storage." +msgstr "ååå¨è¿ç§»æ æ³å¨å ±äº«åå¨ä½¿ç¨" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "ä¸»æº %(dest)s ååå çä¸»æº %(src)s ä¸å ¼å®¹ã" + +#: cinder/scheduler/driver.py:416 +#, fuzzy, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "æ æ³è¿ç§» %(instance_id)s å° %(dest)s ä¸ï¼ç¼ºå°å å(主æºï¼%(avail)s <= å®ä¾ï¼%(mem_inst)s)" + +#: cinder/scheduler/driver.py:472 +#, fuzzy, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" +"æ æ³è¿ç§»%(instance_id)s å° %(dest)s ä¸ï¼ç¼ºå°ç£ç(主æº:%(available)s <= " +"å®ä¾:%(necessary)s)" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "没æä¸»æºéæ©æå®ä¹ç %s 䏻颿¶æ¯" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "å°è¯å建 %(num_instances)d 个å®ä¾" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "è°åº¦å¨åªè½ç解计ç®èç¹ï¼ææ¶ï¼" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "è¿æ»¤æçä¸»æº %(hosts)s" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "å æçä¸»æº %(weighted_host)s" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, fuzzy, python-format +msgid "Host filter passes for %(host)s" +msgstr "ä¸»æº %(host)s 没æè®¡ç®èç¹" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "æ¥æ¶å° %(service_name)s æå¡æ´æ°ï¼æ¥èª %(host)sã" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "host_manager åªå®ç°äºâcomputeâ" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "计ç®èç¹ %s 没ææå¡" + +#: cinder/scheduler/manager.py:85 +#, fuzzy, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "驱卿¹æ³ %(driver_method)s 丢失ï¼%(e)sãæ¤éåschedule()" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "schedule_%(method)s 失败ï¼%(ex)s" + +#: cinder/scheduler/manager.py:159 +#, fuzzy, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "设置å®ä¾ %(instance_uuid)s è³ ERROR ç¶æ" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "æ æ³ç»è®¡è°åº¦å¨çé项æä»¶ %(filename)sï¼â%(e)sâ" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "æ æ³è§£ç è°åº¦å¨çé项ï¼â%(e)sâ" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "没æè¶³å¤å¯åé çå©ä½CPUæ ¸å¿" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "å·æ²¡æè¶³å¤å¯åé ç空é´" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "æªè®¾ç½® VCPUsï¼å设 CPU éåæåäº" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "伪æ§è¡å½ä»¤ï¼åè¿ç¨ï¼ï¼%s" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "伪å½ä»¤å¹é %s" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "伪å½ä»¤å¼èµ·å¼å¸¸ %s" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "伪å½ä»¤çæ åè¾åºstdout='%(stdout)s' æ åé误è¾åº stderr='%(stderr)s'" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "请æ©å±æ¨¡æç libvirt æ¨¡åæ¥æ¯ææ è®°" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "请æ©å±ä¼ªlibvirtæ¨¡åæ¥æ¯æè¿ç§è®¤ç¥æ¹æ³" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "æ£å¨è¿è¡çå®ä¾ï¼%s" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "ç»æ¢å®ä¾ä¹åï¼%s" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "å é¨é误" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "å¼ºå¶ææ»å®ä¾åï¼%s" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" +"ä¸é¢çè¿ç§»ç¼ºå°äºé级ï¼\n" +"\t%s" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "id" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "IPv4" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "IPv6" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "èµ·å§å°å" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "DNS1" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "DNS2" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "VlanID" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "项ç®" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "uuid" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "ç®æ %s å·²ç»åé " + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "æ æ³ç¡®è®¤å¯¼åºçå· idï¼%sã" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "ç»å®æ°æ®ï¼%s" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "ç»ææ°æ®ï¼%s" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "å¨%s å建æä»¶æ¨¡æå®¢æ·ä»£ç" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "ç§»é¤å¨ %s çæ¨¡æç客æ·ä»£çæä»¶" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, fuzzy, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "è¶ åºé é¢" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "_create: %s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "_delete: %s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "_get: %s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "_get_all: %s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "test_snapshot_create: param=%s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "test_snapshot_create: resp_dict=%s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "test_snapshot_create_force: param=%s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "test_snapshot_create_force: resp_dict=%s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "test_snapshot_show: resp=%s" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "test_snapshot_detail: resp_dict=%s" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "ç±»åï¼%s" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" +"%(message)s\n" +"ç¶æç : %(_status)s\n" +"主ä½: %(_body)s" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "认è¯é误" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "ææé误" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "æ¡ç®æ²¡ææ¾å°" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "æ£å¨ %(relative_url)s æ§è¡ %(method)s" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "主ä½ï¼%s" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "%(auth_uri)s => code %(http_status)s" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "%(relative_uri)s => code %(http_status)s" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "æå¤çç¶æç " + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "è§£ç JSONï¼%s" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "åµå¥(è°ç¨)æ¥æ¶å° %(queue)s, %(value)s" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "åµå¥(è°ç¨)è¿å %s" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "RPCåå°ä¸æ¯æè¶ æ¶" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "å·²æ¥æ¶ %s" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "æå¼èææºç®¡çç¨åºçè¿æ¥å¤±è´¥" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "Compute_serviceè®°å½ä¸º %s å建 " + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "Compute_serviceè®°å½ä¸º %s æ´æ° " + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "è¯å¾ä¸è¿æ»¤æ²¡æè¿æ»¤çå®ä¾ %s" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "è¿æ»¤å¨æ·»å ç»å®ä¾ %s" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "æä¾è é²ç«å¢è§åå·æ°" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "æ·»å å®å ¨ç»è§åï¼%r" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "æ·»å æä¾è è§åï¼%s" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "'qemu-img info'è§£æå¤±è´¥" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "fmt=%(fmt)s ç± %(backing_file)s æ¯æ" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "转åä¸ºè£¸æ ¼å¼ï¼ä½ç®åæ ¼å¼æ¯ %s" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "é对useconnection_type=vmwareapiå¿ é¡»æå®vmwareapi_host_ip,vmwareapi_host_usernameåvmwareapi_host_password" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "å¨vmwareapiï¼_create_sessionï¼å¾å°è¿ä¸ªå¼å¸¸ï¼%s" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "å¨vmwareapiï¼_call_methodï¼å¾å°è¿ä¸ªå¼å¸¸ï¼%s" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "ä»»å¡ [%(task_name)s] %(task_ref)s ç¶æï¼æå" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "ä»»å¡ [%(task_name)s] %(task_ref)s ç¶æï¼é误 %(error_info)s" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "å¨vmwareapiï¼_poll_taskï¼å¾å°è¿ä¸ªé误 %s" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" +"é对use connection_type=xenapiå¿ é¡»æå®xenapi_connection_url, " +"xenapi_connection_username (å¯é) å xenapi_connection_password" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "æ æ³ç¡®å®iscsi initiatoråå" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "䏿¯æå¨XenServerå¯å¨ä¸»æº" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "æ æ³ç»å½å°XenAPI(Dom0ç£çæ¯ç©ºä¹ï¼)" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "å¾å°å¼å¸¸ï¼%s" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "没æååå¨ã" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "============= åå§å =========== : %s" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "å建åï¼å°è¢«ç§»é¤" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "没æè¿è¡çåï¼ç§»é¤" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "è¿è¡å¨ä½ç½®ç»ç¹çåï¼æ¾å¼" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "没æè¿ä¸ªå (%s)" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "裸æºç»ç¹ %s çµæºåæ¢å¤±è´¥" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "deactivate -> activate失败" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "destroy_domainï¼æ²¡æè¯¥å" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "没æè¯¥å %s" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "åï¼%s" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "ç»ç¹ï¼%s" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "å¨ååä¹åï¼%s" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "å廿´»/ç§»é¤å¤±è´¥" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "===== 忣å¨å建 =====" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "åæ ·çååå·²ç»åå¨" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "create_domainï¼å¨get_idle_nodeä¹å" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "æ°åå建ï¼%s" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "裸æºç»ç¹ %s å¯å¨å¤±è´¥" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "没æè¯¥å" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "change_domain_stateï¼æ°ç¶æ %s" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "æä¼ªåååå°æä»¶ä¸ï¼%s" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "åä¸åå¨" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "æªç¥ç裸æºé©±å¨ %(d)s" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "鿝å®ä¾ '%(name)s' æ¶éå°é误ï¼%(ex)s" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "å®ä¾ %(instance_name)sï¼æ£å¨å é¤å®ä¾æä»¶ %(target)s" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "å®ä¾ %sï¼éå¯" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "_wait_for_reboot失败" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "å®ä¾ %sï¼å·²ææ´" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "_wait_for_rescue 失败" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "<============= ç产裸æº=============>" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "å®ä¾ %sï¼æ£å¨å建ä¸" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "å·²ç»æ³¨å ¥å¯é¥ä½æ¯å®ä¾è¿æ²¡æè¿è¡" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "å®ä¾ %sï¼å·²å¯å¨" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "~~~~~~ å½åç¶æ = %s ~~~~~~" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "å®ä¾ %s ç产æå" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "å®ä¾ %sï¼æ²¡æå¯å¨" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "è¿å¤æäº¤è£¸æºåé " + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "å®ä¾ %sï¼æ£å¨å建éå" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "å®ä¾ %(inst_name)sï¼å° %(injection)s æ³¨å ¥éå %(img_id)s" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "å®ä¾ %(inst_name)sï¼å¿½ç¥åéå %(img_id)s æ³¨å ¥æ°æ®çé误 (%(e)s)" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "å®ä¾ %sï¼å¼å§æ¹æ³ toXML" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "å®ä¾ %sï¼æ¹æ³toXML 宿" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "æ æ³å¾å°CPUçæ°ç®ï¼å 为è¿ä¸ªå½æ°ä¸æ¯ç»è¿ä¸ªå¹³å°æ§è¡çãè¿ä¸ªé误å¯ä»¥è¢«æ¾å¿å¿½ç¥ã" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "#### RLK: cpu_arch = %s " + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "æ£å¨æ´æ°ã" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "æ£å¨æ´æ°ä¸»æºç¶æ" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "free_node..." + +#: cinder/virt/baremetal/tilera.py:216 +#, fuzzy, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "é对node_id = %(id)s node_ip = %(ip)sè°ç¨äºdeactivate_node" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "ç»ç¹ç¶æè®¾ä¸º0" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "rootfs å·²ç»è¢«ç§»é¤äº" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "å¨ping裸æºèç¹ä¹å" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "activate_node" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "èç¹å¤äºæªç¥çéè¯¯ç¶æã" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "没æåéçéå奿é 置好" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "æªç¥çç£çéå奿ï¼%s" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "éåå·²ç»æè½½" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "æè½½æä»¶ç³»ç»å¤±è´¥ï¼%s" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "ç§»é¤å®¹å¨å¤±è´¥ï¼%s" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "䏿¯æçååºï¼%s" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "æªç¥çguestmounté误" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "æ æ³ç»loopbackéå éåï¼%s" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "æªæ¾å°ååº" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "æ å°ååºå¤±è´¥ï¼%s" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "NBDä¸å¯ç¨ï¼æ¨¡å没æå è½½" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "没æç©ºé²NBD设å¤" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "qemu-nbd é误ï¼%s" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "nbd è®¾å¤ %s 没æåºç°" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "æ£å¨è¿æ¥ libvirtï¼%s" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "è¿æ¥ libvirt 失败" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "鿝æ¶åçé误ãCode=%(errcode)s Error=%(e)s" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "å é¤å·²ä¿åçå®ä¾æ¶ libvirt åçé误ãCode=%(errcode)s Error=%(e)s" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "å¨ undefine æ¶ libvirt åçé误ãCode=%(errcode)s Error=%(e)s" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "å®ä¾éæ¯æåã" + +#: cinder/virt/libvirt/connection.py:435 +#, fuzzy, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "å¨ undefine æ¶ libvirt åçé误ãCode=%(errcode)s Error=%(e)s" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "å é¤å®ä¾æä»¶ %(target)s" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "éå LXC å设å¤" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "å离LXC å设å¤" + +#: cinder/virt/libvirt/connection.py:692 +#, fuzzy +msgid "Instance soft rebooted successfully." +msgstr "å®ä¾æåéå¯ã" + +#: cinder/virt/libvirt/connection.py:696 +#, fuzzy +msgid "Failed to soft reboot instance." +msgstr "éæ°å¯å¨å®ä¾å¤±è´¥" + +#: cinder/virt/libvirt/connection.py:725 +#, fuzzy +msgid "Instance shutdown successfully." +msgstr "å®ä¾æåç产ã" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "éå¯è¿ç¨ä¸ï¼å®ä¾æ¶å¤±ã" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "å®ä¾æåéå¯ã" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "åç° %(migration_count)d ä¸ªè¶ è¿ %(confirm_window)d ç§æªç»ç¡®è®¤çè¿ç§»" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "æ£å¨èªå¨ç¡®è®¤è¿ç§» %d" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "å®ä¾å¨è¿è¡" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "å®ä¾æåç产ã" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "dataï¼%(data)r, fpath: %(fpath)r" + +#: cinder/virt/libvirt/connection.py:978 +#, fuzzy +msgid "Guest does not have a console available" +msgstr "ç¨æ·æ²¡æç®¡çåæé" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "æ£å¨å建éå" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "å° %(injection)s æ³¨å ¥å°éå %(img_id)s" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "忽ç¥åéå %(img_id)s æ³¨å ¥çæ°æ®çé误 (%(e)s)" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "å设å¤å表 block_device_list %s" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "æ£å¨å¯å¨ toXML æ¹æ³" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "toXMLæ¹æ³å®æ" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "æ¥æ¾ %(instance_name)sæ¶libvirtåºéï¼[é误代ç %(error_code)s] %(ex)s" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "libvirtçæ¬è¿æ§(䏿¯ægetVersion)" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "'<cpu>' å¿ é¡»ä¸º 1, 使¯ä¸º %d\n" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "ææ (%(topology)s) å¿ é¡»å«æ %(ks)s" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" +"å·²å¯å¨å®ä¾çCPUä¿¡æ¯ï¼\n" +"%s" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" +"CPU ä¸å ¼å®¹.\n" +"\n" +"%(ret)s\n" +"\n" +"åè %(u)s" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "è¿ç§» %s è¶ æ¶" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "å å®åå·ï¼æä»¥è·³è¿ %(path)s" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "å®ä¾ %sï¼å¼å§æ§è¡ migrate_disk_and_power_off" + +#: cinder/virt/libvirt/connection.py:2513 +#, fuzzy, python-format +msgid "During wait running, instance disappeared." +msgstr "%s å¨è¿è¡ä¸æ¶å¤±äºã" + +#: cinder/virt/libvirt/connection.py:2518 +#, fuzzy, python-format +msgid "Instance running successfully." +msgstr "å®ä¾ %s æåè¿è¡ã" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "å®ä¾ %sï¼å¼å§æ§è¡ finish_migration" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "å®ä¾ %sï¼å¼å§æ§è¡ finish_revert_migration" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "Libvirtæ¨¡åæ æ³å è½½ãNWFilterFirewall æ æ³æ£å¸¸å·¥ä½ã" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "å¨ nwfilter éè°ç¨ setup_basic_filtering" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "æ£å¨ç¡®ä¿éæè¿æ»¤å¨" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "nwfilter(%(instance_filter_name)s)æªæ¾å°" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "å称为 %(name)s çnwfilter(%(instance_filter_name)s) æªæ¾å°ã" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "iptables é²ç«å¢ï¼è®¾ç½®åºæ¬çè¿æ»¤è§å" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "è¯å¾ä¸è¿æ»¤æ²¡æè¿æ»¤çå®ä¾" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "%s æ¯ä¸ä¸ªæ£ç¡®çå®ä¾åç§°" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "%s æä¸ä¸ªç£çæä»¶" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "å®ä¾ %(instance)s ç±æä»¶ %(backing)s æ¥å¤ä»½" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "å®ä¾ %(instance)s æ£å¨ä½¿ç¨çå¤ä»½æä»¶ %(backing)s 没æåºç°å¨éåæå¡éã" + +#: cinder/virt/libvirt/imagecache.py:237 +#, fuzzy, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "%(container_format)s-%(id)s (%(base_file)s)ï¼éåéªè¯å¤±è´¥" + +#: cinder/virt/libvirt/imagecache.py:247 +#, fuzzy, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "%(container_format)s-%(id)s (%(base_file)s)ï¼éåéªè¯è·³è¿ï¼æ²¡ææ£ååå¨" + +#: cinder/virt/libvirt/imagecache.py:266 +#, fuzzy, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "å é¤ %(base_file)s 失败ï¼éè¯¯æ¯ %(error)s" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "åºæä»¶å¤ªæ°ä¸éè¦å é¤ï¼%s" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "æ£å¨å é¤åºæä»¶ï¼%s" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "å é¤ %(base_file)s 失败ï¼éè¯¯æ¯ %(error)s" + +#: cinder/virt/libvirt/imagecache.py:299 +#, fuzzy, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "%(container_format)s-%(id)s (%(base_file)s)ï¼æ£å¨æ£æ¥ä¸" + +#: cinder/virt/libvirt/imagecache.py:318 +#, fuzzy, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" +"%(container_format)s-%(id)s (%(base_file)s)ï¼æ£å¨ä½¿ç¨ä¸ï¼æ¬å°èç¹ %(local)d, è¿ç¨èç¹ " +"%(remote)d" + +#: cinder/virt/libvirt/imagecache.py:330 +#, fuzzy, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" +"%(container_format)s-%(id)s (%(base_file)s)ï¼è¦å -- 使ç¨ä¸ç¼ºå°åºæä»¶! å®ä¾ï¼ " +"%(instance_list)s" + +#: cinder/virt/libvirt/imagecache.py:338 +#, fuzzy, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "%(container_format)s-%(id)s (%(base_file)s)ï¼å¨ä½¿ç¨ä¸ï¼ å¨è¿ç¨èç¹ (%(remote)d ä¸" + +#: cinder/virt/libvirt/imagecache.py:348 +#, fuzzy, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "%(container_format)s-%(id)s (%(base_file)s)ï¼éåä¸å¨ä½¿ç¨ä¸" + +#: cinder/virt/libvirt/imagecache.py:354 +#, fuzzy, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "%(container_format)s-%(id)s (%(base_file)s)ï¼éåå¨ä½¿ç¨ä¸" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "è·³è¿éªè¯ï¼å¨ %s 䏿²¡æåºç¡ç®å½" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "éªè¯åºç¡éå" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "æªç¥çåºæä»¶ï¼%s" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "æ´»è·çåºæä»¶ï¼%s" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "æåçåºæä»¶ï¼%s" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "å¯å é¤çåºæä»¶ï¼%s" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "ç¡®è®¤å®æ" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "æ æ³æ¾å°ä¸ä¸ªå¼æ¾ç«¯å£" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "ä¿è¯vlan %(vlan)s åæ¡¥ %(bridge)s" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "ä¿è¯æ¡¥ %s" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "ç§»é¤å®ä¾â%sâçèæç½ç»è®¾å¤æ¶å¤±è´¥" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "å¨ %s æªæ¾å°iSCSI设å¤" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "å¨ %(mount_device)s ä¸è¿æ²¡ææ¾å°iSCSIå·ãå°åæ¬¡æ«æå¹¶éè¯ãå°è¯æ¬¡æ°ï¼%(tries)s" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "æ¾å°iSCSIèç¹ %(mount_device)s ï¼ç»è¿%(tries)s æ¬¡åæ«æï¼" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "è°ç¨ RetrieveProperties æ¶åçé误 %s" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "%(text)s: _db_content => %(content)s" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "屿§ %(attr)s 没æä¸ºç®¡ç对象 %(objName)s 设置" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "没æèææºæ³¨å" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "ref 为 %s çèææºä¸åå¨" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "éåºæ æçä¼è¯æè å·²ç»éåºäºï¼%s" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "ä¼è¯æé误" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "ä¼è¯æ æ" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr " è¿æ²¡æèææºè¢«æ³¨å" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "Glance éå %s å¨è¢«ææ»çç¶æ" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "Glance éå %(image_id)s å¤äºæªç¥ç¶æ - %(state)s" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "ESX SOAP æå¡å¨å¨ååºé为æç®¡ç³»ç»è¿åä¸ä¸ªç©ºç端å£ç»" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "æ£å¨ESX主æºä¸å建å称为 %s ç端å£ç»" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "å·²ç»å¨ESX主æºä¸å建äºå称为 %s ç端å£ç»" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "HTTPè¿æ¥å ³éæ¶åçå¼å¸¸ VMWareHTTpWrite. Exceptionï¼%s" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "æ æ³å¯¼å ¥ sudsã" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "å¿ é¡»æå® vmwareapi_wsdl_loc" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "VI SDK没ææä¾è¿æ ·çSOAPæ¹æ³ â%sâ" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "å¨ %s ä¸åç httplib éè¯¯ï¼ " + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "å¨ %s 奿¥åä¸åçé误 " + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "å¨%séåçç±»åéè¯¯ï¼ " + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "å¨ %s åçå¼å¸¸ " + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "è·åå®ä¾å表" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "æ»å ±è·å¾ %s 个å®ä¾" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "æ æ³å¾å°æ¬å°çåå¨å¼ç¨" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "å¨ESX主æºä¸å建å为 %s çèææº" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "å·²ç»å¨ESX主æºä¸å建å为 %s çèææº" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" +"å建 %(vmdk_file_size_in_kb)s KB 大çèæç£çåéé å¨ç±»å %(adapter_type)s å¨ESX主æºçæ¬å°åå¨ " +"%(data_store_name)s ä¸" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "å建 %(vmdk_file_size_in_kb)s KB 大çèæç£çå¨ESX主æºçæ¬å°åå¨ %(data_store_name)s ä¸" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "å 餿件 %(flat_uploaded_vmdk_path)s å¨ESX主æºçæ¬å°åå¨ %(data_store_name)s ä¸" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "å 餿件 %(flat_uploaded_vmdk_path)s å¨ESX主æºçæ¬å°åå¨ %(data_store_name)s ä¸" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "ä¸è½½æä»¶æ°æ® %(image_ref)s å°ESX主æºçæ°æ®åå¨ %(data_store_name)s ä¸" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "å·²ç»ä¸è½½éåæä»¶æ°æ® %(image_ref)s å¨ESXæ°æ®åå¨ %(data_store_name)s ä¸" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "æ£å¨éæ°é ç½®èææºå®ä¾ %s æ¥éå éåç£ç" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "å·²ç»éæ°é ç½®èææºå®ä¾ %s æ¥éå äºéåç£ç" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "æ£å¯å¨èææºå®ä¾ %s" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "å·²ç»å¯å¨èææºå®ä¾ %s" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "æ£å¨åå»ºèææºå®ä¾å¿«ç § %s " + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "å·²ç»åå»ºèææºå®ä¾å¿«ç § %s " + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "æ£å¨å¿«ç §èææºå®ä¾ %s ä¹åå¤å¶ç£çæ°æ®" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "å·²ç»å¨å¿«ç §èææºå®ä¾ %s ä¹åå¤å¶ç£çæ°æ®" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "ä¸ä¼ éå %s" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "å·²ç»ä¸ä¼ éå %s" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "æ£å¨å é¤ä¸´æ¶çvmdkæä»¶ %s" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "å·²ç»å é¤ä¸´æ¶çvmdkæä»¶ %s" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "å®ä¾æªå¯å¨" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "æ£å¨éå¯èææºå®¢æ·æä½ç³»ç» %s" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "å·²ç»éå¯èææºå®¢æ·æä½ç³»ç» %s" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "æ£å¨å·å¯å¨èææº %s" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "å·²ç»å·å¯å¨èææº %s" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "å®ä¾ - %s ä¸åå¨" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "æ£å¨å ³éèææº %s" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "å ³éèææº %s" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "æ£å¨æ³¨éèææº %s" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "å·²ç»æ³¨éèææº %s" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "注éèææºæ¶å¨ vmwareapi:vmops:destroy ä¸åçå¼å¸¸ï¼%s" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "æ£å¨å é¤èææº %(name)s çå 容ä½ç½®å¨æ°æ®åå¨ %(datastore_name)s ä¸" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "å·²ç»å é¤èææº %(name)s çå æªç¥å¨æ°æ®åå¨ %(datastore_name)s ä¸" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "å½ä»ç£çå é¤èææºçå 容æ¶å¨ vmwareapi:vmops:destroy éåçå¼å¸¸ï¼%s" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "vmwareapi 䏿¯ææå" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "vmwareapi 䏿¯æåæ¶æå" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "æèµ·èææº %s " + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "å·²ç»æèµ·èææº %s " + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "å®ä¾å·²å ³éï¼æ æ³æèµ·ã" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "èææº %s å·²ç»å¨æèµ·ç¶æãä¸å任使ä½ç´æ¥è¿å" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "æ£å¨æ¢å¤èææº %s" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "å·²ç»æ¢å¤èææº %s " + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "å®ä¾ä¸å¨æèµ·ç¶æ" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "get_diagnostics 没æå¨ vmwareapi éå®ç°" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "æ£å¨éæ°é ç½®å®ä¾ %(name)s æ¥è®¾ç½®æºå¨çid为ip - %(ip_addr)s" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "å·²ç»éæ°é ç½®èææºå®ä¾ %(name)s æ¥è®¾ç½®æºå¨çid为ip - %(ip_addr)s" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "æ£å¨ä½¿ç¨è·¯å¾ %s å建ç®å½" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "å·²ç»å建路å¾ä¸º %s çç®å½" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "æ£å¨ä»glanceéåæå¡å¨ä¸ä¸è½½éå %s" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "å·²ç»ä»glanceéåæå¡å¨ä¸ä¸è½½éå %s" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "æ£å¨åGlanceéåæå¡å¨ä¸ä¼ éå %s" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "å·²ç»åGlanceéåæå¡å¨ä¸ä¼ äºéå %s" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "æ£å¨è·åéå %s ç大å°" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "è·å¾å¤§å°ä¸º %(size)s çéåç®çä¸ºäº %(image)s" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "产ç NotImplemented é误" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "xenapi.fake 没æ %s çå®ç°" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "æ£å¨è°ç¨ %(localname)s %(impl)s" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "è°ç¨ getter %s" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "xenapi.fake 没æ %s çå®ç°æè è°ç¨æ¶ç¨äºé误æ°ç®çåæ°" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "æ æ³ä¸ºä¸»æºå¾å°åå¨åºï¼%s" + +#: cinder/virt/xenapi/host.py:169 +#, fuzzy, python-format +msgid "Unable to get updated status" +msgstr "æ æ³å¾å°ææ°çç¶æï¼%s" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "对 %(method)s çè°ç¨è¿åé误ï¼%(e)sã" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "åç°ä¸å¯ä¸çç½ç» name_label %s" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "åç°æ¡¥ %s çç½ç»ä¸å¯ä¸" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "åç°ç½æ¡¥ %s 没æç½ç»" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, fuzzy, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "æ æ³æ¾å°å®ä¾ %s ç宿主æº" + +#: cinder/virt/xenapi/pool.py:162 +#, fuzzy, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "æ³¨å ¥æä»¶å¤±è´¥ï¼%(resp)r" + +#: cinder/virt/xenapi/pool.py:174 +#, fuzzy, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "æ æ³ä½¿ç¨å ¨å±è§è² %(role_id)s" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "æ²¡ææ¾å°è®¾å¤ %s çPIF" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" +"ç½ç» %(bridge)s ç PIF %(pif_rec['uuid'])s æVLAN id %(pif_vlan)dãæå¾ çæ°ç®æ¯ " +"%(vlan_num)d" + +#: cinder/virt/xenapi/vm_utils.py:218 +#, fuzzy, python-format +msgid "Created VM" +msgstr "_create: %s" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "没æå¨å®ä¾ %s æ¾å°VBD" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, fuzzy, python-format +msgid "VBD %s already detached" +msgstr "å·²ç»å离" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "æ æ³ç§»é¤ VBD %s" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "æ æ³éæ¯ VBD %s" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, fuzzy, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "å建äºVBD %(vbd_ref)s ç®çæ¯ä¸ºäºèææº %(vm_ref)sï¼VDI %(vdi_ref)s" + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "å建äºVBD %(vbd_ref)s ç®çæ¯ä¸ºäºèææº %(vm_ref)sï¼VDI %(vdi_ref)s" + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "æ æ³éæ¯ VDI %s" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" +"åå»ºäº VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s) ä½ç½®å¨" +" %(sr_ref)sã" + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "å¤å¶äº VDI %(vdi_ref)s ï¼å¯¹è±¡æ¥èªVDI %(vdi_to_copy_ref)s ï¼ä½ç½®å¨ %(sr_ref)sã" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "å éäº VDI %(vdi_ref)s 对象æ¥èªVDI %(vdi_to_clone_ref)s" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, fuzzy, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "æªæ¾å° %(vm_ref)s ç主VDI" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, fuzzy, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "æ£å¨ä¸ºèææº %(vm_ref)s åå¿«ç §ï¼éç¨æ ç¾æ¯ â%(label)sâ" + +#: cinder/virt/xenapi/vm_utils.py:392 +#, fuzzy, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "å·²ç»å建äºå¿«ç § %(template_vm_ref)s å¿«ç §å¯¹è±¡æ¯èææº %(vm_ref)sã" + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "请æ±xapi ä¸ä¼ %(vdi_uuids)s ä½ä¸ºéåID %(image_id)s" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "åªè½å¨extç±»åçç¼ºçæ¬å°åå¨åºæ¯æå¿«éå éãè¿ä¸ªç³»ç»çåå¨åºç±»å为 %(sr_type)sãå¿½ç¥æ¤ cow æ è®°ã" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "è¯·æ± xapi è·å vhd éå %(image)s" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "xapi 'download_vhd' è¿åâ%(vdi_type)sâç±»åçVDIï¼å ¶UUID为 â%(vdi_uuid)sâ" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "image_size_bytes=%(size_bytes)dï¼allowed_size_bytes=%(allowed_size_bytes)d" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "éåå¤§å° %(size_bytes)d è¶ è¿instance_typeæå 许çå°å¤§ %(allowed_size_bytes)d" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, fuzzy, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "è·åéå %(image)s" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, fuzzy, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "éå %(image)s ç大å°ï¼%(virtual_size)d" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "å æ ¸/å åçéå太大ï¼%(vdi_size)d åèï¼æå¤§ %(max_size)d åè" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "å°VDI %s å¤å¶å°dom0ç/boot/guestä¸" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "å æ ¸/å åç VDI %s 已鿝" + +#: cinder/virt/xenapi/vm_utils.py:895 +#, fuzzy, python-format +msgid "Failed to fetch glance image" +msgstr "å®ä¾ %sï¼è·åGlanceéå失败" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "æ£æµå° %(image_type_str)s æ ¼å¼ï¼ç®æ æ¯éå %(image_ref)s" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "为PVå æ ¸æ¥è¯¢vdi %s" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "æªç¥çéåæ ¼å¼ %(disk_image_type)s" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "VDI %s ä¾ç¶å¯ç¨" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "(VM_UTILS) xenserver èææºç¶æ -> |%s|" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "(VM_UTILS) xenapi power_state -> |%s|" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "éæ°æ«æåå¨åº %s" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "æ è®°sr_matching_filter '%s' 没æéµå¾ªæ ¼å¼è¦æ±" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "XenAPIæ æ³æ¾å°å®è£ 客æ·å®ä¾çåå¨åºãè¯·æ£æ¥ä½ çé ç½®æè é ç½®æ è®°'sr_matching_filter'" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "æ æ³æ¾å°content-type ISOçåå¨åº" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "ISOï¼æ£å¨æ¥çåå¨åº %(sr_rec)s" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "ISOï¼éisoå 容" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "ISOï¼iso content_typeï¼æ²¡æ 'i18n-key' é®" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "ISOï¼iso content_typeï¼i18n-keyçå¼ä¸æ¯ 'local-storage-iso'" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "ISO: åå¨åºç¬¦åæ å" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "ISO: ISO, æ£å¨æ¥çæ¯å¦æ¯æ¬å°ç主æº" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "ISO: PBD %(pbd_ref)s æ¶å¤±äº" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "ISO: PBDå¹é , æ³è¦ %(pbd_rec)s, ç®åæ %(host)s" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "ISOï¼å«ææ¬å°PBDçåå¨åº" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "æ æ³ä¸ºå«æå¡å¨è¯¦ç»ä¿¡æ¯çèææº %(vm_uuid)s è·åRRD XMLï¼%(server)sã" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "æ æ³è·åå 嫿å¡å¨è¯¦ç»æ åµçRRD XMLæ´æ°ï¼%(server)sã" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "æ¥èªXenserveræ æçç»è®¡æ°æ®ï¼%s" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "VHD %(vdi_uuid)s æç¶ %(parent_ref)s" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "ç¶æ è¯ %(parent_uuid)s ååå çç¶æ è¯ %(original_parent_uuid)s ä¸å¹é ï¼æ£å¨çå¾ åå¹¶..." + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "VHD coalesce å°è¦è¶ è¿(%(max_attempts)d)ï¼æ¾å¼ä¸..." + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "çå¾ è®¾å¤ %s åå»ºè¶ æ¶" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "æå ¥VBD %s... " + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "æå ¥VBD %s 宿ã" + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "VBD %(vbd_ref)s ä½ä¸º %(orig_dev)s æå ¥" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "VBD %(vbd_ref)s æå ¥é误ç设å¤ï¼éæ°æ å°ä¸º %(dev)s" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "æ£å¨éæ¯VDI为 %s ç VBD " + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "å·²ç»éæ¯VDI为 %s ç VBD" + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "对 %s è¿è¡pygrub" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "æ¾å°Xenå æ ¸ %s" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "æ²¡ææ¾å°Xenå æ ¸ãæ£å¨å¯å¨HVMã" + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "ååºï¼" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr " %(num)s: %(ptype)s %(size)d sectors" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "å°ååºè¡¨ %(primary_first)d %(primary_last)d åå ¥å° %(dev_path)s..." + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "宿åå ¥ååºè¡¨ %s ã" + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "å®è£ å¨è¯¥éåçXenServerå·¥å ·å¯ä»¥è¿è¡ç½ç»æ³¨å ¥ãç½ç»æä»¶ä¸ä¼è¢«æä½ã" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "该éåæXenServerå·¥å ·ï¼ä½æ¯ä¸è½è¿è¡ç½ç»æ³¨å ¥" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "没æå¨è¯¥éåä¸å®è£ XenServerå·¥å ·" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "ç´æ¥æä½æ¥å£æä»¶" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "æè½½æä»¶ç³»ç»å¤±è´¥(ææçæ¯éLinuxå®ä¾)ï¼%s" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, fuzzy, python-format +msgid "Updating progress to %(progress)d" +msgstr "å°å®ä¾ '%(instance_uuid)s' çè¿åº¦æ´æ°å° %(progress)d" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "å°è¯è¿å¯å¨ä¸åå¨çå®ä¾ï¼å®ä¾çid %s 䏿£ç¡®" + +#: cinder/virt/xenapi/vmops.py:233 +#, fuzzy +msgid "Starting instance" +msgstr "æ£å¨å¯å¨èææº" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "ä» dom0 ä¸ç§»é¤å æ ¸/å åçæä»¶" + +#: cinder/virt/xenapi/vmops.py:358 +#, fuzzy +msgid "Failed to spawn, rolling back" +msgstr "卿°æ®åºæ´æ°å·å¤±è´¥" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +#, fuzzy, python-format +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "æ£å¨èªå¨é ç½®å®ä¾ %(instance_uuid)s çç£çï¼å°è¯è°æ´ååºå¤§å°..." + +#: cinder/virt/xenapi/vmops.py:515 +#, fuzzy, python-format +msgid "Invalid value for injected_files: %r" +msgstr "injected_filesæ æçå¼ï¼'%s'" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "æ³¨å ¥æä»¶è·¯å¾ï¼'%s'" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "设置管çåå¯ç " + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "éç½®ç½ç»" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "设置VCPU æé" + +#: cinder/virt/xenapi/vmops.py:544 +#, fuzzy +msgid "Starting VM" +msgstr "éå¯xvp" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "%(hypervisor)s/%(os)s/%(architecture)s ææ°çagent build æ¯ %(version)s çæ¬" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "æ²¡ææ¾å° %(hypervisor)s/%(os)s/%(architecture)s ç代çå建" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "æ¥è¯¢ä»£ççæ¬" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "å®ä¾ä»£ççæ¬ï¼%s" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "æä»£çæ´æ°ä¸º %s" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "æ æ³ä¸º '%s' ç¡®å®opaque_refã" + +#: cinder/virt/xenapi/vmops.py:670 +#, fuzzy, python-format +msgid "Finished snapshot and upload for VM" +msgstr "å¿«ç §å®æ¯å¹¶ä¸ºèææº %s ä¸ä¼ " + +#: cinder/virt/xenapi/vmops.py:677 +#, fuzzy, python-format +msgid "Starting snapshot for VM" +msgstr "å¼å§ä¸ºèææº %s å¿«ç §" + +#: cinder/virt/xenapi/vmops.py:686 +#, fuzzy, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "æ æ³ä¸ºå®ä¾ %(instance_uuid)s å¿«ç §ï¼%(exc)s" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "å° vhd è½¬ç§»å°æ°ä¸»æºå¤±è´¥" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "å° VDI %(cow_uuid)s ç± %(old_gb)dGB è°å°å° %(new_gb)dGB" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "å° VDI %(vdi_uuid)s ç± %(old_gb)dGB è°å¤§å° %(new_gb)dGB" + +#: cinder/virt/xenapi/vmops.py:901 +#, fuzzy, python-format +msgid "Resize complete" +msgstr "è°æ´å®ä¾ %s ç大å°å®æ¯" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "æ¥è¯¢ä»£ççæ¬å¤±è´¥ï¼%(resp)r" + +#: cinder/virt/xenapi/vmops.py:949 +#, fuzzy, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "domid ç± %(olddomid)s æ¹å为 %(newdomid)s" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "æ´æ°ä»£ç失败ï¼%(resp)r" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "交æ¢é¥å失败ï¼%(resp)r" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "æ´æ°å¯ç 失败ï¼%(resp)r" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "æ³¨å ¥æä»¶å¤±è´¥ï¼%(resp)r" + +#: cinder/virt/xenapi/vmops.py:1032 +#, fuzzy, python-format +msgid "VM already halted, skipping shutdown..." +msgstr "èææº %(instance_uuid)s å·²ç»ç»æ¢ï¼è·³è¿å ³é..." + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "æ æ³ä¸ºèææºæ¾å°VBD" + +#: cinder/virt/xenapi/vmops.py:1097 +#, fuzzy, python-format +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "å®ä¾ %(instance_uuid)s 使ç¨RAWæè VHDï¼è·³è¿å æ ¸åå åççå é¤" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "å®ä¾æ¥æå æ ¸æè å åçï¼ä½ä¸æ¯äºè åæ" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "å æ ¸/å åçæä»¶ç§»é¤äº" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +#, fuzzy +msgid "Destroying VM" +msgstr "éå¯xvp" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "èææºä¸åå¨ï¼è·³è¿éæ¯..." + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "å®ä¾å·²å¤äºææ´æ¨¡å¼ï¼%s" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "æ¾å°%(instance_count)dä¸ªè¶ è¿%(timeout)dç§æ¬æçéå¯" + +#: cinder/virt/xenapi/vmops.py:1300 +#, fuzzy, python-format +msgid "Automatically hard rebooting" +msgstr "èªå¨å·éå¯ %d" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, fuzzy, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "为å®ä¾ %(instance_uuid)s å ³éèææº" + +#: cinder/virt/xenapi/vmops.py:1379 +#, fuzzy, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "æ²¡ææ¾å°å®ä¾ %(instance_id)s" + +#: cinder/virt/xenapi/vmops.py:1383 +#, fuzzy +msgid "In ERROR state" +msgstr "èç¹å¤äºæªç¥çéè¯¯ç¶æã" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "æ æ³å¾å°å¸¦å®½ä¿¡æ¯" + +#: cinder/virt/xenapi/vmops.py:1469 +#, fuzzy, python-format +msgid "Injecting network info to xenstore" +msgstr "ä¸ºèææºæ³¨å ¥ç½ç»ä¿¡æ¯å°xsï¼|%s|" + +#: cinder/virt/xenapi/vmops.py:1483 +#, fuzzy +msgid "Creating vifs" +msgstr "æ£å¨å建éå" + +#: cinder/virt/xenapi/vmops.py:1492 +#, fuzzy, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "æ£å¨ä¸ºèææº %(vm_ref)sï¼ç½ç» %(network_ref)s å建VIFã" + +#: cinder/virt/xenapi/vmops.py:1495 +#, fuzzy, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "æ£å¨ä¸ºèææº %(vm_ref)sï¼ç½ç» %(network_ref)s å建VIFã" + +#: cinder/virt/xenapi/vmops.py:1520 +#, fuzzy, python-format +msgid "Injecting hostname to xenstore" +msgstr "ä¸ºèææºæ³¨å ¥hostnameå°xsï¼|%s|" + +#: cinder/virt/xenapi/vmops.py:1545 +#, fuzzy, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" +"%(method)s ç代çè°ç¨è¿åæ æçååºï¼%(ret)rãèææºid=%(instance_uuid)s; path=%(path)s; " +"args=%(addl_args)r" + +#: cinder/virt/xenapi/vmops.py:1566 +#, fuzzy, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "è¶ æ¶ï¼è°ç¨ %(method)s è¶ æ¶ãèææºid=%(instance_uuid)s; args=%(args)r" + +#: cinder/virt/xenapi/vmops.py:1570 +#, fuzzy, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "æ²¡ææ§è¡ï¼ä»£ç䏿¯æ %(method)s çè°ç¨ãèææºid=%(instance_uuid)s; args=%(args)r" + +#: cinder/virt/xenapi/vmops.py:1575 +#, fuzzy, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "对 %(method)s çè°ç¨è¿åé误ï¼%(e)sã" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "OpenSSLé误ï¼%s" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "å¨volume_utilså建åå¨åº" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "ç±»åis = %s" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "name = %s" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "å° %(label)s ä½ä¸º %(sr_ref)s å建ã" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "æ æ³å建åå¨åº" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "å¨volume_utilséå¼å ¥sr" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "å° %(label)s ä½ä¸º %(sr_ref)s å¼å ¥ã" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "为åå¨åºå建pbd" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "æå ¥åå¨åº" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "æ æ³å¼å ¥åå¨åº" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "æ æ³å¾å°ä½¿ç¨uuidçåå¨åº" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "éå¿åå¨åº %s..." + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "æ æ³éå¿Storage Repository" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "å¼å ¥ %s..." + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "æ æ³å¨VBD %sæ¾å°åå¨åº" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "å¼å¸¸ %(exc)s å¨ä¸º %(sr_ref)s å¾å°PBDsæ¶è¢«å¿½ç¥" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "å¼å¸¸ %(exc)s 卿å¼PBD %(pbd)s æ¶è¢«å¿½ç¥" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "æ æ³å¨åå¨åº %s ä¸å¼å ¥VDI" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "æ æ³ä½¿å¾VDI %s çè®°å½è¿è¡" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "æ æ³ä¸ºåå¨åº %s å¼å ¥VDI" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "å¨åå¨åº %s 寻æ¾VDIsåºé" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "æ æ³ä¸ºVDI %s æ¾å°VBD" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "æ æ³è·å¾ç®æ ä¿¡æ¯ %(data)s, %(mountpoint)s" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "æè½½ç¹æ æ³è¢«ç¿»è¯ï¼%s" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "æ¾ä¸å°VDI ref" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "æ£å¨å建åå¨åº %s" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "æ æ³å建åå¨åº" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "æ æ³è·ååå¨åºè®°å½" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "å¼å ¥åå¨åº %s" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "å¨xapiæ°æ®åºæ¾å°åå¨åºãæ éå¼å ¥ã" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "æ æ³å¼å ¥åå¨åº" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "æ£æ¥åå¨åº %s" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "å¨xapiæ°æ®åºæ²¡ææ¾å°åå¨åº %s" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "ä¸è½éå¿åå¨åº" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "æ æ³å¨åå¨åº %(sr_ref)s ä¸ä¸ºå®ä¾ %(instance_name)s å建 VDI" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "åå¨åº %(sr_ref)s ä¸è½ä¸ºå®ä¾%(instance_name)s使ç¨" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "æ æ³éå å·å°å®ä¾ %s" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "æè½½ç¹ %(mountpoint)s éå å°å®ä¾ %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "å离_volume: %(instance_name)s, %(mountpoint)s" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "æ æ³æ¾å° %s å·" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "æ æ³å离 %s å·" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "æ æ³éæ¯VBD %s" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "åååå¨åº %s åºé" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "æè½½ç¹ %(mountpoint)s ä»å®ä¾ %(instance_name)s å离" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "æ¡æåºéï¼%s" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "æ æç请æ±ï¼%s" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "请æ±ï¼%s" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "请æ±ç¼ºå°ä»¤çï¼%s" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "请æ±ä¸ææ æä»¤çï¼%s" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "æå¤é误ï¼%s" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "å¯å¨cinder-xvpvncproxyèç¹(çæ¬ %s)" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "ç¶æå¿ é¡»å¯ç¨" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "%(pid)s çé é¢è¶ åºï¼å°è¯å建 %(size)sG çå·" + +#: cinder/volume/api.py:137 +#, fuzzy +msgid "Volume status must be available or error" +msgstr "å·ç»ç¶æå¿ é¡»å¯è·å" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "å·²ç»éå " + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "å·²ç»å离" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "å¿ é¡»å¯ç¨" + +#: cinder/volume/api.py:325 +#, fuzzy +msgid "Volume Snapshot status must be available or error" +msgstr "å·ç»ç¶æå¿ é¡»å¯è·å" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "ä»å¤±è´¥çæ§è¡ä¸æ¢å¤ãå°è¯ç¼å· %s" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "å·ç» %s ä¸åå¨" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "è·³è¿ensure_exportãæ²¡æä¸ºå·æä¾iscsi_targetï¼%d" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "è·³è¿remove_exportãæ²¡æä¸ºå·æä¾iscsi_targetï¼%d" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "è·³è¿remove_exportãæ²¡æä¸ºå·å¯¼åºiscsi_targetï¼%d" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "éç¨discoveryï¼ISCSI provider_location 没æåå¨" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "æ æ³ä¸ºå· %s æ¾å° iSCSI 导åº" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "ISCSI Discoveryï¼æ¾å° %s" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "æ æ³ç¡®è®¤å¯¼åºçå·idï¼%(volume_id)sã" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "FAKE ISCSI: %s" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "RBDæ²¡ææ± %s" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "Sheepdog 没æå·¥ä½ï¼%s" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "Sheepdog 没æå·¥ä½" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "LoggingVolumeDriver: %s" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "鿰坼åºå·%s" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "å· %sï¼è·³è¿å¯¼åº" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "å· %s: å建ä¸" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "å·%(vol_name)s:å建大å°ä¸º%(vol_size)sçé»è¾å·" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "å·%sï¼æ£å¨å建导åº" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "å·%sï¼å建æå" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "å·ä»å¨éå ä¸" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "å·ä¸å±äºè¿ä¸ªèç¹" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "å·%sï¼æ£å¨ç§»é¤å¯¼åº" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "å·%sï¼å é¤ä¸" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "å· %sï¼å·ç¹å¿" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "å·%sï¼å 餿å" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "å¿«ç § %sï¼æ£å¨å建" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "å¿«ç § %(snap_name)sï¼æ£å¨å建" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "å¿«ç § %sï¼å建æå" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "å¿«ç § %sï¼æ£å¨å é¤" + +#: cinder/volume/manager.py:214 +#, fuzzy, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "å¿«ç § %sï¼å建æå" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "å¿«ç § %sï¼å 餿å" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "æ£æ¥å·è½å" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "æ¾å°æ°è½åï¼%s" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "æ¸ çè½å" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "æ¶å°éç¥ {%s}" + +#: cinder/volume/netapp.py:79 +#, fuzzy, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "éå %(image_id)s æ æ³æ¥åï¼åå æ¯ï¼ %(reason)s" + +#: cinder/volume/netapp.py:109 +#, fuzzy, python-format +msgid "%s is not set" +msgstr "ç§æ·ID没æè®¾" + +#: cinder/volume/netapp.py:128 +#, fuzzy, python-format +msgid "Connected to DFM server" +msgstr "è¿æ¥å° %s çAMQPæå¡å¨" + +#: cinder/volume/netapp.py:159 +#, fuzzy, python-format +msgid "Job failed: %s" +msgstr "æªç¥çåºæä»¶ï¼%s" + +#: cinder/volume/netapp.py:240 +#, fuzzy +msgid "Failed to provision dataset member" +msgstr "æ´æ°æ°æ®åºå¤±è´¥" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, fuzzy, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "æ æ³ä¸ºVDI %s æ¾å°VBD" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, fuzzy, python-format +msgid "No LUN ID for volume %s" +msgstr "æ æ³ä¸ºå· %s æ¾å° iSCSI 导åº" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, fuzzy, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "为ipï¼ %sè·åå æ°æ®å¤±è´¥" + +#: cinder/volume/netapp.py:614 +#, fuzzy, python-format +msgid "Failed to get host details for host ID %s" +msgstr "为ipï¼ %sè·åå æ°æ®å¤±è´¥" + +#: cinder/volume/netapp.py:620 +#, fuzzy, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "为ipï¼ %sè·åå æ°æ®å¤±è´¥" + +#: cinder/volume/netapp.py:625 +#, fuzzy, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "为ipï¼ %sè·åå æ°æ®å¤±è´¥" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "æå®san_passwordæè san_private_key" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "san_ipå¿ é¡»è®¾ç½®" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "没æä¸º %(zfs_poolname)s æ¾å°LUIDãOutput=%(out)s" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "è¿åCLIQå½ä»¤ %s" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "CLIQå½ä»¤ %(verb)s %(cliq_args)s éè¯¯æ ¼å¼çååºãResult=%(out)s" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "å¨è¿è¡CLIQå½ä»¤ %(verb)s %(cliq_args)s æ¶åçé误ãè¾åºç»æ Result=%(out)s" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "é群 %(cluster_name)s ææå¤æ°éçèæ ip å°åãè¾åºç»æ Result=%(_xml)s" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "å·ä¿¡æ¯ï¼%(volume_name)s => %(volume_attributes)s" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "䏿¯ælocal_path" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "æ æ³ä¸ºå· %s ç¡®å®é¡¹ç®ï¼æ æ³å¯¼åº" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "SolidFire API è°ç¨çåæ°ï¼%s" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "è°ç¨ json.loads() å¼èµ·å¼å¸¸ï¼%s" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "SolidFire APIè°ç¨ç»æï¼%s" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "æ¾å°solidfire叿·ï¼%s" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "solidfire叿·ï¼%s ä¸åå¨ï¼æ£å¨å建..." + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "è¿å ¥SolidFire create_volume..." + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "离å¼SolidFire create_volume" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "è¿å ¥SolidFire delete_volume..." + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "æ£å¨å é¤volumeIDï¼%s " + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "离å¼SolidFire delete_volume" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "æ£å¨æ§è¡SolidFire ensure_export..." + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "æ£å¨æ§è¡SolidFire create_export..." + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "nameä¸è½æ¯None" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "idä¸è½æ¯None" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "åå¨åº name = %s" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "åæ°ï¼%s" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "å建åå¨åº %s失败... ç»§ç»" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "å建失败" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "æ°åå¨åºçåå¨åº UUIDï¼%s" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "æ´æ°æ°æ®åºå¤±è´¥" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "å¼å ¥åå¨åº %s 失败... ç»§ç»" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "å°è¾¾åå° %d 失败" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "XenSMDriverè¦æ±xenapiè¿æ¥" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "åå§åä¼è¯å¤±è´¥" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "å·ä¼å¨åå°å建 - %d" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "卿°æ®åºæ´æ°å·å¤±è´¥" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "æ æ³å建å·" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "å é¤VDI失败" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "卿°æ®åºå é¤å·å¤±è´¥" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "没æå¨æ°æ®åºæ¾å°å·" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "没æå¨æ°æ®åºä¸æ¾å°åå°(backend)" + +#: cinder/volume/nexenta/__init__.py:27 +#, fuzzy, python-format +msgid "Nexenta SA returned the error" +msgstr "æå¡å¨è¿åé误ï¼%s" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, fuzzy, python-format +msgid "Sending JSON data: %s" +msgstr "ç»å®æ°æ®ï¼%s" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +#, fuzzy +msgid "Bad response from server" +msgstr "æ¥èªSolidFire APIçé误ååº" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, fuzzy, python-format +msgid "Got response: %s" +msgstr "ååº %s" + +#: cinder/volume/nexenta/volume.py:96 +#, fuzzy, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "å·ç» %s ä¸åå¨" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "æªæå®Cinder访é®åæ°ã" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "æ æ³æ¾å°èæåå¨éµå %(id)dã" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "æ æ³æ¾å°èæåå¨éµå %(name)sã" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "ç¶ç»idåç»idä¸è½ä¸æ ·" + +#~ msgid "No body provided" +#~ msgstr "没ææä¾ä¸»ä½" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "å建VSA %(display_name)s ç±»åæ¯ %(vc_type)s" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "å é¤idï¼%sçVSA" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "æå°å %(ip)s ä¸VSA %(id)så ³è" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "åæ¶å°åä¸VSA %(id)så ³è" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "æ²¡ææ¾å° %(obj)s 该对象çIDæ¯ %(id)s" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "%(obj)s çIDæ¯ %(id)s å®å±äºVSA %(own_vsa_id)sè䏿¯VSA %(vsa_id)sã" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "ç´¢å¼ãvsa_id=%(vsa_id)s" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "详ç»å 容ãvsa_id=%(vsa_id)s" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "å建å·ãvsa_id=%(vsa_id)s, body=%(body)s" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "å建 %(size)s GBçå·æ¥æºæ¯VSA ID %(vsa_id)s" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "æ´æ°%(obj)sè³idï¼%(id)s ï¼ä¿®æ¹ï¼%(changes)s" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "å é¤å·ãvsa_id=%(vsa_id)s, id=%(id)s" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "æ¾ç¤ºå·ãvsa_id=%(vsa_id)s, id=%(id)s" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "为 VSA %s ç´¢å¼å®ä¾" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "åå¤å¼ºå¶å é¤èææº %(instance_uuid)sï¼å³ä½¿å·²ç»å é¤äºã" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "æ°æ®åºä¸ä¸åå¨å®ä¾ %(instance_uuid)sï¼ä½æ¯æ 论å¦ä½è¦ç¨ç¹æ®ä¸ä¸ææ¥å ³éã" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "å°è¯éæ¯å·²ç»éæ¯çå®ä¾: %s" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "æ æ³ä¸ä¸¢å¤±æ°æ®å°é级" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "%(fl_host)s:%(fl_port)dä¸çAMQPæå¡å¨ä¸å¯è¾¾ï¼%(e)sã %(fl_intv)d ç§éååå°è¯ã" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "%(tries)d 次å°è¯åä¾ç¶æ æ³è¿æ¥å°AMQPæå¡å¨ãæ£å¨å ³éã" + +#~ msgid "Reconnected to queue" +#~ msgstr "éæ°è¿æ¥éå" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "ä»éåè·åæ¶æ¯å¤±è´¥ï¼%s" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "为%såå§åéé 卿¶è´¹è (Adapter Consumer)" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "\"%(exchange)s\" fanout exchangeç¨è·¯ç±å¯é¥ \"%(key)s\" å建ç" + +#~ msgid "Exception while processing consumer" +#~ msgstr "å¤çæ¶è´¹è åºç°å¼å¸¸" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "æ£å¨å建 \"%(exchange)s\" fanout exchange" + +#~ msgid "topic is %s" +#~ msgstr "䏻颿¯ %s" + +#~ msgid "message %s" +#~ msgstr "æ¶æ¯ %s" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "æ æ³ç¡®è®¤tmpfile %(ipath)s å¨ç¸åçå ±äº«åå¨ç %(src)s å %(dest)sä¹é´ã" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "_filter_hosts: %(request_spec)s" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "æç §é©±å¨ç±»å %s è¿æ»¤ä¸»æº" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "ä¸»æº %s 没æè¶³å¤ç容éãè·³è¿" + +#~ msgid "Filter hosts: %s" +#~ msgstr "è¿æ»¤ä¸»æºï¼%s" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "å¿ é¡»å®ç°ä¸»æºéæ©æºå¶" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "æéæ©ä¸»æºçæå¤§æ°ç®(%d)" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "éæ©è¶ è¿äºä¸»æº %(host)s" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "æä¾å· %(name)s å®ç大å°ä¸º %(size)s ä½ç½®å¨ä¸»æº %(host)s" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "volume_params %(volume_params)s" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "%(i)dï¼å·å%(name)s" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "æ£å¨å°è¯ç产 %(num_volumes)d 个å·" + +#~ msgid "Error creating volumes" +#~ msgstr "å建å·å¤±è´¥" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "Non-VSA å· %d" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "æ£å¨çäº§å· %(volume_id)s å®ç驱å¨ç±»å为 %(drive_type)s" + +#~ msgid "Error creating volume" +#~ msgstr "å建å·å¤±è´¥" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "没æè½ååé 大å°ä¸º %(size)s çå·" + +#~ msgid "Host %s:" +#~ msgstr "ä¸»æº %sï¼" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" +#~ "\té©±å¨ %(qosgrp)-25sï¼æ»å ± %(total)2sï¼å·²ç¨ %(used)2sï¼" +#~ " ç©ºé² %(free)2sãå¯ç¨ %(avail)-5s" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "\t [ tab] LeastUsedHostï¼æä½³ä¸»æºï¼ %(best_host)sã(使ç¨çç©ºé´ %(min_used)s)" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "\t MostAvailCapï¼æä½³ä¸»æºï¼ %(best_host)sã (å¯ç¨ %(max_avail)s %(type_str)s)" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "(%(nm)s) åå¸ (é®ï¼%(routing_key)s) %(message)s" + +#~ msgid "Publishing to route %s" +#~ msgstr "åå¸å¹¶è·¯ç±å° %s" + +#~ msgid "Declaring queue %s" +#~ msgstr "æ£å¨å£°æéå %s" + +#~ msgid "Declaring exchange %s" +#~ msgstr "æ£å¨å£°æäº¤æ¢(exchange) %s" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "æéå %(queue)s ç»å®å° %(exchange)s éç¨ç鮿¯ %(routing_key)s" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "ä»éå %(queue)s åæ¶æ¯ï¼%(message)s" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "æµè¯ï¼æ¨¡æé误ç VSA åç§°ãæåºå¼å¸¸" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "æµè¯ï¼æ¨¡ææ°æ®æµè¯ãæåº" + +#~ msgid "Test: user_data = %s" +#~ msgstr "æµè¯ï¼user_data = %s" + +#~ msgid "_create: param=%s" +#~ msgstr "_create: param=%s" + +#~ msgid "Host %s" +#~ msgstr "ä¸»æº %s" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "æµè¯ï¼å¨ä¸»æº %(host)s ä¸æä¾ %(name)s" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "\t vol=%(vol)s" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "æµè¯ï¼VSAæ´æ°è¯·æ±ï¼vsa_id=%(vsa_id)s values=%(values)s" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "æµè¯ï¼å·å建ï¼%s" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "æµè¯ï¼å·è·å请æ±ï¼id=%(volume_id)s" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "æµè¯ï¼å·æ´æ°è¯·æ±ï¼id=%(volume_id)s values=%(values)s" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "æµè¯ï¼å·è·åï¼id=%(volume_id)s" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "ä»»å¡ [%(name)s] %(task)s ç¶æï¼æå %(result)s" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "ä»»å¡ [%(name)s] %(task)s ç¶æï¼%(status)s %(error_info)s" + +#~ msgid "virsh said: %r" +#~ msgstr "virsh è¾åºï¼ %r" + +#~ msgid "cool, it's a device" +#~ msgstr "é ·ï¼è¿æ¯ä¸ªè®¾å¤" + +#~ msgid "Unable to read LXC console" +#~ msgstr "æ æ³è¯»å LXC æ§å¶å°" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" +#~ "è½¬æ¢æ xml...\n" +#~ "ï¼%s " + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "nwfilter(%(instance_secgroup_filter_name)s) æªæ¾å°" + +#~ msgid "Created VM %s..." +#~ msgstr "åå»ºèææº %s ..." + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "å·²ç»å°èææº %(instance_name)s å建æ %(vm_ref)sã" + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "æ£å¨ä¸ºèææº %(vm_ref)s å建ä¸ä¸ªç¹å®çCDROM VBDï¼ VDI %(vdi_ref)s ... " + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "å·²ç»å建äºä¸ä¸ªåºäºCDROM çVBD %(vbd_ref)sï¼ç®çæ¯ä¸ºèææº %(vm_ref)sï¼VDI %(vdi_ref)sã" + +#~ msgid "Image Type: %s" +#~ msgstr "éåç±»åï¼%s" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "ISOï¼æ¾å°å¯è½å å«è¯¥ISOéåçåå¨åº" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "æ£å¨ä¸ºVDI%så建VBD " + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "为VDI %s å建VBD宿ã" + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "VBD.unplug æä½ç¬¬ä¸æ¬¡æåã" + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "VBD.unplug æä½è¢«æç»ï¼éè¯ä¸..." + +#~ msgid "Not sleeping anymore!" +#~ msgstr "ä¸åç¡ç ï¼" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "VBD.unplug æä½æç»æåã" + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "å¨ VBD.unplug æä½ä¸å¿½ç¥XenAPI.Failureï¼%s" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "å¿½ç¥ XenAPI.Failure %s" + +#~ msgid "Starting instance %s" +#~ msgstr "å¯å¨å®ä¾ %s" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "å®ä¾ %sï¼ç产失败" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "å®ä¾ %s ç产失败 - æ£å¨è¿è¡æ¸ ç" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "å®ä¾ %sï¼ç产失败 - æ æ³åå»ºèææº" + +#~ msgid "Starting VM %s..." +#~ msgstr "å¯å¨èææº %s..." + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "ç产 VM %(instance_uuid)s 宿¯ç± %(vm_ref)s å建çã" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "å®ä¾ %sï¼çå¾ è¿è¡" + +#~ msgid "Instance %s: running" +#~ msgstr "å®ä¾ %sï¼è¿è¡" + +#~ msgid "Resources to remove:%s" +#~ msgstr "å°è¦ç§»é¤çèµæºï¼%s" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "ç§»é¤VDI %(vdi_ref)s(uuidï¼%(vdi_to_remove)s)" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "è·³è¿ %s çVDIç鿝" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "æ£å¨ä¸ºå®ä¾ %(instance_uuid)s 鿝 VDIs" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "å®ä¾ %(instance_uuid)s 鿝äº" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "æ£å¨ä¸ºå®ä¾%(instance_uuid)s éæ¯èææº" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "æ²¡ææ¾å°ä¸ºè¿ç§» %d çå®ä¾ï¼æ£å¨è·³è¿" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "æ£å¨ä¸ºèææºå建 vif(s)ï¼|%s|" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "å建VIF %(vif_ref)s æ¯ä¸ºäºèææº %(vm_ref)sï¼ç½ç» %(network_ref)sã" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "%(method)s çè°ç¨è¿åé误ï¼%(e)sãèææºid=%(instance_uuid)s; args=%(args)r" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "ä¸ºèææº %(vm_ref)s ï¼VDI %(vdi_ref)s å建VBD... " + +#~ msgid "Error destroying VDI" +#~ msgstr "鿝VDIåºé" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "\tå· %s 䏿¯VSA å·" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "\tFE VSA å· %s çå建 - ä»ä¹é½ä¸å" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "为 %s çVSA BE create_volume失败" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "为 %s çVSA BE create_volumeæå" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "\tFE VSA å· %s çå é¤ - ä»ä¹é½ä¸å" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "为 %s çVSA BE delete_volume失败" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "为 %s çVSA BE delete_volumeæå" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "\tFE VSA å· %s æ¬å°è·¯å¾è°ç¨ - è°ç¨discover" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "\tFE VSA Volume %s ç¡®ä¿å¯¼åº - ä»ä¹é½ä¸å" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "\tFE VSA Volume %s åå»ºå¯¼åº - ä»ä¹é½ä¸å" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "\tFE VSA Volume %s å é¤å¯¼åº - ä»ä¹é½ä¸å" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "为 %s çVSA BE remove_export失败" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "è·åQoSä¿¡æ¯å¤±è´¥" + +#~ msgid "drive_name not defined" +#~ msgstr "没æå®ä¹drive_name" + +#~ msgid "invalid drive type name %s" +#~ msgstr "æ æçdriveç±»ååç§° %s" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "*** ç¨äºå®éªçVSA代ç ***" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "请æ±çVCs (%d)æ°ç®è¿å¤§ã设置为é»è®¤å¼" + +#~ msgid "Creating VSA: %s" +#~ msgstr "æ£å¨å建VSAï¼%s" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" +#~ "VSA ID %(vsa_id)d %(vsa_name)sï¼åå»ºå· " +#~ "%(vol_name)sï¼%(vol_size)d GBï¼ç±»å %(vol_type_id)s" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "VSA ID %(vsa_id)dï¼æ´æ°VSAç¶æå° %(status)s" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "VSA ID %(vsa_id)dï¼æ´æ°VSAè°ç¨" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "æ·»å %(add_cnt)s VCså° %(vsa_name)sã" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "%(del_cnt)s VCs ä»VSA %(vsa_name)s ä¸å é¤ã" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "VSA ID %(vsa_id)sï¼å é¤ %(direction)s å· %(vol_name)s" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "æ æ³å é¤å· %s" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "VSA ID %(vsa_id)sï¼å¼ºè¿«å é¤ã%(direction)s å· %(vol_name)s" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "å°è¦è¯å¾ç»æ¢VSA ID %s" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "VSA ID %(vsa_id)sï¼å é¤å®ä¾ %(name)s" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "æ¶å°VSA %s çCreate call" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "æ²¡ææ¾å°VSA %(vsa_id)d" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "VSA ID %(vsa_id)sï¼Drive %(vol_id)s å建ãç¶æ %(status)s" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "Drive %(vol_name)s (%(vol_disp_name)s) ä¾ç¶å¨åå»ºé¶æ®µ - 请çå¾ " + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "VSA ID %(vsa_id)d: 䏿¯ææçå·é½åå»ºäº (%(cvol_real)d of %(cvol_exp)d)" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" +#~ "VSA ID %(vsa_id)dï¼Drive %(vol_name)s " +#~ "(%(vol_disp_name)s)å¤äº %(status)s ç¶æã" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "æ´æ°å· %(vol_name)s çéå ç¶æå¤±è´¥ã%(ex)s" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "VSA ID %(vsa_id)dï¼å 餿æBEå·" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "VSA ID %(vsa_id)dï¼å¯å¨ %(vc_count)d 个å®ä¾" + diff --git a/cinder/locale/zh_TW/LC_MESSAGES/nova.po b/cinder/locale/zh_TW/LC_MESSAGES/nova.po new file mode 100644 index 000000000..48bc07cdc --- /dev/null +++ b/cinder/locale/zh_TW/LC_MESSAGES/nova.po @@ -0,0 +1,8207 @@ +# Chinese (Traditional) translation for cinder +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the cinder package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: cinder\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-04-08 23:04+0000\n" +"PO-Revision-Date: 2012-03-07 02:00+0000\n" +"Last-Translator: Charles Hsu <charles0126+openstack@gmail.com>\n" +"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.6\n" + +#: cinder/context.py:59 +#, python-format +msgid "Arguments dropped when creating context: %s" +msgstr "" + +#: cinder/context.py:90 +#, python-format +msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" +msgstr "" + +#: cinder/crypto.py:48 +msgid "Filename of root CA" +msgstr "" + +#: cinder/crypto.py:51 +msgid "Filename of private key" +msgstr "Private key ç§é°æªæ¡å稱" + +#: cinder/crypto.py:54 +msgid "Filename of root Certificate Revocation List" +msgstr "" + +#: cinder/crypto.py:57 +msgid "Where we keep our keys" +msgstr "æåçkeysçåæ¼ä½è" + +#: cinder/crypto.py:60 +msgid "Where we keep our root CA" +msgstr "æåçæ ¹æèçåæ¼ä½è" + +#: cinder/crypto.py:63 +msgid "Should we use a CA for each project?" +msgstr "æ¯å¦éè¦ä¸åproject 使ç¨ä¸åCA" + +#: cinder/crypto.py:67 +#, python-format +msgid "Subject for certificate for users, %s for project, user, timestamp" +msgstr "" + +#: cinder/crypto.py:72 +#, python-format +msgid "Subject for certificate for projects, %s for project, timestamp" +msgstr "" + +#: cinder/crypto.py:292 +#, python-format +msgid "Flags path: %s" +msgstr "" + +#: cinder/exception.py:56 +msgid "Unexpected error while running command." +msgstr "éé æçå·è¡é¯èª¤" + +#: cinder/exception.py:59 +#, python-format +msgid "" +"%(description)s\n" +"Command: %(cmd)s\n" +"Exit code: %(exit_code)s\n" +"Stdout: %(stdout)r\n" +"Stderr: %(stderr)r" +msgstr "" +"%(description)s\n" +"å½ä»¤: %(cmd)s\n" +"éåºä»£ç¢¼: %(exit_code)s\n" +"æ¨æºè¼¸åº: %(stdout)r\n" +"æ¨æºé¯èª¤è¼¸åº: %(stderr)r" + +#: cinder/exception.py:94 +msgid "DB exception wrapped." +msgstr "" + +#: cinder/exception.py:155 +msgid "An unknown exception occurred." +msgstr "ç¼çä¸åæªç¥ä¾å¤" + +#: cinder/exception.py:178 +msgid "Failed to decrypt text" +msgstr "å §æè§£ç¢¼å¤±æ" + +#: cinder/exception.py:182 +msgid "Failed to paginate through images from image service" +msgstr "" + +#: cinder/exception.py:186 +msgid "Virtual Interface creation failed" +msgstr "建ç«èæ¬ä»é¢å¤±æ" + +#: cinder/exception.py:190 +msgid "5 attempts to create virtual interfacewith unique mac address failed" +msgstr "é£çºå試 5 次建ç«å¯ä¸ç¶²è·¯ä½ç½®(MAC)çèæ¬ä»é¢å¤±æ" + +#: cinder/exception.py:195 +msgid "Connection to glance failed" +msgstr "飿¥å°glance失æ" + +#: cinder/exception.py:199 +msgid "Connection to melange failed" +msgstr "" + +#: cinder/exception.py:203 +msgid "Not authorized." +msgstr "æªè¢«ææ¬" + +#: cinder/exception.py:208 +msgid "User does not have admin privileges" +msgstr "使ç¨è ä¸¦æ²æç®¡çè æ¬å" + +#: cinder/exception.py:212 +#, python-format +msgid "Policy doesn't allow %(action)s to be performed." +msgstr "" + +#: cinder/exception.py:216 +#, python-format +msgid "Not authorized for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:220 +msgid "Unacceptable parameters." +msgstr "ä¸å¯æ¥åç忏å¼" + +#: cinder/exception.py:225 +msgid "Invalid snapshot" +msgstr "ç¡æçå¿«ç §(snapshot)" + +#: cinder/exception.py:229 +#, python-format +msgid "Volume %(volume_id)s is not attached to anything" +msgstr "" + +#: cinder/exception.py:233 cinder/api/openstack/compute/contrib/keypairs.py:113 +msgid "Keypair data is invalid" +msgstr "ç¡æçKeypair" + +#: cinder/exception.py:237 +msgid "Failed to load data into json format" +msgstr "" + +#: cinder/exception.py:241 +msgid "The request is invalid." +msgstr "" + +#: cinder/exception.py:245 +#, python-format +msgid "Invalid signature %(signature)s for user %(user)s." +msgstr "" + +#: cinder/exception.py:249 +msgid "Invalid input received" +msgstr "" + +#: cinder/exception.py:253 +#, python-format +msgid "Invalid instance type %(instance_type)s." +msgstr "" + +#: cinder/exception.py:257 +msgid "Invalid volume type" +msgstr "" + +#: cinder/exception.py:261 +msgid "Invalid volume" +msgstr "" + +#: cinder/exception.py:265 +#, python-format +msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s" +msgstr "" + +#: cinder/exception.py:269 +#, python-format +msgid "Invalid IP protocol %(protocol)s." +msgstr "" + +#: cinder/exception.py:273 +#, python-format +msgid "Invalid content type %(content_type)s." +msgstr "" + +#: cinder/exception.py:277 +#, python-format +msgid "Invalid cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:281 +msgid "Invalid reuse of an RPC connection." +msgstr "" + +#: cinder/exception.py:285 +msgid "Invalid Parameter: Unicode is not supported by the current database." +msgstr "" + +#: cinder/exception.py:292 +#, python-format +msgid "%(err)s" +msgstr "" + +#: cinder/exception.py:296 +#, python-format +msgid "" +"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:" +" %(reason)s." +msgstr "" + +#: cinder/exception.py:301 +#, python-format +msgid "Group not valid. Reason: %(reason)s" +msgstr "" + +#: cinder/exception.py:305 +#, python-format +msgid "" +"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while" +" the instance is in this state." +msgstr "" + +#: cinder/exception.py:310 +#, python-format +msgid "Instance %(instance_id)s is not running." +msgstr "" + +#: cinder/exception.py:314 +#, python-format +msgid "Instance %(instance_id)s is not suspended." +msgstr "" + +#: cinder/exception.py:318 +#, python-format +msgid "Instance %(instance_id)s is not in rescue mode" +msgstr "" + +#: cinder/exception.py:322 +msgid "Failed to suspend instance" +msgstr "" + +#: cinder/exception.py:326 +msgid "Failed to resume server" +msgstr "" + +#: cinder/exception.py:330 +msgid "Failed to reboot instance" +msgstr "" + +#: cinder/exception.py:334 +msgid "Failed to terminate instance" +msgstr "" + +#: cinder/exception.py:338 +msgid "Service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:342 +msgid "Volume service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:346 +msgid "Compute service is unavailable at this time." +msgstr "" + +#: cinder/exception.py:350 +#, python-format +msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)." +msgstr "" + +#: cinder/exception.py:355 +msgid "Destination compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:359 +msgid "Original compute host is unavailable at this time." +msgstr "" + +#: cinder/exception.py:363 +msgid "The supplied hypervisor type of is invalid." +msgstr "" + +#: cinder/exception.py:367 +msgid "The instance requires a newer hypervisor version than has been provided." +msgstr "" + +#: cinder/exception.py:372 +#, python-format +msgid "" +"The supplied disk path (%(path)s) already exists, it is expected not to " +"exist." +msgstr "" + +#: cinder/exception.py:377 +#, python-format +msgid "The supplied device path (%(path)s) is invalid." +msgstr "" + +#: cinder/exception.py:381 +#, python-format +msgid "The supplied device (%(device)s) is busy." +msgstr "" + +#: cinder/exception.py:385 +msgid "Unacceptable CPU info" +msgstr "" + +#: cinder/exception.py:389 +#, python-format +msgid "%(address)s is not a valid IP v4/6 address." +msgstr "" + +#: cinder/exception.py:393 +#, python-format +msgid "" +"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN " +"tag is %(tag)s, but the one associated with the port group is %(pgroup)s." +msgstr "" + +#: cinder/exception.py:399 +#, python-format +msgid "" +"vSwitch which contains the port group %(bridge)s is not associated with " +"the desired physical adapter. Expected vSwitch is %(expected)s, but the " +"one associated is %(actual)s." +msgstr "" + +#: cinder/exception.py:406 +#, python-format +msgid "Disk format %(disk_format)s is not acceptable" +msgstr "" + +#: cinder/exception.py:410 +#, python-format +msgid "Image %(image_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:414 +#, python-format +msgid "Instance %(instance_id)s is unacceptable: %(reason)s" +msgstr "" + +#: cinder/exception.py:418 +#, python-format +msgid "Ec2 id %(ec2_id)s is unacceptable." +msgstr "" + +#: cinder/exception.py:422 +msgid "Resource could not be found." +msgstr "" + +#: cinder/exception.py:427 +#, python-format +msgid "Required flag %(flag)s not set." +msgstr "" + +#: cinder/exception.py:431 +#, python-format +msgid "Volume %(volume_id)s could not be found." +msgstr "" + +#: cinder/exception.py:435 +#, python-format +msgid "Unable to locate account %(account_name)s on Solidfire device" +msgstr "" + +#: cinder/exception.py:440 +#, python-format +msgid "Volume not found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:444 +#, python-format +msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:449 +msgid "Zero volume types found." +msgstr "" + +#: cinder/exception.py:453 +#, python-format +msgid "Volume type %(volume_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:457 +#, python-format +msgid "Volume type with name %(volume_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:462 +#, python-format +msgid "" +"Volume Type %(volume_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:467 +#, python-format +msgid "Snapshot %(snapshot_id)s could not be found." +msgstr "" + +#: cinder/exception.py:471 +#, python-format +msgid "deleting volume %(volume_name)s that has snapshot" +msgstr "" + +#: cinder/exception.py:475 +#, python-format +msgid "deleting snapshot %(snapshot_name)s that has dependent volumes" +msgstr "" + +#: cinder/exception.py:480 +#, python-format +msgid "No target id found for volume %(volume_id)s." +msgstr "" + +#: cinder/exception.py:484 +#, python-format +msgid "No disk at %(location)s" +msgstr "" + +#: cinder/exception.py:488 +#, python-format +msgid "Could not find a handler for %(driver_type)s volume." +msgstr "" + +#: cinder/exception.py:492 +#, python-format +msgid "Invalid image href %(image_href)s." +msgstr "" + +#: cinder/exception.py:496 +msgid "" +"Some images have been stored via hrefs. This version of the api does not " +"support displaying image hrefs." +msgstr "" + +#: cinder/exception.py:501 +#, python-format +msgid "Image %(image_id)s could not be found." +msgstr "" + +#: cinder/exception.py:505 +#, python-format +msgid "Kernel not found for image %(image_id)s." +msgstr "" + +#: cinder/exception.py:509 +#, python-format +msgid "User %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:513 +#, python-format +msgid "Project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:517 +#, python-format +msgid "User %(user_id)s is not a member of project %(project_id)s." +msgstr "" + +#: cinder/exception.py:521 +#, python-format +msgid "Role %(role_id)s could not be found." +msgstr "" + +#: cinder/exception.py:525 +msgid "Cannot find SR to read/write VDI." +msgstr "" + +#: cinder/exception.py:529 +#, python-format +msgid "%(req)s is required to create a network." +msgstr "" + +#: cinder/exception.py:533 +#, python-format +msgid "Network %(network_id)s could not be found." +msgstr "" + +#: cinder/exception.py:537 +#, python-format +msgid "Network could not be found for bridge %(bridge)s" +msgstr "" + +#: cinder/exception.py:541 +#, python-format +msgid "Network could not be found for uuid %(uuid)s" +msgstr "" + +#: cinder/exception.py:545 +#, python-format +msgid "Network could not be found with cidr %(cidr)s." +msgstr "" + +#: cinder/exception.py:549 +#, python-format +msgid "Network could not be found for instance %(instance_id)s." +msgstr "" + +#: cinder/exception.py:553 +msgid "No networks defined." +msgstr "" + +#: cinder/exception.py:557 +#, python-format +msgid "" +"Either Network uuid %(network_uuid)s is not present or is not assigned to" +" the project %(project_id)s." +msgstr "" + +#: cinder/exception.py:562 +#, python-format +msgid "Host is not set to the network (%(network_id)s)." +msgstr "" + +#: cinder/exception.py:566 +#, python-format +msgid "Network %(network)s has active ports, cannot delete." +msgstr "" + +#: cinder/exception.py:570 +msgid "Could not find the datastore reference(s) which the VM uses." +msgstr "" + +#: cinder/exception.py:574 +#, python-format +msgid "No fixed IP associated with id %(id)s." +msgstr "" + +#: cinder/exception.py:578 +#, python-format +msgid "Fixed ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:582 +#, python-format +msgid "Instance %(instance_id)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:586 +#, python-format +msgid "Network host %(host)s has zero fixed ips in network %(network_id)s." +msgstr "" + +#: cinder/exception.py:591 +#, python-format +msgid "Instance %(instance_id)s doesn't have fixed ip '%(ip)s'." +msgstr "" + +#: cinder/exception.py:595 +#, python-format +msgid "Host %(host)s has zero fixed ips." +msgstr "" + +#: cinder/exception.py:599 +#, python-format +msgid "" +"Fixed IP address (%(address)s) does not exist in network " +"(%(network_uuid)s)." +msgstr "" + +#: cinder/exception.py:604 +#, python-format +msgid "Fixed IP address %(address)s is already in use." +msgstr "" + +#: cinder/exception.py:608 +#, python-format +msgid "Fixed IP address %(address)s is invalid." +msgstr "" + +#: cinder/exception.py:612 +msgid "Zero fixed ips available." +msgstr "" + +#: cinder/exception.py:616 +msgid "Zero fixed ips could be found." +msgstr "" + +#: cinder/exception.py:620 +#, python-format +msgid "Floating ip not found for id %(id)s." +msgstr "" + +#: cinder/exception.py:624 +#, python-format +msgid "The DNS entry %(name)s already exists in domain %(domain)s." +msgstr "" + +#: cinder/exception.py:628 +#, python-format +msgid "Floating ip not found for address %(address)s." +msgstr "" + +#: cinder/exception.py:632 +#, python-format +msgid "Floating ip not found for host %(host)s." +msgstr "" + +#: cinder/exception.py:636 +msgid "Zero floating ips available." +msgstr "" + +#: cinder/exception.py:640 +#, python-format +msgid "Floating ip %(address)s is associated." +msgstr "" + +#: cinder/exception.py:644 +#, python-format +msgid "Floating ip %(address)s is not associated." +msgstr "" + +#: cinder/exception.py:648 +msgid "Zero floating ips exist." +msgstr "" + +#: cinder/exception.py:652 +#, python-format +msgid "Interface %(interface)s not found." +msgstr "" + +#: cinder/exception.py:656 +#, python-format +msgid "Keypair %(name)s not found for user %(user_id)s" +msgstr "" + +#: cinder/exception.py:660 +#, python-format +msgid "Certificate %(certificate_id)s not found." +msgstr "" + +#: cinder/exception.py:664 +#, python-format +msgid "Service %(service_id)s could not be found." +msgstr "" + +#: cinder/exception.py:668 +#, python-format +msgid "Host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:672 +#, python-format +msgid "Compute host %(host)s could not be found." +msgstr "" + +#: cinder/exception.py:676 +#, python-format +msgid "Could not find binary %(binary)s on host %(host)s." +msgstr "" + +#: cinder/exception.py:680 +#, python-format +msgid "Auth token %(token)s could not be found." +msgstr "" + +#: cinder/exception.py:684 +#, python-format +msgid "Access Key %(access_key)s could not be found." +msgstr "" + +#: cinder/exception.py:688 +msgid "Quota could not be found" +msgstr "" + +#: cinder/exception.py:692 +#, python-format +msgid "Quota for project %(project_id)s could not be found." +msgstr "" + +#: cinder/exception.py:696 +#, python-format +msgid "Quota class %(class_name)s could not be found." +msgstr "" + +#: cinder/exception.py:700 +#, python-format +msgid "Security group %(security_group_id)s not found." +msgstr "" + +#: cinder/exception.py:704 +#, python-format +msgid "Security group %(security_group_id)s not found for project %(project_id)s." +msgstr "" + +#: cinder/exception.py:709 +#, python-format +msgid "Security group with rule %(rule_id)s not found." +msgstr "" + +#: cinder/exception.py:713 +#, python-format +msgid "" +"Security group %(security_group_id)s is already associated with the " +"instance %(instance_id)s" +msgstr "" + +#: cinder/exception.py:718 +#, python-format +msgid "" +"Security group %(security_group_id)s is not associated with the instance " +"%(instance_id)s" +msgstr "" + +#: cinder/exception.py:723 +#, python-format +msgid "Migration %(migration_id)s could not be found." +msgstr "" + +#: cinder/exception.py:727 +#, python-format +msgid "Migration not found for instance %(instance_id)s with status %(status)s." +msgstr "" + +#: cinder/exception.py:732 +#, python-format +msgid "Console pool %(pool_id)s could not be found." +msgstr "" + +#: cinder/exception.py:736 +#, python-format +msgid "" +"Console pool of type %(console_type)s for compute host %(compute_host)s " +"on proxy host %(host)s not found." +msgstr "" + +#: cinder/exception.py:742 +#, python-format +msgid "Console %(console_id)s could not be found." +msgstr "" + +#: cinder/exception.py:746 +#, python-format +msgid "Console for instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:750 +#, python-format +msgid "" +"Console for instance %(instance_id)s in pool %(pool_id)s could not be " +"found." +msgstr "" + +#: cinder/exception.py:755 +#, python-format +msgid "Invalid console type %(console_type)s " +msgstr "" + +#: cinder/exception.py:759 +msgid "Zero instance types found." +msgstr "" + +#: cinder/exception.py:763 +#, python-format +msgid "Instance type %(instance_type_id)s could not be found." +msgstr "" + +#: cinder/exception.py:767 +#, python-format +msgid "Instance type with name %(instance_type_name)s could not be found." +msgstr "" + +#: cinder/exception.py:772 +#, python-format +msgid "Flavor %(flavor_id)s could not be found." +msgstr "" + +#: cinder/exception.py:776 +#, python-format +msgid "Cell %(cell_id)s could not be found." +msgstr "" + +#: cinder/exception.py:780 +#, python-format +msgid "Scheduler Host Filter %(filter_name)s could not be found." +msgstr "" + +#: cinder/exception.py:784 +#, python-format +msgid "Scheduler cost function %(cost_fn_str)s could not be found." +msgstr "" + +#: cinder/exception.py:789 +#, python-format +msgid "Scheduler weight flag not found: %(flag_name)s" +msgstr "" + +#: cinder/exception.py:793 +#, python-format +msgid "Instance %(instance_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:798 +#, python-format +msgid "" +"Instance Type %(instance_type_id)s has no extra specs with key " +"%(extra_specs_key)s." +msgstr "" + +#: cinder/exception.py:803 +msgid "LDAP object could not be found" +msgstr "" + +#: cinder/exception.py:807 +#, python-format +msgid "LDAP user %(user_id)s could not be found." +msgstr "" + +#: cinder/exception.py:811 +#, python-format +msgid "LDAP group %(group_id)s could not be found." +msgstr "" + +#: cinder/exception.py:815 +#, python-format +msgid "LDAP user %(user_id)s is not a member of group %(group_id)s." +msgstr "" + +#: cinder/exception.py:819 +#, python-format +msgid "File %(file_path)s could not be found." +msgstr "" + +#: cinder/exception.py:823 +msgid "Zero files could be found." +msgstr "" + +#: cinder/exception.py:827 +#, python-format +msgid "Virtual switch associated with the network adapter %(adapter)s not found." +msgstr "" + +#: cinder/exception.py:832 +#, python-format +msgid "Network adapter %(adapter)s could not be found." +msgstr "" + +#: cinder/exception.py:836 +#, python-format +msgid "Class %(class_name)s could not be found: %(exception)s" +msgstr "" + +#: cinder/exception.py:840 +msgid "Action not allowed." +msgstr "" + +#: cinder/exception.py:844 +#, python-format +msgid "Unable to use global role %(role_id)s" +msgstr "" + +#: cinder/exception.py:848 +msgid "Rotation is not allowed for snapshots" +msgstr "" + +#: cinder/exception.py:852 +msgid "Rotation param is required for backup image_type" +msgstr "" + +#: cinder/exception.py:861 +#, python-format +msgid "Key pair %(key_name)s already exists." +msgstr "" + +#: cinder/exception.py:865 +#, python-format +msgid "User %(user)s already exists." +msgstr "" + +#: cinder/exception.py:869 +#, python-format +msgid "LDAP user %(user)s already exists." +msgstr "" + +#: cinder/exception.py:873 +#, python-format +msgid "LDAP group %(group)s already exists." +msgstr "" + +#: cinder/exception.py:877 +#, python-format +msgid "User %(uid)s is already a member of the group %(group_dn)s" +msgstr "" + +#: cinder/exception.py:882 +#, python-format +msgid "Project %(project)s already exists." +msgstr "" + +#: cinder/exception.py:886 +#, python-format +msgid "Instance %(name)s already exists." +msgstr "" + +#: cinder/exception.py:890 +#, python-format +msgid "Instance Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:894 +#, python-format +msgid "Volume Type %(name)s already exists." +msgstr "" + +#: cinder/exception.py:898 +#, python-format +msgid "%(path)s is on shared storage: %(reason)s" +msgstr "" + +#: cinder/exception.py:902 +msgid "Migration error" +msgstr "" + +#: cinder/exception.py:906 +#, python-format +msgid "Malformed message body: %(reason)s" +msgstr "" + +#: cinder/exception.py:910 +#, python-format +msgid "Could not find config at %(path)s" +msgstr "" + +#: cinder/exception.py:914 +#, python-format +msgid "Could not load paste app '%(name)s' from %(path)s" +msgstr "" + +#: cinder/exception.py:918 +msgid "When resizing, instances must change size!" +msgstr "" + +#: cinder/exception.py:922 +msgid "Image is larger than instance type allows" +msgstr "" + +#: cinder/exception.py:926 +msgid "1 or more Zones could not complete the request" +msgstr "" + +#: cinder/exception.py:930 +msgid "Instance type's memory is too small for requested image." +msgstr "" + +#: cinder/exception.py:934 +msgid "Instance type's disk is too small for requested image." +msgstr "" + +#: cinder/exception.py:938 +#, python-format +msgid "Insufficient free memory on compute node to start %(uuid)s." +msgstr "" + +#: cinder/exception.py:942 +msgid "Could not fetch bandwidth/cpu/disk metrics for this host." +msgstr "" + +#: cinder/exception.py:946 +#, python-format +msgid "No valid host was found. %(reason)s" +msgstr "" + +#: cinder/exception.py:950 +#, python-format +msgid "Host %(host)s is not up or doesn't exist." +msgstr "" + +#: cinder/exception.py:954 +msgid "Quota exceeded" +msgstr "" + +#: cinder/exception.py:958 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: " +"%(reason)s." +msgstr "" + +#: cinder/exception.py:963 +#, python-format +msgid "Aggregate %(aggregate_id)s could not be found." +msgstr "" + +#: cinder/exception.py:967 +#, python-format +msgid "Aggregate %(aggregate_name)s already exists." +msgstr "" + +#: cinder/exception.py:971 +#, python-format +msgid "Aggregate %(aggregate_id)s has no host %(host)s." +msgstr "" + +#: cinder/exception.py:975 +#, python-format +msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s." +msgstr "" + +#: cinder/exception.py:980 +#, python-format +msgid "Host %(host)s already member of another aggregate." +msgstr "" + +#: cinder/exception.py:984 +#, python-format +msgid "Aggregate %(aggregate_id)s already has host %(host)s." +msgstr "" + +#: cinder/exception.py:988 +#, python-format +msgid "Detected more than one volume with name %(vol_name)s" +msgstr "" + +#: cinder/exception.py:992 +#, python-format +msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s" +msgstr "" + +#: cinder/exception.py:997 +msgid "Unable to create instance type" +msgstr "" + +#: cinder/exception.py:1001 +msgid "Bad response from SolidFire API" +msgstr "" + +#: cinder/exception.py:1005 +#, python-format +msgid "Error in SolidFire API response: status=%(status)s" +msgstr "" + +#: cinder/exception.py:1009 +#, python-format +msgid "Error in SolidFire API response: data=%(data)s" +msgstr "" + +#: cinder/exception.py:1013 +#, python-format +msgid "Detected existing vlan with id %(vlan)d" +msgstr "" + +#: cinder/exception.py:1017 +#, python-format +msgid "Instance %(instance_id)s could not be found." +msgstr "" + +#: cinder/exception.py:1021 +#, python-format +msgid "Invalid id: %(val)s (expecting \"i-...\")." +msgstr "" + +#: cinder/exception.py:1025 +#, python-format +msgid "Could not fetch image %(image)s" +msgstr "" + +#: cinder/log.py:315 +#, python-format +msgid "syslog facility must be one of: %s" +msgstr "" + +#: cinder/manager.py:146 +#, python-format +msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run" +msgstr "" + +#: cinder/manager.py:152 +#, python-format +msgid "Running periodic task %(full_task_name)s" +msgstr "" + +#: cinder/manager.py:159 +#, python-format +msgid "Error during %(full_task_name)s: %(e)s" +msgstr "" + +#: cinder/manager.py:203 +msgid "Notifying Schedulers of capabilities ..." +msgstr "" + +#: cinder/policy.py:30 +msgid "JSON file representing policy" +msgstr "" + +#: cinder/policy.py:33 +msgid "Rule checked when requested rule is not found" +msgstr "" + +#: cinder/service.py:137 +msgid "SIGTERM received" +msgstr "" + +#: cinder/service.py:177 +#, python-format +msgid "Starting %(topic)s node (version %(vcs_string)s)" +msgstr "" + +#: cinder/service.py:195 +#, python-format +msgid "Creating Consumer connection for Service %s" +msgstr "" + +#: cinder/service.py:282 +msgid "Service killed that has no database entry" +msgstr "" + +#: cinder/service.py:319 +msgid "The service database object disappeared, Recreating it." +msgstr "" + +#: cinder/service.py:334 +msgid "Recovered model server connection!" +msgstr "" + +#: cinder/service.py:340 +msgid "model server went away" +msgstr "" + +#: cinder/service.py:433 +msgid "Full set of FLAGS:" +msgstr "" + +#: cinder/service.py:440 +#, python-format +msgid "%(flag)s : FLAG SET " +msgstr "" + +#: cinder/utils.py:79 +#, python-format +msgid "Inner Exception: %s" +msgstr "" + +#: cinder/utils.py:165 +#, python-format +msgid "Fetching %s" +msgstr "" + +#: cinder/utils.py:210 +#, python-format +msgid "Got unknown keyword args to utils.execute: %r" +msgstr "" + +#: cinder/utils.py:220 +#, python-format +msgid "Running cmd (subprocess): %s" +msgstr "" + +#: cinder/utils.py:236 cinder/utils.py:315 +#, python-format +msgid "Result was %s" +msgstr "" + +#: cinder/utils.py:249 +#, python-format +msgid "%r failed. Retrying." +msgstr "" + +#: cinder/utils.py:291 +#, python-format +msgid "Running cmd (SSH): %s" +msgstr "" + +#: cinder/utils.py:293 +msgid "Environment not supported over SSH" +msgstr "" + +#: cinder/utils.py:297 +msgid "process_input not supported over SSH" +msgstr "" + +#: cinder/utils.py:352 +#, python-format +msgid "debug in callback: %s" +msgstr "" + +#: cinder/utils.py:534 +#, python-format +msgid "Link Local address is not found.:%s" +msgstr "" + +#: cinder/utils.py:537 +#, python-format +msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" +msgstr "" + +#: cinder/utils.py:648 +#, python-format +msgid "Invalid backend: %s" +msgstr "" + +#: cinder/utils.py:659 +#, python-format +msgid "backend %s" +msgstr "" + +#: cinder/utils.py:709 +msgid "in looping call" +msgstr "" + +#: cinder/utils.py:927 +#, python-format +msgid "Attempting to grab semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:931 +#, python-format +msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:935 +#, python-format +msgid "Attempting to grab file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:942 +#, python-format +msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"..." +msgstr "" + +#: cinder/utils.py:1001 +#, python-format +msgid "Found sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1008 +#, python-format +msgid "Cleaned sentinel %(filename)s for pid %(pid)s" +msgstr "" + +#: cinder/utils.py:1023 +#, python-format +msgid "Found lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1028 +#, python-format +msgid "Cleaned lockfile %(file)s with link count %(count)d" +msgstr "" + +#: cinder/utils.py:1138 +#, python-format +msgid "Expected object of type: %s" +msgstr "" + +#: cinder/utils.py:1169 +#, python-format +msgid "Invalid server_string: %s" +msgstr "" + +#: cinder/utils.py:1298 +#, python-format +msgid "timefunc: '%(name)s' took %(total_time).2f secs" +msgstr "" + +#: cinder/utils.py:1330 +msgid "Original exception being dropped" +msgstr "" + +#: cinder/utils.py:1461 +#, python-format +msgid "Class %(fullname)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1463 +#, python-format +msgid "Class %(fullname)s is deprecated" +msgstr "" + +#: cinder/utils.py:1495 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated: %(msg)s" +msgstr "" + +#: cinder/utils.py:1497 +#, python-format +msgid "Function %(name)s in %(location)s is deprecated" +msgstr "" + +#: cinder/utils.py:1681 +#, python-format +msgid "Could not remove tmpdir: %s" +msgstr "" + +#: cinder/wsgi.py:97 +#, python-format +msgid "Started %(name)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:108 +msgid "Stopping WSGI server." +msgstr "" + +#: cinder/wsgi.py:111 +msgid "Stopping raw TCP server." +msgstr "" + +#: cinder/wsgi.py:117 +#, python-format +msgid "Starting TCP server %(arg0)s on %(host)s:%(port)s" +msgstr "" + +#: cinder/wsgi.py:133 +msgid "WSGI server has stopped." +msgstr "" + +#: cinder/wsgi.py:211 +msgid "You must implement __call__" +msgstr "" + +#: cinder/api/direct.py:218 +msgid "not available" +msgstr "" + +#: cinder/api/direct.py:299 +#, python-format +msgid "Returned non-serializeable type: %s" +msgstr "" + +#: cinder/api/sizelimit.py:51 +msgid "Request is too large." +msgstr "" + +#: cinder/api/validator.py:142 +#, python-format +msgid "%(key)s with value %(value)s failed validator %(validator)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:73 +#, python-format +msgid "%(code)s: %(message)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:95 +#, python-format +msgid "FaultWrapper: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:170 +msgid "Too many failed authentications." +msgstr "" + +#: cinder/api/ec2/__init__.py:180 +#, python-format +msgid "" +"Access key %(access_key)s has had %(failures)d failed authentications and" +" will be locked out for %(lock_mins)d minutes." +msgstr "" + +#: cinder/api/ec2/__init__.py:267 +msgid "Signature not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:271 +msgid "Access key not provided" +msgstr "" + +#: cinder/api/ec2/__init__.py:306 cinder/api/ec2/__init__.py:319 +msgid "Failure communicating with keystone" +msgstr "" + +#: cinder/api/ec2/__init__.py:388 +#, python-format +msgid "Authentication Failure: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:404 +#, python-format +msgid "Authenticated Request For %(uname)s:%(pname)s)" +msgstr "" + +#: cinder/api/ec2/__init__.py:435 +#, python-format +msgid "action: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:437 +#, python-format +msgid "arg: %(key)s\t\tval: %(value)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:512 +#, python-format +msgid "Unauthorized request for controller=%(controller)s and action=%(action)s" +msgstr "" + +#: cinder/api/ec2/__init__.py:584 +#, python-format +msgid "InstanceNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:590 +#, python-format +msgid "VolumeNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:596 +#, python-format +msgid "SnapshotNotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:602 +#, python-format +msgid "NotFound raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:605 +#, python-format +msgid "EC2APIError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:613 +#, python-format +msgid "KeyPairExists raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:617 +#, python-format +msgid "InvalidParameterValue raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:621 +#, python-format +msgid "InvalidPortRange raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:625 +#, python-format +msgid "NotAuthorized raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:629 +#, python-format +msgid "InvalidRequest raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:633 +#, python-format +msgid "QuotaError raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:637 +#, python-format +msgid "Invalid id: bogus (expecting \"i-...\"): %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:646 +#, python-format +msgid "Unexpected error raised: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:647 +#, python-format +msgid "Environment: %s" +msgstr "" + +#: cinder/api/ec2/__init__.py:649 cinder/api/metadata/handler.py:248 +msgid "An unknown error has occurred. Please try your request again." +msgstr "" + +#: cinder/api/ec2/apirequest.py:64 +#, python-format +msgid "Unsupported API request: controller = %(controller)s, action = %(action)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:336 +#, python-format +msgid "Create snapshot of volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:372 +#, python-format +msgid "" +"Value (%s) for KeyName is invalid. Content limited to Alphanumeric " +"character, spaces, dashes, and underscore." +msgstr "" + +#: cinder/api/ec2/cloud.py:378 +#, python-format +msgid "Value (%s) for Keyname is invalid. Length exceeds maximum of 255." +msgstr "" + +#: cinder/api/ec2/cloud.py:382 +#, python-format +msgid "Create key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:391 +#, python-format +msgid "Import key %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:409 +#, python-format +msgid "Delete key pair %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:551 +msgid "Invalid CIDR" +msgstr "" + +#: cinder/api/ec2/cloud.py:639 cinder/api/ec2/cloud.py:693 +#: cinder/api/ec2/cloud.py:800 +msgid "Not enough parameters, need group_name or group_id" +msgstr "" + +#: cinder/api/ec2/cloud.py:654 +#: cinder/api/openstack/compute/contrib/security_groups.py:517 +#, python-format +msgid "Revoke security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:666 cinder/api/ec2/cloud.py:719 +#, python-format +msgid "%s Not enough parameters to build a valid rule" +msgstr "" + +#: cinder/api/ec2/cloud.py:684 cinder/api/ec2/cloud.py:744 +msgid "No rule for the specified parameters." +msgstr "" + +#: cinder/api/ec2/cloud.py:708 +#: cinder/api/openstack/compute/contrib/security_groups.py:354 +#, python-format +msgid "Authorize security group ingress %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:725 +#, python-format +msgid "%s - This rule already exists in group" +msgstr "" + +#: cinder/api/ec2/cloud.py:769 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Content limited to " +"Alphanumeric characters, spaces, dashes, and underscores." +msgstr "" + +#: cinder/api/ec2/cloud.py:776 +#, python-format +msgid "" +"Value (%s) for parameter GroupName is invalid. Length exceeds maximum of " +"255." +msgstr "" + +#: cinder/api/ec2/cloud.py:780 +#: cinder/api/openstack/compute/contrib/security_groups.py:292 +#, python-format +msgid "Create Security Group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:783 +#, python-format +msgid "group %s already exists" +msgstr "" + +#: cinder/api/ec2/cloud.py:815 +#: cinder/api/openstack/compute/contrib/security_groups.py:245 +#, python-format +msgid "Delete security group %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:823 cinder/compute/manager.py:1630 +#, python-format +msgid "Get console output for instance %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:894 +#, python-format +msgid "Create volume from snapshot %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:898 cinder/api/openstack/compute/contrib/volumes.py:186 +#: cinder/api/openstack/volume/volumes.py:222 +#, python-format +msgid "Create volume of %s GB" +msgstr "" + +#: cinder/api/ec2/cloud.py:921 +msgid "Delete Failed" +msgstr "" + +#: cinder/api/ec2/cloud.py:931 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(instance_id)s at %(device)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:939 +msgid "Attach Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:952 cinder/api/openstack/compute/contrib/volumes.py:366 +#, python-format +msgid "Detach volume %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:959 +msgid "Detach Volume Failed." +msgstr "" + +#: cinder/api/ec2/cloud.py:984 cinder/api/ec2/cloud.py:1041 +#: cinder/api/ec2/cloud.py:1518 cinder/api/ec2/cloud.py:1533 +#, python-format +msgid "attribute not supported: %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1107 +#, python-format +msgid "vol = %s\n" +msgstr "" + +#: cinder/api/ec2/cloud.py:1255 +msgid "Allocate address" +msgstr "" + +#: cinder/api/ec2/cloud.py:1267 +#, python-format +msgid "Release address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1272 +#, python-format +msgid "Associate address %(public_ip)s to instance %(instance_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1282 +#, python-format +msgid "Disassociate address %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1308 +msgid "Image must be available" +msgstr "" + +#: cinder/api/ec2/cloud.py:1329 +msgid "Going to start terminating instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1343 +#, python-format +msgid "Reboot instance %r" +msgstr "" + +#: cinder/api/ec2/cloud.py:1354 +msgid "Going to stop instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1365 +msgid "Going to start instances" +msgstr "" + +#: cinder/api/ec2/cloud.py:1455 +#, python-format +msgid "De-registering image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1471 +msgid "imageLocation is required" +msgstr "" + +#: cinder/api/ec2/cloud.py:1490 +#, python-format +msgid "Registered image %(image_location)s with id %(image_id)s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1536 +msgid "user or group not specified" +msgstr "" + +#: cinder/api/ec2/cloud.py:1538 +msgid "only group \"all\" is supported" +msgstr "" + +#: cinder/api/ec2/cloud.py:1540 +msgid "operation_type must be add or remove" +msgstr "" + +#: cinder/api/ec2/cloud.py:1542 +#, python-format +msgid "Updating image %s publicity" +msgstr "" + +#: cinder/api/ec2/cloud.py:1555 +#, python-format +msgid "Not allowed to modify attributes for image %s" +msgstr "" + +#: cinder/api/ec2/cloud.py:1603 +#, python-format +msgid "Couldn't stop instance with in %d sec" +msgstr "" + +#: cinder/api/metadata/handler.py:246 cinder/api/metadata/handler.py:253 +#, python-format +msgid "Failed to get metadata for ip: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:43 +#, python-format +msgid "Caught error: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:45 cinder/api/openstack/wsgi.py:886 +#, python-format +msgid "%(url)s returned with HTTP %(status)d" +msgstr "" + +#: cinder/api/openstack/__init__.py:94 +msgid "Must specify an ExtensionManager class" +msgstr "" + +#: cinder/api/openstack/__init__.py:105 +#, python-format +msgid "Extended resource: %s" +msgstr "" + +#: cinder/api/openstack/__init__.py:130 +#, python-format +msgid "" +"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such " +"resource" +msgstr "" + +#: cinder/api/openstack/__init__.py:135 +#, python-format +msgid "Extension %(ext_name)s extending resource: %(collection)s" +msgstr "" + +#: cinder/api/openstack/auth.py:90 +#, python-format +msgid "%(user_id)s could not be found with token '%(token)s'" +msgstr "" + +#: cinder/api/openstack/auth.py:134 +#, python-format +msgid "%(user_id)s must be an admin or a member of %(project_id)s" +msgstr "" + +#: cinder/api/openstack/auth.py:152 +msgid "Authentication requests must be made against a version root (e.g. /v2)." +msgstr "" + +#: cinder/api/openstack/auth.py:167 +#, python-format +msgid "Could not find %s in request." +msgstr "" + +#: cinder/api/openstack/auth.py:191 +#, python-format +msgid "Successfully authenticated '%s'" +msgstr "" + +#: cinder/api/openstack/auth.py:241 +msgid "User not found with provided API key." +msgstr "" + +#: cinder/api/openstack/auth.py:258 +#, python-format +msgid "Provided API key is valid, but not for user '%(username)s'" +msgstr "" + +#: cinder/api/openstack/common.py:133 cinder/api/openstack/common.py:167 +msgid "limit param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:136 cinder/api/openstack/common.py:171 +msgid "limit param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:161 +msgid "offset param must be an integer" +msgstr "" + +#: cinder/api/openstack/common.py:175 +msgid "offset param must be positive" +msgstr "" + +#: cinder/api/openstack/common.py:203 +#, python-format +msgid "marker [%s] not found" +msgstr "" + +#: cinder/api/openstack/common.py:243 +#, python-format +msgid "href %s does not contain version" +msgstr "" + +#: cinder/api/openstack/common.py:278 +msgid "Image metadata limit exceeded" +msgstr "" + +#: cinder/api/openstack/common.py:295 +#, python-format +msgid "Converting nw_info: %s" +msgstr "" + +#: cinder/api/openstack/common.py:305 +#, python-format +msgid "Converted networks: %s" +msgstr "" + +#: cinder/api/openstack/common.py:338 +#, python-format +msgid "Cannot '%(action)s' while instance is in %(attr)s %(state)s" +msgstr "" + +#: cinder/api/openstack/common.py:341 +#, python-format +msgid "Instance is in an invalid state for '%(action)s'" +msgstr "" + +#: cinder/api/openstack/common.py:421 +msgid "Rejecting snapshot request, snapshots currently disabled" +msgstr "" + +#: cinder/api/openstack/common.py:423 +msgid "Instance snapshots are not permitted at this time." +msgstr "" + +#: cinder/api/openstack/extensions.py:188 +#, python-format +msgid "Loaded extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:225 +#, python-format +msgid "Ext name: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:226 +#, python-format +msgid "Ext alias: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:227 +#, python-format +msgid "Ext description: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:229 +#, python-format +msgid "Ext namespace: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:230 +#, python-format +msgid "Ext updated: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:232 +#, python-format +msgid "Exception loading extension: %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:246 +#, python-format +msgid "Loading extension %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:252 +#, python-format +msgid "Calling extension factory %s" +msgstr "" + +#: cinder/api/openstack/extensions.py:264 +#, python-format +msgid "Failed to load extension %(ext_factory)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:344 +#, python-format +msgid "Failed to load extension %(classpath)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/extensions.py:368 +#, python-format +msgid "Failed to load extension %(ext_name)s: %(exc)s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:135 cinder/api/openstack/wsgi.py:538 +msgid "cannot understand JSON" +msgstr "" + +#: cinder/api/openstack/wsgi.py:159 +#: cinder/api/openstack/compute/contrib/hosts.py:86 +msgid "cannot understand XML" +msgstr "" + +#: cinder/api/openstack/wsgi.py:543 +msgid "too many body keys" +msgstr "" + +#: cinder/api/openstack/wsgi.py:582 +#, python-format +msgid "Exception handling resource: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:586 +#, python-format +msgid "Fault thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:589 +#, python-format +msgid "HTTP exception thrown: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:697 +msgid "Unrecognized Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:701 +msgid "No Content-Type provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:705 +msgid "Empty body provided in request" +msgstr "" + +#: cinder/api/openstack/wsgi.py:816 +#, python-format +msgid "There is no such action: %s" +msgstr "" + +#: cinder/api/openstack/wsgi.py:819 cinder/api/openstack/wsgi.py:832 +#: cinder/api/openstack/compute/server_metadata.py:58 +#: cinder/api/openstack/compute/server_metadata.py:76 +#: cinder/api/openstack/compute/server_metadata.py:101 +#: cinder/api/openstack/compute/server_metadata.py:126 +#: cinder/api/openstack/compute/contrib/admin_actions.py:211 +#: cinder/api/openstack/compute/contrib/console_output.py:52 +msgid "Malformed request body" +msgstr "" + +#: cinder/api/openstack/wsgi.py:829 +msgid "Unsupported Content-Type" +msgstr "" + +#: cinder/api/openstack/wsgi.py:841 +msgid "Malformed request url" +msgstr "" + +#: cinder/api/openstack/wsgi.py:889 +#, python-format +msgid "%(url)s returned a fault: %(e)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:265 +msgid "element is not a child" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:414 +msgid "root element selecting a list" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:739 +#, python-format +msgid "Template tree mismatch; adding slave %(slavetag)s to master %(mastertag)s" +msgstr "" + +#: cinder/api/openstack/xmlutil.py:858 +msgid "subclasses must implement construct()!" +msgstr "" + +#: cinder/api/openstack/compute/extensions.py:29 +#: cinder/api/openstack/volume/extensions.py:29 +msgid "Initializing extension manager." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:40 +#: cinder/api/openstack/compute/images.py:146 +#: cinder/api/openstack/compute/images.py:161 +msgid "Image not found." +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:79 +msgid "Incorrect request body format" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:83 +#: cinder/api/openstack/compute/server_metadata.py:80 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:79 +#: cinder/api/openstack/compute/contrib/volumetypes.py:188 +msgid "Request body and URI mismatch" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:86 +#: cinder/api/openstack/compute/server_metadata.py:84 +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:82 +#: cinder/api/openstack/compute/contrib/volumetypes.py:191 +msgid "Request body contains too many items" +msgstr "" + +#: cinder/api/openstack/compute/image_metadata.py:111 +msgid "Invalid metadata key" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:74 +msgid "Instance does not exist" +msgstr "" + +#: cinder/api/openstack/compute/ips.py:97 +msgid "Instance is not a member of specified network" +msgstr "" + +#: cinder/api/openstack/compute/limits.py:140 +#, python-format +msgid "" +"Only %(value)s %(verb)s request(s) can be made to %(uri)s every " +"%(unit_string)s." +msgstr "" + +#: cinder/api/openstack/compute/limits.py:266 +msgid "This request was rate-limited." +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:38 +#: cinder/api/openstack/compute/server_metadata.py:122 +#: cinder/api/openstack/compute/server_metadata.py:159 +msgid "Server does not exist" +msgstr "" + +#: cinder/api/openstack/compute/server_metadata.py:141 +#: cinder/api/openstack/compute/server_metadata.py:152 +msgid "Metadata item was not found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:425 +#, python-format +msgid "Invalid server status: %(status)s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:433 +msgid "Invalid changes-since value" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:483 +msgid "Personality file limit exceeded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:485 +msgid "Personality file path too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:487 +msgid "Personality file content too long" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:501 +msgid "Server name is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:505 +msgid "Server name is an empty string" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:509 +msgid "Server name must be less than 256 characters." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:527 +#, python-format +msgid "Bad personality format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:530 +msgid "Bad personality format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:535 +#, python-format +msgid "Personality content for %s cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:550 +#, python-format +msgid "Bad networks format: network uuid is not in proper format (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:559 +#, python-format +msgid "Invalid fixed IP address (%s)" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:566 +#, python-format +msgid "Duplicate networks (%s) are not allowed" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:572 +#, python-format +msgid "Bad network format: missing %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:575 +msgid "Bad networks format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:587 +msgid "Userdata content cannot be decoded" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:594 +msgid "accessIPv4 is not proper IPv4 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:601 +msgid "accessIPv6 is not proper IPv6 format" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:633 +msgid "Server name is not defined" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:675 +#: cinder/api/openstack/compute/servers.py:740 +msgid "Invalid flavorRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:737 +msgid "Can not find requested image" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:743 +msgid "Invalid key_name provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:829 +#: cinder/api/openstack/compute/servers.py:849 +msgid "Instance has not been resized." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:835 +#, python-format +msgid "Error in confirm-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:855 +#, python-format +msgid "Error in revert-resize %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:868 +msgid "Argument 'type' for reboot is not HARD or SOFT" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:872 +msgid "Missing argument 'type' for reboot" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:885 +#, python-format +msgid "Error in reboot %s" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:897 +msgid "Unable to locate requested flavor." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:900 +msgid "Resize requires a change in size." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:924 +msgid "Malformed server entity" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:931 +msgid "Missing imageRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:940 +msgid "Invalid imageRef provided." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:949 +msgid "Missing flavorRef attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:962 +msgid "No adminPass was specified" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:966 +#: cinder/api/openstack/compute/servers.py:1144 +msgid "Invalid adminPass" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:980 +msgid "Unable to parse metadata key/value pairs." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:993 +msgid "Resize request has invalid 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:996 +msgid "Resize requests require 'flavorRef' attribute." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1014 +#: cinder/api/openstack/compute/contrib/aggregates.py:142 +#: cinder/api/openstack/compute/contrib/networks.py:65 +msgid "Invalid request body" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1019 +msgid "Could not parse imageRef from request." +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1071 +msgid "Instance could not be found" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1074 +msgid "Cannot find image for rebuild" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1103 +msgid "createImage entity requires name attribute" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1112 +#: cinder/api/openstack/compute/contrib/admin_actions.py:238 +msgid "Invalid metadata" +msgstr "" + +#: cinder/api/openstack/compute/servers.py:1167 +#, python-format +msgid "Removing options '%(unk_opt_str)s' from query" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:60 +#, python-format +msgid "Compute.api::pause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:77 +#, python-format +msgid "Compute.api::unpause %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:94 +#, python-format +msgid "compute.api::suspend %s" +msgstr "compute.api::æ«å %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:111 +#, python-format +msgid "compute.api::resume %s" +msgstr "compute.api::ç¹¼çº %s" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:127 +#, python-format +msgid "Error in migrate %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:141 +#, python-format +msgid "Compute.api::reset_network %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:154 +#: cinder/api/openstack/compute/contrib/admin_actions.py:170 +#: cinder/api/openstack/compute/contrib/admin_actions.py:186 +#: cinder/api/openstack/compute/contrib/multinic.py:41 +#: cinder/api/openstack/compute/contrib/rescue.py:44 +msgid "Server not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:157 +#, python-format +msgid "Compute.api::inject_network_info %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:173 +#, python-format +msgid "Compute.api::lock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:189 +#, python-format +msgid "Compute.api::unlock %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:219 +#, python-format +msgid "createBackup entity requires %s attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:223 +msgid "Malformed createBackup entity" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:229 +msgid "createBackup attribute 'rotation' must be an integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:244 +#: cinder/api/openstack/compute/contrib/console_output.py:47 +#: cinder/api/openstack/compute/contrib/console_output.py:59 +#: cinder/api/openstack/compute/contrib/consoles.py:49 +#: cinder/api/openstack/compute/contrib/consoles.py:60 +#: cinder/api/openstack/compute/contrib/server_action_list.py:49 +#: cinder/api/openstack/compute/contrib/server_diagnostics.py:47 +#: cinder/api/openstack/compute/contrib/server_start_stop.py:38 +msgid "Instance not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:272 +msgid "host and block_migration must be specified." +msgstr "" + +#: cinder/api/openstack/compute/contrib/admin_actions.py:284 +#, python-format +msgid "Live migration of instance %(id)s to host %(host)s failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:76 +#, python-format +msgid "" +"Cannot create aggregate with name %(name)s and availability zone " +"%(avail_zone)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:88 +#, python-format +msgid "Cannot show aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:114 +#, python-format +msgid "Cannot update aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:126 +#, python-format +msgid "Cannot delete aggregate: %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:139 +#, python-format +msgid "Aggregates does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:152 +#: cinder/api/openstack/compute/contrib/aggregates.py:158 +#, python-format +msgid "Cannot add host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:171 +#: cinder/api/openstack/compute/contrib/aggregates.py:175 +#, python-format +msgid "Cannot remove host %(host)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/aggregates.py:195 +#, python-format +msgid "Cannot set metadata %(metadata)s in aggregate %(id)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/certificates.py:75 +msgid "Only root certificate can be retrieved." +msgstr "" + +#: cinder/api/openstack/compute/contrib/cloudpipe.py:146 +msgid "" +"Unable to claim IP for VPN instances, ensure it isn't running, and try " +"again in a few minutes" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:44 +msgid "Missing type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/consoles.py:56 +msgid "Invalid type specification" +msgstr "" + +#: cinder/api/openstack/compute/contrib/disk_config.py:44 +#, python-format +msgid "%s must be either 'MANUAL' or 'AUTO'." +msgstr "" + +#: cinder/api/openstack/compute/contrib/extended_server_attributes.py:77 +#: cinder/api/openstack/compute/contrib/extended_status.py:61 +msgid "Server not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextradata.py:61 +#: cinder/api/openstack/compute/contrib/flavorextradata.py:91 +msgid "Flavor not found." +msgstr "" + +#: cinder/api/openstack/compute/contrib/flavorextraspecs.py:49 +#: cinder/api/openstack/compute/contrib/volumetypes.py:158 +msgid "No Request Body" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:159 +#, python-format +msgid "No more floating ips in pool %s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:161 +msgid "No more floating ips available." +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:201 +#: cinder/api/openstack/compute/contrib/floating_ips.py:230 +#: cinder/api/openstack/compute/contrib/security_groups.py:571 +#: cinder/api/openstack/compute/contrib/security_groups.py:604 +msgid "Missing parameter dict" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:204 +#: cinder/api/openstack/compute/contrib/floating_ips.py:233 +msgid "Address not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:213 +msgid "No fixed ips associated to instance" +msgstr "" + +#: cinder/api/openstack/compute/contrib/floating_ips.py:216 +msgid "Associate floating ip failed" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:144 +#, python-format +msgid "Invalid status: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:148 +#, python-format +msgid "Invalid mode: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:152 +#, python-format +msgid "Invalid update setting: '%s'" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:170 +#, python-format +msgid "Putting host %(host)s in maintenance mode %(mode)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:181 +#, python-format +msgid "Setting host %(host)s to %(state)s." +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:230 +msgid "Describe-resource is admin only functionality" +msgstr "" + +#: cinder/api/openstack/compute/contrib/hosts.py:238 +msgid "Host not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:70 +msgid "Keypair name contains unsafe characters" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:95 +msgid "Keypair name must be between 1 and 255 characters long" +msgstr "" + +#: cinder/api/openstack/compute/contrib/keypairs.py:100 +#, python-format +msgid "Key pair '%s' already exists." +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:52 +msgid "Missing 'networkId' argument for addFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:68 +msgid "Missing 'address' argument for removeFixedIp" +msgstr "" + +#: cinder/api/openstack/compute/contrib/multinic.py:77 +#, python-format +msgid "Unable to find address %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:62 +#, python-format +msgid "Network does not have %s action" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:70 +#, python-format +msgid "Disassociating network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:74 +#: cinder/api/openstack/compute/contrib/networks.py:91 +#: cinder/api/openstack/compute/contrib/networks.py:101 +msgid "Network not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:87 +#, python-format +msgid "Showing network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/networks.py:97 +#, python-format +msgid "Deleting network with id %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/scheduler_hints.py:41 +msgid "Malformed scheduler_hints attribute" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:222 +msgid "Security group id should be integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:243 +msgid "Security group is still in use" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:295 +#, python-format +msgid "Security group %s already exists" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:315 +#, python-format +msgid "Security group %s is not a string or unicode" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:318 +#, python-format +msgid "Security group %s cannot be empty." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:321 +#, python-format +msgid "Security group %s should not be greater than 255 characters." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:348 +msgid "Parent group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:351 +#, python-format +msgid "Security group (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:369 +msgid "Not enough parameters to build a valid rule." +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:376 +#, python-format +msgid "This rule already exists in group %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:414 +msgid "Parent or group id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:507 +msgid "Rule id is not integer" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:510 +#, python-format +msgid "Rule (%s) not found" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:574 +#: cinder/api/openstack/compute/contrib/security_groups.py:607 +msgid "Security group not specified" +msgstr "" + +#: cinder/api/openstack/compute/contrib/security_groups.py:578 +#: cinder/api/openstack/compute/contrib/security_groups.py:611 +msgid "Security group name cannot be empty" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:45 +#, python-format +msgid "start instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/server_start_stop.py:54 +#, python-format +msgid "stop instance %r" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:73 +#: cinder/api/openstack/volume/volumes.py:106 +#, python-format +msgid "vol=%s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:146 +#: cinder/api/openstack/volume/volumes.py:184 +#, python-format +msgid "Delete volume with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:329 +#, python-format +msgid "Attach volume %(volume_id)s to instance %(server_id)s at %(device)s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:481 +#: cinder/api/openstack/volume/snapshots.py:110 +#, python-format +msgid "Delete snapshot with id: %s" +msgstr "" + +#: cinder/api/openstack/compute/contrib/volumes.py:524 +#: cinder/api/openstack/volume/snapshots.py:150 +#, python-format +msgid "Create snapshot from volume %s" +msgstr "" + +#: cinder/auth/fakeldap.py:33 +msgid "Attempted to instantiate singleton" +msgstr "" + +#: cinder/auth/ldapdriver.py:650 +#, python-format +msgid "" +"Attempted to remove the last member of a group. Deleting the group at %s " +"instead." +msgstr "" + +#: cinder/auth/manager.py:298 +#, python-format +msgid "Looking up user: %r" +msgstr "" + +#: cinder/auth/manager.py:302 +#, python-format +msgid "Failed authorization for access key %s" +msgstr "" + +#: cinder/auth/manager.py:308 +#, python-format +msgid "Using project name = user name (%s)" +msgstr "" + +#: cinder/auth/manager.py:315 +#, python-format +msgid "failed authorization: no project named %(pjid)s (user=%(uname)s)" +msgstr "" + +#: cinder/auth/manager.py:324 +#, python-format +msgid "" +"Failed authorization: user %(uname)s not admin and not member of project " +"%(pjname)s" +msgstr "" + +#: cinder/auth/manager.py:331 cinder/auth/manager.py:343 +#, python-format +msgid "user.secret: %s" +msgstr "" + +#: cinder/auth/manager.py:332 cinder/auth/manager.py:344 +#, python-format +msgid "expected_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:333 cinder/auth/manager.py:345 +#, python-format +msgid "signature: %s" +msgstr "" + +#: cinder/auth/manager.py:335 cinder/auth/manager.py:357 +#, python-format +msgid "Invalid signature for user %s" +msgstr "" + +#: cinder/auth/manager.py:353 +#, python-format +msgid "host_only_signature: %s" +msgstr "" + +#: cinder/auth/manager.py:449 +msgid "Must specify project" +msgstr "" + +#: cinder/auth/manager.py:490 +#, python-format +msgid "Adding role %(role)s to user %(uid)s in project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:493 +#, python-format +msgid "Adding sitewide role %(role)s to user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:519 +#, python-format +msgid "Removing role %(role)s from user %(uid)s on project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:522 +#, python-format +msgid "Removing sitewide role %(role)s from user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:595 +#, python-format +msgid "Created project %(name)s with manager %(manager_user)s" +msgstr "" + +#: cinder/auth/manager.py:613 +#, python-format +msgid "modifying project %s" +msgstr "" + +#: cinder/auth/manager.py:625 +#, python-format +msgid "Adding user %(uid)s to project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:646 +#, python-format +msgid "Remove user %(uid)s from project %(pid)s" +msgstr "" + +#: cinder/auth/manager.py:676 +#, python-format +msgid "Deleting project %s" +msgstr "" + +#: cinder/auth/manager.py:734 +#, python-format +msgid "Created user %(rvname)s (admin: %(rvadmin)r)" +msgstr "" + +#: cinder/auth/manager.py:743 +#, python-format +msgid "Deleting user %s" +msgstr "" + +#: cinder/auth/manager.py:753 +#, python-format +msgid "Access Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:755 +#, python-format +msgid "Secret Key change for user %s" +msgstr "" + +#: cinder/auth/manager.py:757 +#, python-format +msgid "Admin status set to %(admin)r for user %(uid)s" +msgstr "" + +#: cinder/auth/manager.py:802 +#, python-format +msgid "No vpn data for project %s" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:46 +msgid "Instance type for vpn instances" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:49 +msgid "Template for cloudpipe instance boot script" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:52 +msgid "Network to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:55 +msgid "Netmask to push into openvpn config" +msgstr "" + +#: cinder/cloudpipe/pipelib.py:107 +#, python-format +msgid "Launching VPN for %s" +msgstr "" + +#: cinder/compute/api.py:141 +msgid "No compute host specified" +msgstr "" + +#: cinder/compute/api.py:144 +#, python-format +msgid "Unable to find host for Instance %s" +msgstr "" + +#: cinder/compute/api.py:192 +#, python-format +msgid "" +"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata " +"properties" +msgstr "" + +#: cinder/compute/api.py:203 +#, python-format +msgid "Quota exceeded for %(pid)s, metadata property key or value too long" +msgstr "" + +#: cinder/compute/api.py:257 +msgid "Cannot run any more instances of this type." +msgstr "" + +#: cinder/compute/api.py:259 +#, python-format +msgid "Can only run %s more instances of this type." +msgstr "" + +#: cinder/compute/api.py:261 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances. " +msgstr "" + +#: cinder/compute/api.py:310 +msgid "Creating a raw instance" +msgstr "" + +#: cinder/compute/api.py:312 +#, python-format +msgid "Using Kernel=%(kernel_id)s, Ramdisk=%(ramdisk_id)s" +msgstr "" + +#: cinder/compute/api.py:383 +#, python-format +msgid "Going to run %s instances..." +msgstr "" + +#: cinder/compute/api.py:447 +#, python-format +msgid "bdm %s" +msgstr "" + +#: cinder/compute/api.py:474 +#, python-format +msgid "block_device_mapping %s" +msgstr "" + +#: cinder/compute/api.py:591 +#, python-format +msgid "Sending create to scheduler for %(pid)s/%(uid)s's" +msgstr "" + +#: cinder/compute/api.py:871 +msgid "Going to try to soft delete instance" +msgstr "" + +#: cinder/compute/api.py:891 +msgid "No host for instance, deleting immediately" +msgstr "" + +#: cinder/compute/api.py:939 +msgid "Going to try to terminate instance" +msgstr "" + +#: cinder/compute/api.py:977 +msgid "Going to try to stop instance" +msgstr "" + +#: cinder/compute/api.py:996 +msgid "Going to try to start instance" +msgstr "" + +#: cinder/compute/api.py:1000 +#, python-format +msgid "Instance %(instance_uuid)s is not stopped. (%(vm_state)s" +msgstr "" + +#: cinder/compute/api.py:1071 cinder/volume/api.py:173 +#: cinder/volume/volume_types.py:64 +#, python-format +msgid "Searching by: %s" +msgstr "" + +#: cinder/compute/api.py:1201 +#, python-format +msgid "Image type not recognized %s" +msgstr "" + +#: cinder/compute/api.py:1369 +msgid "flavor_id is None. Assuming migration." +msgstr "" + +#: cinder/compute/api.py:1377 +#, python-format +msgid "" +"Old instance type %(current_instance_type_name)s, new instance type " +"%(new_instance_type_name)s" +msgstr "" + +#: cinder/compute/api.py:1644 +#, python-format +msgid "multiple fixedips exist, using the first: %s" +msgstr "" + +#: cinder/compute/instance_types.py:57 cinder/compute/instance_types.py:65 +msgid "create arguments must be positive integers" +msgstr "" + +#: cinder/compute/instance_types.py:76 cinder/volume/volume_types.py:41 +#, python-format +msgid "DB error: %s" +msgstr "" + +#: cinder/compute/instance_types.py:86 +#, python-format +msgid "Instance type %s not found for deletion" +msgstr "" + +#: cinder/compute/manager.py:138 +#, python-format +msgid "check_instance_lock: decorating: |%s|" +msgstr "" + +#: cinder/compute/manager.py:140 +#, python-format +msgid "" +"check_instance_lock: arguments: |%(self)s| |%(context)s| " +"|%(instance_uuid)s|" +msgstr "" + +#: cinder/compute/manager.py:144 +#, python-format +msgid "check_instance_lock: locked: |%s|" +msgstr "" + +#: cinder/compute/manager.py:146 +#, python-format +msgid "check_instance_lock: admin: |%s|" +msgstr "" + +#: cinder/compute/manager.py:151 +#, python-format +msgid "check_instance_lock: executing: |%s|" +msgstr "" + +#: cinder/compute/manager.py:155 +#, python-format +msgid "check_instance_lock: not executing |%s|" +msgstr "" + +#: cinder/compute/manager.py:201 +#, python-format +msgid "Unable to load the virtualization driver: %s" +msgstr "" + +#: cinder/compute/manager.py:223 +#, python-format +msgid "" +"Instance %(instance_uuid)s has been destroyed from under us while trying " +"to set it to ERROR" +msgstr "" + +#: cinder/compute/manager.py:240 +#, python-format +msgid "Current state is %(drv_state)s, state in DB is %(db_state)s." +msgstr "" + +#: cinder/compute/manager.py:245 +msgid "Rebooting instance after cinder-compute restart." +msgstr "" + +#: cinder/compute/manager.py:255 +msgid "Hypervisor driver does not support firewall rules" +msgstr "" + +#: cinder/compute/manager.py:260 +msgid "Checking state" +msgstr "" + +#: cinder/compute/manager.py:329 +#, python-format +msgid "Setting up bdm %s" +msgstr "" + +#: cinder/compute/manager.py:400 +#, python-format +msgid "Instance %s already deleted from database. Attempting forceful vm deletion" +msgstr "" + +#: cinder/compute/manager.py:406 +#, python-format +msgid "Exception encountered while terminating the instance %s" +msgstr "" + +#: cinder/compute/manager.py:444 +#, python-format +msgid "Instance %s not found." +msgstr "" + +#: cinder/compute/manager.py:480 +msgid "Instance has already been created" +msgstr "" + +#: cinder/compute/manager.py:523 +#, python-format +msgid "" +"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, " +"allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:528 +#, python-format +msgid "" +"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed " +"size %(allowed_size_bytes)d" +msgstr "" + +#: cinder/compute/manager.py:538 +msgid "Starting instance..." +msgstr "" + +#: cinder/compute/manager.py:548 +msgid "Skipping network allocation for instance" +msgstr "" + +#: cinder/compute/manager.py:561 +msgid "Instance failed network setup" +msgstr "" + +#: cinder/compute/manager.py:565 +#, python-format +msgid "Instance network_info: |%s|" +msgstr "" + +#: cinder/compute/manager.py:578 +msgid "Instance failed block device setup" +msgstr "" + +#: cinder/compute/manager.py:594 +msgid "Instance failed to spawn" +msgstr "" + +#: cinder/compute/manager.py:615 +msgid "Deallocating network for instance" +msgstr "" + +#: cinder/compute/manager.py:672 +#, python-format +msgid "%(action_str)s instance" +msgstr "" + +#: cinder/compute/manager.py:699 +#, python-format +msgid "Ignoring DiskNotFound: %s" +msgstr "" + +#: cinder/compute/manager.py:708 +#, python-format +msgid "terminating bdm %s" +msgstr "" + +#: cinder/compute/manager.py:742 cinder/compute/manager.py:1328 +#: cinder/compute/manager.py:1416 cinder/compute/manager.py:2501 +#, python-format +msgid "%s. Setting instance vm_state to ERROR" +msgstr "" + +#: cinder/compute/manager.py:811 +#, python-format +msgid "" +"Cannot rebuild instance [%(instance_uuid)s], because the given image does" +" not exist." +msgstr "" + +#: cinder/compute/manager.py:816 +#, python-format +msgid "Cannot rebuild instance [%(instance_uuid)s]: %(exc)s" +msgstr "" + +#: cinder/compute/manager.py:823 +#, python-format +msgid "Rebuilding instance %s" +msgstr "" + +#: cinder/compute/manager.py:876 +#, python-format +msgid "Rebooting instance %s" +msgstr "" + +#: cinder/compute/manager.py:891 +#, python-format +msgid "" +"trying to reboot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:933 +#, python-format +msgid "instance %s: snapshotting" +msgstr "" + +#: cinder/compute/manager.py:939 +#, python-format +msgid "" +"trying to snapshot a non-running instance: %(instance_uuid)s (state: " +"%(state)s expected: %(running)s)" +msgstr "" + +#: cinder/compute/manager.py:995 +#, python-format +msgid "Found %(num_images)d images (rotation: %(rotation)d)" +msgstr "" + +#: cinder/compute/manager.py:1001 +#, python-format +msgid "Rotating out %d backups" +msgstr "" + +#: cinder/compute/manager.py:1005 +#, python-format +msgid "Deleting image %s" +msgstr "" + +#: cinder/compute/manager.py:1035 +#, python-format +msgid "Failed to set admin password. Instance %s is not running" +msgstr "" + +#: cinder/compute/manager.py:1041 +#, python-format +msgid "Instance %s: Root password set" +msgstr "" + +#: cinder/compute/manager.py:1050 +msgid "set_admin_password is not implemented by this driver." +msgstr "" + +#: cinder/compute/manager.py:1064 +msgid "Error setting admin password" +msgstr "" + +#: cinder/compute/manager.py:1079 +#, python-format +msgid "" +"trying to inject a file into a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1084 +#, python-format +msgid "instance %(instance_uuid)s: injecting file to %(path)s" +msgstr "" + +#: cinder/compute/manager.py:1098 +#, python-format +msgid "" +"trying to update agent on a non-running instance: %(instance_uuid)s " +"(state: %(current_power_state)s expected: %(expected_state)s)" +msgstr "" + +#: cinder/compute/manager.py:1103 +#, python-format +msgid "instance %(instance_uuid)s: updating agent to %(url)s" +msgstr "" + +#: cinder/compute/manager.py:1116 +#, python-format +msgid "instance %s: rescuing" +msgstr "" + +#: cinder/compute/manager.py:1141 +#, python-format +msgid "instance %s: unrescuing" +msgstr "" + +#: cinder/compute/manager.py:1270 +msgid "destination same as source!" +msgstr "" + +#: cinder/compute/manager.py:1287 +#, python-format +msgid "instance %s: migrating" +msgstr "" + +#: cinder/compute/manager.py:1471 +#, python-format +msgid "instance %s: pausing" +msgstr "" + +#: cinder/compute/manager.py:1489 +#, python-format +msgid "instance %s: unpausing" +msgstr "" + +#: cinder/compute/manager.py:1525 +#, python-format +msgid "instance %s: retrieving diagnostics" +msgstr "" + +#: cinder/compute/manager.py:1534 +#, python-format +msgid "instance %s: suspending" +msgstr "" + +#: cinder/compute/manager.py:1556 +#, python-format +msgid "instance %s: resuming" +msgstr "" + +#: cinder/compute/manager.py:1579 +#, python-format +msgid "instance %s: locking" +msgstr "" + +#: cinder/compute/manager.py:1588 +#, python-format +msgid "instance %s: unlocking" +msgstr "" + +#: cinder/compute/manager.py:1596 +#, python-format +msgid "instance %s: getting locked state" +msgstr "" + +#: cinder/compute/manager.py:1606 +#, python-format +msgid "instance %s: reset network" +msgstr "" + +#: cinder/compute/manager.py:1614 +#, python-format +msgid "instance %s: inject network info" +msgstr "" + +#: cinder/compute/manager.py:1618 +#, python-format +msgid "network_info to inject: |%s|" +msgstr "" + +#: cinder/compute/manager.py:1655 +#, python-format +msgid "instance %s: getting vnc console" +msgstr "" + +#: cinder/compute/manager.py:1685 +#, python-format +msgid "Booting with volume %(volume_id)s at %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1703 +#, python-format +msgid "" +"instance %(instance_uuid)s: attaching volume %(volume_id)s to " +"%(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1705 +#, python-format +msgid "Attaching volume %(volume_id)s to %(mountpoint)s" +msgstr "" + +#: cinder/compute/manager.py:1714 +#, python-format +msgid "instance %(instance_uuid)s: attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1724 +#, python-format +msgid "Attach failed %(mountpoint)s, removing" +msgstr "" + +#: cinder/compute/manager.py:1752 +#, python-format +msgid "Detach volume %(volume_id)s from mountpoint %(mp)s" +msgstr "" + +#: cinder/compute/manager.py:1756 +#, python-format +msgid "Detaching volume from unknown instance %s" +msgstr "" + +#: cinder/compute/manager.py:1822 +#, python-format +msgid "" +"Creating tmpfile %s to notify to other compute nodes that they should " +"mount the same storage." +msgstr "" + +#: cinder/compute/manager.py:1884 +msgid "Instance has no volume." +msgstr "" + +#: cinder/compute/manager.py:1916 +#, python-format +msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s." +msgstr "" + +#: cinder/compute/manager.py:1973 +#, python-format +msgid "Pre live migration failed at %(dest)s" +msgstr "" + +#: cinder/compute/manager.py:2000 +msgid "post_live_migration() is started.." +msgstr "" + +#: cinder/compute/manager.py:2030 +msgid "No floating_ip found" +msgstr "" + +#: cinder/compute/manager.py:2038 +msgid "No floating_ip found." +msgstr "" + +#: cinder/compute/manager.py:2040 +#, python-format +msgid "" +"Live migration: Unexpected error: cannot inherit floating ip.\n" +"%(e)s" +msgstr "" + +#: cinder/compute/manager.py:2073 +#, python-format +msgid "Migrating instance to %(dest)s finished successfully." +msgstr "" + +#: cinder/compute/manager.py:2075 +msgid "" +"You may see the error \"libvirt: QEMU error: Domain not found: no domain " +"with matching name.\" This error can be safely ignored." +msgstr "" + +#: cinder/compute/manager.py:2090 +msgid "Post operation of migraton started" +msgstr "" + +#: cinder/compute/manager.py:2226 +#, python-format +msgid "Updated the info_cache for instance %s" +msgstr "" + +#: cinder/compute/manager.py:2255 +msgid "Updating bandwidth usage cache" +msgstr "" + +#: cinder/compute/manager.py:2277 +msgid "Updating host status" +msgstr "" + +#: cinder/compute/manager.py:2305 +#, python-format +msgid "" +"Found %(num_db_instances)s in the database and %(num_vm_instances)s on " +"the hypervisor." +msgstr "" + +#: cinder/compute/manager.py:2331 +#, python-format +msgid "" +"During the sync_power process the instance %(uuid)s has moved from host " +"%(src)s to host %(dst)s" +msgstr "" + +#: cinder/compute/manager.py:2344 +#, python-format +msgid "" +"Instance %s is in the process of migrating to this host. Wait next " +"sync_power cycle before setting power state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2350 +msgid "" +"Instance found in database but not known by hypervisor. Setting power " +"state to NOSTATE" +msgstr "" + +#: cinder/compute/manager.py:2380 +msgid "FLAGS.reclaim_instance_interval <= 0, skipping..." +msgstr "" + +#: cinder/compute/manager.py:2392 +msgid "Reclaiming deleted instance" +msgstr "" + +#: cinder/compute/manager.py:2458 +#, python-format +msgid "" +"Detected instance with name label '%(name)s' which is marked as DELETED " +"but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2465 +#, python-format +msgid "" +"Destroying instance with name label '%(name)s' which is marked as DELETED" +" but still present on host." +msgstr "" + +#: cinder/compute/manager.py:2472 +#, python-format +msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action" +msgstr "" + +#: cinder/compute/manager.py:2542 +#, python-format +msgid "" +"Aggregate %(aggregate_id)s: unrecoverable state during operation on " +"%(host)s" +msgstr "" + +#: cinder/compute/utils.py:142 +msgid "v4 subnets are required for legacy nw_info" +msgstr "" + +#: cinder/console/manager.py:77 cinder/console/vmrc_manager.py:70 +msgid "Adding console" +msgstr "" + +#: cinder/console/manager.py:97 +#, python-format +msgid "Tried to remove non-existant console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:122 +#, python-format +msgid "Tried to remove non-existent console %(console_id)s." +msgstr "" + +#: cinder/console/vmrc_manager.py:125 +#, python-format +msgid "Removing console %(console_id)s." +msgstr "" + +#: cinder/console/xvp.py:98 +msgid "Rebuilding xvp conf" +msgstr "" + +#: cinder/console/xvp.py:116 +#, python-format +msgid "Re-wrote %s" +msgstr "" + +#: cinder/console/xvp.py:121 +msgid "Stopping xvp" +msgstr "" + +#: cinder/console/xvp.py:134 +msgid "Starting xvp" +msgstr "" + +#: cinder/console/xvp.py:141 +#, python-format +msgid "Error starting xvp: %s" +msgstr "" + +#: cinder/console/xvp.py:144 +msgid "Restarting xvp" +msgstr "" + +#: cinder/console/xvp.py:146 +msgid "xvp not running..." +msgstr "" + +#: cinder/consoleauth/manager.py:63 +#, python-format +msgid "Deleting Expired Token: (%s)" +msgstr "" + +#: cinder/consoleauth/manager.py:75 +#, python-format +msgid "Received Token: %(token)s, %(token_dict)s)" +msgstr "" + +#: cinder/consoleauth/manager.py:79 +#, python-format +msgid "Checking Token: %(token)s, %(token_valid)s)" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:57 +msgid "Use of empty request context is deprecated" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:198 +#, python-format +msgid "Unrecognized read_deleted value '%s'" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:516 cinder/db/sqlalchemy/api.py:551 +#, python-format +msgid "No ComputeNode for %(host)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4019 cinder/db/sqlalchemy/api.py:4045 +#, python-format +msgid "No backend config with id %(sm_backend_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4103 +#, python-format +msgid "No sm_flavor called %(sm_flavor)s" +msgstr "" + +#: cinder/db/sqlalchemy/api.py:4147 +#, python-format +msgid "No sm_volume with id %(volume_id)s" +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:66 +msgid "python-migrate is not installed. Exiting." +msgstr "" + +#: cinder/db/sqlalchemy/migration.py:78 +msgid "version should be an integer" +msgstr "" + +#: cinder/db/sqlalchemy/session.py:137 +#, python-format +msgid "SQL connection failed. %s attempts left." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:48 +msgid "interface column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:80 +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:54 +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:48 +#, python-format +msgid "Table |%s| not created!" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:87 +msgid "VIF column not added to fixed_ips table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/030_multi_nic.py:97 +#, python-format +msgid "join list for moving mac_addresses |%s|" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:39 +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:60 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:61 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:99 +msgid "foreign key constraint couldn't be added" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/031_fk_fixed_ips_virtual_interface_id.py:58 +msgid "foreign key constraint couldn't be dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/045_add_network_priority.py:34 +msgid "priority column not added to networks table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py:41 +#: cinder/db/sqlalchemy/migrate_repo/versions/060_remove_network_fk_from_vif.py:42 +#: cinder/db/sqlalchemy/migrate_repo/versions/064_change_instance_id_to_uuid_in_instance_actions.py:56 +#: cinder/db/sqlalchemy/migrate_repo/versions/070_untie_cinder_network_models.py:68 +msgid "foreign key constraint couldn't be removed" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/049_add_instances_progress.py:34 +msgid "progress column not added to instances table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/055_convert_flavor_id_to_str.py:97 +#, python-format +msgid "" +"Could not cast flavorid to integer: %s. Set flavorid to an integer-like " +"string to downgrade." +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/062_add_instance_info_cache_table.py:69 +msgid "instance_info_caches tables not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/069_block_migration.py:41 +msgid "progress column not added to compute_nodes table" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/072_add_dns_table.py:76 +msgid "dns_domains table not dropped" +msgstr "" + +#: cinder/db/sqlalchemy/migrate_repo/versions/083_quota_class.py:60 +msgid "quota_classes table not dropped" +msgstr "" + +#: cinder/image/glance.py:147 +msgid "Connection error contacting glance server, retrying" +msgstr "" + +#: cinder/image/glance.py:153 cinder/network/quantum/melange_connection.py:104 +msgid "Maximum attempts reached" +msgstr "" + +#: cinder/image/glance.py:278 +#, python-format +msgid "Creating image in Glance. Metadata passed in %s" +msgstr "" + +#: cinder/image/glance.py:281 +#, python-format +msgid "Metadata after formatting for Glance %s" +msgstr "" + +#: cinder/image/glance.py:289 +#, python-format +msgid "Metadata returned from Glance formatted for Base %s" +msgstr "" + +#: cinder/image/glance.py:331 cinder/image/glance.py:335 +msgid "Not the image owner" +msgstr "" + +#: cinder/image/glance.py:410 +#, python-format +msgid "%(timestamp)s does not follow any of the signatures: %(iso_formats)s" +msgstr "" + +#: cinder/image/s3.py:309 +#, python-format +msgid "Failed to download %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:328 +#, python-format +msgid "Failed to decrypt %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:340 +#, python-format +msgid "Failed to untar %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:353 +#, python-format +msgid "Failed to upload %(image_location)s to %(image_path)s" +msgstr "" + +#: cinder/image/s3.py:379 +#, python-format +msgid "Failed to decrypt private key: %s" +msgstr "" + +#: cinder/image/s3.py:387 +#, python-format +msgid "Failed to decrypt initialization vector: %s" +msgstr "" + +#: cinder/image/s3.py:398 +#, python-format +msgid "Failed to decrypt image file %(image_file)s: %(err)s" +msgstr "" + +#: cinder/image/s3.py:410 +msgid "Unsafe filenames in image" +msgstr "" + +#: cinder/ipv6/account_identifier.py:38 cinder/ipv6/rfc2462.py:34 +#, python-format +msgid "Bad mac for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:40 cinder/ipv6/rfc2462.py:36 +#, python-format +msgid "Bad prefix for to_global_ipv6: %s" +msgstr "" + +#: cinder/ipv6/account_identifier.py:42 +#, python-format +msgid "Bad project_id for to_global_ipv6: %s" +msgstr "" + +#: cinder/network/ldapdns.py:321 +msgid "This driver only supports type 'a' entries." +msgstr "" + +#: cinder/network/linux_net.py:166 +#, python-format +msgid "Attempted to remove chain %s which does not exist" +msgstr "" + +#: cinder/network/linux_net.py:192 +#, python-format +msgid "Unknown chain: %r" +msgstr "" + +#: cinder/network/linux_net.py:215 +#, python-format +msgid "" +"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " +"%(top)r" +msgstr "" + +#: cinder/network/linux_net.py:335 +msgid "IPTablesManager.apply completed with success" +msgstr "" + +#: cinder/network/linux_net.py:694 +#, python-format +msgid "Hupping dnsmasq threw %s" +msgstr "" + +#: cinder/network/linux_net.py:696 +#, python-format +msgid "Pid %d is stale, relaunching dnsmasq" +msgstr "" + +#: cinder/network/linux_net.py:756 +#, python-format +msgid "killing radvd threw %s" +msgstr "" + +#: cinder/network/linux_net.py:758 +#, python-format +msgid "Pid %d is stale, relaunching radvd" +msgstr "" + +#: cinder/network/linux_net.py:967 +#, python-format +msgid "Starting VLAN inteface %s" +msgstr "" + +#: cinder/network/linux_net.py:999 +#, python-format +msgid "Starting Bridge interface for %s" +msgstr "" + +#: cinder/network/linux_net.py:1142 +#, python-format +msgid "Starting bridge %s " +msgstr "" + +#: cinder/network/linux_net.py:1149 +#, python-format +msgid "Done starting bridge %s" +msgstr "" + +#: cinder/network/linux_net.py:1167 +#, python-format +msgid "Failed unplugging gateway interface '%s'" +msgstr "" + +#: cinder/network/linux_net.py:1170 +#, python-format +msgid "Unplugged gateway interface '%s'" +msgstr "" + +#: cinder/network/manager.py:291 +#, python-format +msgid "Fixed ip %(fixed_ip_id)s not found" +msgstr "" + +#: cinder/network/manager.py:300 cinder/network/manager.py:496 +#, python-format +msgid "Interface %(interface)s not found" +msgstr "" + +#: cinder/network/manager.py:315 +#, python-format +msgid "floating IP allocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:353 +#, python-format +msgid "floating IP deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:386 +#, python-format +msgid "Address |%(address)s| is not allocated" +msgstr "" + +#: cinder/network/manager.py:390 +#, python-format +msgid "Address |%(address)s| is not allocated to your project |%(project)s|" +msgstr "" + +#: cinder/network/manager.py:402 +#, python-format +msgid "Quota exceeded for %s, tried to allocate address" +msgstr "" + +#: cinder/network/manager.py:614 +#, python-format +msgid "" +"Database inconsistency: DNS domain |%s| is registered in the Cinder db but " +"not visible to either the floating or instance DNS driver. It will be " +"ignored." +msgstr "" + +#: cinder/network/manager.py:660 +#, python-format +msgid "Domain |%(domain)s| already exists, changing zone to |%(av_zone)s|." +msgstr "" + +#: cinder/network/manager.py:670 +#, python-format +msgid "Domain |%(domain)s| already exists, changing project to |%(project)s|." +msgstr "" + +#: cinder/network/manager.py:778 +#, python-format +msgid "Disassociated %s stale fixed ip(s)" +msgstr "" + +#: cinder/network/manager.py:782 +msgid "setting network host" +msgstr "" + +#: cinder/network/manager.py:896 +#, python-format +msgid "network allocations for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:901 +#, python-format +msgid "networks retrieved for instance |%(instance_id)s|: |%(networks)s|" +msgstr "" + +#: cinder/network/manager.py:930 +#, python-format +msgid "network deallocation for instance |%s|" +msgstr "" + +#: cinder/network/manager.py:1152 +#, python-format +msgid "" +"instance-dns-zone is |%(domain)s|, which is in availability zone " +"|%(zone)s|. Instance |%(instance)s| is in zone |%(zone2)s|. No DNS record" +" will be created." +msgstr "" + +#: cinder/network/manager.py:1227 +#, python-format +msgid "Unable to release %s because vif doesn't exist." +msgstr "" + +#: cinder/network/manager.py:1244 +#, python-format +msgid "Leased IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1248 +#, python-format +msgid "IP %s leased that is not associated" +msgstr "" + +#: cinder/network/manager.py:1256 +#, python-format +msgid "IP |%s| leased that isn't allocated" +msgstr "" + +#: cinder/network/manager.py:1261 +#, python-format +msgid "Released IP |%(address)s|" +msgstr "" + +#: cinder/network/manager.py:1265 +#, python-format +msgid "IP %s released that is not associated" +msgstr "" + +#: cinder/network/manager.py:1268 +#, python-format +msgid "IP %s released that was not leased" +msgstr "" + +#: cinder/network/manager.py:1331 +msgid "cidr already in use" +msgstr "" + +#: cinder/network/manager.py:1334 +#, python-format +msgid "requested cidr (%(cidr)s) conflicts with existing supernet (%(super)s)" +msgstr "" + +#: cinder/network/manager.py:1345 +#, python-format +msgid "" +"requested cidr (%(cidr)s) conflicts with existing smaller cidr " +"(%(smaller)s)" +msgstr "" + +#: cinder/network/manager.py:1404 +msgid "Network already exists!" +msgstr "" + +#: cinder/network/manager.py:1423 +#, python-format +msgid "Network must be disassociated from project %s before delete" +msgstr "" + +#: cinder/network/manager.py:1832 +msgid "" +"The sum between the number of networks and the vlan start cannot be " +"greater than 4094" +msgstr "" + +#: cinder/network/manager.py:1839 +#, python-format +msgid "" +"The network range is not big enough to fit %(num_networks)s. Network size" +" is %(network_size)s" +msgstr "" + +#: cinder/network/minidns.py:65 +msgid "This driver only supports type 'a'" +msgstr "" + +#: cinder/network/quantum/client.py:154 +msgid "Tenant ID not set" +msgstr "" + +#: cinder/network/quantum/client.py:180 +#, python-format +msgid "Quantum Client Request: %(method)s %(action)s" +msgstr "" + +#: cinder/network/quantum/client.py:196 +#, python-format +msgid "Quantum entity not found: %s" +msgstr "" + +#: cinder/network/quantum/client.py:206 +#, python-format +msgid "Server %(status_code)s error: %(data)s" +msgstr "" + +#: cinder/network/quantum/client.py:210 +#, python-format +msgid "Unable to connect to server. Got error: %s" +msgstr "" + +#: cinder/network/quantum/client.py:228 +#, python-format +msgid "unable to deserialize object of type = '%s'" +msgstr "" + +#: cinder/network/quantum/manager.py:162 +msgid "QuantumManager does not use 'multi_host' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:166 +msgid "QuantumManager requires that only one network is created per call" +msgstr "" + +#: cinder/network/quantum/manager.py:176 +msgid "QuantumManager does not use 'vlan_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:182 +msgid "QuantumManager does not use 'vpn_start' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:186 +msgid "QuantumManager does not use 'bridge' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:190 +msgid "QuantumManager does not use 'bridge_interface' parameter." +msgstr "" + +#: cinder/network/quantum/manager.py:195 +msgid "QuantumManager requires a valid (.1) gateway address." +msgstr "" + +#: cinder/network/quantum/manager.py:204 +#, python-format +msgid "" +"Unable to find existing quantum network for tenant '%(q_tenant_id)s' with" +" net-id '%(quantum_net_id)s'" +msgstr "" + +#: cinder/network/quantum/manager.py:301 +#, python-format +msgid "network allocations for instance %s" +msgstr "" + +#: cinder/network/quantum/manager.py:588 +#, python-format +msgid "" +"port deallocation failed for instance: |%(instance_id)s|, port_id: " +"|%(port_id)s|" +msgstr "" + +#: cinder/network/quantum/manager.py:606 +#, python-format +msgid "" +"ipam deallocation failed for instance: |%(instance_id)s|, vif_uuid: " +"|%(vif_uuid)s|" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:96 +#, python-format +msgid "Server returned error: %s" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:98 +msgid "Connection error contacting melange service, retrying" +msgstr "" + +#: cinder/network/quantum/melange_connection.py:108 +#, python-format +msgid "" +"allocate IP on network |%(network_id)s| belonging to " +"|%(network_tenant_id)s| to this vif |%(vif_id)s| with mac " +"|%(mac_address)s| belonging to |%(project_id)s| " +msgstr "" + +#: cinder/network/quantum/melange_ipam_lib.py:133 +msgid "get_project_and_global_net_ids must be called with a non-null project_id" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:75 +msgid "Error creating network entry" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:90 +#, python-format +msgid "No network with net_id = %s" +msgstr "" + +#: cinder/network/quantum/cinder_ipam_lib.py:221 +#, python-format +msgid "No fixed IPs to deallocate for vif %s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:99 +#, python-format +msgid "Connecting interface %(interface_id)s to net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/network/quantum/quantum_connection.py:113 +#, python-format +msgid "Deleting port %(port_id)s on net %(net_id)s for %(tenant_id)s" +msgstr "" + +#: cinder/notifier/api.py:115 +#, python-format +msgid "%s not in valid priorities" +msgstr "" + +#: cinder/notifier/api.py:130 +#, python-format +msgid "" +"Problem '%(e)s' attempting to send to notification system. " +"Payload=%(payload)s" +msgstr "" + +#: cinder/notifier/list_notifier.py:65 +#, python-format +msgid "Problem '%(e)s' attempting to send to notification driver %(driver)s." +msgstr "" + +#: cinder/notifier/rabbit_notifier.py:46 +#, python-format +msgid "Could not send notification to %(topic)s. Payload=%(message)s" +msgstr "" + +#: cinder/rpc/amqp.py:146 +#, python-format +msgid "Returning exception %s to caller" +msgstr "" + +#: cinder/rpc/amqp.py:188 +#, python-format +msgid "unpacked context: %s" +msgstr "" + +#: cinder/rpc/amqp.py:231 +#, python-format +msgid "received %s" +msgstr "" + +#: cinder/rpc/amqp.py:236 +#, python-format +msgid "no method for message: %s" +msgstr "" + +#: cinder/rpc/amqp.py:237 +#, python-format +msgid "No method for message: %s" +msgstr "" + +#: cinder/rpc/amqp.py:321 +#, python-format +msgid "Making asynchronous call on %s ..." +msgstr "" + +#: cinder/rpc/amqp.py:324 +#, python-format +msgid "MSG_ID is %s" +msgstr "" + +#: cinder/rpc/amqp.py:346 +#, python-format +msgid "Making asynchronous cast on %s..." +msgstr "" + +#: cinder/rpc/amqp.py:354 +msgid "Making asynchronous fanout cast..." +msgstr "" + +#: cinder/rpc/amqp.py:379 +#, python-format +msgid "Sending notification on %s..." +msgstr "" + +#: cinder/rpc/common.py:54 +#, python-format +msgid "" +"Remote error: %(exc_type)s %(value)s\n" +"%(traceback)s." +msgstr "" + +#: cinder/rpc/common.py:71 +msgid "Timeout while waiting on RPC response." +msgstr "" + +#: cinder/rpc/impl_kombu.py:111 +msgid "Failed to process message... skipping it." +msgstr "" + +#: cinder/rpc/impl_kombu.py:407 +#, python-format +msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:430 +#, python-format +msgid "Connected to AMQP server on %(hostname)s:%(port)d" +msgstr "" + +#: cinder/rpc/impl_kombu.py:466 +#, python-format +msgid "" +"Unable to connect to AMQP server on %(hostname)s:%(port)d after " +"%(max_retries)d tries: %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:482 +#, python-format +msgid "" +"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " +"again in %(sleep_time)d seconds." +msgstr "" + +#: cinder/rpc/impl_kombu.py:533 cinder/rpc/impl_qpid.py:385 +#, python-format +msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:551 cinder/rpc/impl_qpid.py:400 +#, python-format +msgid "Timed out waiting for RPC response: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:555 cinder/rpc/impl_qpid.py:404 +#, python-format +msgid "Failed to consume message from queue: %s" +msgstr "" + +#: cinder/rpc/impl_kombu.py:589 cinder/rpc/impl_qpid.py:434 +#, python-format +msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:341 +#, python-format +msgid "Unable to connect to AMQP server: %s " +msgstr "" + +#: cinder/rpc/impl_qpid.py:346 +#, python-format +msgid "Connected to AMQP server on %s" +msgstr "" + +#: cinder/rpc/impl_qpid.py:354 +msgid "Re-established AMQP queues" +msgstr "" + +#: cinder/rpc/impl_qpid.py:412 +msgid "Error processing message. Skipping it." +msgstr "" + +#: cinder/scheduler/chance.py:47 cinder/scheduler/simple.py:91 +#: cinder/scheduler/simple.py:143 +msgid "Is the appropriate service running?" +msgstr "" + +#: cinder/scheduler/chance.py:52 +msgid "Could not find another compute" +msgstr "" + +#: cinder/scheduler/driver.py:63 +#, python-format +msgid "Casted '%(method)s' to volume '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:80 +#, python-format +msgid "Casted '%(method)s' to compute '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:89 +#, python-format +msgid "Casted '%(method)s' to network '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:107 +#, python-format +msgid "Casted '%(method)s' to %(topic)s '%(host)s'" +msgstr "" + +#: cinder/scheduler/driver.py:181 +msgid "Must implement a fallback schedule" +msgstr "" + +#: cinder/scheduler/driver.py:185 +msgid "Driver must implement schedule_prep_resize" +msgstr "" + +#: cinder/scheduler/driver.py:190 +msgid "Driver must implement schedule_run_instance" +msgstr "" + +#: cinder/scheduler/driver.py:325 +msgid "Block migration can not be used with shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:330 +msgid "Live migration can not be used without shared storage." +msgstr "" + +#: cinder/scheduler/driver.py:367 cinder/scheduler/driver.py:457 +#, python-format +msgid "host %(dest)s is not compatible with original host %(src)s." +msgstr "" + +#: cinder/scheduler/driver.py:416 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"memory(host:%(avail)s <= instance:%(mem_inst)s)" +msgstr "" + +#: cinder/scheduler/driver.py:472 +#, python-format +msgid "" +"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of " +"disk(host:%(available)s <= instance:%(necessary)s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:51 +#, python-format +msgid "No host selection for %s defined." +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:64 +#, python-format +msgid "Attempting to build %(num_instances)d instance(s)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:157 +msgid "Scheduler only understands Compute nodes (for now)" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:199 +#, python-format +msgid "Filtered %(hosts)s" +msgstr "" + +#: cinder/scheduler/filter_scheduler.py:209 +#, python-format +msgid "Weighted %(weighted_host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:144 +#, python-format +msgid "Host filter fails for ignored host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:151 +#, python-format +msgid "Host filter fails for non-forced host %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:157 +#, python-format +msgid "Host filter function %(func)s failed for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:163 +#, python-format +msgid "Host filter passes for %(host)s" +msgstr "" + +#: cinder/scheduler/host_manager.py:272 +#, python-format +msgid "Received %(service_name)s service update from %(host)s." +msgstr "" + +#: cinder/scheduler/host_manager.py:313 +msgid "host_manager only implemented for 'compute'" +msgstr "" + +#: cinder/scheduler/host_manager.py:323 +#, python-format +msgid "No service for compute ID %s" +msgstr "" + +#: cinder/scheduler/manager.py:85 +#, python-format +msgid "" +"Driver Method %(driver_method_name)s missing: %(e)s. Reverting to " +"schedule()" +msgstr "" + +#: cinder/scheduler/manager.py:150 +#, python-format +msgid "Failed to schedule_%(method)s: %(ex)s" +msgstr "" + +#: cinder/scheduler/manager.py:159 +#, python-format +msgid "Setting instance %(instance_uuid)s to %(state)s state." +msgstr "" + +#: cinder/scheduler/scheduler_options.py:66 +#, python-format +msgid "Could not stat scheduler options file %(filename)s: '%(e)s'" +msgstr "" + +#: cinder/scheduler/scheduler_options.py:75 +#, python-format +msgid "Could not decode scheduler options: '%(e)s'" +msgstr "" + +#: cinder/scheduler/simple.py:87 +msgid "Not enough allocatable CPU cores remaining" +msgstr "" + +#: cinder/scheduler/simple.py:137 +msgid "Not enough allocatable volume gigabytes remaining" +msgstr "" + +#: cinder/scheduler/filters/core_filter.py:45 +msgid "VCPUs not set; assuming CPU collection broken" +msgstr "" + +#: cinder/tests/fake_utils.py:72 +#, python-format +msgid "Faking execution of cmd (subprocess): %s" +msgstr "" + +#: cinder/tests/fake_utils.py:80 +#, python-format +msgid "Faked command matched %s" +msgstr "" + +#: cinder/tests/fake_utils.py:96 +#, python-format +msgid "Faked command raised an exception %s" +msgstr "" + +#: cinder/tests/fake_utils.py:101 +#, python-format +msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'" +msgstr "" + +#: cinder/tests/fakelibvirt.py:784 +msgid "Please extend mock libvirt module to support flags" +msgstr "" + +#: cinder/tests/fakelibvirt.py:790 +msgid "Please extend fake libvirt module to support this auth method" +msgstr "" + +#: cinder/tests/test_compute.py:365 cinder/tests/test_compute.py:1419 +#, python-format +msgid "Running instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:371 +#, python-format +msgid "After terminating instances: %s" +msgstr "" + +#: cinder/tests/test_compute.py:589 +msgid "Internal error" +msgstr "" + +#: cinder/tests/test_compute.py:1430 +#, python-format +msgid "After force-killing instances: %s" +msgstr "" + +#: cinder/tests/test_misc.py:92 +#, python-format +msgid "" +"The following migrations are missing a downgrade:\n" +"\t%s" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:169 +msgid "id" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:170 +msgid "IPv4" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:171 +msgid "IPv6" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:172 +msgid "start address" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:173 +msgid "DNS1" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:174 +msgid "DNS2" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:175 +msgid "VlanID" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:176 +msgid "project" +msgstr "" + +#: cinder/tests/test_cinder_manage.py:177 +msgid "uuid" +msgstr "" + +#: cinder/tests/test_volume.py:216 +#, python-format +msgid "Target %s allocated" +msgstr "" + +#: cinder/tests/test_volume.py:468 +#, python-format +msgid "Cannot confirm exported volume id:%s." +msgstr "" + +#: cinder/tests/test_volume_types.py:58 +#, python-format +msgid "Given data: %s" +msgstr "" + +#: cinder/tests/test_volume_types.py:59 +#, python-format +msgid "Result data: %s" +msgstr "" + +#: cinder/tests/test_xenapi.py:626 +#, python-format +msgid "Creating files in %s to simulate guest agent" +msgstr "" + +#: cinder/tests/test_xenapi.py:637 +#, python-format +msgid "Removing simulated guest agent files in %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/test_servers.py:2144 +#, python-format +msgid "Quota exceeded: code=%(code)s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:57 +#, python-format +msgid "_create: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:66 +#, python-format +msgid "_delete: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:75 +#, python-format +msgid "_get: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:85 +#, python-format +msgid "_get_all: %s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:125 +#, python-format +msgid "test_snapshot_create: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:134 +#, python-format +msgid "test_snapshot_create: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:156 +#, python-format +msgid "test_snapshot_create_force: param=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:165 +#, python-format +msgid "test_snapshot_create_force: resp_dict=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:205 +#, python-format +msgid "test_snapshot_show: resp=%s" +msgstr "" + +#: cinder/tests/api/openstack/compute/contrib/test_snapshots.py:231 +#, python-format +msgid "test_snapshot_detail: resp_dict=%s" +msgstr "" + +#: cinder/tests/integrated/test_login.py:31 +#, python-format +msgid "flavor: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:38 +#, python-format +msgid "" +"%(message)s\n" +"Status Code: %(_status)s\n" +"Body: %(_body)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:47 +msgid "Authentication error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:55 +msgid "Authorization error" +msgstr "" + +#: cinder/tests/integrated/api/client.py:63 +msgid "Item not found" +msgstr "" + +#: cinder/tests/integrated/api/client.py:105 +#, python-format +msgid "Doing %(method)s on %(relative_url)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:107 +#, python-format +msgid "Body: %s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:125 +#, python-format +msgid "%(auth_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:151 +#, python-format +msgid "%(relative_uri)s => code %(http_status)s" +msgstr "" + +#: cinder/tests/integrated/api/client.py:161 +msgid "Unexpected status code" +msgstr "" + +#: cinder/tests/integrated/api/client.py:168 +#, python-format +msgid "Decoding JSON: %s" +msgstr "" + +#: cinder/tests/rpc/common.py:133 +#, python-format +msgid "Nested received %(queue)s, %(value)s" +msgstr "" + +#: cinder/tests/rpc/common.py:142 +#, python-format +msgid "Nested return %s" +msgstr "" + +#: cinder/tests/rpc/common.py:160 +msgid "RPC backend does not support timeouts" +msgstr "" + +#: cinder/tests/rpc/common.py:227 cinder/tests/rpc/common.py:233 +#, python-format +msgid "Received %s" +msgstr "" + +#: cinder/virt/connection.py:85 +msgid "Failed to open connection to the hypervisor" +msgstr "" + +#: cinder/virt/fake.py:270 cinder/virt/xenapi_conn.py:396 +#: cinder/virt/baremetal/proxy.py:716 cinder/virt/libvirt/connection.py:2045 +#, python-format +msgid "Compute_service record created for %s " +msgstr "" + +#: cinder/virt/fake.py:273 cinder/virt/xenapi_conn.py:399 +#: cinder/virt/baremetal/proxy.py:720 cinder/virt/libvirt/connection.py:2048 +#, python-format +msgid "Compute_service record updated for %s " +msgstr "" + +#: cinder/virt/firewall.py:130 +#, python-format +msgid "Attempted to unfilter instance %s which is not filtered" +msgstr "" + +#: cinder/virt/firewall.py:137 +#, python-format +msgid "Filters added to instance %s" +msgstr "" + +#: cinder/virt/firewall.py:139 +msgid "Provider Firewall Rules refreshed" +msgstr "" + +#: cinder/virt/firewall.py:291 +#, python-format +msgid "Adding security group rule: %r" +msgstr "" + +#: cinder/virt/firewall.py:403 cinder/virt/xenapi/firewall.py:87 +#, python-format +msgid "Adding provider rule: %s" +msgstr "" + +#: cinder/virt/images.py:86 +msgid "'qemu-img info' parsing failed." +msgstr "" + +#: cinder/virt/images.py:92 +#, python-format +msgid "fmt=%(fmt)s backed by: %(backing_file)s" +msgstr "" + +#: cinder/virt/images.py:104 +#, python-format +msgid "Converted to raw, but format is now %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:105 +msgid "" +"Must specify vmwareapi_host_ip,vmwareapi_host_username and " +"vmwareapi_host_password to useconnection_type=vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:276 +#, python-format +msgid "In vmwareapi:_create_session, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:359 +#, python-format +msgid "In vmwareapi:_call_method, got this exception: %s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:398 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: success" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:404 +#, python-format +msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s" +msgstr "" + +#: cinder/virt/vmwareapi_conn.py:409 +#, python-format +msgid "In vmwareapi:_poll_task, Got this error %s" +msgstr "" + +#: cinder/virt/xenapi_conn.py:140 +msgid "" +"Must specify xenapi_connection_url, xenapi_connection_username " +"(optionally), and xenapi_connection_password to use " +"connection_type=xenapi" +msgstr "" + +#: cinder/virt/xenapi_conn.py:329 cinder/virt/libvirt/connection.py:472 +msgid "Could not determine iscsi initiator name" +msgstr "" + +#: cinder/virt/xenapi_conn.py:460 +msgid "Host startup on XenServer is not supported." +msgstr "" + +#: cinder/virt/xenapi_conn.py:489 +msgid "Unable to log in to XenAPI (is the Dom0 disk full?)" +msgstr "" + +#: cinder/virt/xenapi_conn.py:527 +msgid "Host is member of a pool, but DB says otherwise" +msgstr "" + +#: cinder/virt/xenapi_conn.py:599 cinder/virt/xenapi_conn.py:612 +#, python-format +msgid "Got exception: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:93 +msgid "No domains exist." +msgstr "" + +#: cinder/virt/baremetal/dom.py:95 +#, python-format +msgid "============= initial domains =========== : %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:99 +msgid "Building domain: to be removed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:103 +msgid "Not running domain: remove" +msgstr "" + +#: cinder/virt/baremetal/dom.py:111 +msgid "domain running on an unknown node: discarded" +msgstr "" + +#: cinder/virt/baremetal/dom.py:127 +#, python-format +msgid "No such domain (%s)" +msgstr "" + +#: cinder/virt/baremetal/dom.py:134 +#, python-format +msgid "Failed power down Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:143 +msgid "deactivate -> activate fails" +msgstr "" + +#: cinder/virt/baremetal/dom.py:153 +msgid "destroy_domain: no such domain" +msgstr "" + +#: cinder/virt/baremetal/dom.py:154 +#, python-format +msgid "No such domain %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:161 +#, python-format +msgid "Domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:163 +#, python-format +msgid "Nodes: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:166 +#, python-format +msgid "After storing domains: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:169 +msgid "deactivation/removing domain failed" +msgstr "" + +#: cinder/virt/baremetal/dom.py:176 +msgid "===== Domain is being created =====" +msgstr "" + +#: cinder/virt/baremetal/dom.py:179 +msgid "Same domain name already exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:181 +msgid "create_domain: before get_idle_node" +msgstr "" + +#: cinder/virt/baremetal/dom.py:198 +#, python-format +msgid "Created new domain: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:213 +#, python-format +msgid "Failed to boot Bare-metal node %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:222 +msgid "No such domain exists" +msgstr "" + +#: cinder/virt/baremetal/dom.py:226 +#, python-format +msgid "change_domain_state: to new state %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:233 +#, python-format +msgid "Stored fake domains to the file: %s" +msgstr "" + +#: cinder/virt/baremetal/dom.py:244 +msgid "domain does not exist" +msgstr "" + +#: cinder/virt/baremetal/nodes.py:42 +#, python-format +msgid "Unknown baremetal driver %(d)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:148 +#, python-format +msgid "Error encountered when destroying instance '%(name)s': %(ex)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:162 +#, python-format +msgid "instance %(instance_name)s: deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:189 +#, python-format +msgid "instance %s: rebooted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:192 +msgid "_wait_for_reboot failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:222 +#, python-format +msgid "instance %s: rescued" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:225 +msgid "_wait_for_rescue failed" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:242 +msgid "<============= spawn of baremetal =============>" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:255 +#, python-format +msgid "instance %s: is building" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:260 +msgid "Key is injected but instance is not running yet" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:265 +#, python-format +msgid "instance %s: booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:268 +#, python-format +msgid "~~~~~~ current state = %s ~~~~~~" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:269 +#, python-format +msgid "instance %s spawned successfully" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:272 +#, python-format +msgid "instance %s:not booted" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:274 +msgid "Bremetal assignment is overcommitted." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:354 +#, python-format +msgid "instance %s: Creating image" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:473 +#, python-format +msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:484 +#, python-format +msgid "" +"instance %(inst_name)s: ignoring error injecting data into image " +"%(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:529 +#, python-format +msgid "instance %s: starting toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:531 +#, python-format +msgid "instance %s: finished toXML method" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:574 cinder/virt/libvirt/connection.py:1815 +msgid "" +"Cannot get the number of cpu, because this function is not implemented " +"for this platform. This error can be safely ignored for now." +msgstr "" + +#: cinder/virt/baremetal/proxy.py:714 +#, python-format +msgid "#### RLK: cpu_arch = %s " +msgstr "" + +#: cinder/virt/baremetal/proxy.py:746 +msgid "Updating!" +msgstr "" + +#: cinder/virt/baremetal/proxy.py:773 cinder/virt/libvirt/connection.py:2609 +#: cinder/virt/xenapi/host.py:129 +msgid "Updating host stats" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:185 +msgid "free_node...." +msgstr "" + +#: cinder/virt/baremetal/tilera.py:216 +#, python-format +msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:221 +msgid "status of node is set to 0" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:232 +msgid "rootfs is already removed" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:264 +msgid "Before ping to the bare-metal node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:275 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:279 +#, python-format +msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:292 +msgid "Noting to do for tilera nodes: vmlinux is in CF" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:316 +msgid "activate_node" +msgstr "" + +#: cinder/virt/baremetal/tilera.py:330 +msgid "Node is unknown error state." +msgstr "" + +#: cinder/virt/disk/api.py:165 +msgid "no capable image handler configured" +msgstr "" + +#: cinder/virt/disk/api.py:178 +#, python-format +msgid "unknown disk image handler: %s" +msgstr "" + +#: cinder/virt/disk/api.py:189 +msgid "image already mounted" +msgstr "" + +#: cinder/virt/disk/api.py:276 cinder/virt/disk/guestfs.py:64 +#: cinder/virt/disk/guestfs.py:78 cinder/virt/disk/mount.py:100 +#, python-format +msgid "Failed to mount filesystem: %s" +msgstr "" + +#: cinder/virt/disk/api.py:291 +#, python-format +msgid "Failed to remove container: %s" +msgstr "" + +#: cinder/virt/disk/api.py:441 +#, python-format +msgid "User %(username)s not found in password file." +msgstr "" + +#: cinder/virt/disk/api.py:457 +#, python-format +msgid "User %(username)s not found in shadow file." +msgstr "" + +#: cinder/virt/disk/guestfs.py:39 +#, python-format +msgid "unsupported partition: %s" +msgstr "" + +#: cinder/virt/disk/guestfs.py:77 +msgid "unknown guestmount error" +msgstr "" + +#: cinder/virt/disk/loop.py:30 +#, python-format +msgid "Could not attach image to loopback: %s" +msgstr "" + +#: cinder/virt/disk/mount.py:76 +msgid "no partitions found" +msgstr "" + +#: cinder/virt/disk/mount.py:77 +#, python-format +msgid "Failed to map partitions: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:58 +msgid "nbd unavailable: module not loaded" +msgstr "" + +#: cinder/virt/disk/nbd.py:63 +msgid "No free nbd devices" +msgstr "" + +#: cinder/virt/disk/nbd.py:81 +#, python-format +msgid "qemu-nbd error: %s" +msgstr "" + +#: cinder/virt/disk/nbd.py:93 +#, python-format +msgid "nbd device %s did not show up" +msgstr "" + +#: cinder/virt/libvirt/connection.py:265 +#, python-format +msgid "Connecting to libvirt: %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:286 +msgid "Connection to libvirt broke" +msgstr "" + +#: cinder/virt/libvirt/connection.py:388 +#, python-format +msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:400 +#, python-format +msgid "" +"Error from libvirt during saved instance removal. Code=%(errcode)s " +"Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:411 +#, python-format +msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:423 +msgid "Instance destroyed successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:435 +#, python-format +msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:461 +#, python-format +msgid "Deleting instance files %(target)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:554 +msgid "attaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:567 +msgid "detaching LXC block device" +msgstr "" + +#: cinder/virt/libvirt/connection.py:692 +msgid "Instance soft rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:696 +msgid "Failed to soft reboot instance." +msgstr "" + +#: cinder/virt/libvirt/connection.py:725 +msgid "Instance shutdown successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:761 cinder/virt/libvirt/connection.py:905 +msgid "During reboot, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:766 +msgid "Instance rebooted successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:867 cinder/virt/xenapi/vmops.py:1358 +#, python-format +msgid "" +"Found %(migration_count)d unconfirmed migrations older than " +"%(confirm_window)d seconds" +msgstr "" + +#: cinder/virt/libvirt/connection.py:871 +#, python-format +msgid "Automatically confirming migration %d" +msgstr "" + +#: cinder/virt/libvirt/connection.py:896 +msgid "Instance is running" +msgstr "" + +#: cinder/virt/libvirt/connection.py:910 +msgid "Instance spawned successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:926 +#, python-format +msgid "data: %(data)r, fpath: %(fpath)r" +msgstr "" + +#: cinder/virt/libvirt/connection.py:978 +#, fuzzy +msgid "Guest does not have a console available" +msgstr "使ç¨è ä¸¦æ²æç®¡çè æ¬å" + +#: cinder/virt/libvirt/connection.py:1020 +#, python-format +msgid "Path '%(path)s' supports direct I/O" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1024 +#, python-format +msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1028 cinder/virt/libvirt/connection.py:1032 +#, python-format +msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1153 +msgid "Creating image" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1339 +#, python-format +msgid "Injecting %(injection)s into image %(img_id)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1349 +#, python-format +msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1381 +#, python-format +msgid "block_device_list %s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1658 +msgid "Starting toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1662 +msgid "Finished toXML method" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1679 +#, python-format +msgid "" +"Error from libvirt while looking up %(instance_name)s: [Error Code " +"%(error_code)s] %(ex)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1920 +msgid "libvirt version is too old (does not support getVersion)" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1942 +#, python-format +msgid "'<cpu>' must be 1, but %d\n" +msgstr "" + +#: cinder/virt/libvirt/connection.py:1969 +#, python-format +msgid "topology (%(topology)s) must have %(ks)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2067 +#, python-format +msgid "" +"Instance launched has CPU info:\n" +"%s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2079 +#, python-format +msgid "" +"CPU doesn't have compatibility.\n" +"\n" +"%(ret)s\n" +"\n" +"Refer to %(u)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2136 +#, python-format +msgid "Timeout migrating for %s. nwfilter not found." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2352 +#, python-format +msgid "skipping %(path)s since it looks like volume" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2407 +#, python-format +msgid "Getting disk size of %(i_name)s: %(e)s" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2458 +#, python-format +msgid "Instance %s: Starting migrate_disk_and_power_off" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2513 +msgid "During wait running, instance disappeared." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2518 +msgid "Instance running successfully." +msgstr "" + +#: cinder/virt/libvirt/connection.py:2525 +#, python-format +msgid "Instance %s: Starting finish_migration" +msgstr "" + +#: cinder/virt/libvirt/connection.py:2565 +#, python-format +msgid "Instance %s: Starting finish_revert_migration" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:42 +msgid "" +"Libvirt module could not be loaded. NWFilterFirewall will not work " +"correctly." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:93 +msgid "Called setup_basic_filtering in nwfilter" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:101 +msgid "Ensuring static filters" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:171 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:217 +#, python-format +msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found." +msgstr "" + +#: cinder/virt/libvirt/firewall.py:233 +msgid "iptables firewall: Setup Basic Filtering" +msgstr "" + +#: cinder/virt/libvirt/firewall.py:252 +msgid "Attempted to unfilter instance which is not filtered" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:170 +#, python-format +msgid "%s is a valid instance name" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:173 +#, python-format +msgid "%s has a disk file" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:175 +#, python-format +msgid "Instance %(instance)s is backed by %(backing)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:186 +#, python-format +msgid "" +"Instance %(instance)s is using a backing file %(backing)s which does not " +"appear in the image service" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:237 +#, python-format +msgid "%(id)s (%(base_file)s): image verification failed" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:247 +#, python-format +msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:266 +#, python-format +msgid "Cannot remove %(base_file)s, it does not exist" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:278 +#, python-format +msgid "Base file too young to remove: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:281 +#, python-format +msgid "Removing base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:288 +#, python-format +msgid "Failed to remove %(base_file)s, error was %(error)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:299 +#, python-format +msgid "%(id)s (%(base_file)s): checking" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:318 +#, python-format +msgid "" +"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d " +"on other nodes" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:330 +#, python-format +msgid "" +"%(id)s (%(base_file)s): warning -- an absent base file is in use! " +"instances: %(instance_list)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:338 +#, python-format +msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:348 +#, python-format +msgid "%(id)s (%(base_file)s): image is not in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:354 +#, python-format +msgid "%(id)s (%(base_file)s): image is in use" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:377 +#, python-format +msgid "Skipping verification, no base directory at %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:381 +msgid "Verify base images" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:388 +#, python-format +msgid "Image id %(id)s yields fingerprint %(fingerprint)s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:406 +#, python-format +msgid "Unknown base file: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:411 +#, python-format +msgid "Active base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:414 +#, python-format +msgid "Corrupt base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:418 +#, python-format +msgid "Removable base files: %s" +msgstr "" + +#: cinder/virt/libvirt/imagecache.py:426 +msgid "Verification complete" +msgstr "" + +#: cinder/virt/libvirt/utils.py:264 +msgid "Unable to find an open port" +msgstr "" + +#: cinder/virt/libvirt/vif.py:90 +#, python-format +msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:99 +#, python-format +msgid "Ensuring bridge %s" +msgstr "" + +#: cinder/virt/libvirt/vif.py:165 cinder/virt/libvirt/vif.py:220 +#, python-format +msgid "Failed while unplugging vif of instance '%s'" +msgstr "" + +#: cinder/virt/libvirt/volume.py:163 +#, python-format +msgid "iSCSI device not found at %s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:166 +#, python-format +msgid "" +"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. " +"Try number: %(tries)s" +msgstr "" + +#: cinder/virt/libvirt/volume.py:178 +#, python-format +msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)" +msgstr "" + +#: cinder/virt/vmwareapi/error_util.py:93 +#, python-format +msgid "Error(s) %s occurred in the call to RetrieveProperties" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:44 cinder/virt/xenapi/fake.py:77 +#, python-format +msgid "%(text)s: _db_content => %(content)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:131 +#, python-format +msgid "Property %(attr)s not set for the managed object %(objName)s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:437 +msgid "There is no VM registered" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:439 cinder/virt/vmwareapi/fake.py:609 +#, python-format +msgid "Virtual Machine with ref %s is not there" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:502 +#, python-format +msgid "Logging out a session that is invalid or already logged out: %s" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:517 +msgid "Session is faulty" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:520 +msgid "Session Invalid" +msgstr "" + +#: cinder/virt/vmwareapi/fake.py:606 +msgid " No Virtual Machine has been registered yet" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:99 +#, python-format +msgid "Glance image %s is in killed state" +msgstr "" + +#: cinder/virt/vmwareapi/io_util.py:107 +#, python-format +msgid "Glance image %(image_id)s is in unknown state - %(state)s" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:128 +msgid "" +"ESX SOAP server returned an empty port group for the host system in its " +"response" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:155 +#, python-format +msgid "Creating Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/network_utils.py:169 +#, python-format +msgid "Created Port Group with name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/read_write_util.py:150 +#, python-format +msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:84 +msgid "Unable to import suds." +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:90 +msgid "Must specify vmwareapi_wsdl_loc" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:145 +#, python-format +msgid "No such SOAP method '%s' provided by VI SDK" +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:150 +#, python-format +msgid "httplib error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:157 +#, python-format +msgid "Socket error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:162 +#, python-format +msgid "Type error in %s: " +msgstr "" + +#: cinder/virt/vmwareapi/vim.py:166 +#, python-format +msgid "Exception in %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:66 +msgid "Getting list of instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:82 +#, python-format +msgid "Got total of %s instances" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:126 +msgid "Couldn't get a local Datastore reference" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:196 +#, python-format +msgid "Creating VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:205 +#, python-format +msgid "Created VM with the name %s on the ESX host" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:234 +#, python-format +msgid "" +"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter " +"type %(adapter_type)s on the ESX host local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:251 +#, python-format +msgid "" +"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host " +"local store %(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:260 +#, python-format +msgid "" +"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:272 +#, python-format +msgid "" +"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:283 +#, python-format +msgid "" +"Downloading image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:298 +#, python-format +msgid "" +"Downloaded image file data %(image_ref)s to the ESX data store " +"%(data_store_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:315 +#, python-format +msgid "Reconfiguring VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:322 +#, python-format +msgid "Reconfigured VM instance %s to attach the image disk" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:329 +#, python-format +msgid "Powering on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:335 +#, python-format +msgid "Powered on the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:381 +#, python-format +msgid "Creating Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:391 +#, python-format +msgid "Created Snapshot of the VM instance %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:434 +#, python-format +msgid "Copying disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:447 +#, python-format +msgid "Copied disk data before snapshot of the VM instance %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:456 +#, python-format +msgid "Uploading image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:469 +#, python-format +msgid "Uploaded image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:479 +#, python-format +msgid "Deleting temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:488 +#, python-format +msgid "Deleted temporary vmdk file %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:520 +msgid "instance is not powered on" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:527 +#, python-format +msgid "Rebooting guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:530 +#, python-format +msgid "Rebooted guest OS of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:532 +#, python-format +msgid "Doing hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:536 +#, python-format +msgid "Did hard reboot of VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:548 +#, python-format +msgid "instance - %s not present" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:567 +#, python-format +msgid "Powering off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:572 +#, python-format +msgid "Powered off the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:576 +#, python-format +msgid "Unregistering the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:579 +#, python-format +msgid "Unregistered the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:581 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while un-registering the " +"VM: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:592 +#, python-format +msgid "Deleting contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:602 +#, python-format +msgid "Deleted contents of the VM %(name)s from datastore %(datastore_name)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:607 +#, python-format +msgid "" +"In vmwareapi:vmops:destroy, got this exception while deleting the VM " +"contents from the disk: %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:615 +msgid "pause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:619 +msgid "unpause not supported for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:633 +#, python-format +msgid "Suspending the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:637 +#, python-format +msgid "Suspended the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:640 +msgid "instance is powered off and can not be suspended." +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:643 +#, python-format +msgid "VM %s was already in suspended state. So returning without doing anything" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:656 +#, python-format +msgid "Resuming the VM %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:661 +#, python-format +msgid "Resumed the VM %s " +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:663 +msgid "instance is not in a suspended state" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:699 +msgid "get_diagnostics not implemented for vmwareapi" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:757 +#, python-format +msgid "" +"Reconfiguring VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:765 +#, python-format +msgid "" +"Reconfigured VM instance %(name)s to set the machine id with ip - " +"%(ip_addr)s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:802 +#, python-format +msgid "Creating directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmops.py:806 +#, python-format +msgid "Created directory with path %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:89 +#, python-format +msgid "Downloading image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:103 +#, python-format +msgid "Downloaded image %s from glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:108 +#, python-format +msgid "Uploading image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:129 +#, python-format +msgid "Uploaded image %s to the Glance image server" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:139 +#, python-format +msgid "Getting image size for the image %s" +msgstr "" + +#: cinder/virt/vmwareapi/vmware_images.py:143 +#, python-format +msgid "Got image size of %(size)s for the image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:553 cinder/virt/xenapi/fake.py:652 +#: cinder/virt/xenapi/fake.py:670 cinder/virt/xenapi/fake.py:732 +msgid "Raising NotImplemented" +msgstr "" + +#: cinder/virt/xenapi/fake.py:555 +#, python-format +msgid "xenapi.fake does not have an implementation for %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:589 +#, python-format +msgid "Calling %(localname)s %(impl)s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:594 +#, python-format +msgid "Calling getter %s" +msgstr "" + +#: cinder/virt/xenapi/fake.py:654 +#, python-format +msgid "" +"xenapi.fake does not have an implementation for %s or it has been called " +"with the wrong number of arguments" +msgstr "" + +#: cinder/virt/xenapi/host.py:67 +#, python-format +msgid "" +"Instance %(name)s running on %(host)s could not be found in the database:" +" assuming it is a worker VM and skipping migration to a new host" +msgstr "" + +#: cinder/virt/xenapi/host.py:137 +#, python-format +msgid "Unable to get SR for this host: %s" +msgstr "" + +#: cinder/virt/xenapi/host.py:169 +msgid "Unable to get updated status" +msgstr "" + +#: cinder/virt/xenapi/host.py:172 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s." +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:37 +#, python-format +msgid "Found non-unique network for name_label %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:55 +#, python-format +msgid "Found non-unique network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/network_utils.py:58 +#, python-format +msgid "Found no network for bridge %s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:111 +#, python-format +msgid "Unable to eject %(host)s from the pool; pool not empty" +msgstr "" + +#: cinder/virt/xenapi/pool.py:126 +#, python-format +msgid "Unable to eject %(host)s from the pool; No master found" +msgstr "" + +#: cinder/virt/xenapi/pool.py:143 +#, python-format +msgid "Pool-Join failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:146 +#, python-format +msgid "Unable to join %(host)s in the pool" +msgstr "" + +#: cinder/virt/xenapi/pool.py:162 +#, python-format +msgid "Pool-eject failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/pool.py:174 +#, fuzzy, python-format +msgid "Unable to set up pool: %(e)s." +msgstr "ç¡æ³å¸è¼ Volume %s" + +#: cinder/virt/xenapi/pool.py:185 +#, python-format +msgid "Pool-set_name_label failed: %(e)s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:103 +#, python-format +msgid "Found no PIF for device %s" +msgstr "" + +#: cinder/virt/xenapi/vif.py:122 +#, python-format +msgid "" +"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. " +"Expected %(vlan_num)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:218 +msgid "Created VM" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:245 +#, python-format +msgid "VBD not found in instance %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:262 +#, python-format +msgid "VBD %s already detached" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:265 +#, python-format +msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:270 +#, python-format +msgid "Unable to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:275 +#, python-format +msgid "Reached maximum number of retries trying to unplug VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:286 +#, python-format +msgid "Unable to destroy VBD %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:305 +#, python-format +msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:308 +#, python-format +msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:319 +#, python-format +msgid "Unable to destroy VDI %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:336 +#, python-format +msgid "" +"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)" +" on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:345 +#, python-format +msgid "Copied VDI %(vdi_ref)s from VDI %(vdi_to_copy_ref)s on %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:353 +#, python-format +msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:372 +#, python-format +msgid "No primary VDI found for %(vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:379 +#, python-format +msgid "Snapshotting with label '%(label)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:392 +#, python-format +msgid "Created snapshot %(template_vm_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:431 +#, python-format +msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:583 +#, python-format +msgid "Creating blank HD of size %(req_size)d gigs" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:634 +#, python-format +msgid "" +"Fast cloning is only supported on default local SR of type ext. SR on " +"this system was found to be of type %(sr_type)s. Ignoring the cow flag." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:724 +#, python-format +msgid "" +"download_vhd %(image)s attempt %(attempt_num)d/%(max_attempts)d from " +"%(glance_host)s:%(glance_port)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:734 +#, python-format +msgid "download_vhd failed: %r" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:750 +#, python-format +msgid "Asking xapi to fetch vhd image %(image)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:760 +#, python-format +msgid "" +"xapi 'download_vhd' returned VDI of type '%(vdi_type)s' with UUID " +"'%(vdi_uuid)s'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:789 +#, python-format +msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:805 +#, python-format +msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:809 +#, python-format +msgid "" +"Image size %(size_bytes)d exceeded instance_type allowed size " +"%(allowed_size_bytes)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:831 +#, python-format +msgid "Fetching image %(image)s, type %(image_type_str)" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:844 +#, python-format +msgid "Size for image %(image)s: %(virtual_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:853 +#, python-format +msgid "" +"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d " +"bytes" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:870 +#, python-format +msgid "Copying VDI %s to /boot/guest on dom0" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:884 +#, python-format +msgid "Kernel/Ramdisk VDI %s destroyed" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:895 +msgid "Failed to fetch glance image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:934 +#, python-format +msgid "Detected %(image_type_str)s format for image %(image_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:955 +#, python-format +msgid "Looking up vdi %s for PV kernel" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:973 +#, python-format +msgid "Unknown image format %(disk_image_type)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1016 +#, python-format +msgid "VDI %s is still available" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1059 +#, python-format +msgid "(VM_UTILS) xenserver vm state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1061 +#, python-format +msgid "(VM_UTILS) xenapi power_state -> |%s|" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1088 +#, python-format +msgid "Unable to parse rrd of %(vm_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1108 +#, python-format +msgid "Re-scanning SR %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1136 +#, python-format +msgid "Flag sr_matching_filter '%s' does not respect formatting convention" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1154 +msgid "" +"XenAPI is unable to find a Storage Repository to install guest instances " +"on. Please check your configuration and/or configure the flag " +"'sr_matching_filter'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1167 +msgid "Cannot find SR of content-type ISO" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1175 +#, python-format +msgid "ISO: looking at SR %(sr_rec)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1177 +msgid "ISO: not iso content" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1180 +msgid "ISO: iso content_type, no 'i18n-key' key" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1183 +msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1187 +msgid "ISO: SR MATCHing our criteria" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1189 +msgid "ISO: ISO, looking to see if it is host local" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1192 +#, python-format +msgid "ISO: PBD %(pbd_ref)s disappeared" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1195 +#, python-format +msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1198 +msgid "ISO: SR with local PBD" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1220 +#, python-format +msgid "" +"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: " +"%(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1236 +#, python-format +msgid "Unable to obtain RRD XML updates with server details: %(server)s." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1290 +#, python-format +msgid "Invalid statistics data from Xenserver: %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1343 +#, python-format +msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1417 +#, python-format +msgid "" +"Parent %(parent_uuid)s doesn't match original parent " +"%(original_parent_uuid)s, waiting for coalesce..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1427 +#, python-format +msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1462 +#, python-format +msgid "Timeout waiting for device %s to be created" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1473 +#, python-format +msgid "Plugging VBD %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1476 +#, python-format +msgid "Plugging VBD %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1478 +#, python-format +msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1481 +#, python-format +msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1490 +#, python-format +msgid "Destroying VBD for VDI %s ... " +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1498 +#, python-format +msgid "Destroying VBD for VDI %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1511 +#, python-format +msgid "Running pygrub against %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1518 +#, python-format +msgid "Found Xen kernel %s" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1520 +msgid "No Xen kernel found. Booting HVM." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1533 +msgid "Partitions:" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1539 +#, python-format +msgid " %(num)s: %(ptype)s %(size)d sectors" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1565 +#, python-format +msgid "" +"Writing partition table %(primary_first)d %(primary_last)d to " +"%(dev_path)s..." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1578 +#, python-format +msgid "Writing partition table %s done." +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1632 +#, python-format +msgid "" +"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s " +"virtual_size=%(virtual_size)d block_size=%(block_size)d" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1664 +#, python-format +msgid "" +"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% " +"reduction in size" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1714 +msgid "" +"XenServer tools installed in this image are capable of network injection." +" Networking files will not bemanipulated" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1722 +msgid "" +"XenServer tools are present in this image but are not capable of network " +"injection" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1726 +msgid "XenServer tools are not installed in this image" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1742 +msgid "Manipulating interface files directly" +msgstr "" + +#: cinder/virt/xenapi/vm_utils.py:1751 +#, python-format +msgid "Failed to mount filesystem (expected for non-linux instances): %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:131 cinder/virt/xenapi/vmops.py:722 +#, python-format +msgid "Updating progress to %(progress)d" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:231 +#, python-format +msgid "Attempted to power on non-existent instance bad instance id %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:233 +msgid "Starting instance" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:303 +msgid "Removing kernel/ramdisk files from dom0" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:358 +msgid "Failed to spawn, rolling back" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:443 +msgid "Detected ISO image type, creating blank VM for install" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:462 +msgid "Auto configuring disk, attempting to resize partition..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:515 +#, python-format +msgid "Invalid value for injected_files: %r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:520 +#, python-format +msgid "Injecting file path: '%s'" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:527 +msgid "Setting admin password" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:531 +msgid "Resetting network" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:538 +msgid "Setting VCPU weight" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:544 +msgid "Starting VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:551 +#, python-format +msgid "" +"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is " +"%(version)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:554 +#, python-format +msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:561 +msgid "Waiting for instance state to become running" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:573 +msgid "Querying agent version" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:576 +#, python-format +msgid "Instance agent version: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:581 +#, python-format +msgid "Updating Agent to %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:616 +#, python-format +msgid "No opaque_ref could be determined for '%s'." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:670 +msgid "Finished snapshot and upload for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:677 +msgid "Starting snapshot for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:686 +#, fuzzy, python-format +msgid "Unable to Snapshot instance: %(exc)s" +msgstr "ç¡æ³æè¼Volume å°èæ¬æ©å¨ %s" + +#: cinder/virt/xenapi/vmops.py:702 +msgid "Failed to transfer vhd to new host" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:770 +#, python-format +msgid "Resizing down VDI %(cow_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:893 +#, python-format +msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:901 +msgid "Resize complete" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:928 +#, python-format +msgid "Failed to query agent version: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:949 +#, python-format +msgid "domid changed from %(domid)s to %(newdomid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:962 +#, python-format +msgid "Failed to update agent: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:983 +#, python-format +msgid "Failed to exchange keys: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:998 +#, python-format +msgid "Failed to update password: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1023 +#, python-format +msgid "Failed to inject file: %(resp)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1032 +msgid "VM already halted, skipping shutdown..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1036 +msgid "Shutting down VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1054 +msgid "Unable to find VBD for VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1097 +msgid "Using RAW or VHD, skipping kernel and ramdisk deletion" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1104 +msgid "instance has a kernel or ramdisk but not both" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1111 +msgid "kernel/ramdisk files removed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1121 +msgid "VM destroyed" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1147 +msgid "Destroying VM" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1169 +msgid "VM is not present, skipping destroy..." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1222 +#, python-format +msgid "Instance is already in Rescue Mode: %s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1296 +#, python-format +msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1300 +msgid "Automatically hard rebooting" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1363 +#, python-format +msgid "Setting migration %(migration_id)s to error: %(reason)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1374 +#, python-format +msgid "" +"Automatically confirming migration %(migration_id)s for instance " +"%(instance_uuid)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1379 +#, python-format +msgid "Instance %(instance_uuid)s not found" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1383 +msgid "In ERROR state" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1389 +#, python-format +msgid "In %(task_state)s task_state, not RESIZE_VERIFY" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1396 +#, python-format +msgid "Error auto-confirming resize: %(e)s. Will retry later." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1418 +msgid "Could not get bandwidth info." +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1469 +msgid "Injecting network info to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1483 +msgid "Creating vifs" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1492 +#, python-format +msgid "Creating VIF for network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1495 +#, python-format +msgid "Created VIF %(vif_ref)s, network %(network_ref)s" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1520 +msgid "Injecting hostname to xenstore" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1545 +#, python-format +msgid "" +"The agent call to %(method)s returned an invalid response: %(ret)r. " +"path=%(path)s; args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1566 +#, python-format +msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1570 +#, python-format +msgid "" +"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. " +"args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1575 +#, python-format +msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r" +msgstr "" + +#: cinder/virt/xenapi/vmops.py:1661 +#, python-format +msgid "OpenSSL error: %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:52 +msgid "creating sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:55 cinder/virt/xenapi/volume_utils.py:83 +#, python-format +msgid "type is = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:58 cinder/virt/xenapi/volume_utils.py:86 +#, python-format +msgid "name = %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:71 +#, python-format +msgid "Created %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:76 cinder/virt/xenapi/volume_utils.py:174 +msgid "Unable to create Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:80 +msgid "introducing sr within volume_utils" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:103 cinder/virt/xenapi/volume_utils.py:170 +#: cinder/virt/xenapi/volumeops.py:156 +#, python-format +msgid "Introduced %(label)s as %(sr_ref)s." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:106 +msgid "Creating pbd for SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:108 +msgid "Plugging SR" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:116 cinder/virt/xenapi/volumeops.py:160 +msgid "Unable to introduce Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:127 cinder/virt/xenapi/volumeops.py:50 +msgid "Unable to get SR using uuid" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:129 +#, python-format +msgid "Forgetting SR %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:137 +msgid "Unable to forget Storage Repository" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:157 +#, python-format +msgid "Introducing %s..." +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:186 +#, python-format +msgid "Unable to find SR from VBD %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:204 +#, python-format +msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:210 +#, python-format +msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:234 +#, python-format +msgid "Unable to introduce VDI on SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:242 +#, python-format +msgid "Unable to get record of VDI %s on" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:264 +#, python-format +msgid "Unable to introduce VDI for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:274 +#, python-format +msgid "Error finding vdis in SR %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:281 +#, python-format +msgid "Unable to find vbd for vdi %s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:315 +#, python-format +msgid "Unable to obtain target information %(data)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volume_utils.py:341 +#, python-format +msgid "Mountpoint cannot be translated: %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:64 +msgid "Could not find VDI ref" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:69 +#, python-format +msgid "Creating SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:73 +msgid "Could not create SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:76 +msgid "Could not retrieve SR record" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:81 +#, python-format +msgid "Introducing SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:85 +msgid "SR found in xapi database. No need to introduce" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:90 +msgid "Could not introduce SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:94 +#, python-format +msgid "Checking for SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:106 +#, python-format +msgid "SR %s not found in the xapi database" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:112 +msgid "Could not forget SR" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:121 +#, python-format +msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:178 +#, python-format +msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" +msgstr "ç¡æ³æ¿ instanceå¯¦ä¾ %(instance_name)s , å»ºç« VDI å¨SR %(sr_ref)s" + +#: cinder/virt/xenapi/volumeops.py:189 +#, python-format +msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" +msgstr "ç¡æ³æ¿ instanceå¯¦ä¾ %(instance_name)s , 使ç¨SR %(sr_ref)s" + +#: cinder/virt/xenapi/volumeops.py:197 +#, python-format +msgid "Unable to attach volume to instance %s" +msgstr "ç¡æ³æè¼Volume å°èæ¬æ©å¨ %s" + +#: cinder/virt/xenapi/volumeops.py:200 +#, python-format +msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" +msgstr "æè¼é» %(mountpoint)s æè¼å°èæ¬æ©å¨ %(instance_name)s" + +#: cinder/virt/xenapi/volumeops.py:210 +#, python-format +msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" +msgstr "å¸è¼_Volume: %(instance_name)s, %(mountpoint)s" + +#: cinder/virt/xenapi/volumeops.py:219 +#, python-format +msgid "Unable to locate volume %s" +msgstr "æ¾ä¸å°Volume %s" + +#: cinder/virt/xenapi/volumeops.py:227 +#, python-format +msgid "Unable to detach volume %s" +msgstr "ç¡æ³å¸è¼ Volume %s" + +#: cinder/virt/xenapi/volumeops.py:232 +#, python-format +msgid "Unable to destroy vbd %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:239 +#, python-format +msgid "Error purging SR %s" +msgstr "" + +#: cinder/virt/xenapi/volumeops.py:241 +#, python-format +msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" +msgstr "æè¼é» %(mountpoint)s å¾èæ¬æ©å¨ %(instance_name)s å¸è¼" + +#: cinder/vnc/xvp_proxy.py:98 cinder/vnc/xvp_proxy.py:103 +#, python-format +msgid "Error in handshake: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:119 +#, python-format +msgid "Invalid request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:139 +#, python-format +msgid "Request: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:142 +#, python-format +msgid "Request made with missing token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:153 +#, python-format +msgid "Request made with invalid token: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:160 +#, python-format +msgid "Unexpected error: %s" +msgstr "" + +#: cinder/vnc/xvp_proxy.py:180 +#, python-format +msgid "Starting cinder-xvpvncproxy node (version %s)" +msgstr "" + +#: cinder/volume/api.py:74 cinder/volume/api.py:220 +msgid "status must be available" +msgstr "" + +#: cinder/volume/api.py:85 +#, python-format +msgid "Quota exceeded for %(pid)s, tried to create %(size)sG volume" +msgstr "" + +#: cinder/volume/api.py:137 +#, fuzzy +msgid "Volume status must be available or error" +msgstr "Volume çæ éè¦å¯è¢«ä½¿ç¨" + +#: cinder/volume/api.py:142 +#, python-format +msgid "Volume still has %d dependent snapshots" +msgstr "" + +#: cinder/volume/api.py:223 +msgid "already attached" +msgstr "" + +#: cinder/volume/api.py:230 +msgid "already detached" +msgstr "" + +#: cinder/volume/api.py:292 +msgid "must be available" +msgstr "" + +#: cinder/volume/api.py:325 +#, fuzzy +msgid "Volume Snapshot status must be available or error" +msgstr "Volume çæ éè¦å¯è¢«ä½¿ç¨" + +#: cinder/volume/driver.py:96 +#, python-format +msgid "Recovering from a failed execute. Try number %s" +msgstr "" + +#: cinder/volume/driver.py:106 +#, python-format +msgid "volume group %s doesn't exist" +msgstr "" + +#: cinder/volume/driver.py:270 +#, python-format +msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:318 +#, python-format +msgid "Skipping remove_export. No iscsi_target provisioned for volume: %d" +msgstr "" + +#: cinder/volume/driver.py:327 +#, python-format +msgid "" +"Skipping remove_export. No iscsi_target is presently exported for volume:" +" %d" +msgstr "" + +#: cinder/volume/driver.py:337 +msgid "ISCSI provider_location not stored, using discovery" +msgstr "" + +#: cinder/volume/driver.py:384 +#, python-format +msgid "Could not find iSCSI export for volume %s" +msgstr "" + +#: cinder/volume/driver.py:388 +#, python-format +msgid "ISCSI Discovery: Found %s" +msgstr "" + +#: cinder/volume/driver.py:466 +#, python-format +msgid "Cannot confirm exported volume id:%(volume_id)s." +msgstr "" + +#: cinder/volume/driver.py:493 +#, python-format +msgid "FAKE ISCSI: %s" +msgstr "" + +#: cinder/volume/driver.py:505 +#, python-format +msgid "rbd has no pool %s" +msgstr "" + +#: cinder/volume/driver.py:579 +#, python-format +msgid "Sheepdog is not working: %s" +msgstr "" + +#: cinder/volume/driver.py:581 +msgid "Sheepdog is not working" +msgstr "" + +#: cinder/volume/driver.py:680 cinder/volume/driver.py:685 +#, python-format +msgid "LoggingVolumeDriver: %s" +msgstr "" + +#: cinder/volume/manager.py:96 +#, python-format +msgid "Re-exporting %s volumes" +msgstr "" + +#: cinder/volume/manager.py:101 +#, python-format +msgid "volume %s: skipping export" +msgstr "" + +#: cinder/volume/manager.py:107 +#, python-format +msgid "volume %s: creating" +msgstr "" + +#: cinder/volume/manager.py:119 +#, python-format +msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" +msgstr "" + +#: cinder/volume/manager.py:131 +#, python-format +msgid "volume %s: creating export" +msgstr "" + +#: cinder/volume/manager.py:144 +#, python-format +msgid "volume %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:153 +msgid "Volume is still attached" +msgstr "" + +#: cinder/volume/manager.py:155 +msgid "Volume is not local to this node" +msgstr "" + +#: cinder/volume/manager.py:159 +#, python-format +msgid "volume %s: removing export" +msgstr "" + +#: cinder/volume/manager.py:161 +#, python-format +msgid "volume %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:164 +#, python-format +msgid "volume %s: volume is busy" +msgstr "" + +#: cinder/volume/manager.py:176 +#, python-format +msgid "volume %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:183 +#, python-format +msgid "snapshot %s: creating" +msgstr "" + +#: cinder/volume/manager.py:187 +#, python-format +msgid "snapshot %(snap_name)s: creating" +msgstr "" + +#: cinder/volume/manager.py:202 +#, python-format +msgid "snapshot %s: created successfully" +msgstr "" + +#: cinder/volume/manager.py:211 +#, python-format +msgid "snapshot %s: deleting" +msgstr "" + +#: cinder/volume/manager.py:214 +#, python-format +msgid "snapshot %s: snapshot is busy" +msgstr "" + +#: cinder/volume/manager.py:226 +#, python-format +msgid "snapshot %s: deleted successfully" +msgstr "" + +#: cinder/volume/manager.py:310 +msgid "Checking volume capabilities" +msgstr "" + +#: cinder/volume/manager.py:314 +#, python-format +msgid "New capabilities found: %s" +msgstr "" + +#: cinder/volume/manager.py:325 +msgid "Clear capabilities" +msgstr "" + +#: cinder/volume/manager.py:329 +#, python-format +msgid "Notification {%s} received" +msgstr "" + +#: cinder/volume/netapp.py:79 +#, python-format +msgid "API %(name)sfailed: %(reason)s" +msgstr "" + +#: cinder/volume/netapp.py:109 +#, python-format +msgid "%s is not set" +msgstr "" + +#: cinder/volume/netapp.py:128 +msgid "Connected to DFM server" +msgstr "" + +#: cinder/volume/netapp.py:159 +#, python-format +msgid "Job failed: %s" +msgstr "" + +#: cinder/volume/netapp.py:240 +msgid "Failed to provision dataset member" +msgstr "" + +#: cinder/volume/netapp.py:252 +msgid "No LUN was created by the provision job" +msgstr "" + +#: cinder/volume/netapp.py:261 cinder/volume/netapp.py:433 +#, fuzzy, python-format +msgid "Failed to find LUN ID for volume %s" +msgstr "æ¾ä¸å°Volume %s" + +#: cinder/volume/netapp.py:280 +msgid "Failed to remove and delete dataset member" +msgstr "" + +#: cinder/volume/netapp.py:603 cinder/volume/netapp.py:657 +#, fuzzy, python-format +msgid "No LUN ID for volume %s" +msgstr "æ¾ä¸å°Volume %s" + +#: cinder/volume/netapp.py:607 cinder/volume/netapp.py:661 +#, python-format +msgid "Failed to get LUN details for LUN ID %s" +msgstr "" + +#: cinder/volume/netapp.py:614 +#, python-format +msgid "Failed to get host details for host ID %s" +msgstr "" + +#: cinder/volume/netapp.py:620 +#, python-format +msgid "Failed to get target portal for filer: %s" +msgstr "" + +#: cinder/volume/netapp.py:625 +#, python-format +msgid "Failed to get target IQN for filer: %s" +msgstr "" + +#: cinder/volume/san.py:113 cinder/volume/san.py:151 +msgid "Specify san_password or san_private_key" +msgstr "" + +#: cinder/volume/san.py:156 +msgid "san_ip must be set" +msgstr "" + +#: cinder/volume/san.py:320 +#, python-format +msgid "LUID not found for %(zfs_poolname)s. Output=%(out)s" +msgstr "" + +#: cinder/volume/san.py:452 +#, python-format +msgid "CLIQ command returned %s" +msgstr "" + +#: cinder/volume/san.py:458 +#, python-format +msgid "Malformed response to CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:466 +#, python-format +msgid "Error running CLIQ command %(verb)s %(cliq_args)s. Result=%(out)s" +msgstr "" + +#: cinder/volume/san.py:496 +#, python-format +msgid "" +"Unexpected number of virtual ips for cluster %(cluster_name)s. " +"Result=%(_xml)s" +msgstr "" + +#: cinder/volume/san.py:549 +#, python-format +msgid "Volume info: %(volume_name)s => %(volume_attributes)s" +msgstr "" + +#: cinder/volume/san.py:594 +msgid "local_path not supported" +msgstr "" + +#: cinder/volume/san.py:626 +#, python-format +msgid "Could not determine project for volume %s, can't export" +msgstr "" + +#: cinder/volume/san.py:696 +#, python-format +msgid "Payload for SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:713 +#, python-format +msgid "Call to json.loads() raised an exception: %s" +msgstr "" + +#: cinder/volume/san.py:718 +#, python-format +msgid "Results of SolidFire API call: %s" +msgstr "" + +#: cinder/volume/san.py:732 +#, python-format +msgid "Found solidfire account: %s" +msgstr "" + +#: cinder/volume/san.py:746 +#, python-format +msgid "solidfire account: %s does not exist, create it..." +msgstr "" + +#: cinder/volume/san.py:804 +msgid "Enter SolidFire create_volume..." +msgstr "" + +#: cinder/volume/san.py:846 +msgid "Leaving SolidFire create_volume" +msgstr "" + +#: cinder/volume/san.py:861 +msgid "Enter SolidFire delete_volume..." +msgstr "" + +#: cinder/volume/san.py:880 +#, python-format +msgid "Deleting volumeID: %s " +msgstr "" + +#: cinder/volume/san.py:888 +msgid "Leaving SolidFire delete_volume" +msgstr "" + +#: cinder/volume/san.py:891 +msgid "Executing SolidFire ensure_export..." +msgstr "" + +#: cinder/volume/san.py:895 +msgid "Executing SolidFire create_export..." +msgstr "" + +#: cinder/volume/volume_types.py:49 cinder/volume/volume_types.py:108 +msgid "name cannot be None" +msgstr "" + +#: cinder/volume/volume_types.py:96 +msgid "id cannot be None" +msgstr "" + +#: cinder/volume/xensm.py:55 +#, python-format +msgid "SR name = %s" +msgstr "" + +#: cinder/volume/xensm.py:56 +#, python-format +msgid "Params: %s" +msgstr "" + +#: cinder/volume/xensm.py:60 +#, python-format +msgid "Failed to create sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:62 +msgid "Create failed" +msgstr "" + +#: cinder/volume/xensm.py:64 +#, python-format +msgid "SR UUID of new SR is: %s" +msgstr "" + +#: cinder/volume/xensm.py:71 +msgid "Failed to update db" +msgstr "" + +#: cinder/volume/xensm.py:80 +#, python-format +msgid "Failed to introduce sr %s...continuing" +msgstr "" + +#: cinder/volume/xensm.py:91 +#, python-format +msgid "Failed to reach backend %d" +msgstr "" + +#: cinder/volume/xensm.py:100 +msgid "XenSMDriver requires xenapi connection" +msgstr "" + +#: cinder/volume/xensm.py:110 +msgid "Failed to initiate session" +msgstr "" + +#: cinder/volume/xensm.py:142 +#, python-format +msgid "Volume will be created in backend - %d" +msgstr "" + +#: cinder/volume/xensm.py:154 +msgid "Failed to update volume in db" +msgstr "" + +#: cinder/volume/xensm.py:157 +msgid "Unable to create volume" +msgstr "" + +#: cinder/volume/xensm.py:171 +msgid "Failed to delete vdi" +msgstr "" + +#: cinder/volume/xensm.py:177 +msgid "Failed to delete volume in db" +msgstr "" + +#: cinder/volume/xensm.py:210 +msgid "Failed to find volume in db" +msgstr "" + +#: cinder/volume/xensm.py:221 +msgid "Failed to find backend in db" +msgstr "" + +#: cinder/volume/nexenta/__init__.py:27 +msgid "Nexenta SA returned the error" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:64 +#, python-format +msgid "Sending JSON data: %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:69 +#, python-format +msgid "Auto switching to HTTPS connection to %s" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:75 +msgid "No headers in server response" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:76 +msgid "Bad response from server" +msgstr "" + +#: cinder/volume/nexenta/jsonrpc.py:79 +#, python-format +msgid "Got response: %s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:96 +#, python-format +msgid "Volume %s does not exist in Nexenta SA" +msgstr "" + +#: cinder/volume/nexenta/volume.py:180 +msgid "" +"Call to local_path should not happen. Verify that use_local_volumes flag " +"is turned off." +msgstr "" + +#: cinder/volume/nexenta/volume.py:202 +#, python-format +msgid "Ignored target creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:210 +#, python-format +msgid "Ignored target group creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:219 +#, python-format +msgid "Ignored target group member addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:227 +#, python-format +msgid "Ignored LU creation error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:237 +#, python-format +msgid "Ignored LUN mapping entry addition error \"%s\" while ensuring export" +msgstr "" + +#: cinder/volume/nexenta/volume.py:273 +#, python-format +msgid "" +"Got error trying to destroy target group %(target_group)s, assuming it is" +" already gone: %(exc)s" +msgstr "" + +#: cinder/volume/nexenta/volume.py:280 +#, python-format +msgid "" +"Got error trying to delete target %(target)s, assuming it is already " +"gone: %(exc)s" +msgstr "" + +#~ msgid "Unable to locate account %(account_name) on Solidfire device" +#~ msgstr "" + +#~ msgid "Zone %(zone_id)s could not be found." +#~ msgstr "" + +#~ msgid "Cinder access parameters were not specified." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(id)d could not be found." +#~ msgstr "" + +#~ msgid "Virtual Storage Array %(name)s could not be found." +#~ msgstr "" + +#~ msgid "Detected more than one volume with name %(vol_name)" +#~ msgstr "" + +#~ msgid "Detected existing vlan with id %(vlan)" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab semaphore \"%(lock)s\" " +#~ "for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got semaphore \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "" +#~ "Attempting to grab file lock " +#~ "\"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Got file lock \"%(lock)s\" for method \"%(method)s\"...lock" +#~ msgstr "" + +#~ msgid "Parent group id and group id cannot be same" +#~ msgstr "" + +#~ msgid "No body provided" +#~ msgstr "" + +#~ msgid "Create VSA %(display_name)s of type %(vc_type)s" +#~ msgstr "" + +#~ msgid "Delete VSA with id: %s" +#~ msgstr "" + +#~ msgid "Associate address %(ip)s to VSA %(id)s" +#~ msgstr "" + +#~ msgid "Disassociate address from VSA %(id)s" +#~ msgstr "" + +#~ msgid "%(obj)s with ID %(id)s not found" +#~ msgstr "" + +#~ msgid "" +#~ "%(obj)s with ID %(id)s belongs to " +#~ "VSA %(own_vsa_id)s and not to VSA " +#~ "%(vsa_id)s." +#~ msgstr "" + +#~ msgid "Index. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Detail. vsa_id=%(vsa_id)s" +#~ msgstr "" + +#~ msgid "Create. vsa_id=%(vsa_id)s, body=%(body)s" +#~ msgstr "" + +#~ msgid "Create volume of %(size)s GB from VSA ID %(vsa_id)s" +#~ msgstr "" + +#~ msgid "Update %(obj)s with id: %(id)s, changes: %(changes)s" +#~ msgstr "" + +#~ msgid "Delete. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Show. vsa_id=%(vsa_id)s, id=%(id)s" +#~ msgstr "" + +#~ msgid "Index instances for VSA %s" +#~ msgstr "" + +#~ msgid "Quota exceeded for %(pid)s, tried to run %(min_count)s instances" +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You cannot run" +#~ " any more instances of this type." +#~ msgstr "" + +#~ msgid "" +#~ "Instance quota exceeded. You can only" +#~ " run %s more instances of this " +#~ "type." +#~ msgstr "" + +#~ msgid "Going to try to soft delete %s" +#~ msgstr "" + +#~ msgid "No host for instance %s, deleting immediately" +#~ msgstr "" + +#~ msgid "Going to try to terminate %s" +#~ msgstr "" + +#~ msgid "Going to try to stop %s" +#~ msgstr "" + +#~ msgid "Going to try to start %s" +#~ msgstr "" + +#~ msgid "" +#~ "Going to force the deletion of the" +#~ " vm %(instance_uuid)s, even if it is" +#~ " deleted" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s did not exist " +#~ "in the DB, but I will shut " +#~ "it down anyway using a special " +#~ "context" +#~ msgstr "" + +#~ msgid "exception terminating the instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "trying to destroy already destroyed instance: %s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(name)s found in database but" +#~ " not known by hypervisor. Setting " +#~ "power state to NOSTATE" +#~ msgstr "" + +#~ msgid "" +#~ "Detected instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "" +#~ "Destroying instance with name label " +#~ "'%(name_label)s' which is marked as " +#~ "DELETED but still present on host." +#~ msgstr "" + +#~ msgid "SQL connection failed (%(connstring)s). %(attempts)d attempts left." +#~ msgstr "" + +#~ msgid "Can't downgrade without losing data" +#~ msgstr "" + +#~ msgid "Instance %(instance_id)s not found" +#~ msgstr "" + +#~ msgid "Network %s has active ports, cannot delete" +#~ msgstr "" + +#~ msgid "No fixed IPs to deallocate for vif %sid" +#~ msgstr "" + +#~ msgid "" +#~ "AMQP server on %(fl_host)s:%(fl_port)d is " +#~ "unreachable: %(e)s. Trying again in " +#~ "%(fl_intv)d seconds." +#~ msgstr "" + +#~ msgid "Unable to connect to AMQP server after %(tries)d tries. Shutting down." +#~ msgstr "" + +#~ msgid "Reconnected to queue" +#~ msgstr "" + +#~ msgid "Failed to fetch message from queue: %s" +#~ msgstr "" + +#~ msgid "Initing the Adapter Consumer for %s" +#~ msgstr "" + +#~ msgid "Created \"%(exchange)s\" fanout exchange with \"%(key)s\" routing key" +#~ msgstr "" + +#~ msgid "Exception while processing consumer" +#~ msgstr "" + +#~ msgid "Creating \"%(exchange)s\" fanout exchange" +#~ msgstr "" + +#~ msgid "response %s" +#~ msgstr "" + +#~ msgid "topic is %s" +#~ msgstr "" + +#~ msgid "message %s" +#~ msgstr "" + +#~ msgid "" +#~ "Cannot confirm tmpfile at %(ipath)s is" +#~ " on same shared storage between " +#~ "%(src)s and %(dest)s." +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of memory(host:%(avail)s <= " +#~ "instance:%(mem_inst)s)" +#~ msgstr "" + +#~ msgid "" +#~ "Unable to migrate %(instance_id)s to " +#~ "%(dest)s: Lack of disk(host:%(available)s <=" +#~ " instance:%(necessary)s)" +#~ msgstr "" + +#~ msgid "Driver Method %(driver_method)s missing: %(e)s.Reverting to schedule()" +#~ msgstr "" + +#~ msgid "Setting instance %(instance_uuid)s to ERROR state." +#~ msgstr "" + +#~ msgid "_filter_hosts: %(request_spec)s" +#~ msgstr "" + +#~ msgid "Filter hosts for drive type %s" +#~ msgstr "" + +#~ msgid "Host %s has no free capacity. Skip" +#~ msgstr "" + +#~ msgid "Filter hosts: %s" +#~ msgstr "" + +#~ msgid "Must implement host selection mechanism" +#~ msgstr "" + +#~ msgid "Maximum number of hosts selected (%d)" +#~ msgstr "" + +#~ msgid "Selected excessive host %(host)s" +#~ msgstr "" + +#~ msgid "Provision volume %(name)s of size %(size)s GB on host %(host)s" +#~ msgstr "" + +#~ msgid "volume_params %(volume_params)s" +#~ msgstr "" + +#~ msgid "%(i)d: Volume %(name)s" +#~ msgstr "" + +#~ msgid "Attempting to spawn %(num_volumes)d volume(s)" +#~ msgstr "" + +#~ msgid "Error creating volumes" +#~ msgstr "" + +#~ msgid "Non-VSA volume %d" +#~ msgstr "" + +#~ msgid "Spawning volume %(volume_id)s with drive type %(drive_type)s" +#~ msgstr "" + +#~ msgid "Error creating volume" +#~ msgstr "" + +#~ msgid "No capability selected for volume of size %(size)s" +#~ msgstr "" + +#~ msgid "Host %s:" +#~ msgstr "" + +#~ msgid "" +#~ "\tDrive %(qosgrp)-25s: total %(total)2s, " +#~ "used %(used)2s, free %(free)2s. Available " +#~ "capacity %(avail)-5s" +#~ msgstr "" + +#~ msgid "" +#~ "\t LeastUsedHost: Best host: %(best_host)s." +#~ " (used capacity %(min_used)s)" +#~ msgstr "" + +#~ msgid "" +#~ "\t MostAvailCap: Best host: %(best_host)s. " +#~ "(available %(max_avail)s %(type_str)s)" +#~ msgstr "" + +#~ msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" +#~ msgstr "" + +#~ msgid "Publishing to route %s" +#~ msgstr "" + +#~ msgid "Declaring queue %s" +#~ msgstr "" + +#~ msgid "Declaring exchange %s" +#~ msgstr "" + +#~ msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" +#~ msgstr "" + +#~ msgid "Getting from %(queue)s: %(message)s" +#~ msgstr "" + +#~ msgid "Test: Emulate wrong VSA name. Raise" +#~ msgstr "" + +#~ msgid "Test: Emulate DB error. Raise" +#~ msgstr "" + +#~ msgid "Test: user_data = %s" +#~ msgstr "" + +#~ msgid "_create: param=%s" +#~ msgstr "" + +#~ msgid "Host %s" +#~ msgstr "" + +#~ msgid "Test: provision vol %(name)s on host %(host)s" +#~ msgstr "" + +#~ msgid "\t vol=%(vol)s" +#~ msgstr "" + +#~ msgid "Test: VSA update request: vsa_id=%(vsa_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume create: %s" +#~ msgstr "" + +#~ msgid "Test: Volume get request: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Test: Volume update request: id=%(volume_id)s values=%(values)s" +#~ msgstr "" + +#~ msgid "Test: Volume get: id=%(volume_id)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: success %(result)s" +#~ msgstr "" + +#~ msgid "Task [%(name)s] %(task)s status: %(status)s %(error_info)s" +#~ msgstr "" + +#~ msgid "Unable to get updated status: %s" +#~ msgstr "" + +#~ msgid "" +#~ "deactivate_node is called for " +#~ "node_id = %(id)s node_ip = %(ip)s" +#~ msgstr "" + +#~ msgid "virsh said: %r" +#~ msgstr "" + +#~ msgid "cool, it's a device" +#~ msgstr "" + +#~ msgid "Unable to read LXC console" +#~ msgstr "" + +#~ msgid "" +#~ "to xml...\n" +#~ ":%s " +#~ msgstr "" + +#~ msgid "During wait running, %s disappeared." +#~ msgstr "" + +#~ msgid "Instance %s running successfully." +#~ msgstr "" + +#~ msgid "The nwfilter(%(instance_secgroup_filter_name)s) is not found." +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image verification failed" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): image " +#~ "verification skipped, no hash stored" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): checking" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in use:" +#~ " on this node %(local)d local, " +#~ "%(remote)d on other nodes" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): warning " +#~ "-- an absent base file is in " +#~ "use! instances: %(instance_list)s" +#~ msgstr "" + +#~ msgid "" +#~ "%(container_format)s-%(id)s (%(base_file)s): in: on" +#~ " other nodes (%(remote)d on other " +#~ "nodes)" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is not in use" +#~ msgstr "" + +#~ msgid "%(container_format)s-%(id)s (%(base_file)s): image is in use" +#~ msgstr "" + +#~ msgid "Created VM %s..." +#~ msgstr "" + +#~ msgid "Created VM %(instance_name)s as %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Creating a CDROM-specific VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "" +#~ "Created a CDROM-specific VBD %(vbd_ref)s" +#~ " for VM %(vm_ref)s, VDI %(vdi_ref)s." +#~ msgstr "" + +#~ msgid "No primary VDI found for%(vm_ref)s" +#~ msgstr "" + +#~ msgid "Snapshotting VM %(vm_ref)s with label '%(label)s'..." +#~ msgstr "" + +#~ msgid "Created snapshot %(template_vm_ref)s from VM %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Fetching image %(image)s" +#~ msgstr "" + +#~ msgid "Image Type: %s" +#~ msgstr "" + +#~ msgid "ISO: Found sr possibly containing the ISO image" +#~ msgstr "" + +#~ msgid "Size for image %(image)s:%(virtual_size)d" +#~ msgstr "" + +#~ msgid "instance %s: Failed to fetch glance image" +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s ... " +#~ msgstr "" + +#~ msgid "Creating VBD for VDI %s done." +#~ msgstr "" + +#~ msgid "VBD.unplug successful first time." +#~ msgstr "" + +#~ msgid "VBD.unplug rejected: retrying..." +#~ msgstr "" + +#~ msgid "Not sleeping anymore!" +#~ msgstr "" + +#~ msgid "VBD.unplug successful eventually." +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure in VBD.unplug: %s" +#~ msgstr "" + +#~ msgid "Ignoring XenAPI.Failure %s" +#~ msgstr "" + +#~ msgid "Starting instance %s" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn" +#~ msgstr "" + +#~ msgid "Instance %s failed to spawn - performing clean-up" +#~ msgstr "" + +#~ msgid "instance %s: Failed to spawn - Unable to create VM" +#~ msgstr "" + +#~ msgid "" +#~ "Auto configuring disk for instance " +#~ "%(instance_uuid)s, attempting to resize " +#~ "partition..." +#~ msgstr "" + +#~ msgid "Invalid value for injected_files: '%s'" +#~ msgstr "" + +#~ msgid "Starting VM %s..." +#~ msgstr "" + +#~ msgid "Spawning VM %(instance_uuid)s created %(vm_ref)s." +#~ msgstr "" + +#~ msgid "Instance %s: waiting for running" +#~ msgstr "" + +#~ msgid "Instance %s: running" +#~ msgstr "" + +#~ msgid "Resources to remove:%s" +#~ msgstr "" + +#~ msgid "Removing VDI %(vdi_ref)s(uuid:%(vdi_to_remove)s)" +#~ msgstr "" + +#~ msgid "Skipping VDI destroy for %s" +#~ msgstr "" + +#~ msgid "Finished snapshot and upload for VM %s" +#~ msgstr "" + +#~ msgid "Starting snapshot for VM %s" +#~ msgstr "" + +#~ msgid "Unable to Snapshot instance %(instance_uuid)s: %(exc)s" +#~ msgstr "" + +#~ msgid "Updating instance '%(instance_uuid)s' progress to %(progress)d" +#~ msgstr "" + +#~ msgid "Resize instance %s complete" +#~ msgstr "" + +#~ msgid "domid changed from %(olddomid)s to %(newdomid)s" +#~ msgstr "" + +#~ msgid "VM %(instance_uuid)s already halted,skipping shutdown..." +#~ msgstr "" + +#~ msgid "Shutting down VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Destroying VDIs for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "" +#~ "Instance %(instance_uuid)s using RAW or " +#~ "VHD, skipping kernel and ramdisk " +#~ "deletion" +#~ msgstr "" + +#~ msgid "Instance %(instance_uuid)s VM destroyed" +#~ msgstr "" + +#~ msgid "Destroying VM for Instance %(instance_uuid)s" +#~ msgstr "" + +#~ msgid "Automatically hard rebooting %d" +#~ msgstr "" + +#~ msgid "Instance for migration %d not found, skipping" +#~ msgstr "" + +#~ msgid "injecting network info to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "creating vif(s) for vm: |%s|" +#~ msgstr "" + +#~ msgid "Creating VIF for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." +#~ msgstr "" + +#~ msgid "injecting hostname to xs for vm: |%s|" +#~ msgstr "" + +#~ msgid "" +#~ "The agent call to %(method)s returned" +#~ " an invalid response: %(ret)r. VM " +#~ "id=%(instance_uuid)s; path=%(path)s; args=%(addl_args)r" +#~ msgstr "" + +#~ msgid "" +#~ "TIMEOUT: The call to %(method)s timed" +#~ " out. VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "NOT IMPLEMENTED: The call to %(method)s" +#~ " is not supported by the agent. " +#~ "VM id=%(instance_uuid)s; args=%(args)r" +#~ msgstr "" + +#~ msgid "" +#~ "The call to %(method)s returned an " +#~ "error: %(e)s. VM id=%(instance_uuid)s; " +#~ "args=%(args)r" +#~ msgstr "" + +#~ msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " +#~ msgstr "" + +#~ msgid "Error destroying VDI" +#~ msgstr "" + +#~ msgid "\tVolume %s is NOT VSA volume" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s creation - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE create_volume for %s succeeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s deletion - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s failed" +#~ msgstr "" + +#~ msgid "VSA BE delete_volume for %s suceeded" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s local path call - call discover" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s ensure export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s create export - do nothing" +#~ msgstr "" + +#~ msgid "\tFE VSA Volume %s remove export - do nothing" +#~ msgstr "" + +#~ msgid "VSA BE remove_export for %s failed" +#~ msgstr "" + +#~ msgid "Failed to retrieve QoS info" +#~ msgstr "" + +#~ msgid "invalid drive data" +#~ msgstr "" + +#~ msgid "drive_name not defined" +#~ msgstr "" + +#~ msgid "invalid drive type name %s" +#~ msgstr "" + +#~ msgid "*** Experimental VSA code ***" +#~ msgstr "" + +#~ msgid "Requested number of VCs (%d) is too high. Setting to default" +#~ msgstr "" + +#~ msgid "Creating VSA: %s" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d %(vsa_name)s: Create " +#~ "volume %(vol_name)s, %(vol_size)d GB, type " +#~ "%(vol_type_id)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA status to %(status)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Update VSA call" +#~ msgstr "" + +#~ msgid "Adding %(add_cnt)s VCs to VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "Deleting %(del_cnt)s VCs from VSA %(vsa_name)s." +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Deleting %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Unable to delete volume %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Forced delete. %(direction)s volume %(vol_name)s" +#~ msgstr "" + +#~ msgid "Going to try to terminate VSA ID %s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Delete instance %(name)s" +#~ msgstr "" + +#~ msgid "Create call received for VSA %s" +#~ msgstr "" + +#~ msgid "Failed to find VSA %(vsa_id)d" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)s: Drive %(vol_id)s created. Status %(status)s" +#~ msgstr "" + +#~ msgid "Drive %(vol_name)s (%(vol_disp_name)s) still in creating phase - wait" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Not all volumes " +#~ "are created (%(cvol_real)d of %(cvol_exp)d)" +#~ msgstr "" + +#~ msgid "" +#~ "VSA ID %(vsa_id)d: Drive %(vol_name)s " +#~ "(%(vol_disp_name)s) is in %(status)s state" +#~ msgstr "" + +#~ msgid "Failed to update attach status for volume %(vol_name)s. %(ex)s" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Delete all BE volumes" +#~ msgstr "" + +#~ msgid "VSA ID %(vsa_id)d: Start %(vc_count)d instances" +#~ msgstr "" + diff --git a/cinder/log.py b/cinder/log.py new file mode 100644 index 000000000..2e458659e --- /dev/null +++ b/cinder/log.py @@ -0,0 +1,416 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Cinder logging handler. + +This module adds to logging functionality by adding the option to specify +a context object when calling the various log methods. If the context object +is not specified, default formatting is used. Additionally, an instance uuid +may be passed as part of the log message, which is intended to make it easier +for admins to find messages related to a specific instance. + +It also allows setting of formatting information through flags. + +""" + +import cStringIO +import inspect +import itertools +import json +import logging +import logging.config +import logging.handlers +import os +import stat +import sys +import traceback + +import cinder +from cinder import flags +from cinder.openstack.common import cfg +from cinder.openstack.common import local +from cinder import version + + +log_opts = [ + cfg.StrOpt('logging_context_format_string', + default='%(asctime)s %(levelname)s %(name)s [%(request_id)s ' + '%(user_id)s %(project_id)s] %(instance)s' + '%(message)s', + help='format string to use for log messages with context'), + cfg.StrOpt('logging_default_format_string', + default='%(asctime)s %(levelname)s %(name)s [-] %(instance)s' + '%(message)s', + help='format string to use for log messages without context'), + cfg.StrOpt('logging_debug_format_suffix', + default='from (pid=%(process)d) %(funcName)s ' + '%(pathname)s:%(lineno)d', + help='data to append to log format when level is DEBUG'), + cfg.StrOpt('logging_exception_prefix', + default='%(asctime)s TRACE %(name)s %(instance)s', + help='prefix each line of exception output with this format'), + cfg.ListOpt('default_log_levels', + default=[ + 'amqplib=WARN', + 'sqlalchemy=WARN', + 'boto=WARN', + 'suds=INFO', + 'eventlet.wsgi.server=WARN' + ], + help='list of logger=LEVEL pairs'), + cfg.BoolOpt('publish_errors', + default=False, + help='publish error events'), + + # NOTE(mikal): there are two options here because sometimes we are handed + # a full instance (and could include more information), and other times we + # are just handed a UUID for the instance. + cfg.StrOpt('instance_format', + default='[instance: %(uuid)s] ', + help='If an instance is passed with the log message, format ' + 'it like this'), + cfg.StrOpt('instance_uuid_format', + default='[instance: %(uuid)s] ', + help='If an instance UUID is passed with the log message, ' + 'format it like this'), + ] + +FLAGS = flags.FLAGS +FLAGS.register_opts(log_opts) + +# our new audit level +# NOTE(jkoelker) Since we synthesized an audit level, make the logging +# module aware of it so it acts like other levels. +logging.AUDIT = logging.INFO + 1 +logging.addLevelName(logging.AUDIT, 'AUDIT') + + +try: + NullHandler = logging.NullHandler +except AttributeError: # NOTE(jkoelker) NullHandler added in Python 2.7 + class NullHandler(logging.Handler): + def handle(self, record): + pass + + def emit(self, record): + pass + + def createLock(self): + self.lock = None + + +def _dictify_context(context): + if context is None: + return None + if not isinstance(context, dict) and getattr(context, 'to_dict', None): + context = context.to_dict() + return context + + +def _get_binary_name(): + return os.path.basename(inspect.stack()[-1][1]) + + +def _get_log_file_path(binary=None): + logfile = FLAGS.log_file or FLAGS.logfile + logdir = FLAGS.log_dir or FLAGS.logdir + + if logfile and not logdir: + return logfile + + if logfile and logdir: + return os.path.join(logdir, logfile) + + if logdir: + binary = binary or _get_binary_name() + return '%s.log' % (os.path.join(logdir, binary),) + + +class CinderContextAdapter(logging.LoggerAdapter): + warn = logging.LoggerAdapter.warning + + def __init__(self, logger): + self.logger = logger + + def audit(self, msg, *args, **kwargs): + self.log(logging.AUDIT, msg, *args, **kwargs) + + def process(self, msg, kwargs): + if 'extra' not in kwargs: + kwargs['extra'] = {} + extra = kwargs['extra'] + + context = kwargs.pop('context', None) + if not context: + context = getattr(local.store, 'context', None) + if context: + extra.update(_dictify_context(context)) + + instance = kwargs.pop('instance', None) + instance_extra = '' + if instance: + instance_extra = FLAGS.instance_format % instance + else: + instance_uuid = kwargs.pop('instance_uuid', None) + if instance_uuid: + instance_extra = (FLAGS.instance_uuid_format + % {'uuid': instance_uuid}) + extra.update({'instance': instance_extra}) + + extra.update({"cinder_version": version.version_string_with_vcs()}) + extra['extra'] = extra.copy() + return msg, kwargs + + +class JSONFormatter(logging.Formatter): + def __init__(self, fmt=None, datefmt=None): + # NOTE(jkoelker) we ignore the fmt argument, but its still there + # since logging.config.fileConfig passes it. + self.datefmt = datefmt + + def formatException(self, ei, strip_newlines=True): + lines = traceback.format_exception(*ei) + if strip_newlines: + lines = [itertools.ifilter(lambda x: x, + line.rstrip().splitlines()) + for line in lines] + lines = list(itertools.chain(*lines)) + return lines + + def format(self, record): + message = {'message': record.getMessage(), + 'asctime': self.formatTime(record, self.datefmt), + 'name': record.name, + 'msg': record.msg, + 'args': record.args, + 'levelname': record.levelname, + 'levelno': record.levelno, + 'pathname': record.pathname, + 'filename': record.filename, + 'module': record.module, + 'lineno': record.lineno, + 'funcname': record.funcName, + 'created': record.created, + 'msecs': record.msecs, + 'relative_created': record.relativeCreated, + 'thread': record.thread, + 'thread_name': record.threadName, + 'process_name': record.processName, + 'process': record.process, + 'traceback': None} + + if hasattr(record, 'extra'): + message['extra'] = record.extra + + if record.exc_info: + message['traceback'] = self.formatException(record.exc_info) + + return json.dumps(message) + + +class LegacyCinderFormatter(logging.Formatter): + """A cinder.context.RequestContext aware formatter configured via flags. + + The flags used to set format strings are: logging_context_format_string + and logging_default_format_string. You can also specify + logging_debug_format_suffix to append extra formatting if the log level is + debug. + + For information about what variables are available for the formatter see: + http://docs.python.org/library/logging.html#formatter + + """ + + def format(self, record): + """Uses contextstring if request_id is set, otherwise default.""" + if 'instance' not in record.__dict__: + record.__dict__['instance'] = '' + + if record.__dict__.get('request_id', None): + self._fmt = FLAGS.logging_context_format_string + else: + self._fmt = FLAGS.logging_default_format_string + + if (record.levelno == logging.DEBUG and + FLAGS.logging_debug_format_suffix): + self._fmt += " " + FLAGS.logging_debug_format_suffix + + # Cache this on the record, Logger will respect our formated copy + if record.exc_info: + record.exc_text = self.formatException(record.exc_info, record) + return logging.Formatter.format(self, record) + + def formatException(self, exc_info, record=None): + """Format exception output with FLAGS.logging_exception_prefix.""" + if not record: + return logging.Formatter.formatException(self, exc_info) + + stringbuffer = cStringIO.StringIO() + traceback.print_exception(exc_info[0], exc_info[1], exc_info[2], + None, stringbuffer) + lines = stringbuffer.getvalue().split('\n') + stringbuffer.close() + + if FLAGS.logging_exception_prefix.find('%(asctime)') != -1: + record.asctime = self.formatTime(record, self.datefmt) + + formatted_lines = [] + for line in lines: + pl = FLAGS.logging_exception_prefix % record.__dict__ + fl = '%s%s' % (pl, line) + formatted_lines.append(fl) + return '\n'.join(formatted_lines) + + +class PublishErrorsHandler(logging.Handler): + def emit(self, record): + if 'list_notifier_drivers' in FLAGS: + if 'cinder.notifier.log_notifier' in FLAGS.list_notifier_drivers: + return + cinder.notifier.api.notify('cinder.error.publisher', + 'error_notification', + cinder.notifier.api.ERROR, + dict(error=record.msg)) + + +def handle_exception(type, value, tb): + extra = {} + if FLAGS.verbose: + extra['exc_info'] = (type, value, tb) + getLogger().critical(str(value), **extra) + + +def setup(): + """Setup cinder logging.""" + sys.excepthook = handle_exception + + if FLAGS.log_config: + try: + logging.config.fileConfig(FLAGS.log_config) + except Exception: + traceback.print_exc() + raise + else: + _setup_logging_from_flags() + + +def _find_facility_from_flags(): + facility_names = logging.handlers.SysLogHandler.facility_names + facility = getattr(logging.handlers.SysLogHandler, + FLAGS.syslog_log_facility, + None) + + if facility is None and FLAGS.syslog_log_facility in facility_names: + facility = facility_names.get(FLAGS.syslog_log_facility) + + if facility is None: + valid_facilities = facility_names.keys() + consts = ['LOG_AUTH', 'LOG_AUTHPRIV', 'LOG_CRON', 'LOG_DAEMON', + 'LOG_FTP', 'LOG_KERN', 'LOG_LPR', 'LOG_MAIL', 'LOG_NEWS', + 'LOG_AUTH', 'LOG_SYSLOG', 'LOG_USER', 'LOG_UUCP', + 'LOG_LOCAL0', 'LOG_LOCAL1', 'LOG_LOCAL2', 'LOG_LOCAL3', + 'LOG_LOCAL4', 'LOG_LOCAL5', 'LOG_LOCAL6', 'LOG_LOCAL7'] + valid_facilities.extend(consts) + raise TypeError(_('syslog facility must be one of: %s') % + ', '.join("'%s'" % fac + for fac in valid_facilities)) + + return facility + + +def _setup_logging_from_flags(): + cinder_root = getLogger().logger + for handler in cinder_root.handlers: + cinder_root.removeHandler(handler) + + if FLAGS.use_syslog: + facility = _find_facility_from_flags() + syslog = logging.handlers.SysLogHandler(address='/dev/log', + facility=facility) + cinder_root.addHandler(syslog) + + logpath = _get_log_file_path() + if logpath: + filelog = logging.handlers.WatchedFileHandler(logpath) + cinder_root.addHandler(filelog) + + mode = int(FLAGS.logfile_mode, 8) + st = os.stat(logpath) + if st.st_mode != (stat.S_IFREG | mode): + os.chmod(logpath, mode) + + if FLAGS.use_stderr: + streamlog = logging.StreamHandler() + cinder_root.addHandler(streamlog) + + elif not FLAGS.log_file: + streamlog = logging.StreamHandler(stream=sys.stdout) + cinder_root.addHandler(streamlog) + + if FLAGS.publish_errors: + cinder_root.addHandler(PublishErrorsHandler(logging.ERROR)) + + for handler in cinder_root.handlers: + datefmt = FLAGS.log_date_format + if FLAGS.log_format: + handler.setFormatter(logging.Formatter(fmt=FLAGS.log_format, + datefmt=datefmt)) + handler.setFormatter(LegacyCinderFormatter(datefmt=datefmt)) + + if FLAGS.verbose or FLAGS.debug: + cinder_root.setLevel(logging.DEBUG) + else: + cinder_root.setLevel(logging.INFO) + + level = logging.NOTSET + for pair in FLAGS.default_log_levels: + mod, _sep, level_name = pair.partition('=') + level = logging.getLevelName(level_name) + logger = logging.getLogger(mod) + logger.setLevel(level) + + # NOTE(jkoelker) Clear the handlers for the root logger that was setup + # by basicConfig in cinder/__init__.py and install the + # NullHandler. + root = logging.getLogger() + for handler in root.handlers: + root.removeHandler(handler) + handler = NullHandler() + handler.setFormatter(logging.Formatter()) + root.addHandler(handler) + + +_loggers = {} + + +def getLogger(name='cinder'): + if name not in _loggers: + _loggers[name] = CinderContextAdapter(logging.getLogger(name)) + return _loggers[name] + + +class WritableLogger(object): + """A thin wrapper that responds to `write` and logs.""" + + def __init__(self, logger, level=logging.INFO): + self.logger = logger + self.level = level + + def write(self, msg): + self.logger.log(self.level, msg) diff --git a/cinder/manager.py b/cinder/manager.py new file mode 100644 index 000000000..9609e3906 --- /dev/null +++ b/cinder/manager.py @@ -0,0 +1,205 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Base Manager class. + +Managers are responsible for a certain aspect of the system. It is a logical +grouping of code relating to a portion of the system. In general other +components should be using the manager to make changes to the components that +it is responsible for. + +For example, other components that need to deal with volumes in some way, +should do so by calling methods on the VolumeManager instead of directly +changing fields in the database. This allows us to keep all of the code +relating to volumes in the same place. + +We have adopted a basic strategy of Smart managers and dumb data, which means +rather than attaching methods to data objects, components should call manager +methods that act on the data. + +Methods on managers that can be executed locally should be called directly. If +a particular method must execute on a remote host, this should be done via rpc +to the service that wraps the manager + +Managers should be responsible for most of the db access, and +non-implementation specific data. Anything implementation specific that can't +be generalized should be done by the Driver. + +In general, we prefer to have one manager with multiple drivers for different +implementations, but sometimes it makes sense to have multiple managers. You +can think of it this way: Abstract different overall strategies at the manager +level(FlatNetwork vs VlanNetwork), and different implementations at the driver +level(LinuxNetDriver vs CiscoNetDriver). + +Managers will often provide methods for initial setup of a host or periodic +tasks to a wrapping service. + +This module provides Manager, a base class for managers. + +""" + +from cinder.db import base +from cinder import flags +from cinder import log as logging +from cinder.scheduler import api +from cinder import version + + +FLAGS = flags.FLAGS + + +LOG = logging.getLogger(__name__) + + +def periodic_task(*args, **kwargs): + """Decorator to indicate that a method is a periodic task. + + This decorator can be used in two ways: + + 1. Without arguments '@periodic_task', this will be run on every tick + of the periodic scheduler. + + 2. With arguments, @periodic_task(ticks_between_runs=N), this will be + run on every N ticks of the periodic scheduler. + """ + def decorator(f): + f._periodic_task = True + f._ticks_between_runs = kwargs.pop('ticks_between_runs', 0) + return f + + # NOTE(sirp): The `if` is necessary to allow the decorator to be used with + # and without parens. + # + # In the 'with-parens' case (with kwargs present), this function needs to + # return a decorator function since the interpreter will invoke it like: + # + # periodic_task(*args, **kwargs)(f) + # + # In the 'without-parens' case, the original function will be passed + # in as the first argument, like: + # + # periodic_task(f) + if kwargs: + return decorator + else: + return decorator(args[0]) + + +class ManagerMeta(type): + def __init__(cls, names, bases, dict_): + """Metaclass that allows us to collect decorated periodic tasks.""" + super(ManagerMeta, cls).__init__(names, bases, dict_) + + # NOTE(sirp): if the attribute is not present then we must be the base + # class, so, go ahead an initialize it. If the attribute is present, + # then we're a subclass so make a copy of it so we don't step on our + # parent's toes. + try: + cls._periodic_tasks = cls._periodic_tasks[:] + except AttributeError: + cls._periodic_tasks = [] + + try: + cls._ticks_to_skip = cls._ticks_to_skip.copy() + except AttributeError: + cls._ticks_to_skip = {} + + for value in cls.__dict__.values(): + if getattr(value, '_periodic_task', False): + task = value + name = task.__name__ + cls._periodic_tasks.append((name, task)) + cls._ticks_to_skip[name] = task._ticks_between_runs + + +class Manager(base.Base): + __metaclass__ = ManagerMeta + + def __init__(self, host=None, db_driver=None): + if not host: + host = FLAGS.host + self.host = host + super(Manager, self).__init__(db_driver) + + def periodic_tasks(self, context, raise_on_error=False): + """Tasks to be run at a periodic interval.""" + for task_name, task in self._periodic_tasks: + full_task_name = '.'.join([self.__class__.__name__, task_name]) + + ticks_to_skip = self._ticks_to_skip[task_name] + if ticks_to_skip > 0: + LOG.debug(_("Skipping %(full_task_name)s, %(ticks_to_skip)s" + " ticks left until next run"), locals()) + self._ticks_to_skip[task_name] -= 1 + continue + + self._ticks_to_skip[task_name] = task._ticks_between_runs + LOG.debug(_("Running periodic task %(full_task_name)s"), locals()) + + try: + task(self, context) + except Exception as e: + if raise_on_error: + raise + LOG.exception(_("Error during %(full_task_name)s: %(e)s"), + locals()) + + def init_host(self): + """Handle initialization if this is a standalone service. + + Child classes should override this method. + + """ + pass + + def service_version(self, context): + return version.version_string() + + def service_config(self, context): + config = {} + for key in FLAGS: + config[key] = FLAGS.get(key, None) + return config + + +class SchedulerDependentManager(Manager): + """Periodically send capability updates to the Scheduler services. + + Services that need to update the Scheduler of their capabilities + should derive from this class. Otherwise they can derive from + manager.Manager directly. Updates are only sent after + update_service_capabilities is called with non-None values. + + """ + + def __init__(self, host=None, db_driver=None, service_name='undefined'): + self.last_capabilities = None + self.service_name = service_name + super(SchedulerDependentManager, self).__init__(host, db_driver) + + def update_service_capabilities(self, capabilities): + """Remember these capabilities to send on next periodic update.""" + self.last_capabilities = capabilities + + @periodic_task + def _publish_service_capabilities(self, context): + """Pass data back to the scheduler at a periodic interval.""" + if self.last_capabilities: + LOG.debug(_('Notifying Schedulers of capabilities ...')) + api.update_service_capabilities(context, self.service_name, + self.host, self.last_capabilities) diff --git a/cinder/notifier/__init__.py b/cinder/notifier/__init__.py new file mode 100644 index 000000000..482d54e4f --- /dev/null +++ b/cinder/notifier/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2011 OpenStack LLC. +# 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/cinder/notifier/api.py b/cinder/notifier/api.py new file mode 100644 index 000000000..27c9e8421 --- /dev/null +++ b/cinder/notifier/api.py @@ -0,0 +1,133 @@ +# Copyright 2011 OpenStack LLC. +# 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 uuid + +from cinder import flags +from cinder import utils +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder.openstack.common import importutils + + +LOG = logging.getLogger(__name__) + +notifier_opts = [ + cfg.StrOpt('default_notification_level', + default='INFO', + help='Default notification level for outgoing notifications'), + cfg.StrOpt('default_publisher_id', + default='$host', + help='Default publisher_id for outgoing notifications'), + ] + +FLAGS = flags.FLAGS +FLAGS.register_opts(notifier_opts) + +WARN = 'WARN' +INFO = 'INFO' +ERROR = 'ERROR' +CRITICAL = 'CRITICAL' +DEBUG = 'DEBUG' + +log_levels = (DEBUG, WARN, INFO, ERROR, CRITICAL) + + +class BadPriorityException(Exception): + pass + + +def notify_decorator(name, fn): + """ decorator for notify which is used from utils.monkey_patch() + + :param name: name of the function + :param function: - object of the function + :returns: function -- decorated function + + """ + def wrapped_func(*args, **kwarg): + body = {} + body['args'] = [] + body['kwarg'] = {} + for arg in args: + body['args'].append(arg) + for key in kwarg: + body['kwarg'][key] = kwarg[key] + notify(FLAGS.default_publisher_id, + name, + FLAGS.default_notification_level, + body) + return fn(*args, **kwarg) + return wrapped_func + + +def publisher_id(service, host=None): + if not host: + host = FLAGS.host + return "%s.%s" % (service, host) + + +def notify(publisher_id, event_type, priority, payload): + """Sends a notification using the specified driver + + :param publisher_id: the source worker_type.host of the message + :param event_type: the literal type of event (ex. Instance Creation) + :param priority: patterned after the enumeration of Python logging + levels in the set (DEBUG, WARN, INFO, ERROR, CRITICAL) + :param payload: A python dictionary of attributes + + Outgoing message format includes the above parameters, and appends the + following: + + message_id + a UUID representing the id for this notification + + timestamp + the GMT timestamp the notification was sent at + + The composite message will be constructed as a dictionary of the above + attributes, which will then be sent via the transport mechanism defined + by the driver. + + Message example:: + + {'message_id': str(uuid.uuid4()), + 'publisher_id': 'compute.host1', + 'timestamp': utils.utcnow(), + 'priority': 'WARN', + 'event_type': 'compute.create_instance', + 'payload': {'instance_id': 12, ... }} + + """ + if priority not in log_levels: + raise BadPriorityException( + _('%s not in valid priorities') % priority) + + # Ensure everything is JSON serializable. + payload = utils.to_primitive(payload, convert_instances=True) + + driver = importutils.import_module(FLAGS.notification_driver) + msg = dict(message_id=str(uuid.uuid4()), + publisher_id=publisher_id, + event_type=event_type, + priority=priority, + payload=payload, + timestamp=str(utils.utcnow())) + try: + driver.notify(msg) + except Exception, e: + LOG.exception(_("Problem '%(e)s' attempting to " + "send to notification system. Payload=%(payload)s") % + locals()) diff --git a/cinder/notifier/capacity_notifier.py b/cinder/notifier/capacity_notifier.py new file mode 100644 index 000000000..9cdbb72d0 --- /dev/null +++ b/cinder/notifier/capacity_notifier.py @@ -0,0 +1,81 @@ +# Copyright 2011 OpenStack LLC. +# 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 cinder import context +from cinder import db +from cinder import log as logging + + +LOG = logging.getLogger(__name__) + + +def notify(message): + """Look for specific compute manager events and interprete them + so as to keep the Capacity table up to date. + + NOTE: the True/False return codes are only for testing. + """ + + # The event_type must start with 'compute.instance.' + event_type = message.get('event_type', None) + preamble = 'compute.instance.' + if not event_type or not event_type.startswith(preamble): + return False + + # Events we're interested in end with .start and .end + event = event_type[len(preamble):] + parts = event.split('.') + suffix = parts[-1].lower() + event = event[:(-len(suffix) - 1)] + + if suffix not in ['start', 'end']: + return False + started = suffix == 'start' + ended = suffix == 'end' + + if started and event == 'create': + # We've already updated this stuff in the scheduler. Don't redo the + # work here. + return False + + work = 1 if started else -1 + + # Extract the host name from the publisher id ... + publisher_preamble = 'compute.' + publisher = message.get('publisher_id', None) + if not publisher or not publisher.startswith(publisher_preamble): + return False + host = publisher[len(publisher_preamble):] + + # If we deleted an instance, make sure we reclaim the resources. + # We may need to do something explicit for rebuild/migrate. + free_ram_mb = 0 + free_disk_gb = 0 + vms = 0 + if ended and event == 'delete': + vms = -1 + payload = message.get('payload', {}) + free_ram_mb = payload.get('memory_mb', 0) + free_disk_gb = payload.get('disk_gb', 0) + + LOG.debug("EventType=%(event_type)s -> host %(host)s: " + "ram %(free_ram_mb)d, disk %(free_disk_gb)d, " + "work %(work)d, vms%(vms)d" % locals()) + + db.api.compute_node_utilization_update(context.get_admin_context(), host, + free_ram_mb_delta=free_ram_mb, free_disk_gb_delta=free_disk_gb, + work_delta=work, vm_delta=vms) + + return True diff --git a/cinder/notifier/list_notifier.py b/cinder/notifier/list_notifier.py new file mode 100644 index 000000000..665fad262 --- /dev/null +++ b/cinder/notifier/list_notifier.py @@ -0,0 +1,71 @@ +# Copyright 2011 OpenStack LLC. +# 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 cinder import flags +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder.openstack.common import exception as common_exception +from cinder.openstack.common import importutils + + +list_notifier_drivers_opt = cfg.MultiStrOpt('list_notifier_drivers', + default=['cinder.notifier.no_op_notifier'], + help='List of drivers to send notifications') + +FLAGS = flags.FLAGS +FLAGS.register_opt(list_notifier_drivers_opt) + +LOG = logging.getLogger(__name__) + +drivers = None + + +class ImportFailureNotifier(object): + """Noisily re-raises some exception over-and-over when notify is called.""" + + def __init__(self, exception): + self.exception = exception + + def notify(self, message): + raise self.exception + + +def _get_drivers(): + """Instantiates and returns drivers based on the flag values.""" + global drivers + if not drivers: + drivers = [] + for notification_driver in FLAGS.list_notifier_drivers: + try: + drivers.append(importutils.import_module(notification_driver)) + except ImportError as e: + drivers.append(ImportFailureNotifier(e)) + return drivers + + +def notify(message): + """Passes notification to multiple notifiers in a list.""" + for driver in _get_drivers(): + try: + driver.notify(message) + except Exception as e: + LOG.exception(_("Problem '%(e)s' attempting to send to " + "notification driver %(driver)s."), locals()) + + +def _reset_drivers(): + """Used by unit tests to reset the drivers.""" + global drivers + drivers = None diff --git a/cinder/notifier/log_notifier.py b/cinder/notifier/log_notifier.py new file mode 100644 index 000000000..8bd78c016 --- /dev/null +++ b/cinder/notifier/log_notifier.py @@ -0,0 +1,34 @@ +# Copyright 2011 OpenStack LLC. +# 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 json + +from cinder import flags +from cinder import log as logging + + +FLAGS = flags.FLAGS + + +def notify(message): + """Notifies the recipient of the desired event given the model. + Log notifications using cinder's default logging system""" + + priority = message.get('priority', + FLAGS.default_notification_level) + priority = priority.lower() + logger = logging.getLogger( + 'cinder.notification.%s' % message['event_type']) + getattr(logger, priority)(json.dumps(message)) diff --git a/cinder/notifier/no_op_notifier.py b/cinder/notifier/no_op_notifier.py new file mode 100644 index 000000000..029710505 --- /dev/null +++ b/cinder/notifier/no_op_notifier.py @@ -0,0 +1,19 @@ +# Copyright 2011 OpenStack LLC. +# 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. + + +def notify(message): + """Notifies the recipient of the desired event given the model""" + pass diff --git a/cinder/notifier/rabbit_notifier.py b/cinder/notifier/rabbit_notifier.py new file mode 100644 index 000000000..0b2942a28 --- /dev/null +++ b/cinder/notifier/rabbit_notifier.py @@ -0,0 +1,46 @@ +# Copyright 2011 OpenStack LLC. +# 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 cinder.context + +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder import rpc + +LOG = logging.getLogger(__name__) + +notification_topic_opt = cfg.ListOpt('notification_topics', + default=['notifications', ], + help='AMQP topic used for Cinder notifications') + +FLAGS = flags.FLAGS +FLAGS.register_opt(notification_topic_opt) + + +def notify(message): + """Sends a notification to the RabbitMQ""" + context = cinder.context.get_admin_context() + priority = message.get('priority', + FLAGS.default_notification_level) + priority = priority.lower() + for topic in FLAGS.notification_topics: + topic = '%s.%s' % (topic, priority) + try: + rpc.notify(context, topic, message) + except Exception, e: + LOG.exception(_("Could not send notification to %(topic)s. " + "Payload=%(message)s"), locals()) diff --git a/cinder/notifier/test_notifier.py b/cinder/notifier/test_notifier.py new file mode 100644 index 000000000..6624a90aa --- /dev/null +++ b/cinder/notifier/test_notifier.py @@ -0,0 +1,25 @@ +# Copyright 2011 OpenStack LLC. +# 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 cinder import flags + +FLAGS = flags.FLAGS + +NOTIFICATIONS = [] + + +def notify(message): + """Test notifier, stores notifications in memory for unittests.""" + NOTIFICATIONS.append(message) diff --git a/cinder/openstack/__init__.py b/cinder/openstack/__init__.py new file mode 100644 index 000000000..0a3b98867 --- /dev/null +++ b/cinder/openstack/__init__.py @@ -0,0 +1,15 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 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/cinder/openstack/common/README b/cinder/openstack/common/README new file mode 100644 index 000000000..def4a172a --- /dev/null +++ b/cinder/openstack/common/README @@ -0,0 +1,13 @@ +openstack-common +---------------- + +A number of modules from openstack-common are imported into this project. + +These modules are "incubating" in openstack-common and are kept in sync +with the help of openstack-common's update.py script. See: + + http://wiki.openstack.org/CommonLibrary#Incubation + +The copy of the code should never be directly modified here. Please +always update openstack-common first and then run the script to copy +the changes across. diff --git a/cinder/openstack/common/__init__.py b/cinder/openstack/common/__init__.py new file mode 100644 index 000000000..0a3b98867 --- /dev/null +++ b/cinder/openstack/common/__init__.py @@ -0,0 +1,15 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 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/cinder/openstack/common/cfg.py b/cinder/openstack/common/cfg.py new file mode 100644 index 000000000..85aafec9e --- /dev/null +++ b/cinder/openstack/common/cfg.py @@ -0,0 +1,1298 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 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. + +r""" +Configuration options which may be set on the command line or in config files. + +The schema for each option is defined using the Opt sub-classes, e.g.: + +:: + + common_opts = [ + cfg.StrOpt('bind_host', + default='0.0.0.0', + help='IP address to listen on'), + cfg.IntOpt('bind_port', + default=9292, + help='Port number to listen on') + ] + +Options can be strings, integers, floats, booleans, lists or 'multi strings':: + + enabled_apis_opt = cfg.ListOpt('enabled_apis', + default=['ec2', 'osapi_compute'], + help='List of APIs to enable by default') + + DEFAULT_EXTENSIONS = [ + 'cinder.api.openstack.compute.contrib.standard_extensions' + ] + osapi_compute_extension_opt = cfg.MultiStrOpt('osapi_compute_extension', + default=DEFAULT_EXTENSIONS) + +Option schemas are registered with with the config manager at runtime, but +before the option is referenced:: + + class ExtensionManager(object): + + enabled_apis_opt = cfg.ListOpt(...) + + def __init__(self, conf): + self.conf = conf + self.conf.register_opt(enabled_apis_opt) + ... + + def _load_extensions(self): + for ext_factory in self.conf.osapi_compute_extension: + .... + +A common usage pattern is for each option schema to be defined in the module or +class which uses the option:: + + opts = ... + + def add_common_opts(conf): + conf.register_opts(opts) + + def get_bind_host(conf): + return conf.bind_host + + def get_bind_port(conf): + return conf.bind_port + +An option may optionally be made available via the command line. Such options +must registered with the config manager before the command line is parsed (for +the purposes of --help and CLI arg validation):: + + cli_opts = [ + cfg.BoolOpt('verbose', + short='v', + default=False, + help='Print more verbose output'), + cfg.BoolOpt('debug', + short='d', + default=False, + help='Print debugging output'), + ] + + def add_common_opts(conf): + conf.register_cli_opts(cli_opts) + +The config manager has a single CLI option defined by default, --config-file:: + + class ConfigOpts(object): + + config_file_opt = MultiStrOpt('config-file', + ... + + def __init__(self, ...): + ... + self.register_cli_opt(self.config_file_opt) + +Option values are parsed from any supplied config files using +openstack.common.iniparser. If none are specified, a default set is used +e.g. glance-api.conf and glance-common.conf:: + + glance-api.conf: + [DEFAULT] + bind_port = 9292 + + glance-common.conf: + [DEFAULT] + bind_host = 0.0.0.0 + +Option values in config files override those on the command line. Config files +are parsed in order, with values in later files overriding those in earlier +files. + +The parsing of CLI args and config files is initiated by invoking the config +manager e.g.:: + + conf = ConfigOpts() + conf.register_opt(BoolOpt('verbose', ...)) + conf(sys.argv[1:]) + if conf.verbose: + ... + +Options can be registered as belonging to a group:: + + rabbit_group = cfg.OptGroup(name='rabbit', + title='RabbitMQ options') + + rabbit_host_opt = cfg.StrOpt('host', + default='localhost', + help='IP/hostname to listen on'), + rabbit_port_opt = cfg.IntOpt('port', + default=5672, + help='Port number to listen on') + + def register_rabbit_opts(conf): + conf.register_group(rabbit_group) + # options can be registered under a group in either of these ways: + conf.register_opt(rabbit_host_opt, group=rabbit_group) + conf.register_opt(rabbit_port_opt, group='rabbit') + +If no group is specified, options belong to the 'DEFAULT' section of config +files:: + + glance-api.conf: + [DEFAULT] + bind_port = 9292 + ... + + [rabbit] + host = localhost + port = 5672 + use_ssl = False + userid = guest + password = guest + virtual_host = / + +Command-line options in a group are automatically prefixed with the +group name:: + + --rabbit-host localhost --rabbit-port 9999 + +Option values in the default group are referenced as attributes/properties on +the config manager; groups are also attributes on the config manager, with +attributes for each of the options associated with the group:: + + server.start(app, conf.bind_port, conf.bind_host, conf) + + self.connection = kombu.connection.BrokerConnection( + hostname=conf.rabbit.host, + port=conf.rabbit.port, + ...) + +Option values may reference other values using PEP 292 string substitution:: + + opts = [ + cfg.StrOpt('state_path', + default=os.path.join(os.path.dirname(__file__), '../'), + help='Top-level directory for maintaining cinder state'), + cfg.StrOpt('sqlite_db', + default='cinder.sqlite', + help='file name for sqlite'), + cfg.StrOpt('sql_connection', + default='sqlite:///$state_path/$sqlite_db', + help='connection string for sql database'), + ] + +Note that interpolation can be avoided by using '$$'. + +For command line utilities that dispatch to other command line utilities, the +disable_interspersed_args() method is available. If this this method is called, +then parsing e.g.:: + + script --verbose cmd --debug /tmp/mything + +will no longer return:: + + ['cmd', '/tmp/mything'] + +as the leftover arguments, but will instead return:: + + ['cmd', '--debug', '/tmp/mything'] + +i.e. argument parsing is stopped at the first non-option argument. + +Options may be declared as secret so that their values are not leaked into +log files: + + opts = [ + cfg.StrOpt('s3_store_access_key', secret=True), + cfg.StrOpt('s3_store_secret_key', secret=True), + ... + ] + +""" + +import collections +import copy +import optparse +import os +import string +import sys + +from cinder.openstack.common import iniparser + + +class Error(Exception): + """Base class for cfg exceptions.""" + + def __init__(self, msg=None): + self.msg = msg + + def __str__(self): + return self.msg + + +class ArgsAlreadyParsedError(Error): + """Raised if a CLI opt is registered after parsing.""" + + def __str__(self): + ret = "arguments already parsed" + if self.msg: + ret += ": " + self.msg + return ret + + +class NoSuchOptError(Error, AttributeError): + """Raised if an opt which doesn't exist is referenced.""" + + def __init__(self, opt_name, group=None): + self.opt_name = opt_name + self.group = group + + def __str__(self): + if self.group is None: + return "no such option: %s" % self.opt_name + else: + return "no such option in group %s: %s" % (self.group.name, + self.opt_name) + + +class NoSuchGroupError(Error): + """Raised if a group which doesn't exist is referenced.""" + + def __init__(self, group_name): + self.group_name = group_name + + def __str__(self): + return "no such group: %s" % self.group_name + + +class DuplicateOptError(Error): + """Raised if multiple opts with the same name are registered.""" + + def __init__(self, opt_name): + self.opt_name = opt_name + + def __str__(self): + return "duplicate option: %s" % self.opt_name + + +class TemplateSubstitutionError(Error): + """Raised if an error occurs substituting a variable in an opt value.""" + + def __str__(self): + return "template substitution error: %s" % self.msg + + +class ConfigFilesNotFoundError(Error): + """Raised if one or more config files are not found.""" + + def __init__(self, config_files): + self.config_files = config_files + + def __str__(self): + return ('Failed to read some config files: %s' % + string.join(self.config_files, ',')) + + +class ConfigFileParseError(Error): + """Raised if there is an error parsing a config file.""" + + def __init__(self, config_file, msg): + self.config_file = config_file + self.msg = msg + + def __str__(self): + return 'Failed to parse %s: %s' % (self.config_file, self.msg) + + +class ConfigFileValueError(Error): + """Raised if a config file value does not match its opt type.""" + pass + + +def find_config_files(project=None, prog=None): + """Return a list of default configuration files. + + :param project: an optional project name + :param prog: the program name, defaulting to the basename of sys.argv[0] + + We default to two config files: [${project}.conf, ${prog}.conf] + + And we look for those config files in the following directories:: + + ~/.${project}/ + ~/ + /etc/${project}/ + /etc/ + + We return an absolute path for (at most) one of each the default config + files, for the topmost directory it exists in. + + For example, if project=foo, prog=bar and /etc/foo/foo.conf, /etc/bar.conf + and ~/.foo/bar.conf all exist, then we return ['/etc/foo/foo.conf', + '~/.foo/bar.conf'] + + If no project name is supplied, we only look for ${prog.conf}. + """ + if prog is None: + prog = os.path.basename(sys.argv[0]) + + fix_path = lambda p: os.path.abspath(os.path.expanduser(p)) + + cfg_dirs = [ + fix_path(os.path.join('~', '.' + project)) if project else None, + fix_path('~'), + os.path.join('/etc', project) if project else None, + '/etc' + ] + cfg_dirs = filter(bool, cfg_dirs) + + def search_dirs(dirs, basename): + for d in dirs: + path = os.path.join(d, basename) + if os.path.exists(path): + return path + + config_files = [] + if project: + config_files.append(search_dirs(cfg_dirs, '%s.conf' % project)) + config_files.append(search_dirs(cfg_dirs, '%s.conf' % prog)) + + return filter(bool, config_files) + + +def _is_opt_registered(opts, opt): + """Check whether an opt with the same name is already registered. + + The same opt may be registered multiple times, with only the first + registration having any effect. However, it is an error to attempt + to register a different opt with the same name. + + :param opts: the set of opts already registered + :param opt: the opt to be registered + :returns: True if the opt was previously registered, False otherwise + :raises: DuplicateOptError if a naming conflict is detected + """ + if opt.dest in opts: + if opts[opt.dest]['opt'] is not opt: + raise DuplicateOptError(opt.name) + return True + else: + return False + + +class Opt(object): + + """Base class for all configuration options. + + An Opt object has no public methods, but has a number of public string + properties: + + name: + the name of the option, which may include hyphens + dest: + the (hyphen-less) ConfigOpts property which contains the option value + short: + a single character CLI option name + default: + the default value of the option + metavar: + the name shown as the argument to a CLI option in --help output + help: + an string explaining how the options value is used + """ + multi = False + + def __init__(self, name, dest=None, short=None, default=None, + metavar=None, help=None, secret=False): + """Construct an Opt object. + + The only required parameter is the option's name. However, it is + common to also supply a default and help string for all options. + + :param name: the option's name + :param dest: the name of the corresponding ConfigOpts property + :param short: a single character CLI option name + :param default: the default value of the option + :param metavar: the option argument to show in --help + :param help: an explanation of how the option is used + :param secret: true iff the value should be obfuscated in log output + """ + self.name = name + if dest is None: + self.dest = self.name.replace('-', '_') + else: + self.dest = dest + self.short = short + self.default = default + self.metavar = metavar + self.help = help + self.secret = secret + + def _get_from_config_parser(self, cparser, section): + """Retrieves the option value from a MultiConfigParser object. + + This is the method ConfigOpts uses to look up the option value from + config files. Most opt types override this method in order to perform + type appropriate conversion of the returned value. + + :param cparser: a ConfigParser object + :param section: a section name + """ + return cparser.get(section, self.dest) + + def _add_to_cli(self, parser, group=None): + """Makes the option available in the command line interface. + + This is the method ConfigOpts uses to add the opt to the CLI interface + as appropriate for the opt type. Some opt types may extend this method, + others may just extend the helper methods it uses. + + :param parser: the CLI option parser + :param group: an optional OptGroup object + """ + container = self._get_optparse_container(parser, group) + kwargs = self._get_optparse_kwargs(group) + prefix = self._get_optparse_prefix('', group) + self._add_to_optparse(container, self.name, self.short, kwargs, prefix) + + def _add_to_optparse(self, container, name, short, kwargs, prefix=''): + """Add an option to an optparse parser or group. + + :param container: an optparse.OptionContainer object + :param name: the opt name + :param short: the short opt name + :param kwargs: the keyword arguments for add_option() + :param prefix: an optional prefix to prepend to the opt name + :raises: DuplicateOptError if a naming confict is detected + """ + args = ['--' + prefix + name] + if short: + args += ['-' + short] + for a in args: + if container.has_option(a): + raise DuplicateOptError(a) + container.add_option(*args, **kwargs) + + def _get_optparse_container(self, parser, group): + """Returns an optparse.OptionContainer. + + :param parser: an optparse.OptionParser + :param group: an (optional) OptGroup object + :returns: an optparse.OptionGroup if a group is given, else the parser + """ + if group is not None: + return group._get_optparse_group(parser) + else: + return parser + + def _get_optparse_kwargs(self, group, **kwargs): + """Build a dict of keyword arguments for optparse's add_option(). + + Most opt types extend this method to customize the behaviour of the + options added to optparse. + + :param group: an optional group + :param kwargs: optional keyword arguments to add to + :returns: a dict of keyword arguments + """ + dest = self.dest + if group is not None: + dest = group.name + '_' + dest + kwargs.update({ + 'dest': dest, + 'metavar': self.metavar, + 'help': self.help, + }) + return kwargs + + def _get_optparse_prefix(self, prefix, group): + """Build a prefix for the CLI option name, if required. + + CLI options in a group are prefixed with the group's name in order + to avoid conflicts between similarly named options in different + groups. + + :param prefix: an existing prefix to append to (e.g. 'no' or '') + :param group: an optional OptGroup object + :returns: a CLI option prefix including the group name, if appropriate + """ + if group is not None: + return group.name + '-' + prefix + else: + return prefix + + +class StrOpt(Opt): + """ + String opts do not have their values transformed and are returned as + str objects. + """ + pass + + +class BoolOpt(Opt): + + """ + Bool opts are set to True or False on the command line using --optname or + --noopttname respectively. + + In config files, boolean values are case insensitive and can be set using + 1/0, yes/no, true/false or on/off. + """ + + _boolean_states = {'1': True, 'yes': True, 'true': True, 'on': True, + '0': False, 'no': False, 'false': False, 'off': False} + + def _get_from_config_parser(self, cparser, section): + """Retrieve the opt value as a boolean from ConfigParser.""" + def convert_bool(v): + value = self._boolean_states.get(v.lower()) + if value is None: + raise ValueError('Unexpected boolean value %r' % v) + + return value + + return [convert_bool(v) for v in cparser.get(section, self.dest)] + + def _add_to_cli(self, parser, group=None): + """Extends the base class method to add the --nooptname option.""" + super(BoolOpt, self)._add_to_cli(parser, group) + self._add_inverse_to_optparse(parser, group) + + def _add_inverse_to_optparse(self, parser, group): + """Add the --nooptname option to the option parser.""" + container = self._get_optparse_container(parser, group) + kwargs = self._get_optparse_kwargs(group, action='store_false') + prefix = self._get_optparse_prefix('no', group) + kwargs["help"] = "The inverse of --" + self.name + self._add_to_optparse(container, self.name, None, kwargs, prefix) + + def _get_optparse_kwargs(self, group, action='store_true', **kwargs): + """Extends the base optparse keyword dict for boolean options.""" + return super(BoolOpt, + self)._get_optparse_kwargs(group, action=action, **kwargs) + + +class IntOpt(Opt): + + """Int opt values are converted to integers using the int() builtin.""" + + def _get_from_config_parser(self, cparser, section): + """Retrieve the opt value as a integer from ConfigParser.""" + return [int(v) for v in cparser.get(section, self.dest)] + + def _get_optparse_kwargs(self, group, **kwargs): + """Extends the base optparse keyword dict for integer options.""" + return super(IntOpt, + self)._get_optparse_kwargs(group, type='int', **kwargs) + + +class FloatOpt(Opt): + + """Float opt values are converted to floats using the float() builtin.""" + + def _get_from_config_parser(self, cparser, section): + """Retrieve the opt value as a float from ConfigParser.""" + return [float(v) for v in cparser.get(section, self.dest)] + + def _get_optparse_kwargs(self, group, **kwargs): + """Extends the base optparse keyword dict for float options.""" + return super(FloatOpt, + self)._get_optparse_kwargs(group, type='float', **kwargs) + + +class ListOpt(Opt): + + """ + List opt values are simple string values separated by commas. The opt value + is a list containing these strings. + """ + + def _get_from_config_parser(self, cparser, section): + """Retrieve the opt value as a list from ConfigParser.""" + return [v.split(',') for v in cparser.get(section, self.dest)] + + def _get_optparse_kwargs(self, group, **kwargs): + """Extends the base optparse keyword dict for list options.""" + return super(ListOpt, + self)._get_optparse_kwargs(group, + type='string', + action='callback', + callback=self._parse_list, + **kwargs) + + def _parse_list(self, option, opt, value, parser): + """An optparse callback for parsing an option value into a list.""" + setattr(parser.values, self.dest, value.split(',')) + + +class MultiStrOpt(Opt): + + """ + Multistr opt values are string opts which may be specified multiple times. + The opt value is a list containing all the string values specified. + """ + multi = True + + def _get_optparse_kwargs(self, group, **kwargs): + """Extends the base optparse keyword dict for multi str options.""" + return super(MultiStrOpt, + self)._get_optparse_kwargs(group, action='append') + + +class OptGroup(object): + + """ + Represents a group of opts. + + CLI opts in the group are automatically prefixed with the group name. + + Each group corresponds to a section in config files. + + An OptGroup object has no public methods, but has a number of public string + properties: + + name: + the name of the group + title: + the group title as displayed in --help + help: + the group description as displayed in --help + """ + + def __init__(self, name, title=None, help=None): + """Constructs an OptGroup object. + + :param name: the group name + :param title: the group title for --help + :param help: the group description for --help + """ + self.name = name + if title is None: + self.title = "%s options" % title + else: + self.title = title + self.help = help + + self._opts = {} # dict of dicts of (opt:, override:, default:) + self._optparse_group = None + + def _register_opt(self, opt): + """Add an opt to this group. + + :param opt: an Opt object + :returns: False if previously registered, True otherwise + :raises: DuplicateOptError if a naming conflict is detected + """ + if _is_opt_registered(self._opts, opt): + return False + + self._opts[opt.dest] = {'opt': opt, 'override': None, 'default': None} + + return True + + def _get_optparse_group(self, parser): + """Build an optparse.OptionGroup for this group.""" + if self._optparse_group is None: + self._optparse_group = optparse.OptionGroup(parser, self.title, + self.help) + return self._optparse_group + + +class ParseError(iniparser.ParseError): + def __init__(self, msg, lineno, line, filename): + super(ParseError, self).__init__(msg, lineno, line) + self.filename = filename + + def __str__(self): + return 'at %s:%d, %s: %r' % (self.filename, self.lineno, + self.msg, self.line) + + +class ConfigParser(iniparser.BaseParser): + def __init__(self, filename, sections): + super(ConfigParser, self).__init__() + self.filename = filename + self.sections = sections + self.section = None + + def parse(self): + with open(self.filename) as f: + return super(ConfigParser, self).parse(f) + + def new_section(self, section): + self.section = section + self.sections.setdefault(self.section, {}) + + def assignment(self, key, value): + if not self.section: + raise self.error_no_section() + + self.sections[self.section].setdefault(key, []) + self.sections[self.section][key].append('\n'.join(value)) + + def parse_exc(self, msg, lineno, line=None): + return ParseError(msg, lineno, line, self.filename) + + def error_no_section(self): + return self.parse_exc('Section must be started before assignment', + self.lineno) + + +class MultiConfigParser(object): + def __init__(self): + self.sections = {} + + def read(self, config_files): + read_ok = [] + + for filename in config_files: + parser = ConfigParser(filename, self.sections) + + try: + parser.parse() + except IOError: + continue + + read_ok.append(filename) + + return read_ok + + def get(self, section, name): + return self.sections[section][name] + + +class ConfigOpts(collections.Mapping): + + """ + Config options which may be set on the command line or in config files. + + ConfigOpts is a configuration option manager with APIs for registering + option schemas, grouping options, parsing option values and retrieving + the values of options. + """ + + def __init__(self, + project=None, + prog=None, + version=None, + usage=None, + default_config_files=None): + """Construct a ConfigOpts object. + + Automatically registers the --config-file option with either a supplied + list of default config files, or a list from find_config_files(). + + :param project: the toplevel project name, used to locate config files + :param prog: the name of the program (defaults to sys.argv[0] basename) + :param version: the program version (for --version) + :param usage: a usage string (%prog will be expanded) + :param default_config_files: config files to use by default + """ + if prog is None: + prog = os.path.basename(sys.argv[0]) + + if default_config_files is None: + default_config_files = find_config_files(project, prog) + + self.project = project + self.prog = prog + self.version = version + self.usage = usage + self.default_config_files = default_config_files + + self._opts = {} # dict of dicts of (opt:, override:, default:) + self._groups = {} + + self._args = None + self._cli_values = {} + + self._oparser = optparse.OptionParser(prog=self.prog, + version=self.version, + usage=self.usage) + self._cparser = None + + self.register_cli_opt( + MultiStrOpt('config-file', + default=self.default_config_files, + metavar='PATH', + help='Path to a config file to use. Multiple config ' + 'files can be specified, with values in later ' + 'files taking precedence. The default files used ' + 'are: %s' % (self.default_config_files, ))) + + def __call__(self, args=None): + """Parse command line arguments and config files. + + Calling a ConfigOpts object causes the supplied command line arguments + and config files to be parsed, causing opt values to be made available + as attributes of the object. + + The object may be called multiple times, each time causing the previous + set of values to be overwritten. + + :params args: command line arguments (defaults to sys.argv[1:]) + :returns: the list of arguments left over after parsing options + :raises: SystemExit, ConfigFilesNotFoundError, ConfigFileParseError + """ + self.reset() + + self._args = args + + (values, args) = self._oparser.parse_args(self._args) + + self._cli_values = vars(values) + + if self.config_file: + self._parse_config_files(self.config_file) + + return args + + def __getattr__(self, name): + """Look up an option value and perform string substitution. + + :param name: the opt name (or 'dest', more precisely) + :returns: the option value (after string subsititution) or a GroupAttr + :raises: NoSuchOptError,ConfigFileValueError,TemplateSubstitutionError + """ + return self._substitute(self._get(name)) + + def __getitem__(self, key): + """Look up an option value and perform string substitution.""" + return self.__getattr__(key) + + def __contains__(self, key): + """Return True if key is the name of a registered opt or group.""" + return key in self._opts or key in self._groups + + def __iter__(self): + """Iterate over all registered opt and group names.""" + for key in self._opts.keys() + self._groups.keys(): + yield key + + def __len__(self): + """Return the number of options and option groups.""" + return len(self._opts) + len(self._groups) + + def reset(self): + """Reset the state of the object to before it was called.""" + self._args = None + self._cli_values = None + self._cparser = None + + def register_opt(self, opt, group=None): + """Register an option schema. + + Registering an option schema makes any option value which is previously + or subsequently parsed from the command line or config files available + as an attribute of this object. + + :param opt: an instance of an Opt sub-class + :param group: an optional OptGroup object or group name + :return: False if the opt was already register, True otherwise + :raises: DuplicateOptError + """ + if group is not None: + return self._get_group(group)._register_opt(opt) + + if _is_opt_registered(self._opts, opt): + return False + + self._opts[opt.dest] = {'opt': opt, 'override': None, 'default': None} + + return True + + def register_opts(self, opts, group=None): + """Register multiple option schemas at once.""" + for opt in opts: + self.register_opt(opt, group) + + def register_cli_opt(self, opt, group=None): + """Register a CLI option schema. + + CLI option schemas must be registered before the command line and + config files are parsed. This is to ensure that all CLI options are + show in --help and option validation works as expected. + + :param opt: an instance of an Opt sub-class + :param group: an optional OptGroup object or group name + :return: False if the opt was already register, True otherwise + :raises: DuplicateOptError, ArgsAlreadyParsedError + """ + if self._args is not None: + raise ArgsAlreadyParsedError("cannot register CLI option") + + if not self.register_opt(opt, group): + return False + + if group is not None: + group = self._get_group(group) + + opt._add_to_cli(self._oparser, group) + + return True + + def register_cli_opts(self, opts, group=None): + """Register multiple CLI option schemas at once.""" + for opt in opts: + self.register_cli_opt(opt, group) + + def register_group(self, group): + """Register an option group. + + An option group must be registered before options can be registered + with the group. + + :param group: an OptGroup object + """ + if group.name in self._groups: + return + + self._groups[group.name] = copy.copy(group) + + def set_override(self, name, override, group=None): + """Override an opt value. + + Override the command line, config file and default values of a + given option. + + :param name: the name/dest of the opt + :param override: the override value + :param group: an option OptGroup object or group name + :raises: NoSuchOptError, NoSuchGroupError + """ + opt_info = self._get_opt_info(name, group) + opt_info['override'] = override + + def set_default(self, name, default, group=None): + """Override an opt's default value. + + Override the default value of given option. A command line or + config file value will still take precedence over this default. + + :param name: the name/dest of the opt + :param default: the default value + :param group: an option OptGroup object or group name + :raises: NoSuchOptError, NoSuchGroupError + """ + opt_info = self._get_opt_info(name, group) + opt_info['default'] = default + + def disable_interspersed_args(self): + """Set parsing to stop on the first non-option. + + If this this method is called, then parsing e.g. + + script --verbose cmd --debug /tmp/mything + + will no longer return: + + ['cmd', '/tmp/mything'] + + as the leftover arguments, but will instead return: + + ['cmd', '--debug', '/tmp/mything'] + + i.e. argument parsing is stopped at the first non-option argument. + """ + self._oparser.disable_interspersed_args() + + def enable_interspersed_args(self): + """Set parsing to not stop on the first non-option. + + This it the default behaviour.""" + self._oparser.enable_interspersed_args() + + def log_opt_values(self, logger, lvl): + """Log the value of all registered opts. + + It's often useful for an app to log its configuration to a log file at + startup for debugging. This method dumps to the entire config state to + the supplied logger at a given log level. + + :param logger: a logging.Logger object + :param lvl: the log level (e.g. logging.DEBUG) arg to logger.log() + """ + logger.log(lvl, "*" * 80) + logger.log(lvl, "Configuration options gathered from:") + logger.log(lvl, "command line args: %s", self._args) + logger.log(lvl, "config files: %s", self.config_file) + logger.log(lvl, "=" * 80) + + def _sanitize(opt, value): + """Obfuscate values of options declared secret""" + return value if not opt.secret else '*' * len(str(value)) + + for opt_name in sorted(self._opts): + opt = self._get_opt_info(opt_name)['opt'] + logger.log(lvl, "%-30s = %s", opt_name, + _sanitize(opt, getattr(self, opt_name))) + + for group_name in self._groups: + group_attr = self.GroupAttr(self, self._get_group(group_name)) + for opt_name in sorted(self._groups[group_name]._opts): + opt = self._get_opt_info(opt_name, group_name)['opt'] + logger.log(lvl, "%-30s = %s", + "%s.%s" % (group_name, opt_name), + _sanitize(opt, getattr(group_attr, opt_name))) + + logger.log(lvl, "*" * 80) + + def print_usage(self, file=None): + """Print the usage message for the current program.""" + self._oparser.print_usage(file) + + def print_help(self, file=None): + """Print the help message for the current program.""" + self._oparser.print_help(file) + + def _get(self, name, group=None): + """Look up an option value. + + :param name: the opt name (or 'dest', more precisely) + :param group: an OptGroup + :returns: the option value, or a GroupAttr object + :raises: NoSuchOptError, NoSuchGroupError, ConfigFileValueError, + TemplateSubstitutionError + """ + if group is None and name in self._groups: + return self.GroupAttr(self, self._get_group(name)) + + info = self._get_opt_info(name, group) + default, opt, override = map(lambda k: info[k], sorted(info.keys())) + + if override is not None: + return override + + values = [] + if self._cparser is not None: + section = group.name if group is not None else 'DEFAULT' + try: + value = opt._get_from_config_parser(self._cparser, section) + except KeyError: + pass + except ValueError as ve: + raise ConfigFileValueError(str(ve)) + else: + if not opt.multi: + # No need to continue since the last value wins + return value[-1] + values.extend(value) + + name = name if group is None else group.name + '_' + name + value = self._cli_values.get(name) + if value is not None: + if not opt.multi: + return value + + return value + values + + if values: + return values + + if default is not None: + return default + + return opt.default + + def _substitute(self, value): + """Perform string template substitution. + + Substititue any template variables (e.g. $foo, ${bar}) in the supplied + string value(s) with opt values. + + :param value: the string value, or list of string values + :returns: the substituted string(s) + """ + if isinstance(value, list): + return [self._substitute(i) for i in value] + elif isinstance(value, str): + tmpl = string.Template(value) + return tmpl.safe_substitute(self.StrSubWrapper(self)) + else: + return value + + def _get_group(self, group_or_name): + """Looks up a OptGroup object. + + Helper function to return an OptGroup given a parameter which can + either be the group's name or an OptGroup object. + + The OptGroup object returned is from the internal dict of OptGroup + objects, which will be a copy of any OptGroup object that users of + the API have access to. + + :param group_or_name: the group's name or the OptGroup object itself + :raises: NoSuchGroupError + """ + if isinstance(group_or_name, OptGroup): + group_name = group_or_name.name + else: + group_name = group_or_name + + if not group_name in self._groups: + raise NoSuchGroupError(group_name) + + return self._groups[group_name] + + def _get_opt_info(self, opt_name, group=None): + """Return the (opt, override, default) dict for an opt. + + :param opt_name: an opt name/dest + :param group: an optional group name or OptGroup object + :raises: NoSuchOptError, NoSuchGroupError + """ + if group is None: + opts = self._opts + else: + group = self._get_group(group) + opts = group._opts + + if not opt_name in opts: + raise NoSuchOptError(opt_name, group) + + return opts[opt_name] + + def _parse_config_files(self, config_files): + """Parse the supplied configuration files. + + :raises: ConfigFilesNotFoundError, ConfigFileParseError + """ + self._cparser = MultiConfigParser() + + try: + read_ok = self._cparser.read(config_files) + except iniparser.ParseError as pe: + raise ConfigFileParseError(pe.filename, str(pe)) + + if read_ok != config_files: + not_read_ok = filter(lambda f: f not in read_ok, config_files) + raise ConfigFilesNotFoundError(not_read_ok) + + class GroupAttr(collections.Mapping): + + """ + A helper class representing the option values of a group as a mapping + and attributes. + """ + + def __init__(self, conf, group): + """Construct a GroupAttr object. + + :param conf: a ConfigOpts object + :param group: an OptGroup object + """ + self.conf = conf + self.group = group + + def __getattr__(self, name): + """Look up an option value and perform template substitution.""" + return self.conf._substitute(self.conf._get(name, self.group)) + + def __getitem__(self, key): + """Look up an option value and perform string substitution.""" + return self.__getattr__(key) + + def __contains__(self, key): + """Return True if key is the name of a registered opt or group.""" + return key in self.group._opts + + def __iter__(self): + """Iterate over all registered opt and group names.""" + for key in self.group._opts.keys(): + yield key + + def __len__(self): + """Return the number of options and option groups.""" + return len(self.group._opts) + + class StrSubWrapper(object): + + """ + A helper class exposing opt values as a dict for string substitution. + """ + + def __init__(self, conf): + """Construct a StrSubWrapper object. + + :param conf: a ConfigOpts object + """ + self.conf = conf + + def __getitem__(self, key): + """Look up an opt value from the ConfigOpts object. + + :param key: an opt name + :returns: an opt value + :raises: TemplateSubstitutionError if attribute is a group + """ + value = getattr(self.conf, key) + if isinstance(value, self.conf.GroupAttr): + raise TemplateSubstitutionError( + 'substituting group %s not supported' % key) + return value + + +class CommonConfigOpts(ConfigOpts): + + DEFAULT_LOG_FORMAT = "%(asctime)s %(levelname)8s [%(name)s] %(message)s" + DEFAULT_LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S" + + common_cli_opts = [ + BoolOpt('debug', + short='d', + default=False, + help='Print debugging output'), + BoolOpt('verbose', + short='v', + default=False, + help='Print more verbose output'), + ] + + logging_cli_opts = [ + StrOpt('log-config', + metavar='PATH', + help='If this option is specified, the logging configuration ' + 'file specified is used and overrides any other logging ' + 'options specified. Please see the Python logging module ' + 'documentation for details on logging configuration ' + 'files.'), + StrOpt('log-format', + default=DEFAULT_LOG_FORMAT, + metavar='FORMAT', + help='A logging.Formatter log message format string which may ' + 'use any of the available logging.LogRecord attributes. ' + 'Default: %default'), + StrOpt('log-date-format', + default=DEFAULT_LOG_DATE_FORMAT, + metavar='DATE_FORMAT', + help='Format string for %(asctime)s in log records. ' + 'Default: %default'), + StrOpt('log-file', + metavar='PATH', + help='(Optional) Name of log file to output to. ' + 'If not set, logging will go to stdout.'), + StrOpt('log-dir', + help='(Optional) The directory to keep log files in ' + '(will be prepended to --logfile)'), + BoolOpt('use-syslog', + default=False, + help='Use syslog for logging.'), + StrOpt('syslog-log-facility', + default='LOG_USER', + help='syslog facility to receive log lines') + ] + + def __init__(self, **kwargs): + super(CommonConfigOpts, self).__init__(**kwargs) + self.register_cli_opts(self.common_cli_opts) + self.register_cli_opts(self.logging_cli_opts) diff --git a/cinder/openstack/common/exception.py b/cinder/openstack/common/exception.py new file mode 100644 index 000000000..ba32da550 --- /dev/null +++ b/cinder/openstack/common/exception.py @@ -0,0 +1,147 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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. + +""" +Exceptions common to OpenStack projects +""" + +import logging + + +class ProcessExecutionError(IOError): + def __init__(self, stdout=None, stderr=None, exit_code=None, cmd=None, + description=None): + if description is None: + description = "Unexpected error while running command." + if exit_code is None: + exit_code = '-' + message = "%s\nCommand: %s\nExit code: %s\nStdout: %r\nStderr: %r" % ( + description, cmd, exit_code, stdout, stderr) + IOError.__init__(self, message) + + +class Error(Exception): + def __init__(self, message=None): + super(Error, self).__init__(message) + + +class ApiError(Error): + def __init__(self, message='Unknown', code='Unknown'): + self.message = message + self.code = code + super(ApiError, self).__init__('%s: %s' % (code, message)) + + +class NotFound(Error): + pass + + +class UnknownScheme(Error): + + msg = "Unknown scheme '%s' found in URI" + + def __init__(self, scheme): + msg = self.__class__.msg % scheme + super(UnknownScheme, self).__init__(msg) + + +class BadStoreUri(Error): + + msg = "The Store URI %s was malformed. Reason: %s" + + def __init__(self, uri, reason): + msg = self.__class__.msg % (uri, reason) + super(BadStoreUri, self).__init__(msg) + + +class Duplicate(Error): + pass + + +class NotAuthorized(Error): + pass + + +class NotEmpty(Error): + pass + + +class Invalid(Error): + pass + + +class BadInputError(Exception): + """Error resulting from a client sending bad input to a server""" + pass + + +class MissingArgumentError(Error): + pass + + +class DatabaseMigrationError(Error): + pass + + +class ClientConnectionError(Exception): + """Error resulting from a client connecting to a server""" + pass + + +def wrap_exception(f): + def _wrap(*args, **kw): + try: + return f(*args, **kw) + except Exception, e: + if not isinstance(e, Error): + #exc_type, exc_value, exc_traceback = sys.exc_info() + logging.exception('Uncaught exception') + #logging.error(traceback.extract_stack(exc_traceback)) + raise Error(str(e)) + raise + _wrap.func_name = f.func_name + return _wrap + + +class OpenstackException(Exception): + """ + Base Exception + + To correctly use this class, inherit from it and define + a 'message' property. That message will get printf'd + with the keyword arguments provided to the constructor. + """ + message = "An unknown exception occurred" + + def __init__(self, **kwargs): + try: + self._error_string = self.message % kwargs + + except Exception: + # at least get the core message out if something happened + self._error_string = self.message + + def __str__(self): + return self._error_string + + +class MalformedRequestBody(OpenstackException): + message = "Malformed message body: %(reason)s" + + +class InvalidContentType(OpenstackException): + message = "Invalid content type %(content_type)s" diff --git a/cinder/openstack/common/importutils.py b/cinder/openstack/common/importutils.py new file mode 100644 index 000000000..9c0815c72 --- /dev/null +++ b/cinder/openstack/common/importutils.py @@ -0,0 +1,45 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 related utilities and helper functions. +""" + +import sys + +from cinder.openstack.common import exception + + +def import_class(import_str): + """Returns a class from a string including module and class""" + mod_str, _sep, class_str = import_str.rpartition('.') + try: + __import__(mod_str) + return getattr(sys.modules[mod_str], class_str) + except (ImportError, ValueError, AttributeError): + raise exception.NotFound('Class %s cannot be found' % class_str) + + +def import_object(import_str, *args, **kwargs): + """Import a class and return an instance of it.""" + return import_class(import_str)(*args, **kwargs) + + +def import_module(import_str): + """Import a module.""" + __import__(import_str) + return sys.modules[import_str] diff --git a/cinder/openstack/common/iniparser.py b/cinder/openstack/common/iniparser.py new file mode 100644 index 000000000..53ca02334 --- /dev/null +++ b/cinder/openstack/common/iniparser.py @@ -0,0 +1,126 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 OpenStack LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +class ParseError(Exception): + def __init__(self, message, lineno, line): + self.msg = message + self.line = line + self.lineno = lineno + + def __str__(self): + return 'at line %d, %s: %r' % (self.lineno, self.msg, self.line) + + +class BaseParser(object): + lineno = 0 + parse_exc = ParseError + + def _assignment(self, key, value): + self.assignment(key, value) + return None, [] + + def _get_section(self, line): + if line[-1] != ']': + return self.error_no_section_end_bracket(line) + if len(line) <= 2: + return self.error_no_section_name(line) + + return line[1:-1] + + def _split_key_value(self, line): + colon = line.find(':') + equal = line.find('=') + if colon < 0 and equal < 0: + return self.error_invalid_assignment(line) + + if colon < 0 or (equal >= 0 and equal < colon): + key, value = line[:equal], line[equal + 1:] + else: + key, value = line[:colon], line[colon + 1:] + + return key.strip(), [value.strip()] + + def parse(self, lineiter): + key = None + value = [] + + for line in lineiter: + self.lineno += 1 + + line = line.rstrip() + if not line: + # Blank line, ends multi-line values + if key: + key, value = self._assignment(key, value) + continue + elif line[0] in (' ', '\t'): + # Continuation of previous assignment + if key is None: + self.error_unexpected_continuation(line) + else: + value.append(line.lstrip()) + continue + + if key: + # Flush previous assignment, if any + key, value = self._assignment(key, value) + + if line[0] == '[': + # Section start + section = self._get_section(line) + if section: + self.new_section(section) + elif line[0] in '#;': + self.comment(line[1:].lstrip()) + else: + key, value = self._split_key_value(line) + if not key: + return self.error_empty_key(line) + + if key: + # Flush previous assignment, if any + self._assignment(key, value) + + def assignment(self, key, value): + """Called when a full assignment is parsed""" + raise NotImplementedError() + + def new_section(self, section): + """Called when a new section is started""" + raise NotImplementedError() + + def comment(self, comment): + """Called when a comment is parsed""" + pass + + def error_invalid_assignment(self, line): + raise self.parse_exc("No ':' or '=' found in assignment", + self.lineno, line) + + def error_empty_key(self, line): + raise self.parse_exc('Key cannot be empty', self.lineno, line) + + def error_unexpected_continuation(self, line): + raise self.parse_exc('Unexpected continuation line', + self.lineno, line) + + def error_no_section_end_bracket(self, line): + raise self.parse_exc('Invalid section (must end with ])', + self.lineno, line) + + def error_no_section_name(self, line): + raise self.parse_exc('Empty section name', self.lineno, line) diff --git a/cinder/openstack/common/local.py b/cinder/openstack/common/local.py new file mode 100644 index 000000000..19d962732 --- /dev/null +++ b/cinder/openstack/common/local.py @@ -0,0 +1,37 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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. + +"""Greenthread local storage of variables using weak references""" + +import weakref + +from eventlet import corolocal + + +class WeakLocal(corolocal.local): + def __getattribute__(self, attr): + rval = corolocal.local.__getattribute__(self, attr) + if rval: + rval = rval() + return rval + + def __setattr__(self, attr, value): + value = weakref.ref(value) + return corolocal.local.__setattr__(self, attr, value) + + +store = WeakLocal() diff --git a/cinder/policy.py b/cinder/policy.py new file mode 100644 index 000000000..646530385 --- /dev/null +++ b/cinder/policy.py @@ -0,0 +1,90 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 OpenStack, LLC. +# 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. + +"""Policy Engine For Cinder""" + +from cinder.common import policy +from cinder import exception +from cinder import flags +from cinder.openstack.common import cfg +from cinder import utils + + +policy_opts = [ + cfg.StrOpt('policy_file', + default='policy.json', + help=_('JSON file representing policy')), + cfg.StrOpt('policy_default_rule', + default='default', + help=_('Rule checked when requested rule is not found')), + ] + +FLAGS = flags.FLAGS +FLAGS.register_opts(policy_opts) + +_POLICY_PATH = None +_POLICY_CACHE = {} + + +def reset(): + global _POLICY_PATH + global _POLICY_CACHE + _POLICY_PATH = None + _POLICY_CACHE = {} + policy.reset() + + +def init(): + global _POLICY_PATH + global _POLICY_CACHE + if not _POLICY_PATH: + _POLICY_PATH = utils.find_config(FLAGS.policy_file) + utils.read_cached_file(_POLICY_PATH, _POLICY_CACHE, + reload_func=_set_brain) + + +def _set_brain(data): + default_rule = FLAGS.policy_default_rule + policy.set_brain(policy.HttpBrain.load_json(data, default_rule)) + + +def enforce(context, action, target): + """Verifies that the action is valid on the target in this context. + + :param context: cinder context + :param action: string representing the action to be checked + this should be colon separated for clarity. + i.e. ``compute:create_instance``, + ``compute:attach_volume``, + ``volume:attach_volume`` + + :param object: dictionary representing the object of the action + for object creation this should be a dictionary representing the + location of the object e.g. ``{'project_id': context.project_id}`` + + :raises cinder.exception.PolicyNotAllowed: if verification fails. + + """ + init() + + match_list = ('rule:%s' % action,) + credentials = context.to_dict() + + try: + policy.enforce(match_list, target, credentials) + except policy.NotAuthorized: + raise exception.PolicyNotAuthorized(action=action) diff --git a/cinder/quota.py b/cinder/quota.py new file mode 100644 index 000000000..2df6c89a4 --- /dev/null +++ b/cinder/quota.py @@ -0,0 +1,234 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Quotas for instances, volumes, and floating ips.""" + +from cinder import db +from cinder.openstack.common import cfg +from cinder import flags + + +quota_opts = [ + cfg.IntOpt('quota_instances', + default=10, + help='number of instances allowed per project'), + cfg.IntOpt('quota_cores', + default=20, + help='number of instance cores allowed per project'), + cfg.IntOpt('quota_ram', + default=50 * 1024, + help='megabytes of instance ram allowed per project'), + cfg.IntOpt('quota_volumes', + default=10, + help='number of volumes allowed per project'), + cfg.IntOpt('quota_gigabytes', + default=1000, + help='number of volume gigabytes allowed per project'), + cfg.IntOpt('quota_floating_ips', + default=10, + help='number of floating ips allowed per project'), + cfg.IntOpt('quota_metadata_items', + default=128, + help='number of metadata items allowed per instance'), + cfg.IntOpt('quota_injected_files', + default=5, + help='number of injected files allowed'), + cfg.IntOpt('quota_injected_file_content_bytes', + default=10 * 1024, + help='number of bytes allowed per injected file'), + cfg.IntOpt('quota_injected_file_path_bytes', + default=255, + help='number of bytes allowed per injected file path'), + cfg.IntOpt('quota_security_groups', + default=10, + help='number of security groups per project'), + cfg.IntOpt('quota_security_group_rules', + default=20, + help='number of security rules per security group'), + ] + +FLAGS = flags.FLAGS +FLAGS.register_opts(quota_opts) + + +quota_resources = ['metadata_items', 'injected_file_content_bytes', + 'volumes', 'gigabytes', 'ram', 'floating_ips', 'instances', + 'injected_files', 'cores', 'security_groups', 'security_group_rules'] + + +def _get_default_quotas(): + defaults = { + 'instances': FLAGS.quota_instances, + 'cores': FLAGS.quota_cores, + 'ram': FLAGS.quota_ram, + 'volumes': FLAGS.quota_volumes, + 'gigabytes': FLAGS.quota_gigabytes, + 'floating_ips': FLAGS.quota_floating_ips, + 'metadata_items': FLAGS.quota_metadata_items, + 'injected_files': FLAGS.quota_injected_files, + 'injected_file_content_bytes': + FLAGS.quota_injected_file_content_bytes, + 'security_groups': FLAGS.quota_security_groups, + 'security_group_rules': FLAGS.quota_security_group_rules, + } + # -1 in the quota flags means unlimited + return defaults + + +def get_class_quotas(context, quota_class, defaults=None): + """Update defaults with the quota class values.""" + + if not defaults: + defaults = _get_default_quotas() + + quota = db.quota_class_get_all_by_name(context, quota_class) + for key in defaults.keys(): + if key in quota: + defaults[key] = quota[key] + + return defaults + + +def get_project_quotas(context, project_id): + defaults = _get_default_quotas() + if context.quota_class: + get_class_quotas(context, context.quota_class, defaults) + quota = db.quota_get_all_by_project(context, project_id) + for key in defaults.keys(): + if key in quota: + defaults[key] = quota[key] + return defaults + + +def _get_request_allotment(requested, used, quota): + if quota == -1: + return requested + return quota - used + + +def allowed_instances(context, requested_instances, instance_type): + """Check quota and return min(requested_instances, allowed_instances).""" + project_id = context.project_id + context = context.elevated() + requested_cores = requested_instances * instance_type['vcpus'] + requested_ram = requested_instances * instance_type['memory_mb'] + usage = db.instance_data_get_for_project(context, project_id) + used_instances, used_cores, used_ram = usage + quota = get_project_quotas(context, project_id) + allowed_instances = _get_request_allotment(requested_instances, + used_instances, + quota['instances']) + allowed_cores = _get_request_allotment(requested_cores, used_cores, + quota['cores']) + allowed_ram = _get_request_allotment(requested_ram, used_ram, quota['ram']) + if instance_type['vcpus']: + allowed_instances = min(allowed_instances, + allowed_cores // instance_type['vcpus']) + if instance_type['memory_mb']: + allowed_instances = min(allowed_instances, + allowed_ram // instance_type['memory_mb']) + + return min(requested_instances, allowed_instances) + + +def allowed_volumes(context, requested_volumes, size): + """Check quota and return min(requested_volumes, allowed_volumes).""" + project_id = context.project_id + context = context.elevated() + size = int(size) + requested_gigabytes = requested_volumes * size + used_volumes, used_gigabytes = db.volume_data_get_for_project(context, + project_id) + quota = get_project_quotas(context, project_id) + allowed_volumes = _get_request_allotment(requested_volumes, used_volumes, + quota['volumes']) + allowed_gigabytes = _get_request_allotment(requested_gigabytes, + used_gigabytes, + quota['gigabytes']) + if size != 0: + allowed_volumes = min(allowed_volumes, + int(allowed_gigabytes // size)) + return min(requested_volumes, allowed_volumes) + + +def allowed_floating_ips(context, requested_floating_ips): + """Check quota and return min(requested, allowed) floating ips.""" + project_id = context.project_id + context = context.elevated() + used_floating_ips = db.floating_ip_count_by_project(context, project_id) + quota = get_project_quotas(context, project_id) + allowed_floating_ips = _get_request_allotment(requested_floating_ips, + used_floating_ips, + quota['floating_ips']) + return min(requested_floating_ips, allowed_floating_ips) + + +def allowed_security_groups(context, requested_security_groups): + """Check quota and return min(requested, allowed) security groups.""" + project_id = context.project_id + context = context.elevated() + used_sec_groups = db.security_group_count_by_project(context, project_id) + quota = get_project_quotas(context, project_id) + allowed_sec_groups = _get_request_allotment(requested_security_groups, + used_sec_groups, + quota['security_groups']) + return min(requested_security_groups, allowed_sec_groups) + + +def allowed_security_group_rules(context, security_group_id, + requested_rules): + """Check quota and return min(requested, allowed) sec group rules.""" + project_id = context.project_id + context = context.elevated() + used_rules = db.security_group_rule_count_by_group(context, + security_group_id) + quota = get_project_quotas(context, project_id) + allowed_rules = _get_request_allotment(requested_rules, + used_rules, + quota['security_group_rules']) + return min(requested_rules, allowed_rules) + + +def _calculate_simple_quota(context, resource, requested): + """Check quota for resource; return min(requested, allowed).""" + quota = get_project_quotas(context, context.project_id) + allowed = _get_request_allotment(requested, 0, quota[resource]) + return min(requested, allowed) + + +def allowed_metadata_items(context, requested_metadata_items): + """Return the number of metadata items allowed.""" + return _calculate_simple_quota(context, 'metadata_items', + requested_metadata_items) + + +def allowed_injected_files(context, requested_injected_files): + """Return the number of injected files allowed.""" + return _calculate_simple_quota(context, 'injected_files', + requested_injected_files) + + +def allowed_injected_file_content_bytes(context, requested_bytes): + """Return the number of bytes allowed per injected file content.""" + resource = 'injected_file_content_bytes' + return _calculate_simple_quota(context, resource, requested_bytes) + + +def allowed_injected_file_path_bytes(context): + """Return the number of bytes allowed in an injected file path.""" + return FLAGS.quota_injected_file_path_bytes diff --git a/cinder/rootwrap/__init__.py b/cinder/rootwrap/__init__.py new file mode 100755 index 000000000..671d3c173 --- /dev/null +++ b/cinder/rootwrap/__init__.py @@ -0,0 +1,16 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 OpenStack, LLC. +# 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/cinder/rootwrap/filters.py b/cinder/rootwrap/filters.py new file mode 100755 index 000000000..a51ecae3d --- /dev/null +++ b/cinder/rootwrap/filters.py @@ -0,0 +1,147 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 OpenStack, LLC. +# 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 os +import re + + +class CommandFilter(object): + """Command filter only checking that the 1st argument matches exec_path""" + + def __init__(self, exec_path, run_as, *args): + self.exec_path = exec_path + self.run_as = run_as + self.args = args + + def match(self, userargs): + """Only check that the first argument (command) matches exec_path""" + if (os.path.basename(self.exec_path) == userargs[0]): + return True + return False + + def get_command(self, userargs): + """Returns command to execute (with sudo -u if run_as != root).""" + if (self.run_as != 'root'): + # Used to run commands at lesser privileges + return ['sudo', '-u', self.run_as, self.exec_path] + userargs[1:] + return [self.exec_path] + userargs[1:] + + def get_environment(self, userargs): + """Returns specific environment to set, None if none""" + return None + + +class RegExpFilter(CommandFilter): + """Command filter doing regexp matching for every argument""" + + def match(self, userargs): + # Early skip if command or number of args don't match + if (len(self.args) != len(userargs)): + # DENY: argument numbers don't match + return False + # Compare each arg (anchoring pattern explicitly at end of string) + for (pattern, arg) in zip(self.args, userargs): + try: + if not re.match(pattern + '$', arg): + break + except re.error: + # DENY: Badly-formed filter + return False + else: + # ALLOW: All arguments matched + return True + + # DENY: Some arguments did not match + return False + + +class DnsmasqFilter(CommandFilter): + """Specific filter for the dnsmasq call (which includes env)""" + + def match(self, userargs): + if (userargs[0].startswith("FLAGFILE=") and + userargs[1].startswith("NETWORK_ID=") and + userargs[2] == "dnsmasq"): + return True + return False + + def get_command(self, userargs): + return [self.exec_path] + userargs[3:] + + def get_environment(self, userargs): + env = os.environ.copy() + env['FLAGFILE'] = userargs[0].split('=')[-1] + env['NETWORK_ID'] = userargs[1].split('=')[-1] + return env + + +class KillFilter(CommandFilter): + """Specific filter for the kill calls. + 1st argument is a list of accepted signals (emptystring means no signal) + 2nd argument is a list of accepted affected executables. + + This filter relies on /proc to accurately determine affected + executable, so it will only work on procfs-capable systems (not OSX). + """ + + def match(self, userargs): + if userargs[0] != "kill": + return False + args = list(userargs) + if len(args) == 3: + signal = args.pop(1) + if signal not in self.args[0]: + # Requested signal not in accepted list + return False + else: + if len(args) != 2: + # Incorrect number of arguments + return False + if '' not in self.args[0]: + # No signal, but list doesn't include empty string + return False + try: + command = os.readlink("/proc/%d/exe" % int(args[1])) + # NOTE(dprince): /proc/PID/exe may have ' (deleted)' on + # the end if an executable is updated or deleted + if command.endswith(" (deleted)"): + command = command[:command.rindex(" ")] + if command not in self.args[1]: + # Affected executable not in accepted list + return False + except (ValueError, OSError): + # Incorrect PID + return False + return True + + +class ReadFileFilter(CommandFilter): + """Specific filter for the utils.read_file_as_root call""" + + def __init__(self, file_path, *args): + self.file_path = file_path + super(ReadFileFilter, self).__init__("/bin/cat", "root", *args) + + def match(self, userargs): + if userargs[0] != 'cat': + return False + if userargs[1] != self.file_path: + return False + if len(userargs) != 2: + return False + return True diff --git a/cinder/rootwrap/volume.py b/cinder/rootwrap/volume.py new file mode 100755 index 000000000..8d96f4600 --- /dev/null +++ b/cinder/rootwrap/volume.py @@ -0,0 +1,45 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 OpenStack, LLC. +# 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 cinder.rootwrap import filters + +filterlist = [ + # cinder/volume/iscsi.py: iscsi_helper '--op' ... + filters.CommandFilter("/usr/sbin/ietadm", "root"), + filters.CommandFilter("/usr/sbin/tgtadm", "root"), + + # cinder/volume/driver.py: 'vgs', '--noheadings', '-o', 'name' + filters.CommandFilter("/sbin/vgs", "root"), + + # cinder/volume/driver.py: 'lvcreate', '-L', sizestr, '-n', volume_name,.. + # cinder/volume/driver.py: 'lvcreate', '-L', ... + filters.CommandFilter("/sbin/lvcreate", "root"), + + # cinder/volume/driver.py: 'dd', 'if=%s' % srcstr, 'of=%s' % deststr,... + filters.CommandFilter("/bin/dd", "root"), + + # cinder/volume/driver.py: 'lvremove', '-f', "%s/%s" % ... + filters.CommandFilter("/sbin/lvremove", "root"), + + # cinder/volume/driver.py: 'lvdisplay','--noheading','-C','-o','Attr',.. + filters.CommandFilter("/sbin/lvdisplay", "root"), + + # cinder/volume/driver.py: 'iscsiadm', '-m', 'discovery', '-t',... + # cinder/volume/driver.py: 'iscsiadm', '-m', 'node', '-T', ... + filters.CommandFilter("/sbin/iscsiadm", "root"), + ] diff --git a/cinder/rootwrap/wrapper.py b/cinder/rootwrap/wrapper.py new file mode 100755 index 000000000..683224e31 --- /dev/null +++ b/cinder/rootwrap/wrapper.py @@ -0,0 +1,60 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 OpenStack, LLC. +# 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 os +import sys + + +FILTERS_MODULES = ['cinder.rootwrap.volume'] + + +def load_filters(): + """Load filters from modules present in cinder.rootwrap.""" + filters = [] + for modulename in FILTERS_MODULES: + try: + __import__(modulename) + module = sys.modules[modulename] + filters = filters + module.filterlist + except ImportError: + # It's OK to have missing filters, since filter modules are + # shipped with specific nodes rather than with python-cinder + pass + return filters + + +def match_filter(filters, userargs): + """ + Checks user command and arguments through command filters and + returns the first matching filter, or None is none matched. + """ + + found_filter = None + + for f in filters: + if f.match(userargs): + # Try other filters if executable is absent + if not os.access(f.exec_path, os.X_OK): + if not found_filter: + found_filter = f + continue + # Otherwise return matching filter for execution + return f + + # No filter matched or first missing executable + return found_filter diff --git a/cinder/rpc/__init__.py b/cinder/rpc/__init__.py new file mode 100644 index 000000000..0340116f6 --- /dev/null +++ b/cinder/rpc/__init__.py @@ -0,0 +1,227 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# All Rights Reserved. +# Copyright 2011 Red Hat, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from cinder.openstack.common import cfg +from cinder.openstack.common import importutils + + +rpc_opts = [ + cfg.StrOpt('rpc_backend', + default='cinder.rpc.impl_kombu', + help="The messaging module to use, defaults to kombu."), + cfg.IntOpt('rpc_thread_pool_size', + default=64, + help='Size of RPC thread pool'), + cfg.IntOpt('rpc_conn_pool_size', + default=30, + help='Size of RPC connection pool'), + cfg.IntOpt('rpc_response_timeout', + default=60, + help='Seconds to wait for a response from call or multicall'), + cfg.IntOpt('allowed_rpc_exception_modules', + default=['cinder.exception'], + help='Modules of exceptions that are permitted to be recreated' + 'upon receiving exception data from an rpc call.'), + ] + +_CONF = None + + +def register_opts(conf): + global _CONF + _CONF = conf + _CONF.register_opts(rpc_opts) + _get_impl().register_opts(_CONF) + + +def create_connection(new=True): + """Create a connection to the message bus used for rpc. + + For some example usage of creating a connection and some consumers on that + connection, see cinder.service. + + :param new: Whether or not to create a new connection. A new connection + will be created by default. If new is False, the + implementation is free to return an existing connection from a + pool. + + :returns: An instance of cinder.rpc.common.Connection + """ + return _get_impl().create_connection(_CONF, new=new) + + +def call(context, topic, msg, timeout=None): + """Invoke a remote method that returns something. + + :param context: Information that identifies the user that has made this + request. + :param topic: The topic to send the rpc message to. This correlates to the + topic argument of + cinder.rpc.common.Connection.create_consumer() + and only applies when the consumer was created + with fanout=False. + :param msg: This is a dict in the form { "method" : "method_to_invoke", + "args" : dict_of_kwargs } + :param timeout: int, number of seconds to use for a response timeout. + If set, this overrides the rpc_response_timeout option. + + :returns: A dict from the remote method. + + :raises: cinder.rpc.common.Timeout if a complete response is not received + before the timeout is reached. + """ + return _get_impl().call(_CONF, context, topic, msg, timeout) + + +def cast(context, topic, msg): + """Invoke a remote method that does not return anything. + + :param context: Information that identifies the user that has made this + request. + :param topic: The topic to send the rpc message to. This correlates to the + topic argument of + cinder.rpc.common.Connection.create_consumer() + and only applies when the consumer was created + with fanout=False. + :param msg: This is a dict in the form { "method" : "method_to_invoke", + "args" : dict_of_kwargs } + + :returns: None + """ + return _get_impl().cast(_CONF, context, topic, msg) + + +def fanout_cast(context, topic, msg): + """Broadcast a remote method invocation with no return. + + This method will get invoked on all consumers that were set up with this + topic name and fanout=True. + + :param context: Information that identifies the user that has made this + request. + :param topic: The topic to send the rpc message to. This correlates to the + topic argument of + cinder.rpc.common.Connection.create_consumer() + and only applies when the consumer was created + with fanout=True. + :param msg: This is a dict in the form { "method" : "method_to_invoke", + "args" : dict_of_kwargs } + + :returns: None + """ + return _get_impl().fanout_cast(_CONF, context, topic, msg) + + +def multicall(context, topic, msg, timeout=None): + """Invoke a remote method and get back an iterator. + + In this case, the remote method will be returning multiple values in + separate messages, so the return values can be processed as the come in via + an iterator. + + :param context: Information that identifies the user that has made this + request. + :param topic: The topic to send the rpc message to. This correlates to the + topic argument of + cinder.rpc.common.Connection.create_consumer() + and only applies when the consumer was created + with fanout=False. + :param msg: This is a dict in the form { "method" : "method_to_invoke", + "args" : dict_of_kwargs } + :param timeout: int, number of seconds to use for a response timeout. + If set, this overrides the rpc_response_timeout option. + + :returns: An iterator. The iterator will yield a tuple (N, X) where N is + an index that starts at 0 and increases by one for each value + returned and X is the Nth value that was returned by the remote + method. + + :raises: cinder.rpc.common.Timeout if a complete response is not received + before the timeout is reached. + """ + return _get_impl().multicall(_CONF, context, topic, msg, timeout) + + +def notify(context, topic, msg): + """Send notification event. + + :param context: Information that identifies the user that has made this + request. + :param topic: The topic to send the notification to. + :param msg: This is a dict of content of event. + + :returns: None + """ + return _get_impl().notify(_CONF, context, topic, msg) + + +def cleanup(): + """Clean up resoruces in use by implementation. + + Clean up any resources that have been allocated by the RPC implementation. + This is typically open connections to a messaging service. This function + would get called before an application using this API exits to allow + connections to get torn down cleanly. + + :returns: None + """ + return _get_impl().cleanup() + + +def cast_to_server(context, server_params, topic, msg): + """Invoke a remote method that does not return anything. + + :param context: Information that identifies the user that has made this + request. + :param server_params: Connection information + :param topic: The topic to send the notification to. + :param msg: This is a dict in the form { "method" : "method_to_invoke", + "args" : dict_of_kwargs } + + :returns: None + """ + return _get_impl().cast_to_server(_CONF, context, server_params, topic, + msg) + + +def fanout_cast_to_server(context, server_params, topic, msg): + """Broadcast to a remote method invocation with no return. + + :param context: Information that identifies the user that has made this + request. + :param server_params: Connection information + :param topic: The topic to send the notification to. + :param msg: This is a dict in the form { "method" : "method_to_invoke", + "args" : dict_of_kwargs } + + :returns: None + """ + return _get_impl().fanout_cast_to_server(_CONF, context, server_params, + topic, msg) + + +_RPCIMPL = None + + +def _get_impl(): + """Delay import of rpc_backend until configuration is loaded.""" + global _RPCIMPL + if _RPCIMPL is None: + _RPCIMPL = importutils.import_module(_CONF.rpc_backend) + return _RPCIMPL diff --git a/cinder/rpc/amqp.py b/cinder/rpc/amqp.py new file mode 100644 index 000000000..b559ca78d --- /dev/null +++ b/cinder/rpc/amqp.py @@ -0,0 +1,405 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# All Rights Reserved. +# Copyright 2011 - 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. + +""" +Shared code between AMQP based cinder.rpc implementations. + +The code in this module is shared between the rpc implemenations based on AMQP. +Specifically, this includes impl_kombu and impl_qpid. impl_carrot also uses +AMQP, but is deprecated and predates this code. +""" + +import inspect +import sys +import uuid + +from eventlet import greenpool +from eventlet import pools +from eventlet import semaphore + +from cinder import context +from cinder import exception +from cinder import log as logging +from cinder.openstack.common import local +import cinder.rpc.common as rpc_common +from cinder import utils + +LOG = logging.getLogger(__name__) + + +class Pool(pools.Pool): + """Class that implements a Pool of Connections.""" + def __init__(self, conf, connection_cls, *args, **kwargs): + self.connection_cls = connection_cls + self.conf = conf + kwargs.setdefault("max_size", self.conf.rpc_conn_pool_size) + kwargs.setdefault("order_as_stack", True) + super(Pool, self).__init__(*args, **kwargs) + + # TODO(comstud): Timeout connections not used in a while + def create(self): + LOG.debug('Pool creating new connection') + return self.connection_cls(self.conf) + + def empty(self): + while self.free_items: + self.get().close() + + +_pool_create_sem = semaphore.Semaphore() + + +def get_connection_pool(conf, connection_cls): + with _pool_create_sem: + # Make sure only one thread tries to create the connection pool. + if not connection_cls.pool: + connection_cls.pool = Pool(conf, connection_cls) + return connection_cls.pool + + +class ConnectionContext(rpc_common.Connection): + """The class that is actually returned to the caller of + create_connection(). This is a essentially a wrapper around + Connection that supports 'with' and can return a new Connection or + one from a pool. It will also catch when an instance of this class + is to be deleted so that we can return Connections to the pool on + exceptions and so forth without making the caller be responsible for + catching all exceptions and making sure to return a connection to + the pool. + """ + + def __init__(self, conf, connection_pool, pooled=True, server_params=None): + """Create a new connection, or get one from the pool""" + self.connection = None + self.conf = conf + self.connection_pool = connection_pool + if pooled: + self.connection = connection_pool.get() + else: + self.connection = connection_pool.connection_cls(conf, + server_params=server_params) + self.pooled = pooled + + def __enter__(self): + """When with ConnectionContext() is used, return self""" + return self + + def _done(self): + """If the connection came from a pool, clean it up and put it back. + If it did not come from a pool, close it. + """ + if self.connection: + if self.pooled: + # Reset the connection so it's ready for the next caller + # to grab from the pool + self.connection.reset() + self.connection_pool.put(self.connection) + else: + try: + self.connection.close() + except Exception: + pass + self.connection = None + + def __exit__(self, exc_type, exc_value, tb): + """End of 'with' statement. We're done here.""" + self._done() + + def __del__(self): + """Caller is done with this connection. Make sure we cleaned up.""" + self._done() + + def close(self): + """Caller is done with this connection.""" + self._done() + + def create_consumer(self, topic, proxy, fanout=False): + self.connection.create_consumer(topic, proxy, fanout) + + def consume_in_thread(self): + self.connection.consume_in_thread() + + def __getattr__(self, key): + """Proxy all other calls to the Connection instance""" + if self.connection: + return getattr(self.connection, key) + else: + raise exception.InvalidRPCConnectionReuse() + + +def msg_reply(conf, msg_id, connection_pool, reply=None, failure=None, + ending=False): + """Sends a reply or an error on the channel signified by msg_id. + + Failure should be a sys.exc_info() tuple. + + """ + with ConnectionContext(conf, connection_pool) as conn: + if failure: + failure = rpc_common.serialize_remote_exception(failure) + + try: + msg = {'result': reply, 'failure': failure} + except TypeError: + msg = {'result': dict((k, repr(v)) + for k, v in reply.__dict__.iteritems()), + 'failure': failure} + if ending: + msg['ending'] = True + conn.direct_send(msg_id, msg) + + +class RpcContext(context.RequestContext): + """Context that supports replying to a rpc.call""" + def __init__(self, *args, **kwargs): + self.msg_id = kwargs.pop('msg_id', None) + self.conf = kwargs.pop('conf') + super(RpcContext, self).__init__(*args, **kwargs) + + def reply(self, reply=None, failure=None, ending=False, + connection_pool=None): + if self.msg_id: + msg_reply(self.conf, self.msg_id, connection_pool, reply, failure, + ending) + if ending: + self.msg_id = None + + +def unpack_context(conf, msg): + """Unpack context from msg.""" + context_dict = {} + for key in list(msg.keys()): + # NOTE(vish): Some versions of python don't like unicode keys + # in kwargs. + key = str(key) + if key.startswith('_context_'): + value = msg.pop(key) + context_dict[key[9:]] = value + context_dict['msg_id'] = msg.pop('_msg_id', None) + context_dict['conf'] = conf + ctx = RpcContext.from_dict(context_dict) + rpc_common._safe_log(LOG.debug, _('unpacked context: %s'), ctx.to_dict()) + return ctx + + +def pack_context(msg, context): + """Pack context into msg. + + Values for message keys need to be less than 255 chars, so we pull + context out into a bunch of separate keys. If we want to support + more arguments in rabbit messages, we may want to do the same + for args at some point. + + """ + context_d = dict([('_context_%s' % key, value) + for (key, value) in context.to_dict().iteritems()]) + msg.update(context_d) + + +class ProxyCallback(object): + """Calls methods on a proxy object based on method and args.""" + + def __init__(self, conf, proxy, connection_pool): + self.proxy = proxy + self.pool = greenpool.GreenPool(conf.rpc_thread_pool_size) + self.connection_pool = connection_pool + self.conf = conf + + def __call__(self, message_data): + """Consumer callback to call a method on a proxy object. + + Parses the message for validity and fires off a thread to call the + proxy object method. + + Message data should be a dictionary with two keys: + method: string representing the method to call + args: dictionary of arg: value + + Example: {'method': 'echo', 'args': {'value': 42}} + + """ + # It is important to clear the context here, because at this point + # the previous context is stored in local.store.context + if hasattr(local.store, 'context'): + del local.store.context + rpc_common._safe_log(LOG.debug, _('received %s'), message_data) + ctxt = unpack_context(self.conf, message_data) + method = message_data.get('method') + args = message_data.get('args', {}) + if not method: + LOG.warn(_('no method for message: %s') % message_data) + ctxt.reply(_('No method for message: %s') % message_data, + connection_pool=self.connection_pool) + return + self.pool.spawn_n(self._process_data, ctxt, method, args) + + @exception.wrap_exception() + def _process_data(self, ctxt, method, args): + """Thread that magically looks for a method on the proxy + object and calls it. + """ + ctxt.update_store() + try: + node_func = getattr(self.proxy, str(method)) + node_args = dict((str(k), v) for k, v in args.iteritems()) + # NOTE(vish): magic is fun! + rval = node_func(context=ctxt, **node_args) + # Check if the result was a generator + if inspect.isgenerator(rval): + for x in rval: + ctxt.reply(x, None, connection_pool=self.connection_pool) + else: + ctxt.reply(rval, None, connection_pool=self.connection_pool) + # This final None tells multicall that it is done. + ctxt.reply(ending=True, connection_pool=self.connection_pool) + except Exception as e: + LOG.exception('Exception during message handling') + ctxt.reply(None, sys.exc_info(), + connection_pool=self.connection_pool) + + +class MulticallWaiter(object): + def __init__(self, conf, connection, timeout): + self._connection = connection + self._iterator = connection.iterconsume( + timeout=timeout or conf.rpc_response_timeout) + self._result = None + self._done = False + self._got_ending = False + self._conf = conf + + def done(self): + if self._done: + return + self._done = True + self._iterator.close() + self._iterator = None + self._connection.close() + + def __call__(self, data): + """The consume() callback will call this. Store the result.""" + if data['failure']: + failure = data['failure'] + self._result = rpc_common.deserialize_remote_exception(self._conf, + failure) + + elif data.get('ending', False): + self._got_ending = True + else: + self._result = data['result'] + + def __iter__(self): + """Return a result until we get a 'None' response from consumer""" + if self._done: + raise StopIteration + while True: + try: + self._iterator.next() + except Exception: + with utils.save_and_reraise_exception(): + self.done() + if self._got_ending: + self.done() + raise StopIteration + result = self._result + if isinstance(result, Exception): + self.done() + raise result + yield result + + +def create_connection(conf, new, connection_pool): + """Create a connection""" + return ConnectionContext(conf, connection_pool, pooled=not new) + + +def multicall(conf, context, topic, msg, timeout, connection_pool): + """Make a call that returns multiple times.""" + # Can't use 'with' for multicall, as it returns an iterator + # that will continue to use the connection. When it's done, + # connection.close() will get called which will put it back into + # the pool + LOG.debug(_('Making asynchronous call on %s ...'), topic) + msg_id = uuid.uuid4().hex + msg.update({'_msg_id': msg_id}) + LOG.debug(_('MSG_ID is %s') % (msg_id)) + pack_context(msg, context) + + conn = ConnectionContext(conf, connection_pool) + wait_msg = MulticallWaiter(conf, conn, timeout) + conn.declare_direct_consumer(msg_id, wait_msg) + conn.topic_send(topic, msg) + return wait_msg + + +def call(conf, context, topic, msg, timeout, connection_pool): + """Sends a message on a topic and wait for a response.""" + rv = multicall(conf, context, topic, msg, timeout, connection_pool) + # NOTE(vish): return the last result from the multicall + rv = list(rv) + if not rv: + return + return rv[-1] + + +def cast(conf, context, topic, msg, connection_pool): + """Sends a message on a topic without waiting for a response.""" + LOG.debug(_('Making asynchronous cast on %s...'), topic) + pack_context(msg, context) + with ConnectionContext(conf, connection_pool) as conn: + conn.topic_send(topic, msg) + + +def fanout_cast(conf, context, topic, msg, connection_pool): + """Sends a message on a fanout exchange without waiting for a response.""" + LOG.debug(_('Making asynchronous fanout cast...')) + pack_context(msg, context) + with ConnectionContext(conf, connection_pool) as conn: + conn.fanout_send(topic, msg) + + +def cast_to_server(conf, context, server_params, topic, msg, connection_pool): + """Sends a message on a topic to a specific server.""" + pack_context(msg, context) + with ConnectionContext(conf, connection_pool, pooled=False, + server_params=server_params) as conn: + conn.topic_send(topic, msg) + + +def fanout_cast_to_server(conf, context, server_params, topic, msg, + connection_pool): + """Sends a message on a fanout exchange to a specific server.""" + pack_context(msg, context) + with ConnectionContext(conf, connection_pool, pooled=False, + server_params=server_params) as conn: + conn.fanout_send(topic, msg) + + +def notify(conf, context, topic, msg, connection_pool): + """Sends a notification event on a topic.""" + event_type = msg.get('event_type') + LOG.debug(_('Sending %(event_type)s on %(topic)s'), locals()) + pack_context(msg, context) + with ConnectionContext(conf, connection_pool) as conn: + conn.notify_send(topic, msg) + + +def cleanup(connection_pool): + if connection_pool: + connection_pool.empty() diff --git a/cinder/rpc/common.py b/cinder/rpc/common.py new file mode 100644 index 000000000..4dfaa3f76 --- /dev/null +++ b/cinder/rpc/common.py @@ -0,0 +1,220 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# All Rights Reserved. +# Copyright 2011 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. + +import copy +import sys +import traceback + +from cinder import exception +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder.openstack.common import importutils +from cinder import utils + + +LOG = logging.getLogger(__name__) + + +class RemoteError(exception.CinderException): + """Signifies that a remote class has raised an exception. + + Contains a string representation of the type of the original exception, + the value of the original exception, and the traceback. These are + sent to the parent as a joined string so printing the exception + contains all of the relevant info. + + """ + message = _("Remote error: %(exc_type)s %(value)s\n%(traceback)s.") + + def __init__(self, exc_type=None, value=None, traceback=None): + self.exc_type = exc_type + self.value = value + self.traceback = traceback + super(RemoteError, self).__init__(exc_type=exc_type, + value=value, + traceback=traceback) + + +class Timeout(exception.CinderException): + """Signifies that a timeout has occurred. + + This exception is raised if the rpc_response_timeout is reached while + waiting for a response from the remote side. + """ + message = _("Timeout while waiting on RPC response.") + + +class Connection(object): + """A connection, returned by rpc.create_connection(). + + This class represents a connection to the message bus used for rpc. + An instance of this class should never be created by users of the rpc API. + Use rpc.create_connection() instead. + """ + def close(self): + """Close the connection. + + This method must be called when the connection will no longer be used. + It will ensure that any resources associated with the connection, such + as a network connection, and cleaned up. + """ + raise NotImplementedError() + + def create_consumer(self, conf, topic, proxy, fanout=False): + """Create a consumer on this connection. + + A consumer is associated with a message queue on the backend message + bus. The consumer will read messages from the queue, unpack them, and + dispatch them to the proxy object. The contents of the message pulled + off of the queue will determine which method gets called on the proxy + object. + + :param conf: An openstack.common.cfg configuration object. + :param topic: This is a name associated with what to consume from. + Multiple instances of a service may consume from the same + topic. For example, all instances of cinder-compute + consume from a queue called "compute". In that case, the + messages will get distributed amongst the consumers in a + round-robin fashion if fanout=False. If fanout=True, + every consumer associated with this topic will get a + copy of every message. + :param proxy: The object that will handle all incoming messages. + :param fanout: Whether or not this is a fanout topic. See the + documentation for the topic parameter for some + additional comments on this. + """ + raise NotImplementedError() + + def consume_in_thread(self): + """Spawn a thread to handle incoming messages. + + Spawn a thread that will be responsible for handling all incoming + messages for consumers that were set up on this connection. + + Message dispatching inside of this is expected to be implemented in a + non-blocking manner. An example implementation would be having this + thread pull messages in for all of the consumers, but utilize a thread + pool for dispatching the messages to the proxy objects. + """ + raise NotImplementedError() + + +def _safe_log(log_func, msg, msg_data): + """Sanitizes the msg_data field before logging.""" + SANITIZE = { + 'set_admin_password': ('new_pass',), + 'run_instance': ('admin_password',), + } + + has_method = 'method' in msg_data and msg_data['method'] in SANITIZE + has_context_token = '_context_auth_token' in msg_data + has_token = 'auth_token' in msg_data + + if not any([has_method, has_context_token, has_token]): + return log_func(msg, msg_data) + + msg_data = copy.deepcopy(msg_data) + + if has_method: + method = msg_data['method'] + if method in SANITIZE: + args_to_sanitize = SANITIZE[method] + for arg in args_to_sanitize: + try: + msg_data['args'][arg] = "<SANITIZED>" + except KeyError: + pass + + if has_context_token: + msg_data['_context_auth_token'] = '<SANITIZED>' + + if has_token: + msg_data['auth_token'] = '<SANITIZED>' + + return log_func(msg, msg_data) + + +def serialize_remote_exception(failure_info): + """Prepares exception data to be sent over rpc. + + Failure_info should be a sys.exc_info() tuple. + + """ + tb = traceback.format_exception(*failure_info) + failure = failure_info[1] + LOG.error(_("Returning exception %s to caller"), unicode(failure)) + LOG.error(tb) + + kwargs = {} + if hasattr(failure, 'kwargs'): + kwargs = failure.kwargs + + data = { + 'class': str(failure.__class__.__name__), + 'module': str(failure.__class__.__module__), + 'message': unicode(failure), + 'tb': tb, + 'args': failure.args, + 'kwargs': kwargs + } + + json_data = utils.dumps(data) + + return json_data + + +def deserialize_remote_exception(conf, data): + failure = utils.loads(str(data)) + + trace = failure.get('tb', []) + message = failure.get('message', "") + "\n" + "\n".join(trace) + name = failure.get('class') + module = failure.get('module') + + # NOTE(ameade): We DO NOT want to allow just any module to be imported, in + # order to prevent arbitrary code execution. + if not module in conf.allowed_rpc_exception_modules: + return RemoteError(name, failure.get('message'), trace) + + try: + mod = importutils.import_module(module) + klass = getattr(mod, name) + if not issubclass(klass, Exception): + raise TypeError("Can only deserialize Exceptions") + + failure = klass(**failure.get('kwargs', {})) + except (AttributeError, TypeError, ImportError): + return RemoteError(name, failure.get('message'), trace) + + ex_type = type(failure) + str_override = lambda self: message + new_ex_type = type(ex_type.__name__ + "_Remote", (ex_type,), + {'__str__': str_override}) + try: + # NOTE(ameade): Dynamically create a new exception type and swap it in + # as the new type for the exception. This only works on user defined + # Exceptions and not core python exceptions. This is important because + # we cannot necessarily change an exception message so we must override + # the __str__ method. + failure.__class__ = new_ex_type + except TypeError as e: + # NOTE(ameade): If a core exception then just add the traceback to the + # first exception argument. + failure.args = (message,) + failure.args[1:] + return failure diff --git a/cinder/rpc/impl_fake.py b/cinder/rpc/impl_fake.py new file mode 100644 index 000000000..dc3b00eca --- /dev/null +++ b/cinder/rpc/impl_fake.py @@ -0,0 +1,185 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +"""Fake RPC implementation which calls proxy methods directly with no +queues. Casts will block, but this is very useful for tests. +""" + +import inspect +import json +import signal +import sys +import time +import traceback + +import eventlet + +from cinder import context +from cinder.rpc import common as rpc_common + +CONSUMERS = {} + + +class RpcContext(context.RequestContext): + def __init__(self, *args, **kwargs): + super(RpcContext, self).__init__(*args, **kwargs) + self._response = [] + self._done = False + + def reply(self, reply=None, failure=None, ending=False): + if ending: + self._done = True + if not self._done: + self._response.append((reply, failure)) + + +class Consumer(object): + def __init__(self, topic, proxy): + self.topic = topic + self.proxy = proxy + + def call(self, context, method, args, timeout): + node_func = getattr(self.proxy, method) + node_args = dict((str(k), v) for k, v in args.iteritems()) + done = eventlet.event.Event() + + def _inner(): + ctxt = RpcContext.from_dict(context.to_dict()) + try: + rval = node_func(context=ctxt, **node_args) + res = [] + # Caller might have called ctxt.reply() manually + for (reply, failure) in ctxt._response: + if failure: + raise failure[0], failure[1], failure[2] + res.append(reply) + # if ending not 'sent'...we might have more data to + # return from the function itself + if not ctxt._done: + if inspect.isgenerator(rval): + for val in rval: + res.append(val) + else: + res.append(rval) + done.send(res) + except Exception as e: + done.send_exception(e) + + thread = eventlet.greenthread.spawn(_inner) + + if timeout: + start_time = time.time() + while not done.ready(): + eventlet.greenthread.sleep(1) + cur_time = time.time() + if (cur_time - start_time) > timeout: + thread.kill() + raise rpc_common.Timeout() + + return done.wait() + + +class Connection(object): + """Connection object.""" + + def __init__(self): + self.consumers = [] + + def create_consumer(self, topic, proxy, fanout=False): + consumer = Consumer(topic, proxy) + self.consumers.append(consumer) + if topic not in CONSUMERS: + CONSUMERS[topic] = [] + CONSUMERS[topic].append(consumer) + + def close(self): + for consumer in self.consumers: + CONSUMERS[consumer.topic].remove(consumer) + self.consumers = [] + + def consume_in_thread(self): + pass + + +def create_connection(conf, new=True): + """Create a connection""" + return Connection() + + +def check_serialize(msg): + """Make sure a message intended for rpc can be serialized.""" + json.dumps(msg) + + +def multicall(conf, context, topic, msg, timeout=None): + """Make a call that returns multiple times.""" + + check_serialize(msg) + + method = msg.get('method') + if not method: + return + args = msg.get('args', {}) + + try: + consumer = CONSUMERS[topic][0] + except (KeyError, IndexError): + return iter([None]) + else: + return consumer.call(context, method, args, timeout) + + +def call(conf, context, topic, msg, timeout=None): + """Sends a message on a topic and wait for a response.""" + rv = multicall(conf, context, topic, msg, timeout) + # NOTE(vish): return the last result from the multicall + rv = list(rv) + if not rv: + return + return rv[-1] + + +def cast(conf, context, topic, msg): + try: + call(conf, context, topic, msg) + except Exception: + pass + + +def notify(conf, context, topic, msg): + check_serialize(msg) + + +def cleanup(): + pass + + +def fanout_cast(conf, context, topic, msg): + """Cast to all consumers of a topic""" + check_serialize(msg) + method = msg.get('method') + if not method: + return + args = msg.get('args', {}) + + for consumer in CONSUMERS.get(topic, []): + try: + consumer.call(context, method, args, None) + except Exception: + pass + + +def register_opts(conf): + pass diff --git a/cinder/rpc/impl_kombu.py b/cinder/rpc/impl_kombu.py new file mode 100644 index 000000000..c64356cf8 --- /dev/null +++ b/cinder/rpc/impl_kombu.py @@ -0,0 +1,713 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 itertools +import socket +import ssl +import sys +import time +import uuid + +import eventlet +import greenlet +import kombu +import kombu.entity +import kombu.messaging +import kombu.connection + +from cinder.openstack.common import cfg +from cinder.rpc import amqp as rpc_amqp +from cinder.rpc import common as rpc_common + +kombu_opts = [ + cfg.StrOpt('kombu_ssl_version', + default='', + help='SSL version to use (valid only if SSL enabled)'), + cfg.StrOpt('kombu_ssl_keyfile', + default='', + help='SSL key file (valid only if SSL enabled)'), + cfg.StrOpt('kombu_ssl_certfile', + default='', + help='SSL cert file (valid only if SSL enabled)'), + cfg.StrOpt('kombu_ssl_ca_certs', + default='', + help=('SSL certification authority file ' + '(valid only if SSL enabled)')), + ] + +LOG = rpc_common.LOG + + +class ConsumerBase(object): + """Consumer base class.""" + + def __init__(self, channel, callback, tag, **kwargs): + """Declare a queue on an amqp channel. + + 'channel' is the amqp channel to use + 'callback' is the callback to call when messages are received + 'tag' is a unique ID for the consumer on the channel + + queue name, exchange name, and other kombu options are + passed in here as a dictionary. + """ + self.callback = callback + self.tag = str(tag) + self.kwargs = kwargs + self.queue = None + self.reconnect(channel) + + def reconnect(self, channel): + """Re-declare the queue after a rabbit reconnect""" + self.channel = channel + self.kwargs['channel'] = channel + self.queue = kombu.entity.Queue(**self.kwargs) + self.queue.declare() + + def consume(self, *args, **kwargs): + """Actually declare the consumer on the amqp channel. This will + start the flow of messages from the queue. Using the + Connection.iterconsume() iterator will process the messages, + calling the appropriate callback. + + If a callback is specified in kwargs, use that. Otherwise, + use the callback passed during __init__() + + If kwargs['nowait'] is True, then this call will block until + a message is read. + + Messages will automatically be acked if the callback doesn't + raise an exception + """ + + options = {'consumer_tag': self.tag} + options['nowait'] = kwargs.get('nowait', False) + callback = kwargs.get('callback', self.callback) + if not callback: + raise ValueError("No callback defined") + + def _callback(raw_message): + message = self.channel.message_to_python(raw_message) + try: + callback(message.payload) + message.ack() + except Exception: + LOG.exception(_("Failed to process message... skipping it.")) + + self.queue.consume(*args, callback=_callback, **options) + + def cancel(self): + """Cancel the consuming from the queue, if it has started""" + try: + self.queue.cancel(self.tag) + except KeyError, e: + # NOTE(comstud): Kludge to get around a amqplib bug + if str(e) != "u'%s'" % self.tag: + raise + self.queue = None + + +class DirectConsumer(ConsumerBase): + """Queue/consumer class for 'direct'""" + + def __init__(self, conf, channel, msg_id, callback, tag, **kwargs): + """Init a 'direct' queue. + + 'channel' is the amqp channel to use + 'msg_id' is the msg_id to listen on + 'callback' is the callback to call when messages are received + 'tag' is a unique ID for the consumer on the channel + + Other kombu options may be passed + """ + # Default options + options = {'durable': False, + 'auto_delete': True, + 'exclusive': True} + options.update(kwargs) + exchange = kombu.entity.Exchange( + name=msg_id, + type='direct', + durable=options['durable'], + auto_delete=options['auto_delete']) + super(DirectConsumer, self).__init__( + channel, + callback, + tag, + name=msg_id, + exchange=exchange, + routing_key=msg_id, + **options) + + +class TopicConsumer(ConsumerBase): + """Consumer class for 'topic'""" + + def __init__(self, conf, channel, topic, callback, tag, **kwargs): + """Init a 'topic' queue. + + 'channel' is the amqp channel to use + 'topic' is the topic to listen on + 'callback' is the callback to call when messages are received + 'tag' is a unique ID for the consumer on the channel + + Other kombu options may be passed + """ + # Default options + options = {'durable': conf.rabbit_durable_queues, + 'auto_delete': False, + 'exclusive': False} + options.update(kwargs) + exchange = kombu.entity.Exchange( + name=conf.control_exchange, + type='topic', + durable=options['durable'], + auto_delete=options['auto_delete']) + super(TopicConsumer, self).__init__( + channel, + callback, + tag, + name=topic, + exchange=exchange, + routing_key=topic, + **options) + + +class FanoutConsumer(ConsumerBase): + """Consumer class for 'fanout'""" + + def __init__(self, conf, channel, topic, callback, tag, **kwargs): + """Init a 'fanout' queue. + + 'channel' is the amqp channel to use + 'topic' is the topic to listen on + 'callback' is the callback to call when messages are received + 'tag' is a unique ID for the consumer on the channel + + Other kombu options may be passed + """ + unique = uuid.uuid4().hex + exchange_name = '%s_fanout' % topic + queue_name = '%s_fanout_%s' % (topic, unique) + + # Default options + options = {'durable': False, + 'auto_delete': True, + 'exclusive': True} + options.update(kwargs) + exchange = kombu.entity.Exchange( + name=exchange_name, + type='fanout', + durable=options['durable'], + auto_delete=options['auto_delete']) + super(FanoutConsumer, self).__init__( + channel, + callback, + tag, + name=queue_name, + exchange=exchange, + routing_key=topic, + **options) + + +class Publisher(object): + """Base Publisher class""" + + def __init__(self, channel, exchange_name, routing_key, **kwargs): + """Init the Publisher class with the exchange_name, routing_key, + and other options + """ + self.exchange_name = exchange_name + self.routing_key = routing_key + self.kwargs = kwargs + self.reconnect(channel) + + def reconnect(self, channel): + """Re-establish the Producer after a rabbit reconnection""" + self.exchange = kombu.entity.Exchange(name=self.exchange_name, + **self.kwargs) + self.producer = kombu.messaging.Producer(exchange=self.exchange, + channel=channel, routing_key=self.routing_key) + + def send(self, msg): + """Send a message""" + self.producer.publish(msg) + + +class DirectPublisher(Publisher): + """Publisher class for 'direct'""" + def __init__(self, conf, channel, msg_id, **kwargs): + """init a 'direct' publisher. + + Kombu options may be passed as keyword args to override defaults + """ + + options = {'durable': False, + 'auto_delete': True, + 'exclusive': True} + options.update(kwargs) + super(DirectPublisher, self).__init__(channel, + msg_id, + msg_id, + type='direct', + **options) + + +class TopicPublisher(Publisher): + """Publisher class for 'topic'""" + def __init__(self, conf, channel, topic, **kwargs): + """init a 'topic' publisher. + + Kombu options may be passed as keyword args to override defaults + """ + options = {'durable': conf.rabbit_durable_queues, + 'auto_delete': False, + 'exclusive': False} + options.update(kwargs) + super(TopicPublisher, self).__init__(channel, + conf.control_exchange, + topic, + type='topic', + **options) + + +class FanoutPublisher(Publisher): + """Publisher class for 'fanout'""" + def __init__(self, conf, channel, topic, **kwargs): + """init a 'fanout' publisher. + + Kombu options may be passed as keyword args to override defaults + """ + options = {'durable': False, + 'auto_delete': True, + 'exclusive': True} + options.update(kwargs) + super(FanoutPublisher, self).__init__(channel, + '%s_fanout' % topic, + None, + type='fanout', + **options) + + +class NotifyPublisher(TopicPublisher): + """Publisher class for 'notify'""" + + def __init__(self, conf, channel, topic, **kwargs): + self.durable = kwargs.pop('durable', conf.rabbit_durable_queues) + super(NotifyPublisher, self).__init__(conf, channel, topic, **kwargs) + + def reconnect(self, channel): + super(NotifyPublisher, self).reconnect(channel) + + # NOTE(jerdfelt): Normally the consumer would create the queue, but + # we do this to ensure that messages don't get dropped if the + # consumer is started after we do + queue = kombu.entity.Queue(channel=channel, + exchange=self.exchange, + durable=self.durable, + name=self.routing_key, + routing_key=self.routing_key) + queue.declare() + + +class Connection(object): + """Connection object.""" + + pool = None + + def __init__(self, conf, server_params=None): + self.consumers = [] + self.consumer_thread = None + self.conf = conf + self.max_retries = self.conf.rabbit_max_retries + # Try forever? + if self.max_retries <= 0: + self.max_retries = None + self.interval_start = self.conf.rabbit_retry_interval + self.interval_stepping = self.conf.rabbit_retry_backoff + # max retry-interval = 30 seconds + self.interval_max = 30 + self.memory_transport = False + + if server_params is None: + server_params = {} + + # Keys to translate from server_params to kombu params + server_params_to_kombu_params = {'username': 'userid'} + + params = {} + for sp_key, value in server_params.iteritems(): + p_key = server_params_to_kombu_params.get(sp_key, sp_key) + params[p_key] = value + + params.setdefault('hostname', self.conf.rabbit_host) + params.setdefault('port', self.conf.rabbit_port) + params.setdefault('userid', self.conf.rabbit_userid) + params.setdefault('password', self.conf.rabbit_password) + params.setdefault('virtual_host', self.conf.rabbit_virtual_host) + + self.params = params + + if self.conf.fake_rabbit: + self.params['transport'] = 'memory' + self.memory_transport = True + else: + self.memory_transport = False + + if self.conf.rabbit_use_ssl: + self.params['ssl'] = self._fetch_ssl_params() + + self.connection = None + self.reconnect() + + def _fetch_ssl_params(self): + """Handles fetching what ssl params + should be used for the connection (if any)""" + ssl_params = dict() + + # http://docs.python.org/library/ssl.html - ssl.wrap_socket + if self.conf.kombu_ssl_version: + ssl_params['ssl_version'] = self.conf.kombu_ssl_version + if self.conf.kombu_ssl_keyfile: + ssl_params['keyfile'] = self.conf.kombu_ssl_keyfile + if self.conf.kombu_ssl_certfile: + ssl_params['certfile'] = self.conf.kombu_ssl_certfile + if self.conf.kombu_ssl_ca_certs: + ssl_params['ca_certs'] = self.conf.kombu_ssl_ca_certs + # We might want to allow variations in the + # future with this? + ssl_params['cert_reqs'] = ssl.CERT_REQUIRED + + if not ssl_params: + # Just have the default behavior + return True + else: + # Return the extended behavior + return ssl_params + + def _connect(self): + """Connect to rabbit. Re-establish any queues that may have + been declared before if we are reconnecting. Exceptions should + be handled by the caller. + """ + if self.connection: + LOG.info(_("Reconnecting to AMQP server on " + "%(hostname)s:%(port)d") % self.params) + try: + self.connection.close() + except self.connection_errors: + pass + # Setting this in case the next statement fails, though + # it shouldn't be doing any network operations, yet. + self.connection = None + self.connection = kombu.connection.BrokerConnection( + **self.params) + self.connection_errors = self.connection.connection_errors + if self.memory_transport: + # Kludge to speed up tests. + self.connection.transport.polling_interval = 0.0 + self.consumer_num = itertools.count(1) + self.connection.connect() + self.channel = self.connection.channel() + # work around 'memory' transport bug in 1.1.3 + if self.memory_transport: + self.channel._new_queue('ae.undeliver') + for consumer in self.consumers: + consumer.reconnect(self.channel) + LOG.info(_('Connected to AMQP server on %(hostname)s:%(port)d'), + self.params) + + def reconnect(self): + """Handles reconnecting and re-establishing queues. + Will retry up to self.max_retries number of times. + self.max_retries = 0 means to retry forever. + Sleep between tries, starting at self.interval_start + seconds, backing off self.interval_stepping number of seconds + each attempt. + """ + + attempt = 0 + while True: + attempt += 1 + try: + self._connect() + return + except (self.connection_errors, IOError), e: + pass + except Exception, e: + # NOTE(comstud): Unfortunately it's possible for amqplib + # to return an error not covered by its transport + # connection_errors in the case of a timeout waiting for + # a protocol response. (See paste link in LP888621) + # So, we check all exceptions for 'timeout' in them + # and try to reconnect in this case. + if 'timeout' not in str(e): + raise + + log_info = {} + log_info['err_str'] = str(e) + log_info['max_retries'] = self.max_retries + log_info.update(self.params) + + if self.max_retries and attempt == self.max_retries: + LOG.exception(_('Unable to connect to AMQP server on ' + '%(hostname)s:%(port)d after %(max_retries)d ' + 'tries: %(err_str)s') % log_info) + # NOTE(comstud): Copied from original code. There's + # really no better recourse because if this was a queue we + # need to consume on, we have no way to consume anymore. + sys.exit(1) + + if attempt == 1: + sleep_time = self.interval_start or 1 + elif attempt > 1: + sleep_time += self.interval_stepping + if self.interval_max: + sleep_time = min(sleep_time, self.interval_max) + + log_info['sleep_time'] = sleep_time + LOG.exception(_('AMQP server on %(hostname)s:%(port)d is' + ' unreachable: %(err_str)s. Trying again in ' + '%(sleep_time)d seconds.') % log_info) + time.sleep(sleep_time) + + def ensure(self, error_callback, method, *args, **kwargs): + while True: + try: + return method(*args, **kwargs) + except (self.connection_errors, socket.timeout, IOError), e: + pass + except Exception, e: + # NOTE(comstud): Unfortunately it's possible for amqplib + # to return an error not covered by its transport + # connection_errors in the case of a timeout waiting for + # a protocol response. (See paste link in LP888621) + # So, we check all exceptions for 'timeout' in them + # and try to reconnect in this case. + if 'timeout' not in str(e): + raise + if error_callback: + error_callback(e) + self.reconnect() + + def get_channel(self): + """Convenience call for bin/clear_rabbit_queues""" + return self.channel + + def close(self): + """Close/release this connection""" + self.cancel_consumer_thread() + self.connection.release() + self.connection = None + + def reset(self): + """Reset a connection so it can be used again""" + self.cancel_consumer_thread() + self.channel.close() + self.channel = self.connection.channel() + # work around 'memory' transport bug in 1.1.3 + if self.memory_transport: + self.channel._new_queue('ae.undeliver') + self.consumers = [] + + def declare_consumer(self, consumer_cls, topic, callback): + """Create a Consumer using the class that was passed in and + add it to our list of consumers + """ + + def _connect_error(exc): + log_info = {'topic': topic, 'err_str': str(exc)} + LOG.error(_("Failed to declare consumer for topic '%(topic)s': " + "%(err_str)s") % log_info) + + def _declare_consumer(): + consumer = consumer_cls(self.conf, self.channel, topic, callback, + self.consumer_num.next()) + self.consumers.append(consumer) + return consumer + + return self.ensure(_connect_error, _declare_consumer) + + def iterconsume(self, limit=None, timeout=None): + """Return an iterator that will consume from all queues/consumers""" + + info = {'do_consume': True} + + def _error_callback(exc): + if isinstance(exc, socket.timeout): + LOG.exception(_('Timed out waiting for RPC response: %s') % + str(exc)) + raise rpc_common.Timeout() + else: + LOG.exception(_('Failed to consume message from queue: %s') % + str(exc)) + info['do_consume'] = True + + def _consume(): + if info['do_consume']: + queues_head = self.consumers[:-1] + queues_tail = self.consumers[-1] + for queue in queues_head: + queue.consume(nowait=True) + queues_tail.consume(nowait=False) + info['do_consume'] = False + return self.connection.drain_events(timeout=timeout) + + for iteration in itertools.count(0): + if limit and iteration >= limit: + raise StopIteration + yield self.ensure(_error_callback, _consume) + + def cancel_consumer_thread(self): + """Cancel a consumer thread""" + if self.consumer_thread is not None: + self.consumer_thread.kill() + try: + self.consumer_thread.wait() + except greenlet.GreenletExit: + pass + self.consumer_thread = None + + def publisher_send(self, cls, topic, msg, **kwargs): + """Send to a publisher based on the publisher class""" + + def _error_callback(exc): + log_info = {'topic': topic, 'err_str': str(exc)} + LOG.exception(_("Failed to publish message to topic " + "'%(topic)s': %(err_str)s") % log_info) + + def _publish(): + publisher = cls(self.conf, self.channel, topic, **kwargs) + publisher.send(msg) + + self.ensure(_error_callback, _publish) + + def declare_direct_consumer(self, topic, callback): + """Create a 'direct' queue. + In cinder's use, this is generally a msg_id queue used for + responses for call/multicall + """ + self.declare_consumer(DirectConsumer, topic, callback) + + def declare_topic_consumer(self, topic, callback=None): + """Create a 'topic' consumer.""" + self.declare_consumer(TopicConsumer, topic, callback) + + def declare_fanout_consumer(self, topic, callback): + """Create a 'fanout' consumer""" + self.declare_consumer(FanoutConsumer, topic, callback) + + def direct_send(self, msg_id, msg): + """Send a 'direct' message""" + self.publisher_send(DirectPublisher, msg_id, msg) + + def topic_send(self, topic, msg): + """Send a 'topic' message""" + self.publisher_send(TopicPublisher, topic, msg) + + def fanout_send(self, topic, msg): + """Send a 'fanout' message""" + self.publisher_send(FanoutPublisher, topic, msg) + + def notify_send(self, topic, msg, **kwargs): + """Send a notify message on a topic""" + self.publisher_send(NotifyPublisher, topic, msg, **kwargs) + + def consume(self, limit=None): + """Consume from all queues/consumers""" + it = self.iterconsume(limit=limit) + while True: + try: + it.next() + except StopIteration: + return + + def consume_in_thread(self): + """Consumer from all queues/consumers in a greenthread""" + def _consumer_thread(): + try: + self.consume() + except greenlet.GreenletExit: + return + if self.consumer_thread is None: + self.consumer_thread = eventlet.spawn(_consumer_thread) + return self.consumer_thread + + def create_consumer(self, topic, proxy, fanout=False): + """Create a consumer that calls a method in a proxy object""" + proxy_cb = rpc_amqp.ProxyCallback(self.conf, proxy, + rpc_amqp.get_connection_pool(self, Connection)) + + if fanout: + self.declare_fanout_consumer(topic, proxy_cb) + else: + self.declare_topic_consumer(topic, proxy_cb) + + +def create_connection(conf, new=True): + """Create a connection""" + return rpc_amqp.create_connection(conf, new, + rpc_amqp.get_connection_pool(conf, Connection)) + + +def multicall(conf, context, topic, msg, timeout=None): + """Make a call that returns multiple times.""" + return rpc_amqp.multicall(conf, context, topic, msg, timeout, + rpc_amqp.get_connection_pool(conf, Connection)) + + +def call(conf, context, topic, msg, timeout=None): + """Sends a message on a topic and wait for a response.""" + return rpc_amqp.call(conf, context, topic, msg, timeout, + rpc_amqp.get_connection_pool(conf, Connection)) + + +def cast(conf, context, topic, msg): + """Sends a message on a topic without waiting for a response.""" + return rpc_amqp.cast(conf, context, topic, msg, + rpc_amqp.get_connection_pool(conf, Connection)) + + +def fanout_cast(conf, context, topic, msg): + """Sends a message on a fanout exchange without waiting for a response.""" + return rpc_amqp.fanout_cast(conf, context, topic, msg, + rpc_amqp.get_connection_pool(conf, Connection)) + + +def cast_to_server(conf, context, server_params, topic, msg): + """Sends a message on a topic to a specific server.""" + return rpc_amqp.cast_to_server(conf, context, server_params, topic, msg, + rpc_amqp.get_connection_pool(conf, Connection)) + + +def fanout_cast_to_server(conf, context, server_params, topic, msg): + """Sends a message on a fanout exchange to a specific server.""" + return rpc_amqp.cast_to_server(conf, context, server_params, topic, msg, + rpc_amqp.get_connection_pool(conf, Connection)) + + +def notify(conf, context, topic, msg): + """Sends a notification event on a topic.""" + return rpc_amqp.notify(conf, context, topic, msg, + rpc_amqp.get_connection_pool(conf, Connection)) + + +def cleanup(): + return rpc_amqp.cleanup(Connection.pool) + + +def register_opts(conf): + conf.register_opts(kombu_opts) diff --git a/cinder/rpc/impl_qpid.py b/cinder/rpc/impl_qpid.py new file mode 100644 index 000000000..95ab00741 --- /dev/null +++ b/cinder/rpc/impl_qpid.py @@ -0,0 +1,563 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC +# Copyright 2011 - 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. + +import itertools +import time +import uuid +import json + +import eventlet +import greenlet +import qpid.messaging +import qpid.messaging.exceptions + +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder.rpc import amqp as rpc_amqp +from cinder.rpc import common as rpc_common + +LOG = logging.getLogger(__name__) + +qpid_opts = [ + cfg.StrOpt('qpid_hostname', + default='localhost', + help='Qpid broker hostname'), + cfg.StrOpt('qpid_port', + default='5672', + help='Qpid broker port'), + cfg.StrOpt('qpid_username', + default='', + help='Username for qpid connection'), + cfg.StrOpt('qpid_password', + default='', + help='Password for qpid connection'), + cfg.StrOpt('qpid_sasl_mechanisms', + default='', + help='Space separated list of SASL mechanisms to use for auth'), + cfg.BoolOpt('qpid_reconnect', + default=True, + help='Automatically reconnect'), + cfg.IntOpt('qpid_reconnect_timeout', + default=0, + help='Reconnection timeout in seconds'), + cfg.IntOpt('qpid_reconnect_limit', + default=0, + help='Max reconnections before giving up'), + cfg.IntOpt('qpid_reconnect_interval_min', + default=0, + help='Minimum seconds between reconnection attempts'), + cfg.IntOpt('qpid_reconnect_interval_max', + default=0, + help='Maximum seconds between reconnection attempts'), + cfg.IntOpt('qpid_reconnect_interval', + default=0, + help='Equivalent to setting max and min to the same value'), + cfg.IntOpt('qpid_heartbeat', + default=5, + help='Seconds between connection keepalive heartbeats'), + cfg.StrOpt('qpid_protocol', + default='tcp', + help="Transport to use, either 'tcp' or 'ssl'"), + cfg.BoolOpt('qpid_tcp_nodelay', + default=True, + help='Disable Nagle algorithm'), + ] + + +class ConsumerBase(object): + """Consumer base class.""" + + def __init__(self, session, callback, node_name, node_opts, + link_name, link_opts): + """Declare a queue on an amqp session. + + 'session' is the amqp session to use + 'callback' is the callback to call when messages are received + 'node_name' is the first part of the Qpid address string, before ';' + 'node_opts' will be applied to the "x-declare" section of "node" + in the address string. + 'link_name' goes into the "name" field of the "link" in the address + string + 'link_opts' will be applied to the "x-declare" section of "link" + in the address string. + """ + self.callback = callback + self.receiver = None + self.session = None + + addr_opts = { + "create": "always", + "node": { + "type": "topic", + "x-declare": { + "durable": True, + "auto-delete": True, + }, + }, + "link": { + "name": link_name, + "durable": True, + "x-declare": { + "durable": False, + "auto-delete": True, + "exclusive": False, + }, + }, + } + addr_opts["node"]["x-declare"].update(node_opts) + addr_opts["link"]["x-declare"].update(link_opts) + + self.address = "%s ; %s" % (node_name, json.dumps(addr_opts)) + + self.reconnect(session) + + def reconnect(self, session): + """Re-declare the receiver after a qpid reconnect""" + self.session = session + self.receiver = session.receiver(self.address) + self.receiver.capacity = 1 + + def consume(self): + """Fetch the message and pass it to the callback object""" + message = self.receiver.fetch() + self.callback(message.content) + + def get_receiver(self): + return self.receiver + + +class DirectConsumer(ConsumerBase): + """Queue/consumer class for 'direct'""" + + def __init__(self, conf, session, msg_id, callback): + """Init a 'direct' queue. + + 'session' is the amqp session to use + 'msg_id' is the msg_id to listen on + 'callback' is the callback to call when messages are received + """ + + super(DirectConsumer, self).__init__(session, callback, + "%s/%s" % (msg_id, msg_id), + {"type": "direct"}, + msg_id, + {"exclusive": True}) + + +class TopicConsumer(ConsumerBase): + """Consumer class for 'topic'""" + + def __init__(self, conf, session, topic, callback): + """Init a 'topic' queue. + + 'session' is the amqp session to use + 'topic' is the topic to listen on + 'callback' is the callback to call when messages are received + """ + + super(TopicConsumer, self).__init__(session, callback, + "%s/%s" % (conf.control_exchange, topic), {}, + topic, {}) + + +class FanoutConsumer(ConsumerBase): + """Consumer class for 'fanout'""" + + def __init__(self, conf, session, topic, callback): + """Init a 'fanout' queue. + + 'session' is the amqp session to use + 'topic' is the topic to listen on + 'callback' is the callback to call when messages are received + """ + + super(FanoutConsumer, self).__init__(session, callback, + "%s_fanout" % topic, + {"durable": False, "type": "fanout"}, + "%s_fanout_%s" % (topic, uuid.uuid4().hex), + {"exclusive": True}) + + +class Publisher(object): + """Base Publisher class""" + + def __init__(self, session, node_name, node_opts=None): + """Init the Publisher class with the exchange_name, routing_key, + and other options + """ + self.sender = None + self.session = session + + addr_opts = { + "create": "always", + "node": { + "type": "topic", + "x-declare": { + "durable": False, + # auto-delete isn't implemented for exchanges in qpid, + # but put in here anyway + "auto-delete": True, + }, + }, + } + if node_opts: + addr_opts["node"]["x-declare"].update(node_opts) + + self.address = "%s ; %s" % (node_name, json.dumps(addr_opts)) + + self.reconnect(session) + + def reconnect(self, session): + """Re-establish the Sender after a reconnection""" + self.sender = session.sender(self.address) + + def send(self, msg): + """Send a message""" + self.sender.send(msg) + + +class DirectPublisher(Publisher): + """Publisher class for 'direct'""" + def __init__(self, conf, session, msg_id): + """Init a 'direct' publisher.""" + super(DirectPublisher, self).__init__(session, msg_id, + {"type": "Direct"}) + + +class TopicPublisher(Publisher): + """Publisher class for 'topic'""" + def __init__(self, conf, session, topic): + """init a 'topic' publisher. + """ + super(TopicPublisher, self).__init__(session, + "%s/%s" % (conf.control_exchange, topic)) + + +class FanoutPublisher(Publisher): + """Publisher class for 'fanout'""" + def __init__(self, conf, session, topic): + """init a 'fanout' publisher. + """ + super(FanoutPublisher, self).__init__(session, + "%s_fanout" % topic, {"type": "fanout"}) + + +class NotifyPublisher(Publisher): + """Publisher class for notifications""" + def __init__(self, conf, session, topic): + """init a 'topic' publisher. + """ + super(NotifyPublisher, self).__init__(session, + "%s/%s" % (conf.control_exchange, topic), + {"durable": True}) + + +class Connection(object): + """Connection object.""" + + pool = None + + def __init__(self, conf, server_params=None): + self.session = None + self.consumers = {} + self.consumer_thread = None + self.conf = conf + + if server_params is None: + server_params = {} + + default_params = dict(hostname=self.conf.qpid_hostname, + port=self.conf.qpid_port, + username=self.conf.qpid_username, + password=self.conf.qpid_password) + + params = server_params + for key in default_params.keys(): + params.setdefault(key, default_params[key]) + + self.broker = params['hostname'] + ":" + str(params['port']) + # Create the connection - this does not open the connection + self.connection = qpid.messaging.Connection(self.broker) + + # Check if flags are set and if so set them for the connection + # before we call open + self.connection.username = params['username'] + self.connection.password = params['password'] + self.connection.sasl_mechanisms = self.conf.qpid_sasl_mechanisms + self.connection.reconnect = self.conf.qpid_reconnect + if self.conf.qpid_reconnect_timeout: + self.connection.reconnect_timeout = ( + self.conf.qpid_reconnect_timeout) + if self.conf.qpid_reconnect_limit: + self.connection.reconnect_limit = self.conf.qpid_reconnect_limit + if self.conf.qpid_reconnect_interval_max: + self.connection.reconnect_interval_max = ( + self.conf.qpid_reconnect_interval_max) + if self.conf.qpid_reconnect_interval_min: + self.connection.reconnect_interval_min = ( + self.conf.qpid_reconnect_interval_min) + if self.conf.qpid_reconnect_interval: + self.connection.reconnect_interval = ( + self.conf.qpid_reconnect_interval) + self.connection.hearbeat = self.conf.qpid_heartbeat + self.connection.protocol = self.conf.qpid_protocol + self.connection.tcp_nodelay = self.conf.qpid_tcp_nodelay + + # Open is part of reconnect - + # NOTE(WGH) not sure we need this with the reconnect flags + self.reconnect() + + def _register_consumer(self, consumer): + self.consumers[str(consumer.get_receiver())] = consumer + + def _lookup_consumer(self, receiver): + return self.consumers[str(receiver)] + + def reconnect(self): + """Handles reconnecting and re-establishing sessions and queues""" + if self.connection.opened(): + try: + self.connection.close() + except qpid.messaging.exceptions.ConnectionError: + pass + + while True: + try: + self.connection.open() + except qpid.messaging.exceptions.ConnectionError, e: + LOG.error(_('Unable to connect to AMQP server: %s'), e) + time.sleep(self.conf.qpid_reconnect_interval or 1) + else: + break + + LOG.info(_('Connected to AMQP server on %s'), self.broker) + + self.session = self.connection.session() + + for consumer in self.consumers.itervalues(): + consumer.reconnect(self.session) + + if self.consumers: + LOG.debug(_("Re-established AMQP queues")) + + def ensure(self, error_callback, method, *args, **kwargs): + while True: + try: + return method(*args, **kwargs) + except (qpid.messaging.exceptions.Empty, + qpid.messaging.exceptions.ConnectionError), e: + if error_callback: + error_callback(e) + self.reconnect() + + def close(self): + """Close/release this connection""" + self.cancel_consumer_thread() + self.connection.close() + self.connection = None + + def reset(self): + """Reset a connection so it can be used again""" + self.cancel_consumer_thread() + self.session.close() + self.session = self.connection.session() + self.consumers = {} + + def declare_consumer(self, consumer_cls, topic, callback): + """Create a Consumer using the class that was passed in and + add it to our list of consumers + """ + def _connect_error(exc): + log_info = {'topic': topic, 'err_str': str(exc)} + LOG.error(_("Failed to declare consumer for topic '%(topic)s': " + "%(err_str)s") % log_info) + + def _declare_consumer(): + consumer = consumer_cls(self.conf, self.session, topic, callback) + self._register_consumer(consumer) + return consumer + + return self.ensure(_connect_error, _declare_consumer) + + def iterconsume(self, limit=None, timeout=None): + """Return an iterator that will consume from all queues/consumers""" + + def _error_callback(exc): + if isinstance(exc, qpid.messaging.exceptions.Empty): + LOG.exception(_('Timed out waiting for RPC response: %s') % + str(exc)) + raise rpc_common.Timeout() + else: + LOG.exception(_('Failed to consume message from queue: %s') % + str(exc)) + + def _consume(): + nxt_receiver = self.session.next_receiver(timeout=timeout) + try: + self._lookup_consumer(nxt_receiver).consume() + except Exception: + LOG.exception(_("Error processing message. Skipping it.")) + + for iteration in itertools.count(0): + if limit and iteration >= limit: + raise StopIteration + yield self.ensure(_error_callback, _consume) + + def cancel_consumer_thread(self): + """Cancel a consumer thread""" + if self.consumer_thread is not None: + self.consumer_thread.kill() + try: + self.consumer_thread.wait() + except greenlet.GreenletExit: + pass + self.consumer_thread = None + + def publisher_send(self, cls, topic, msg): + """Send to a publisher based on the publisher class""" + + def _connect_error(exc): + log_info = {'topic': topic, 'err_str': str(exc)} + LOG.exception(_("Failed to publish message to topic " + "'%(topic)s': %(err_str)s") % log_info) + + def _publisher_send(): + publisher = cls(self.conf, self.session, topic) + publisher.send(msg) + + return self.ensure(_connect_error, _publisher_send) + + def declare_direct_consumer(self, topic, callback): + """Create a 'direct' queue. + In cinder's use, this is generally a msg_id queue used for + responses for call/multicall + """ + self.declare_consumer(DirectConsumer, topic, callback) + + def declare_topic_consumer(self, topic, callback=None): + """Create a 'topic' consumer.""" + self.declare_consumer(TopicConsumer, topic, callback) + + def declare_fanout_consumer(self, topic, callback): + """Create a 'fanout' consumer""" + self.declare_consumer(FanoutConsumer, topic, callback) + + def direct_send(self, msg_id, msg): + """Send a 'direct' message""" + self.publisher_send(DirectPublisher, msg_id, msg) + + def topic_send(self, topic, msg): + """Send a 'topic' message""" + self.publisher_send(TopicPublisher, topic, msg) + + def fanout_send(self, topic, msg): + """Send a 'fanout' message""" + self.publisher_send(FanoutPublisher, topic, msg) + + def notify_send(self, topic, msg, **kwargs): + """Send a notify message on a topic""" + self.publisher_send(NotifyPublisher, topic, msg) + + def consume(self, limit=None): + """Consume from all queues/consumers""" + it = self.iterconsume(limit=limit) + while True: + try: + it.next() + except StopIteration: + return + + def consume_in_thread(self): + """Consumer from all queues/consumers in a greenthread""" + def _consumer_thread(): + try: + self.consume() + except greenlet.GreenletExit: + return + if self.consumer_thread is None: + self.consumer_thread = eventlet.spawn(_consumer_thread) + return self.consumer_thread + + def create_consumer(self, topic, proxy, fanout=False): + """Create a consumer that calls a method in a proxy object""" + proxy_cb = rpc_amqp.ProxyCallback(self.conf, proxy, + rpc_amqp.get_connection_pool(self, Connection)) + + if fanout: + consumer = FanoutConsumer(self.conf, self.session, topic, proxy_cb) + else: + consumer = TopicConsumer(self.conf, self.session, topic, proxy_cb) + + self._register_consumer(consumer) + + return consumer + + +def create_connection(conf, new=True): + """Create a connection""" + return rpc_amqp.create_connection(conf, new, + rpc_amqp.get_connection_pool(conf, Connection)) + + +def multicall(conf, context, topic, msg, timeout=None): + """Make a call that returns multiple times.""" + return rpc_amqp.multicall(conf, context, topic, msg, timeout, + rpc_amqp.get_connection_pool(conf, Connection)) + + +def call(conf, context, topic, msg, timeout=None): + """Sends a message on a topic and wait for a response.""" + return rpc_amqp.call(conf, context, topic, msg, timeout, + rpc_amqp.get_connection_pool(conf, Connection)) + + +def cast(conf, context, topic, msg): + """Sends a message on a topic without waiting for a response.""" + return rpc_amqp.cast(conf, context, topic, msg, + rpc_amqp.get_connection_pool(conf, Connection)) + + +def fanout_cast(conf, context, topic, msg): + """Sends a message on a fanout exchange without waiting for a response.""" + return rpc_amqp.fanout_cast(conf, context, topic, msg, + rpc_amqp.get_connection_pool(conf, Connection)) + + +def cast_to_server(conf, context, server_params, topic, msg): + """Sends a message on a topic to a specific server.""" + return rpc_amqp.cast_to_server(conf, context, server_params, topic, msg, + rpc_amqp.get_connection_pool(conf, Connection)) + + +def fanout_cast_to_server(conf, context, server_params, topic, msg): + """Sends a message on a fanout exchange to a specific server.""" + return rpc_amqp.fanout_cast_to_server(conf, context, server_params, topic, + msg, rpc_amqp.get_connection_pool(conf, Connection)) + + +def notify(conf, context, topic, msg): + """Sends a notification event on a topic.""" + return rpc_amqp.notify(conf, context, topic, msg, + rpc_amqp.get_connection_pool(conf, Connection)) + + +def cleanup(): + return rpc_amqp.cleanup(Connection.pool) + + +def register_opts(conf): + conf.register_opts(qpid_opts) diff --git a/cinder/scheduler/__init__.py b/cinder/scheduler/__init__.py new file mode 100644 index 000000000..ecc937ab1 --- /dev/null +++ b/cinder/scheduler/__init__.py @@ -0,0 +1,27 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2010 OpenStack, LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +""" +:mod:`cinder.scheduler` -- Scheduler Nodes +===================================================== + +.. automodule:: cinder.scheduler + :platform: Unix + :synopsis: Module that picks a compute node to run a VM instance. +.. moduleauthor:: Sandy Walsh <sandy.walsh@rackspace.com> +.. moduleauthor:: Ed Leafe <ed@leafe.com> +.. moduleauthor:: Chris Behrens <cbehrens@codestud.com> +""" diff --git a/cinder/scheduler/api.py b/cinder/scheduler/api.py new file mode 100644 index 000000000..c7065c5cc --- /dev/null +++ b/cinder/scheduler/api.py @@ -0,0 +1,72 @@ +# Copyright (c) 2011 OpenStack, LLC. +# 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. + +""" +Handles all requests relating to schedulers. +""" + +from cinder import flags +from cinder import log as logging +from cinder import rpc + +FLAGS = flags.FLAGS +LOG = logging.getLogger(__name__) + + +def _call_scheduler(method, context, params=None): + """Generic handler for RPC calls to the scheduler. + + :param params: Optional dictionary of arguments to be passed to the + scheduler worker + + :retval: Result returned by scheduler worker + """ + if not params: + params = {} + queue = FLAGS.scheduler_topic + kwargs = {'method': method, 'args': params} + return rpc.call(context, queue, kwargs) + + +def get_host_list(context): + """Return a list of hosts associated with this zone.""" + return _call_scheduler('get_host_list', context) + + +def get_service_capabilities(context): + """Return aggregated capabilities for all services.""" + return _call_scheduler('get_service_capabilities', context) + + +def update_service_capabilities(context, service_name, host, capabilities): + """Send an update to all the scheduler services informing them + of the capabilities of this service.""" + kwargs = dict(method='update_service_capabilities', + args=dict(service_name=service_name, host=host, + capabilities=capabilities)) + return rpc.fanout_cast(context, 'scheduler', kwargs) + + +def live_migration(context, block_migration, disk_over_commit, + instance_id, dest, topic): + """Migrate a server to a new host""" + params = {"instance_id": instance_id, + "dest": dest, + "topic": topic, + "block_migration": block_migration, + "disk_over_commit": disk_over_commit} + # NOTE(comstud): Call vs cast so we can get exceptions back, otherwise + # this call in the scheduler driver doesn't return anything. + _call_scheduler("live_migration", context=context, params=params) diff --git a/cinder/scheduler/chance.py b/cinder/scheduler/chance.py new file mode 100644 index 000000000..064c44a91 --- /dev/null +++ b/cinder/scheduler/chance.py @@ -0,0 +1,83 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2010 OpenStack, LLC. +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +""" +Chance (Random) Scheduler implementation +""" + +import random + +from cinder import exception +from cinder.scheduler import driver + + +class ChanceScheduler(driver.Scheduler): + """Implements Scheduler as a random node selector.""" + + def _filter_hosts(self, request_spec, hosts, **kwargs): + """Filter a list of hosts based on request_spec.""" + + filter_properties = kwargs.get('filter_properties', {}) + ignore_hosts = filter_properties.get('ignore_hosts', []) + hosts = [host for host in hosts if host not in ignore_hosts] + return hosts + + def _schedule(self, context, topic, request_spec, **kwargs): + """Picks a host that is up at random.""" + + elevated = context.elevated() + hosts = self.hosts_up(elevated, topic) + if not hosts: + msg = _("Is the appropriate service running?") + raise exception.NoValidHost(reason=msg) + + hosts = self._filter_hosts(request_spec, hosts, **kwargs) + if not hosts: + msg = _("Could not find another compute") + raise exception.NoValidHost(reason=msg) + + return hosts[int(random.random() * len(hosts))] + + def schedule(self, context, topic, method, *_args, **kwargs): + """Picks a host that is up at random.""" + + host = self._schedule(context, topic, None, **kwargs) + driver.cast_to_host(context, topic, host, method, **kwargs) + + def schedule_run_instance(self, context, request_spec, *_args, **kwargs): + """Create and run an instance or instances""" + num_instances = request_spec.get('num_instances', 1) + instances = [] + for num in xrange(num_instances): + host = self._schedule(context, 'compute', request_spec, **kwargs) + request_spec['instance_properties']['launch_index'] = num + instance = self.create_instance_db_entry(context, request_spec) + driver.cast_to_compute_host(context, host, + 'run_instance', instance_uuid=instance['uuid'], **kwargs) + instances.append(driver.encode_instance(instance)) + # So if we loop around, create_instance_db_entry will actually + # create a new entry, instead of assume it's been created + # already + del request_spec['instance_properties']['uuid'] + return instances + + def schedule_prep_resize(self, context, request_spec, *args, **kwargs): + """Select a target for resize.""" + host = self._schedule(context, 'compute', request_spec, **kwargs) + driver.cast_to_compute_host(context, host, 'prep_resize', **kwargs) diff --git a/cinder/scheduler/driver.py b/cinder/scheduler/driver.py new file mode 100644 index 000000000..d84893ee6 --- /dev/null +++ b/cinder/scheduler/driver.py @@ -0,0 +1,164 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2010 OpenStack, LLC. +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +""" +Scheduler base class that all Schedulers should inherit from +""" + +from cinder import db +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder.openstack.common import importutils +from cinder import rpc +from cinder.rpc import common as rpc_common +from cinder import utils + + +LOG = logging.getLogger(__name__) + +scheduler_driver_opts = [ + cfg.StrOpt('scheduler_host_manager', + default='cinder.scheduler.host_manager.HostManager', + help='The scheduler host manager class to use'), + ] + +FLAGS = flags.FLAGS +FLAGS.register_opts(scheduler_driver_opts) + + +def cast_to_volume_host(context, host, method, update_db=True, **kwargs): + """Cast request to a volume host queue""" + + if update_db: + volume_id = kwargs.get('volume_id', None) + if volume_id is not None: + now = utils.utcnow() + db.volume_update(context, volume_id, + {'host': host, 'scheduled_at': now}) + rpc.cast(context, + db.queue_get_for(context, 'volume', host), + {"method": method, "args": kwargs}) + LOG.debug(_("Casted '%(method)s' to volume '%(host)s'") % locals()) + + +def cast_to_host(context, topic, host, method, update_db=True, **kwargs): + """Generic cast to host""" + + topic_mapping = { + "volume": cast_to_volume_host} + + func = topic_mapping.get(topic) + if func: + func(context, host, method, update_db=update_db, **kwargs) + else: + rpc.cast(context, + db.queue_get_for(context, topic, host), + {"method": method, "args": kwargs}) + LOG.debug(_("Casted '%(method)s' to %(topic)s '%(host)s'") + % locals()) + + +def encode_instance(instance, local=True): + """Encode locally created instance for return via RPC""" + # TODO(comstud): I would love to be able to return the full + # instance information here, but we'll need some modifications + # to the RPC code to handle datetime conversions with the + # json encoding/decoding. We should be able to set a default + # json handler somehow to do it. + # + # For now, I'll just return the instance ID and let the caller + # do a DB lookup :-/ + if local: + return dict(id=instance['id'], _is_precooked=False) + else: + inst = dict(instance) + inst['_is_precooked'] = True + return inst + + +class Scheduler(object): + """The base class that all Scheduler classes should inherit from.""" + + def __init__(self): + self.host_manager = importutils.import_object( + FLAGS.scheduler_host_manager) + + def get_host_list(self): + """Get a list of hosts from the HostManager.""" + return self.host_manager.get_host_list() + + def get_service_capabilities(self): + """Get the normalized set of capabilities for the services. + """ + return self.host_manager.get_service_capabilities() + + def update_service_capabilities(self, service_name, host, capabilities): + """Process a capability update from a service node.""" + self.host_manager.update_service_capabilities(service_name, + host, capabilities) + + def hosts_up(self, context, topic): + """Return the list of hosts that have a running service for topic.""" + + services = db.service_get_all_by_topic(context, topic) + return [service['host'] + for service in services + if utils.service_is_up(service)] + + def schedule(self, context, topic, method, *_args, **_kwargs): + """Must override schedule method for scheduler to work.""" + raise NotImplementedError(_("Must implement a fallback schedule")) + + def schedule_prep_resize(self, context, request_spec, *_args, **_kwargs): + """Must override schedule_prep_resize method for scheduler to work.""" + msg = _("Driver must implement schedule_prep_resize") + raise NotImplementedError(msg) + + def mounted_on_same_shared_storage(self, context, instance_ref, dest): + """Check if the src and dest host mount same shared storage. + + At first, dest host creates temp file, and src host can see + it if they mounts same shared storage. Then src host erase it. + + :param context: security context + :param instance_ref: cinder.db.sqlalchemy.models.Instance object + :param dest: destination host + + """ + + src = instance_ref['host'] + dst_t = db.queue_get_for(context, FLAGS.compute_topic, dest) + src_t = db.queue_get_for(context, FLAGS.compute_topic, src) + + filename = rpc.call(context, dst_t, + {"method": 'create_shared_storage_test_file'}) + + try: + # make sure existence at src host. + ret = rpc.call(context, src_t, + {"method": 'check_shared_storage_test_file', + "args": {'filename': filename}}) + + finally: + rpc.cast(context, dst_t, + {"method": 'cleanup_shared_storage_test_file', + "args": {'filename': filename}}) + + return ret diff --git a/cinder/scheduler/host_manager.py b/cinder/scheduler/host_manager.py new file mode 100644 index 000000000..99632bc86 --- /dev/null +++ b/cinder/scheduler/host_manager.py @@ -0,0 +1,36 @@ +# Copyright (c) 2011 OpenStack, LLC. +# 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. + +""" +Manage hosts in the current zone. +""" + +# FIXME(ja): this code was written only for compute. re-implement for volumes + + +class HostState(object): + pass + + +class HostManager(object): + + def get_host_list(self, *args): + pass + + def update_service_capabilities(self, *args): + pass + + def get_service_capabilities(self, *args): + pass diff --git a/cinder/scheduler/manager.py b/cinder/scheduler/manager.py new file mode 100644 index 000000000..35e73db46 --- /dev/null +++ b/cinder/scheduler/manager.py @@ -0,0 +1,204 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2010 OpenStack, LLC. +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +""" +Scheduler Service +""" + +import functools + +from cinder import db +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder import manager +from cinder.notifier import api as notifier +from cinder.openstack.common import cfg +from cinder.openstack.common import importutils +from cinder import utils + + +LOG = logging.getLogger(__name__) + +scheduler_driver_opt = cfg.StrOpt('scheduler_driver', + default='cinder.scheduler.simple.SimpleScheduler', + help='Default driver to use for the scheduler') + +FLAGS = flags.FLAGS +FLAGS.register_opt(scheduler_driver_opt) + + +class SchedulerManager(manager.Manager): + """Chooses a host to run instances on.""" + + def __init__(self, scheduler_driver=None, *args, **kwargs): + if not scheduler_driver: + scheduler_driver = FLAGS.scheduler_driver + self.driver = importutils.import_object(scheduler_driver) + super(SchedulerManager, self).__init__(*args, **kwargs) + + def __getattr__(self, key): + """Converts all method calls to use the schedule method""" + return functools.partial(self._schedule, key) + + def get_host_list(self, context): + """Get a list of hosts from the HostManager.""" + return self.driver.get_host_list() + + def get_service_capabilities(self, context): + """Get the normalized set of capabilities for this zone.""" + return self.driver.get_service_capabilities() + + def update_service_capabilities(self, context, service_name=None, + host=None, capabilities=None, **kwargs): + """Process a capability update from a service node.""" + if capabilities is None: + capabilities = {} + self.driver.update_service_capabilities(service_name, host, + capabilities) + + def _schedule(self, method, context, topic, *args, **kwargs): + """Tries to call schedule_* method on the driver to retrieve host. + Falls back to schedule(context, topic) if method doesn't exist. + """ + driver_method_name = 'schedule_%s' % method + try: + driver_method = getattr(self.driver, driver_method_name) + args = (context,) + args + except AttributeError, e: + LOG.warning(_("Driver Method %(driver_method_name)s missing: " + "%(e)s. Reverting to schedule()") % locals()) + driver_method = self.driver.schedule + args = (context, topic, method) + args + + # Scheduler methods are responsible for casting. + try: + return driver_method(*args, **kwargs) + except Exception as ex: + with utils.save_and_reraise_exception(): + self._set_vm_state_and_notify(method, + {'vm_state': vm_states.ERROR}, + context, ex, *args, **kwargs) + + def run_instance(self, context, topic, *args, **kwargs): + """Tries to call schedule_run_instance on the driver. + Sets instance vm_state to ERROR on exceptions + """ + args = (context,) + args + try: + return self.driver.schedule_run_instance(*args, **kwargs) + except exception.NoValidHost as ex: + # don't reraise + self._set_vm_state_and_notify('run_instance', + {'vm_state': vm_states.ERROR}, + context, ex, *args, **kwargs) + except Exception as ex: + with utils.save_and_reraise_exception(): + self._set_vm_state_and_notify('run_instance', + {'vm_state': vm_states.ERROR}, + context, ex, *args, **kwargs) + + def prep_resize(self, context, topic, *args, **kwargs): + """Tries to call schedule_prep_resize on the driver. + Sets instance vm_state to ACTIVE on NoHostFound + Sets vm_state to ERROR on other exceptions + """ + args = (context,) + args + try: + return self.driver.schedule_prep_resize(*args, **kwargs) + except exception.NoValidHost as ex: + self._set_vm_state_and_notify('prep_resize', + {'vm_state': vm_states.ACTIVE, + 'task_state': None}, + context, ex, *args, **kwargs) + except Exception as ex: + with utils.save_and_reraise_exception(): + self._set_vm_state_and_notify('prep_resize', + {'vm_state': vm_states.ERROR}, + context, ex, *args, **kwargs) + + def _set_vm_state_and_notify(self, method, updates, context, ex, + *args, **kwargs): + """changes VM state and notifies""" + # FIXME(comstud): Re-factor this somehow. Not sure this belongs in the + # scheduler manager like this. We should make this easier. + # run_instance only sends a request_spec, and an instance may or may + # not have been created in the API (or scheduler) already. If it was + # created, there's a 'uuid' set in the instance_properties of the + # request_spec. + # (littleidea): I refactored this a bit, and I agree + # it should be easier :) + # The refactoring could go further but trying to minimize changes + # for essex timeframe + + LOG.warning(_("Failed to schedule_%(method)s: %(ex)s") % locals()) + + vm_state = updates['vm_state'] + request_spec = kwargs.get('request_spec', {}) + properties = request_spec.get('instance_properties', {}) + instance_uuid = properties.get('uuid', {}) + + if instance_uuid: + state = vm_state.upper() + LOG.warning(_('Setting instance to %(state)s state.'), locals(), + instance_uuid=instance_uuid) + db.instance_update(context, instance_uuid, updates) + + payload = dict(request_spec=request_spec, + instance_properties=properties, + instance_id=instance_uuid, + state=vm_state, + method=method, + reason=ex) + + notifier.notify(notifier.publisher_id("scheduler"), + 'scheduler.' + method, notifier.ERROR, payload) + + # NOTE (masumotok) : This method should be moved to cinder.api.ec2.admin. + # Based on bexar design summit discussion, + # just put this here for bexar release. + def show_host_resources(self, context, host): + """Shows the physical/usage resource given by hosts. + + :param context: security context + :param host: hostname + :returns: + example format is below:: + + {'resource':D, 'usage':{proj_id1:D, proj_id2:D}} + D: {'vcpus': 3, 'memory_mb': 2048, 'local_gb': 2048, + 'vcpus_used': 12, 'memory_mb_used': 10240, + 'local_gb_used': 64} + + """ + # Getting compute node info and related instances info + compute_ref = db.service_get_all_compute_by_host(context, host) + compute_ref = compute_ref[0] + + # Getting total available/used resource + compute_ref = compute_ref['compute_node'][0] + resource = {'vcpus': compute_ref['vcpus'], + 'memory_mb': compute_ref['memory_mb'], + 'local_gb': compute_ref['local_gb'], + 'vcpus_used': compute_ref['vcpus_used'], + 'memory_mb_used': compute_ref['memory_mb_used'], + 'local_gb_used': compute_ref['local_gb_used']} + usage = dict() + + return {'resource': resource, 'usage': usage} diff --git a/cinder/scheduler/simple.py b/cinder/scheduler/simple.py new file mode 100644 index 000000000..8849696f3 --- /dev/null +++ b/cinder/scheduler/simple.py @@ -0,0 +1,144 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2010 OpenStack, LLC. +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +""" +Simple Scheduler +""" + +from cinder import db +from cinder import exception +from cinder import flags +from cinder.openstack.common import cfg +from cinder.scheduler import chance +from cinder.scheduler import driver +from cinder import utils + + +simple_scheduler_opts = [ + cfg.IntOpt("max_cores", + default=16, + help="maximum number of instance cores to allow per host"), + cfg.IntOpt("max_gigabytes", + default=10000, + help="maximum number of volume gigabytes to allow per host"), + cfg.IntOpt("max_networks", + default=1000, + help="maximum number of networks to allow per host"), + cfg.BoolOpt('skip_isolated_core_check', + default=True, + help='Allow overcommitting vcpus on isolated hosts'), + ] + +FLAGS = flags.FLAGS +FLAGS.register_opts(simple_scheduler_opts) + + +class SimpleScheduler(chance.ChanceScheduler): + """Implements Naive Scheduler that tries to find least loaded host.""" + + def _schedule_instance(self, context, instance_opts, *_args, **_kwargs): + """Picks a host that is up and has the fewest running instances.""" + elevated = context.elevated() + + availability_zone = instance_opts.get('availability_zone') + + zone, host = FLAGS.default_schedule_zone, None + if availability_zone: + zone, _x, host = availability_zone.partition(':') + + if host and context.is_admin: + service = db.service_get_by_args(elevated, host, 'cinder-compute') + if not utils.service_is_up(service): + raise exception.WillNotSchedule(host=host) + return host + + results = db.service_get_all_compute_sorted(elevated) + in_isolation = instance_opts['image_ref'] in FLAGS.isolated_images + check_cores = not in_isolation or not FLAGS.skip_isolated_core_check + if zone: + results = [(service, cores) for (service, cores) in results + if service['availability_zone'] == zone] + for result in results: + (service, instance_cores) = result + if in_isolation and service['host'] not in FLAGS.isolated_hosts: + # isloated images run on isolated hosts + continue + if service['host'] in FLAGS.isolated_hosts and not in_isolation: + # images that aren't isolated only run on general hosts + continue + if (check_cores and + instance_cores + instance_opts['vcpus'] > FLAGS.max_cores): + msg = _("Not enough allocatable CPU cores remaining") + raise exception.NoValidHost(reason=msg) + if utils.service_is_up(service) and not service['disabled']: + return service['host'] + msg = _("Is the appropriate service running?") + raise exception.NoValidHost(reason=msg) + + def schedule_run_instance(self, context, request_spec, *_args, **_kwargs): + num_instances = request_spec.get('num_instances', 1) + instances = [] + for num in xrange(num_instances): + host = self._schedule_instance(context, + request_spec['instance_properties'], *_args, **_kwargs) + request_spec['instance_properties']['launch_index'] = num + instance_ref = self.create_instance_db_entry(context, + request_spec) + driver.cast_to_compute_host(context, host, 'run_instance', + instance_uuid=instance_ref['uuid'], **_kwargs) + instances.append(driver.encode_instance(instance_ref)) + # So if we loop around, create_instance_db_entry will actually + # create a new entry, instead of assume it's been created + # already + del request_spec['instance_properties']['uuid'] + return instances + + def schedule_create_volume(self, context, volume_id, *_args, **_kwargs): + """Picks a host that is up and has the fewest volumes.""" + elevated = context.elevated() + + volume_ref = db.volume_get(context, volume_id) + availability_zone = volume_ref.get('availability_zone') + + zone, host = None, None + if availability_zone: + zone, _x, host = availability_zone.partition(':') + if host and context.is_admin: + service = db.service_get_by_args(elevated, host, 'cinder-volume') + if not utils.service_is_up(service): + raise exception.WillNotSchedule(host=host) + driver.cast_to_volume_host(context, host, 'create_volume', + volume_id=volume_id, **_kwargs) + return None + + results = db.service_get_all_volume_sorted(elevated) + if zone: + results = [(service, gigs) for (service, gigs) in results + if service['availability_zone'] == zone] + for result in results: + (service, volume_gigabytes) = result + if volume_gigabytes + volume_ref['size'] > FLAGS.max_gigabytes: + msg = _("Not enough allocatable volume gigabytes remaining") + raise exception.NoValidHost(reason=msg) + if utils.service_is_up(service) and not service['disabled']: + driver.cast_to_volume_host(context, service['host'], + 'create_volume', volume_id=volume_id, **_kwargs) + return None + msg = _("Is the appropriate service running?") + raise exception.NoValidHost(reason=msg) diff --git a/cinder/service.py b/cinder/service.py new file mode 100644 index 000000000..363b3d967 --- /dev/null +++ b/cinder/service.py @@ -0,0 +1,429 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# Copyright 2011 Justin Santa Barbara +# 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. + +"""Generic Node base class for all workers that run on hosts.""" + +import inspect +import os +import random +import signal + +import eventlet +import greenlet + +from cinder import context +from cinder import db +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder.openstack.common import importutils +from cinder import rpc +from cinder import utils +from cinder import version +from cinder import wsgi + + +LOG = logging.getLogger(__name__) + +service_opts = [ + cfg.IntOpt('report_interval', + default=10, + help='seconds between nodes reporting state to datastore'), + cfg.IntOpt('periodic_interval', + default=60, + help='seconds between running periodic tasks'), + cfg.IntOpt('periodic_fuzzy_delay', + default=60, + help='range of seconds to randomly delay when starting the' + ' periodic task scheduler to reduce stampeding.' + ' (Disable by setting to 0)'), + cfg.StrOpt('osapi_volume_listen', + default="0.0.0.0", + help='IP address for OpenStack Volume API to listen'), + cfg.IntOpt('osapi_volume_listen_port', + default=8776, + help='port for os volume api to listen'), + ] + +FLAGS = flags.FLAGS +FLAGS.register_opts(service_opts) + + +class Launcher(object): + """Launch one or more services and wait for them to complete.""" + + def __init__(self): + """Initialize the service launcher. + + :returns: None + + """ + self._services = [] + + @staticmethod + def run_server(server): + """Start and wait for a server to finish. + + :param service: Server to run and wait for. + :returns: None + + """ + server.start() + server.wait() + + def launch_server(self, server): + """Load and start the given server. + + :param server: The server you would like to start. + :returns: None + + """ + gt = eventlet.spawn(self.run_server, server) + self._services.append(gt) + + def stop(self): + """Stop all services which are currently running. + + :returns: None + + """ + for service in self._services: + service.kill() + + def wait(self): + """Waits until all services have been stopped, and then returns. + + :returns: None + + """ + def sigterm(sig, frame): + LOG.audit(_("SIGTERM received")) + # NOTE(jk0): Raise a ^C which is caught by the caller and cleanly + # shuts down the service. This does not yet handle eventlet + # threads. + raise KeyboardInterrupt + + signal.signal(signal.SIGTERM, sigterm) + + for service in self._services: + try: + service.wait() + except greenlet.GreenletExit: + pass + + +class Service(object): + """Service object for binaries running on hosts. + + A service takes a manager and enables rpc by listening to queues based + on topic. It also periodically runs tasks on the manager and reports + it state to the database services table.""" + + def __init__(self, host, binary, topic, manager, report_interval=None, + periodic_interval=None, periodic_fuzzy_delay=None, + *args, **kwargs): + self.host = host + self.binary = binary + self.topic = topic + self.manager_class_name = manager + manager_class = importutils.import_class(self.manager_class_name) + self.manager = manager_class(host=self.host, *args, **kwargs) + self.report_interval = report_interval + self.periodic_interval = periodic_interval + self.periodic_fuzzy_delay = periodic_fuzzy_delay + super(Service, self).__init__(*args, **kwargs) + self.saved_args, self.saved_kwargs = args, kwargs + self.timers = [] + + def start(self): + vcs_string = version.version_string_with_vcs() + LOG.audit(_('Starting %(topic)s node (version %(vcs_string)s)'), + {'topic': self.topic, 'vcs_string': vcs_string}) + utils.cleanup_file_locks() + rpc.register_opts(FLAGS) + self.manager.init_host() + self.model_disconnected = False + ctxt = context.get_admin_context() + try: + service_ref = db.service_get_by_args(ctxt, + self.host, + self.binary) + self.service_id = service_ref['id'] + except exception.NotFound: + self._create_service_ref(ctxt) + + if 'cinder-compute' == self.binary: + self.manager.update_available_resource(ctxt) + + self.conn = rpc.create_connection(new=True) + LOG.debug(_("Creating Consumer connection for Service %s") % + self.topic) + + # Share this same connection for these Consumers + self.conn.create_consumer(self.topic, self, fanout=False) + + node_topic = '%s.%s' % (self.topic, self.host) + self.conn.create_consumer(node_topic, self, fanout=False) + + self.conn.create_consumer(self.topic, self, fanout=True) + + # Consume from all consumers in a thread + self.conn.consume_in_thread() + + if self.report_interval: + pulse = utils.LoopingCall(self.report_state) + pulse.start(interval=self.report_interval, + initial_delay=self.report_interval) + self.timers.append(pulse) + + if self.periodic_interval: + if self.periodic_fuzzy_delay: + initial_delay = random.randint(0, self.periodic_fuzzy_delay) + else: + initial_delay = None + + periodic = utils.LoopingCall(self.periodic_tasks) + periodic.start(interval=self.periodic_interval, + initial_delay=initial_delay) + self.timers.append(periodic) + + def _create_service_ref(self, context): + zone = FLAGS.node_availability_zone + service_ref = db.service_create(context, + {'host': self.host, + 'binary': self.binary, + 'topic': self.topic, + 'report_count': 0, + 'availability_zone': zone}) + self.service_id = service_ref['id'] + + def __getattr__(self, key): + manager = self.__dict__.get('manager', None) + return getattr(manager, key) + + @classmethod + def create(cls, host=None, binary=None, topic=None, manager=None, + report_interval=None, periodic_interval=None, + periodic_fuzzy_delay=None): + """Instantiates class and passes back application object. + + :param host: defaults to FLAGS.host + :param binary: defaults to basename of executable + :param topic: defaults to bin_name - 'cinder-' part + :param manager: defaults to FLAGS.<topic>_manager + :param report_interval: defaults to FLAGS.report_interval + :param periodic_interval: defaults to FLAGS.periodic_interval + :param periodic_fuzzy_delay: defaults to FLAGS.periodic_fuzzy_delay + + """ + if not host: + host = FLAGS.host + if not binary: + binary = os.path.basename(inspect.stack()[-1][1]) + if not topic: + topic = binary.rpartition('cinder-')[2] + if not manager: + manager = FLAGS.get('%s_manager' % topic, None) + if report_interval is None: + report_interval = FLAGS.report_interval + if periodic_interval is None: + periodic_interval = FLAGS.periodic_interval + if periodic_fuzzy_delay is None: + periodic_fuzzy_delay = FLAGS.periodic_fuzzy_delay + service_obj = cls(host, binary, topic, manager, + report_interval=report_interval, + periodic_interval=periodic_interval, + periodic_fuzzy_delay=periodic_fuzzy_delay) + + return service_obj + + def kill(self): + """Destroy the service object in the datastore.""" + self.stop() + try: + db.service_destroy(context.get_admin_context(), self.service_id) + except exception.NotFound: + LOG.warn(_('Service killed that has no database entry')) + + def stop(self): + # Try to shut the connection down, but if we get any sort of + # errors, go ahead and ignore them.. as we're shutting down anyway + try: + self.conn.close() + except Exception: + pass + for x in self.timers: + try: + x.stop() + except Exception: + pass + self.timers = [] + + def wait(self): + for x in self.timers: + try: + x.wait() + except Exception: + pass + + def periodic_tasks(self, raise_on_error=False): + """Tasks to be run at a periodic interval.""" + ctxt = context.get_admin_context() + self.manager.periodic_tasks(ctxt, raise_on_error=raise_on_error) + + def report_state(self): + """Update the state of this service in the datastore.""" + ctxt = context.get_admin_context() + zone = FLAGS.node_availability_zone + state_catalog = {} + try: + try: + service_ref = db.service_get(ctxt, self.service_id) + except exception.NotFound: + LOG.debug(_('The service database object disappeared, ' + 'Recreating it.')) + self._create_service_ref(ctxt) + service_ref = db.service_get(ctxt, self.service_id) + + state_catalog['report_count'] = service_ref['report_count'] + 1 + if zone != service_ref['availability_zone']: + state_catalog['availability_zone'] = zone + + db.service_update(ctxt, + self.service_id, state_catalog) + + # TODO(termie): make this pattern be more elegant. + if getattr(self, 'model_disconnected', False): + self.model_disconnected = False + LOG.error(_('Recovered model server connection!')) + + # TODO(vish): this should probably only catch connection errors + except Exception: # pylint: disable=W0702 + if not getattr(self, 'model_disconnected', False): + self.model_disconnected = True + LOG.exception(_('model server went away')) + + +class WSGIService(object): + """Provides ability to launch API from a 'paste' configuration.""" + + def __init__(self, name, loader=None): + """Initialize, but do not start the WSGI server. + + :param name: The name of the WSGI server given to the loader. + :param loader: Loads the WSGI application using the given name. + :returns: None + + """ + self.name = name + self.manager = self._get_manager() + self.loader = loader or wsgi.Loader() + self.app = self.loader.load_app(name) + self.host = getattr(FLAGS, '%s_listen' % name, "0.0.0.0") + self.port = getattr(FLAGS, '%s_listen_port' % name, 0) + self.server = wsgi.Server(name, + self.app, + host=self.host, + port=self.port) + + def _get_manager(self): + """Initialize a Manager object appropriate for this service. + + Use the service name to look up a Manager subclass from the + configuration and initialize an instance. If no class name + is configured, just return None. + + :returns: a Manager instance, or None. + + """ + fl = '%s_manager' % self.name + if not fl in FLAGS: + return None + + manager_class_name = FLAGS.get(fl, None) + if not manager_class_name: + return None + + manager_class = importutils.import_class(manager_class_name) + return manager_class() + + def start(self): + """Start serving this service using loaded configuration. + + Also, retrieve updated port number in case '0' was passed in, which + indicates a random port should be used. + + :returns: None + + """ + utils.cleanup_file_locks() + rpc.register_opts(FLAGS) + if self.manager: + self.manager.init_host() + self.server.start() + self.port = self.server.port + + def stop(self): + """Stop serving this API. + + :returns: None + + """ + self.server.stop() + + def wait(self): + """Wait for the service to stop serving this API. + + :returns: None + + """ + self.server.wait() + + +# NOTE(vish): the global launcher is to maintain the existing +# functionality of calling service.serve + +# service.wait +_launcher = None + + +def serve(*servers): + global _launcher + if not _launcher: + _launcher = Launcher() + for server in servers: + _launcher.launch_server(server) + + +def wait(): + LOG.debug(_('Full set of FLAGS:')) + for flag in FLAGS: + flag_get = FLAGS.get(flag, None) + # hide flag contents from log if contains a password + # should use secret flag when switch over to openstack-common + if ("_password" in flag or "_key" in flag or + (flag == "sql_connection" and "mysql:" in flag_get)): + LOG.debug(_('%(flag)s : FLAG SET ') % locals()) + else: + LOG.debug('%(flag)s : %(flag_get)s' % locals()) + try: + _launcher.wait() + except KeyboardInterrupt: + _launcher.stop() + rpc.cleanup() diff --git a/cinder/test.py b/cinder/test.py new file mode 100644 index 000000000..434a7c6b9 --- /dev/null +++ b/cinder/test.py @@ -0,0 +1,295 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Base classes for our unit tests. + +Allows overriding of flags for use of fakes, and some black magic for +inline callbacks. + +""" + +import functools +import os +import shutil +import uuid +import unittest + +import mox +import nose.plugins.skip +import stubout + +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder import utils +from cinder import service +from cinder import tests + + +test_opts = [ + cfg.StrOpt('sqlite_clean_db', + default='clean.sqlite', + help='File name of clean sqlite db'), + cfg.BoolOpt('fake_tests', + default=True, + help='should we use everything for testing'), + ] + +FLAGS = flags.FLAGS +FLAGS.register_opts(test_opts) + +LOG = logging.getLogger(__name__) + + +class skip_test(object): + """Decorator that skips a test.""" + # TODO(tr3buchet): remember forever what comstud did here + def __init__(self, msg): + self.message = msg + + def __call__(self, func): + @functools.wraps(func) + def _skipper(*args, **kw): + """Wrapped skipper function.""" + raise nose.SkipTest(self.message) + return _skipper + + +class skip_if(object): + """Decorator that skips a test if condition is true.""" + def __init__(self, condition, msg): + self.condition = condition + self.message = msg + + def __call__(self, func): + @functools.wraps(func) + def _skipper(*args, **kw): + """Wrapped skipper function.""" + if self.condition: + raise nose.SkipTest(self.message) + func(*args, **kw) + return _skipper + + +class skip_unless(object): + """Decorator that skips a test if condition is not true.""" + def __init__(self, condition, msg): + self.condition = condition + self.message = msg + + def __call__(self, func): + @functools.wraps(func) + def _skipper(*args, **kw): + """Wrapped skipper function.""" + if not self.condition: + raise nose.SkipTest(self.message) + func(*args, **kw) + return _skipper + + +def skip_if_fake(func): + """Decorator that skips a test if running in fake mode.""" + def _skipper(*args, **kw): + """Wrapped skipper function.""" + if FLAGS.fake_tests: + raise unittest.SkipTest('Test cannot be run in fake mode') + else: + return func(*args, **kw) + return _skipper + + +class TestingException(Exception): + pass + + +class TestCase(unittest.TestCase): + """Test case base class for all unit tests.""" + + def setUp(self): + """Run before each test method to initialize test environment.""" + super(TestCase, self).setUp() + # NOTE(vish): We need a better method for creating fixtures for tests + # now that we have some required db setup for the system + # to work properly. + self.start = utils.utcnow() + tests.reset_db() + + # emulate some of the mox stuff, we can't use the metaclass + # because it screws with our generators + self.mox = mox.Mox() + self.stubs = stubout.StubOutForTesting() + self.injected = [] + self._services = [] + self._overridden_opts = [] + + def tearDown(self): + """Runs after each test method to tear down test environment.""" + try: + self.mox.UnsetStubs() + self.stubs.UnsetAll() + self.stubs.SmartUnsetAll() + self.mox.VerifyAll() + super(TestCase, self).tearDown() + finally: + # Reset any overridden flags + self.reset_flags() + + # Stop any timers + for x in self.injected: + try: + x.stop() + except AssertionError: + pass + + # Kill any services + for x in self._services: + try: + x.kill() + except Exception: + pass + + # Delete attributes that don't start with _ so they don't pin + # memory around unnecessarily for the duration of the test + # suite + for key in [k for k in self.__dict__.keys() if k[0] != '_']: + del self.__dict__[key] + + def flags(self, **kw): + """Override flag variables for a test.""" + for k, v in kw.iteritems(): + FLAGS.set_override(k, v) + self._overridden_opts.append(k) + + def reset_flags(self): + """Resets all flag variables for the test. + + Runs after each test. + + """ + for k in self._overridden_opts: + FLAGS.set_override(k, None) + self._overridden_opts = [] + + def start_service(self, name, host=None, **kwargs): + host = host and host or uuid.uuid4().hex + kwargs.setdefault('host', host) + kwargs.setdefault('binary', 'cinder-%s' % name) + svc = service.Service.create(**kwargs) + svc.start() + self._services.append(svc) + return svc + + # Useful assertions + def assertDictMatch(self, d1, d2, approx_equal=False, tolerance=0.001): + """Assert two dicts are equivalent. + + This is a 'deep' match in the sense that it handles nested + dictionaries appropriately. + + NOTE: + + If you don't care (or don't know) a given value, you can specify + the string DONTCARE as the value. This will cause that dict-item + to be skipped. + + """ + def raise_assertion(msg): + d1str = str(d1) + d2str = str(d2) + base_msg = ('Dictionaries do not match. %(msg)s d1: %(d1str)s ' + 'd2: %(d2str)s' % locals()) + raise AssertionError(base_msg) + + d1keys = set(d1.keys()) + d2keys = set(d2.keys()) + if d1keys != d2keys: + d1only = d1keys - d2keys + d2only = d2keys - d1keys + raise_assertion('Keys in d1 and not d2: %(d1only)s. ' + 'Keys in d2 and not d1: %(d2only)s' % locals()) + + for key in d1keys: + d1value = d1[key] + d2value = d2[key] + try: + error = abs(float(d1value) - float(d2value)) + within_tolerance = error <= tolerance + except (ValueError, TypeError): + # If both values aren't convertable to float, just ignore + # ValueError if arg is a str, TypeError if it's something else + # (like None) + within_tolerance = False + + if hasattr(d1value, 'keys') and hasattr(d2value, 'keys'): + self.assertDictMatch(d1value, d2value) + elif 'DONTCARE' in (d1value, d2value): + continue + elif approx_equal and within_tolerance: + continue + elif d1value != d2value: + raise_assertion("d1['%(key)s']=%(d1value)s != " + "d2['%(key)s']=%(d2value)s" % locals()) + + def assertDictListMatch(self, L1, L2, approx_equal=False, tolerance=0.001): + """Assert a list of dicts are equivalent.""" + def raise_assertion(msg): + L1str = str(L1) + L2str = str(L2) + base_msg = ('List of dictionaries do not match: %(msg)s ' + 'L1: %(L1str)s L2: %(L2str)s' % locals()) + raise AssertionError(base_msg) + + L1count = len(L1) + L2count = len(L2) + if L1count != L2count: + raise_assertion('Length mismatch: len(L1)=%(L1count)d != ' + 'len(L2)=%(L2count)d' % locals()) + + for d1, d2 in zip(L1, L2): + self.assertDictMatch(d1, d2, approx_equal=approx_equal, + tolerance=tolerance) + + def assertSubDictMatch(self, sub_dict, super_dict): + """Assert a sub_dict is subset of super_dict.""" + self.assertTrue(set(sub_dict.keys()).issubset(set(super_dict.keys()))) + for k, sub_value in sub_dict.items(): + super_value = super_dict[k] + if isinstance(sub_value, dict): + self.assertSubDictMatch(sub_value, super_value) + elif 'DONTCARE' in (sub_value, super_value): + continue + else: + self.assertEqual(sub_value, super_value) + + def assertIn(self, a, b, *args, **kwargs): + """Python < v2.7 compatibility. Assert 'a' in 'b'""" + try: + f = super(TestCase, self).assertIn + except AttributeError: + self.assertTrue(a in b, *args, **kwargs) + else: + f(a, b, *args, **kwargs) + + def assertNotIn(self, a, b, *args, **kwargs): + """Python < v2.7 compatibility. Assert 'a' NOT in 'b'""" + try: + f = super(TestCase, self).assertNotIn + except AttributeError: + self.assertFalse(a in b, *args, **kwargs) + else: + f(a, b, *args, **kwargs) diff --git a/cinder/testing/README.rst b/cinder/testing/README.rst new file mode 100644 index 000000000..3d15e5cec --- /dev/null +++ b/cinder/testing/README.rst @@ -0,0 +1,66 @@ +===================================== +OpenStack Cinder Testing Infrastructure +===================================== + +A note of clarification is in order, to help those who are new to testing in +OpenStack cinder: + +- actual unit tests are created in the "tests" directory; +- the "testing" directory is used to house the infrastructure needed to support + testing in OpenStack Cinder. + +This README file attempts to provide current and prospective contributors with +everything they need to know in order to start creating unit tests and +utilizing the convenience code provided in cinder.testing. + +Note: the content for the rest of this file will be added as the work items in +the following blueprint are completed: + https://blueprints.launchpad.net/cinder/+spec/consolidate-testing-infrastructure + + +Test Types: Unit vs. Functional vs. Integration +----------------------------------------------- + +TBD + +Writing Unit Tests +------------------ + +TBD + +Using Fakes +~~~~~~~~~~~ + +TBD + +test.TestCase +------------- +The TestCase class from cinder.test (generally imported as test) will +automatically manage self.stubs using the stubout module and self.mox +using the mox module during the setUp step. They will automatically +verify and clean up during the tearDown step. + +If using test.TestCase, calling the super class setUp is required and +calling the super class tearDown is required to be last if tearDown +is overriden. + +Writing Functional Tests +------------------------ + +TBD + +Writing Integration Tests +------------------------- + +TBD + +Tests and assertRaises +---------------------- +When asserting that a test should raise an exception, test against the +most specific exception possible. An overly broad exception type (like +Exception) can mask errors in the unit test itself. + +Example:: + + self.assertRaises(exception.InstanceNotFound, db.instance_get_by_uuid, + elevated, instance_uuid) diff --git a/cinder/testing/__init__.py b/cinder/testing/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cinder/testing/fake/__init__.py b/cinder/testing/fake/__init__.py new file mode 100644 index 000000000..5cdad4717 --- /dev/null +++ b/cinder/testing/fake/__init__.py @@ -0,0 +1 @@ +import rabbit diff --git a/cinder/testing/runner.py b/cinder/testing/runner.py new file mode 100644 index 000000000..77b7701ad --- /dev/null +++ b/cinder/testing/runner.py @@ -0,0 +1,372 @@ +#!/usr/bin/env python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +# Colorizer Code is borrowed from Twisted: +# Copyright (c) 2001-2010 Twisted Matrix Laboratories. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +"""Unittest runner for Cinder. + +To run all tests + python cinder/testing/runner.py + +To run a single test module: + python cinder/testing/runner.py test_compute + + or + + python cinder/testing/runner.py api.test_wsgi + +To run a single test: + python cinder/testing/runner.py + test_compute:ComputeTestCase.test_run_terminate + +""" + +import gettext +import heapq +import os +import unittest +import sys +import time + +import eventlet +from nose import config +from nose import core +from nose import result + +gettext.install('cinder', unicode=1) +reldir = os.path.join(os.path.dirname(__file__), '..', '..') +absdir = os.path.abspath(reldir) +sys.path.insert(0, absdir) + +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import cfg + + +class _AnsiColorizer(object): + """ + A colorizer is an object that loosely wraps around a stream, allowing + callers to write text to the stream in a particular color. + + Colorizer classes must implement C{supported()} and C{write(text, color)}. + """ + _colors = dict(black=30, red=31, green=32, yellow=33, + blue=34, magenta=35, cyan=36, white=37) + + def __init__(self, stream): + self.stream = stream + + def supported(cls, stream=sys.stdout): + """ + A class method that returns True if the current platform supports + coloring terminal output using this method. Returns False otherwise. + """ + if not stream.isatty(): + return False # auto color only on TTYs + try: + import curses + except ImportError: + return False + else: + try: + try: + return curses.tigetnum("colors") > 2 + except curses.error: + curses.setupterm() + return curses.tigetnum("colors") > 2 + except Exception: + raise + # guess false in case of error + return False + supported = classmethod(supported) + + def write(self, text, color): + """ + Write the given text to the stream in the given color. + + @param text: Text to be written to the stream. + + @param color: A string label for a color. e.g. 'red', 'white'. + """ + color = self._colors[color] + self.stream.write('\x1b[%s;1m%s\x1b[0m' % (color, text)) + + +class _Win32Colorizer(object): + """ + See _AnsiColorizer docstring. + """ + def __init__(self, stream): + import win32console as win + red, green, blue, bold = (win.FOREGROUND_RED, win.FOREGROUND_GREEN, + win.FOREGROUND_BLUE, win.FOREGROUND_INTENSITY) + self.stream = stream + self.screenBuffer = win.GetStdHandle(win.STD_OUT_HANDLE) + self._colors = { + 'normal': red | green | blue, + 'red': red | bold, + 'green': green | bold, + 'blue': blue | bold, + 'yellow': red | green | bold, + 'magenta': red | blue | bold, + 'cyan': green | blue | bold, + 'white': red | green | blue | bold + } + + def supported(cls, stream=sys.stdout): + try: + import win32console + screenBuffer = win32console.GetStdHandle( + win32console.STD_OUT_HANDLE) + except ImportError: + return False + import pywintypes + try: + screenBuffer.SetConsoleTextAttribute( + win32console.FOREGROUND_RED | + win32console.FOREGROUND_GREEN | + win32console.FOREGROUND_BLUE) + except pywintypes.error: + return False + else: + return True + supported = classmethod(supported) + + def write(self, text, color): + color = self._colors[color] + self.screenBuffer.SetConsoleTextAttribute(color) + self.stream.write(text) + self.screenBuffer.SetConsoleTextAttribute(self._colors['normal']) + + +class _NullColorizer(object): + """ + See _AnsiColorizer docstring. + """ + def __init__(self, stream): + self.stream = stream + + def supported(cls, stream=sys.stdout): + return True + supported = classmethod(supported) + + def write(self, text, color): + self.stream.write(text) + + +def get_elapsed_time_color(elapsed_time): + if elapsed_time > 1.0: + return 'red' + elif elapsed_time > 0.25: + return 'yellow' + else: + return 'green' + + +class CinderTestResult(result.TextTestResult): + def __init__(self, *args, **kw): + self.show_elapsed = kw.pop('show_elapsed') + result.TextTestResult.__init__(self, *args, **kw) + self.num_slow_tests = 5 + self.slow_tests = [] # this is a fixed-sized heap + self._last_case = None + self.colorizer = None + # NOTE(vish): reset stdout for the terminal check + stdout = sys.stdout + sys.stdout = sys.__stdout__ + for colorizer in [_Win32Colorizer, _AnsiColorizer, _NullColorizer]: + if colorizer.supported(): + self.colorizer = colorizer(self.stream) + break + sys.stdout = stdout + + # NOTE(lorinh): Initialize start_time in case a sqlalchemy-migrate + # error results in it failing to be initialized later. Otherwise, + # _handleElapsedTime will fail, causing the wrong error message to + # be outputted. + self.start_time = time.time() + + def getDescription(self, test): + return str(test) + + def _handleElapsedTime(self, test): + self.elapsed_time = time.time() - self.start_time + item = (self.elapsed_time, test) + # Record only the n-slowest tests using heap + if len(self.slow_tests) >= self.num_slow_tests: + heapq.heappushpop(self.slow_tests, item) + else: + heapq.heappush(self.slow_tests, item) + + def _writeElapsedTime(self, test): + color = get_elapsed_time_color(self.elapsed_time) + self.colorizer.write(" %.2f" % self.elapsed_time, color) + + def _writeResult(self, test, long_result, color, short_result, success): + if self.showAll: + self.colorizer.write(long_result, color) + if self.show_elapsed and success: + self._writeElapsedTime(test) + self.stream.writeln() + elif self.dots: + self.stream.write(short_result) + self.stream.flush() + + # NOTE(vish): copied from unittest with edit to add color + def addSuccess(self, test): + unittest.TestResult.addSuccess(self, test) + self._handleElapsedTime(test) + self._writeResult(test, 'OK', 'green', '.', True) + + # NOTE(vish): copied from unittest with edit to add color + def addFailure(self, test, err): + unittest.TestResult.addFailure(self, test, err) + self._handleElapsedTime(test) + self._writeResult(test, 'FAIL', 'red', 'F', False) + + # NOTE(vish): copied from nose with edit to add color + def addError(self, test, err): + """Overrides normal addError to add support for + errorClasses. If the exception is a registered class, the + error will be added to the list for that class, not errors. + """ + self._handleElapsedTime(test) + stream = getattr(self, 'stream', None) + ec, ev, tb = err + try: + exc_info = self._exc_info_to_string(err, test) + except TypeError: + # 2.3 compat + exc_info = self._exc_info_to_string(err) + for cls, (storage, label, isfail) in self.errorClasses.items(): + if result.isclass(ec) and issubclass(ec, cls): + if isfail: + test.passed = False + storage.append((test, exc_info)) + # Might get patched into a streamless result + if stream is not None: + if self.showAll: + message = [label] + detail = result._exception_detail(err[1]) + if detail: + message.append(detail) + stream.writeln(": ".join(message)) + elif self.dots: + stream.write(label[:1]) + return + self.errors.append((test, exc_info)) + test.passed = False + if stream is not None: + self._writeResult(test, 'ERROR', 'red', 'E', False) + + def startTest(self, test): + unittest.TestResult.startTest(self, test) + self.start_time = time.time() + current_case = test.test.__class__.__name__ + + if self.showAll: + if current_case != self._last_case: + self.stream.writeln(current_case) + self._last_case = current_case + + self.stream.write( + ' %s' % str(test.test._testMethodName).ljust(60)) + self.stream.flush() + + +class CinderTestRunner(core.TextTestRunner): + def __init__(self, *args, **kwargs): + self.show_elapsed = kwargs.pop('show_elapsed') + core.TextTestRunner.__init__(self, *args, **kwargs) + + def _makeResult(self): + return CinderTestResult(self.stream, + self.descriptions, + self.verbosity, + self.config, + show_elapsed=self.show_elapsed) + + def _writeSlowTests(self, result_): + # Pare out 'fast' tests + slow_tests = [item for item in result_.slow_tests + if get_elapsed_time_color(item[0]) != 'green'] + if slow_tests: + slow_total_time = sum(item[0] for item in slow_tests) + self.stream.writeln("Slowest %i tests took %.2f secs:" + % (len(slow_tests), slow_total_time)) + for elapsed_time, test in sorted(slow_tests, reverse=True): + time_str = "%.2f" % elapsed_time + self.stream.writeln(" %s %s" % (time_str.ljust(10), test)) + + def run(self, test): + result_ = core.TextTestRunner.run(self, test) + if self.show_elapsed: + self._writeSlowTests(result_) + return result_ + + +def run(): + # This is a fix to allow the --hide-elapsed flag while accepting + # arbitrary nosetest flags as well + argv = [x for x in sys.argv if x != '--hide-elapsed'] + hide_elapsed = argv != sys.argv + logging.setup() + + # If any argument looks like a test name but doesn't have "cinder.tests" in + # front of it, automatically add that so we don't have to type as much + for i, arg in enumerate(argv): + if arg.startswith('test_'): + argv[i] = 'cinder.tests.%s' % arg + + testdir = os.path.abspath(os.path.join("cinder", "tests")) + c = config.Config(stream=sys.stdout, + env=os.environ, + verbosity=3, + workingDir=testdir, + plugins=core.DefaultPluginManager()) + + runner = CinderTestRunner(stream=c.stream, + verbosity=c.verbosity, + config=c, + show_elapsed=not hide_elapsed) + sys.exit(not core.run(config=c, testRunner=runner, argv=argv)) + + +if __name__ == '__main__': + eventlet.monkey_patch() + run() diff --git a/cinder/tests/__init__.py b/cinder/tests/__init__.py new file mode 100644 index 000000000..82532bf04 --- /dev/null +++ b/cinder/tests/__init__.py @@ -0,0 +1,84 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +""" +:mod:`cinder.tests` -- Cinder Unittests +===================================================== + +.. automodule:: cinder.tests + :platform: Unix +.. moduleauthor:: Jesse Andrews <jesse@ansolabs.com> +.. moduleauthor:: Devin Carlen <devin.carlen@gmail.com> +.. moduleauthor:: Vishvananda Ishaya <vishvananda@gmail.com> +.. moduleauthor:: Joshua McKenty <joshua@cognition.ca> +.. moduleauthor:: Manish Singh <yosh@gimp.org> +.. moduleauthor:: Andy Smith <andy@anarkystic.com> +""" + +# See http://code.google.com/p/python-nose/issues/detail?id=373 +# The code below enables nosetests to work with i18n _() blocks +import __builtin__ +setattr(__builtin__, '_', lambda x: x) +import os +import shutil + +from cinder.db.sqlalchemy.session import get_engine +from cinder import flags + +FLAGS = flags.FLAGS + +_DB = None + + +def reset_db(): + if FLAGS.sql_connection == "sqlite://": + engine = get_engine() + engine.dispose() + conn = engine.connect() + conn.connection.executescript(_DB) + else: + shutil.copyfile(os.path.join(FLAGS.state_path, FLAGS.sqlite_clean_db), + os.path.join(FLAGS.state_path, FLAGS.sqlite_db)) + + +def setup(): + import mox # Fail fast if you don't have mox. Workaround for bug 810424 + + from cinder import rpc # Register rpc_backend before fake_flags sets it + FLAGS.register_opts(rpc.rpc_opts) + + from cinder.db import migration + from cinder.tests import fake_flags + + if FLAGS.sql_connection == "sqlite://": + if migration.db_version() > 1: + return + else: + testdb = os.path.join(FLAGS.state_path, FLAGS.sqlite_db) + if os.path.exists(testdb): + return + migration.db_sync() + + if FLAGS.sql_connection == "sqlite://": + global _DB + engine = get_engine() + conn = engine.connect() + _DB = "".join(line for line in conn.connection.iterdump()) + else: + cleandb = os.path.join(FLAGS.state_path, FLAGS.sqlite_clean_db) + shutil.copyfile(testdb, cleandb) diff --git a/cinder/tests/api/__init__.py b/cinder/tests/api/__init__.py new file mode 100644 index 000000000..3be5ce944 --- /dev/null +++ b/cinder/tests/api/__init__.py @@ -0,0 +1,19 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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. + +# NOTE(vish): this forces the fixtures from tests/__init.py:setup() to work +from cinder.tests import * diff --git a/cinder/tests/api/openstack/__init__.py b/cinder/tests/api/openstack/__init__.py new file mode 100644 index 000000000..3be5ce944 --- /dev/null +++ b/cinder/tests/api/openstack/__init__.py @@ -0,0 +1,19 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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. + +# NOTE(vish): this forces the fixtures from tests/__init.py:setup() to work +from cinder.tests import * diff --git a/cinder/tests/api/openstack/common.py b/cinder/tests/api/openstack/common.py new file mode 100644 index 000000000..19515ca67 --- /dev/null +++ b/cinder/tests/api/openstack/common.py @@ -0,0 +1,58 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 json + +import webob + + +def webob_factory(url): + """Factory for removing duplicate webob code from tests""" + + base_url = url + + def web_request(url, method=None, body=None): + req = webob.Request.blank("%s%s" % (base_url, url)) + if method: + req.content_type = "application/json" + req.method = method + if body: + req.body = json.dumps(body) + return req + return web_request + + +def compare_links(actual, expected): + """Compare xml atom links.""" + + return compare_tree_to_dict(actual, expected, ('rel', 'href', 'type')) + + +def compare_media_types(actual, expected): + """Compare xml media types.""" + + return compare_tree_to_dict(actual, expected, ('base', 'type')) + + +def compare_tree_to_dict(actual, expected, keys): + """Compare parts of lxml.etree objects to dicts.""" + + for elem, data in zip(actual, expected): + for key in keys: + if elem.get(key) != data.get(key): + return False + return True diff --git a/cinder/tests/api/openstack/fakes.py b/cinder/tests/api/openstack/fakes.py new file mode 100644 index 000000000..8d97fca89 --- /dev/null +++ b/cinder/tests/api/openstack/fakes.py @@ -0,0 +1,234 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC. +# 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 datetime + +import routes +import webob +import webob.dec +import webob.request + +from cinder.api import auth as api_auth +from cinder.api import openstack as openstack_api +from cinder.api.openstack import auth +from cinder.api.openstack import urlmap +from cinder.api.openstack.compute import versions +from cinder.api.openstack import wsgi as os_wsgi +from cinder import context +from cinder.db.sqlalchemy import models +from cinder import exception as exc +from cinder import utils +from cinder import wsgi + + +FAKE_UUID = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' +FAKE_UUIDS = {} + + +class Context(object): + pass + + +class FakeRouter(wsgi.Router): + def __init__(self, ext_mgr=None): + pass + + @webob.dec.wsgify + def __call__(self, req): + res = webob.Response() + res.status = '200' + res.headers['X-Test-Success'] = 'True' + return res + + +@webob.dec.wsgify +def fake_wsgi(self, req): + return self.application + + +def wsgi_app(inner_app_v2=None, fake_auth=True, fake_auth_context=None, + use_no_auth=False, ext_mgr=None): + if not inner_app_v2: + inner_app_v2 = compute.APIRouter(ext_mgr) + + if fake_auth: + if fake_auth_context is not None: + ctxt = fake_auth_context + else: + ctxt = context.RequestContext('fake', 'fake', auth_token=True) + api_v2 = openstack_api.FaultWrapper(api_auth.InjectContext(ctxt, + limits.RateLimitingMiddleware(inner_app_v2))) + elif use_no_auth: + api_v2 = openstack_api.FaultWrapper(auth.NoAuthMiddleware( + limits.RateLimitingMiddleware(inner_app_v2))) + else: + api_v2 = openstack_api.FaultWrapper(auth.AuthMiddleware( + limits.RateLimitingMiddleware(inner_app_v2))) + + mapper = urlmap.URLMap() + mapper['/v2'] = api_v2 + mapper['/v1.1'] = api_v2 + mapper['/'] = openstack_api.FaultWrapper(versions.Versions()) + return mapper + + +def stub_out_rate_limiting(stubs): + def fake_rate_init(self, app): + # super(limits.RateLimitingMiddleware, self).__init__(app) + self.application = app + + # FIXME(ja): unsure about limits in volumes + # stubs.Set(cinder.api.openstack.compute.limits.RateLimitingMiddleware, + # '__init__', fake_rate_init) + + # stubs.Set(cinder.api.openstack.compute.limits.RateLimitingMiddleware, + # '__call__', fake_wsgi) + + +class FakeToken(object): + id_count = 0 + + def __getitem__(self, key): + return getattr(self, key) + + def __init__(self, **kwargs): + FakeToken.id_count += 1 + self.id = FakeToken.id_count + for k, v in kwargs.iteritems(): + setattr(self, k, v) + + +class FakeRequestContext(context.RequestContext): + def __init__(self, *args, **kwargs): + kwargs['auth_token'] = kwargs.get('auth_token', 'fake_auth_token') + return super(FakeRequestContext, self).__init__(*args, **kwargs) + + +class HTTPRequest(webob.Request): + + @classmethod + def blank(cls, *args, **kwargs): + kwargs['base_url'] = 'http://localhost/v2' + use_admin_context = kwargs.pop('use_admin_context', False) + out = webob.Request.blank(*args, **kwargs) + out.environ['cinder.context'] = FakeRequestContext('fake_user', 'fake', + is_admin=use_admin_context) + return out + + +class TestRouter(wsgi.Router): + def __init__(self, controller): + mapper = routes.Mapper() + mapper.resource("test", "tests", + controller=os_wsgi.Resource(controller)) + super(TestRouter, self).__init__(mapper) + + +class FakeAuthDatabase(object): + data = {} + + @staticmethod + def auth_token_get(context, token_hash): + return FakeAuthDatabase.data.get(token_hash, None) + + @staticmethod + def auth_token_create(context, token): + fake_token = FakeToken(created_at=utils.utcnow(), **token) + FakeAuthDatabase.data[fake_token.token_hash] = fake_token + FakeAuthDatabase.data['id_%i' % fake_token.id] = fake_token + return fake_token + + @staticmethod + def auth_token_destroy(context, token_id): + token = FakeAuthDatabase.data.get('id_%i' % token_id) + if token and token.token_hash in FakeAuthDatabase.data: + del FakeAuthDatabase.data[token.token_hash] + del FakeAuthDatabase.data['id_%i' % token_id] + + +class FakeRateLimiter(object): + def __init__(self, application): + self.application = application + + @webob.dec.wsgify + def __call__(self, req): + return self.application + + +def get_fake_uuid(token=0): + if not token in FAKE_UUIDS: + FAKE_UUIDS[token] = str(utils.gen_uuid()) + return FAKE_UUIDS[token] + + +def stub_volume(id, **kwargs): + volume = { + 'id': id, + 'user_id': 'fakeuser', + 'project_id': 'fakeproject', + 'host': 'fakehost', + 'size': 1, + 'availability_zone': 'fakeaz', + 'instance': {'uuid': 'fakeuuid'}, + 'mountpoint': '/', + 'status': 'fakestatus', + 'attach_status': 'attached', + 'name': 'vol name', + 'display_name': 'displayname', + 'display_description': 'displaydesc', + 'created_at': datetime.datetime(1, 1, 1, 1, 1, 1), + 'snapshot_id': None, + 'volume_type_id': 'fakevoltype', + 'volume_metadata': [], + 'volume_type': {'name': 'vol_type_name'}} + + volume.update(kwargs) + return volume + + +def stub_volume_create(self, context, size, name, description, snapshot, + **param): + vol = stub_volume(1) + vol['size'] = size + vol['display_name'] = name + vol['display_description'] = description + try: + vol['snapshot_id'] = snapshot['id'] + except (KeyError, TypeError): + vol['snapshot_id'] = None + vol['availability_zone'] = param.get('availability_zone', 'fakeaz') + return vol + + +def stub_volume_update(self, context, *args, **param): + pass + + +def stub_volume_delete(self, context, *args, **param): + pass + + +def stub_volume_get(self, context, volume_id): + return stub_volume(volume_id) + + +def stub_volume_get_notfound(self, context, volume_id): + raise exc.NotFound + + +def stub_volume_get_all(self, context, search_opts=None): + return [stub_volume_get(self, context, 1)] diff --git a/cinder/tests/api/openstack/test_common.py b/cinder/tests/api/openstack/test_common.py new file mode 100644 index 000000000..22ccbd77c --- /dev/null +++ b/cinder/tests/api/openstack/test_common.py @@ -0,0 +1,526 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC. +# 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. + +""" +Test suites for 'common' code used throughout the OpenStack HTTP API. +""" + +from lxml import etree +import webob +import webob.exc +import xml.dom.minidom as minidom + +from cinder import exception +from cinder import test +from cinder.api.openstack import common +from cinder.api.openstack import xmlutil + + +NS = "{http://docs.openstack.org/compute/api/v1.1}" +ATOMNS = "{http://www.w3.org/2005/Atom}" + + +class LimiterTest(test.TestCase): + """ + Unit tests for the `cinder.api.openstack.common.limited` method which takes + in a list of items and, depending on the 'offset' and 'limit' GET params, + returns a subset or complete set of the given items. + """ + + def setUp(self): + """ Run before each test. """ + super(LimiterTest, self).setUp() + self.tiny = range(1) + self.small = range(10) + self.medium = range(1000) + self.large = range(10000) + + def test_limiter_offset_zero(self): + """ Test offset key works with 0. """ + req = webob.Request.blank('/?offset=0') + self.assertEqual(common.limited(self.tiny, req), self.tiny) + self.assertEqual(common.limited(self.small, req), self.small) + self.assertEqual(common.limited(self.medium, req), self.medium) + self.assertEqual(common.limited(self.large, req), self.large[:1000]) + + def test_limiter_offset_medium(self): + """ Test offset key works with a medium sized number. """ + req = webob.Request.blank('/?offset=10') + self.assertEqual(common.limited(self.tiny, req), []) + self.assertEqual(common.limited(self.small, req), self.small[10:]) + self.assertEqual(common.limited(self.medium, req), self.medium[10:]) + self.assertEqual(common.limited(self.large, req), self.large[10:1010]) + + def test_limiter_offset_over_max(self): + """ Test offset key works with a number over 1000 (max_limit). """ + req = webob.Request.blank('/?offset=1001') + self.assertEqual(common.limited(self.tiny, req), []) + self.assertEqual(common.limited(self.small, req), []) + self.assertEqual(common.limited(self.medium, req), []) + self.assertEqual( + common.limited(self.large, req), self.large[1001:2001]) + + def test_limiter_offset_blank(self): + """ Test offset key works with a blank offset. """ + req = webob.Request.blank('/?offset=') + self.assertRaises( + webob.exc.HTTPBadRequest, common.limited, self.tiny, req) + + def test_limiter_offset_bad(self): + """ Test offset key works with a BAD offset. """ + req = webob.Request.blank(u'/?offset=\u0020aa') + self.assertRaises( + webob.exc.HTTPBadRequest, common.limited, self.tiny, req) + + def test_limiter_nothing(self): + """ Test request with no offset or limit """ + req = webob.Request.blank('/') + self.assertEqual(common.limited(self.tiny, req), self.tiny) + self.assertEqual(common.limited(self.small, req), self.small) + self.assertEqual(common.limited(self.medium, req), self.medium) + self.assertEqual(common.limited(self.large, req), self.large[:1000]) + + def test_limiter_limit_zero(self): + """ Test limit of zero. """ + req = webob.Request.blank('/?limit=0') + self.assertEqual(common.limited(self.tiny, req), self.tiny) + self.assertEqual(common.limited(self.small, req), self.small) + self.assertEqual(common.limited(self.medium, req), self.medium) + self.assertEqual(common.limited(self.large, req), self.large[:1000]) + + def test_limiter_limit_medium(self): + """ Test limit of 10. """ + req = webob.Request.blank('/?limit=10') + self.assertEqual(common.limited(self.tiny, req), self.tiny) + self.assertEqual(common.limited(self.small, req), self.small) + self.assertEqual(common.limited(self.medium, req), self.medium[:10]) + self.assertEqual(common.limited(self.large, req), self.large[:10]) + + def test_limiter_limit_over_max(self): + """ Test limit of 3000. """ + req = webob.Request.blank('/?limit=3000') + self.assertEqual(common.limited(self.tiny, req), self.tiny) + self.assertEqual(common.limited(self.small, req), self.small) + self.assertEqual(common.limited(self.medium, req), self.medium) + self.assertEqual(common.limited(self.large, req), self.large[:1000]) + + def test_limiter_limit_and_offset(self): + """ Test request with both limit and offset. """ + items = range(2000) + req = webob.Request.blank('/?offset=1&limit=3') + self.assertEqual(common.limited(items, req), items[1:4]) + req = webob.Request.blank('/?offset=3&limit=0') + self.assertEqual(common.limited(items, req), items[3:1003]) + req = webob.Request.blank('/?offset=3&limit=1500') + self.assertEqual(common.limited(items, req), items[3:1003]) + req = webob.Request.blank('/?offset=3000&limit=10') + self.assertEqual(common.limited(items, req), []) + + def test_limiter_custom_max_limit(self): + """ Test a max_limit other than 1000. """ + items = range(2000) + req = webob.Request.blank('/?offset=1&limit=3') + self.assertEqual( + common.limited(items, req, max_limit=2000), items[1:4]) + req = webob.Request.blank('/?offset=3&limit=0') + self.assertEqual( + common.limited(items, req, max_limit=2000), items[3:]) + req = webob.Request.blank('/?offset=3&limit=2500') + self.assertEqual( + common.limited(items, req, max_limit=2000), items[3:]) + req = webob.Request.blank('/?offset=3000&limit=10') + self.assertEqual(common.limited(items, req, max_limit=2000), []) + + def test_limiter_negative_limit(self): + """ Test a negative limit. """ + req = webob.Request.blank('/?limit=-3000') + self.assertRaises( + webob.exc.HTTPBadRequest, common.limited, self.tiny, req) + + def test_limiter_negative_offset(self): + """ Test a negative offset. """ + req = webob.Request.blank('/?offset=-30') + self.assertRaises( + webob.exc.HTTPBadRequest, common.limited, self.tiny, req) + + +class PaginationParamsTest(test.TestCase): + """ + Unit tests for the `cinder.api.openstack.common.get_pagination_params` + method which takes in a request object and returns 'marker' and 'limit' + GET params. + """ + + def test_no_params(self): + """ Test no params. """ + req = webob.Request.blank('/') + self.assertEqual(common.get_pagination_params(req), {}) + + def test_valid_marker(self): + """ Test valid marker param. """ + req = webob.Request.blank( + '/?marker=263abb28-1de6-412f-b00b-f0ee0c4333c2') + self.assertEqual(common.get_pagination_params(req), + {'marker': '263abb28-1de6-412f-b00b-f0ee0c4333c2'}) + + def test_valid_limit(self): + """ Test valid limit param. """ + req = webob.Request.blank('/?limit=10') + self.assertEqual(common.get_pagination_params(req), {'limit': 10}) + + def test_invalid_limit(self): + """ Test invalid limit param. """ + req = webob.Request.blank('/?limit=-2') + self.assertRaises( + webob.exc.HTTPBadRequest, common.get_pagination_params, req) + + def test_valid_limit_and_marker(self): + """ Test valid limit and marker parameters. """ + marker = '263abb28-1de6-412f-b00b-f0ee0c4333c2' + req = webob.Request.blank('/?limit=20&marker=%s' % marker) + self.assertEqual(common.get_pagination_params(req), + {'marker': marker, 'limit': 20}) + + +class MiscFunctionsTest(test.TestCase): + + def test_remove_major_version_from_href(self): + fixture = 'http://www.testsite.com/v1/images' + expected = 'http://www.testsite.com/images' + actual = common.remove_version_from_href(fixture) + self.assertEqual(actual, expected) + + def test_remove_version_from_href(self): + fixture = 'http://www.testsite.com/v1.1/images' + expected = 'http://www.testsite.com/images' + actual = common.remove_version_from_href(fixture) + self.assertEqual(actual, expected) + + def test_remove_version_from_href_2(self): + fixture = 'http://www.testsite.com/v1.1/' + expected = 'http://www.testsite.com/' + actual = common.remove_version_from_href(fixture) + self.assertEqual(actual, expected) + + def test_remove_version_from_href_3(self): + fixture = 'http://www.testsite.com/v10.10' + expected = 'http://www.testsite.com' + actual = common.remove_version_from_href(fixture) + self.assertEqual(actual, expected) + + def test_remove_version_from_href_4(self): + fixture = 'http://www.testsite.com/v1.1/images/v10.5' + expected = 'http://www.testsite.com/images/v10.5' + actual = common.remove_version_from_href(fixture) + self.assertEqual(actual, expected) + + def test_remove_version_from_href_bad_request(self): + fixture = 'http://www.testsite.com/1.1/images' + self.assertRaises(ValueError, + common.remove_version_from_href, + fixture) + + def test_remove_version_from_href_bad_request_2(self): + fixture = 'http://www.testsite.com/v/images' + self.assertRaises(ValueError, + common.remove_version_from_href, + fixture) + + def test_remove_version_from_href_bad_request_3(self): + fixture = 'http://www.testsite.com/v1.1images' + self.assertRaises(ValueError, + common.remove_version_from_href, + fixture) + + def test_get_id_from_href_with_int_url(self): + fixture = 'http://www.testsite.com/dir/45' + actual = common.get_id_from_href(fixture) + expected = '45' + self.assertEqual(actual, expected) + + def test_get_id_from_href_with_int(self): + fixture = '45' + actual = common.get_id_from_href(fixture) + expected = '45' + self.assertEqual(actual, expected) + + def test_get_id_from_href_with_int_url_query(self): + fixture = 'http://www.testsite.com/dir/45?asdf=jkl' + actual = common.get_id_from_href(fixture) + expected = '45' + self.assertEqual(actual, expected) + + def test_get_id_from_href_with_uuid_url(self): + fixture = 'http://www.testsite.com/dir/abc123' + actual = common.get_id_from_href(fixture) + expected = "abc123" + self.assertEqual(actual, expected) + + def test_get_id_from_href_with_uuid_url_query(self): + fixture = 'http://www.testsite.com/dir/abc123?asdf=jkl' + actual = common.get_id_from_href(fixture) + expected = "abc123" + self.assertEqual(actual, expected) + + def test_get_id_from_href_with_uuid(self): + fixture = 'abc123' + actual = common.get_id_from_href(fixture) + expected = 'abc123' + self.assertEqual(actual, expected) + + def test_get_version_from_href(self): + fixture = 'http://www.testsite.com/v1.1/images' + expected = '1.1' + actual = common.get_version_from_href(fixture) + self.assertEqual(actual, expected) + + def test_get_version_from_href_2(self): + fixture = 'http://www.testsite.com/v1.1' + expected = '1.1' + actual = common.get_version_from_href(fixture) + self.assertEqual(actual, expected) + + def test_get_version_from_href_default(self): + fixture = 'http://www.testsite.com/images' + expected = '2' + actual = common.get_version_from_href(fixture) + self.assertEqual(actual, expected) + + def test_raise_http_conflict_for_instance_invalid_state(self): + # Correct args + exc = exception.InstanceInvalidState(attr='fake_attr', + state='fake_state', method='fake_method') + try: + common.raise_http_conflict_for_instance_invalid_state(exc, + 'meow') + except Exception, e: + self.assertTrue(isinstance(e, webob.exc.HTTPConflict)) + msg = str(e) + self.assertEqual(msg, + "Cannot 'meow' while instance is in fake_attr fake_state") + else: + self.fail("webob.exc.HTTPConflict was not raised") + + # Incorrect args + exc = exception.InstanceInvalidState() + try: + common.raise_http_conflict_for_instance_invalid_state(exc, + 'meow') + except Exception, e: + self.assertTrue(isinstance(e, webob.exc.HTTPConflict)) + msg = str(e) + self.assertEqual(msg, + "Instance is in an invalid state for 'meow'") + else: + self.fail("webob.exc.HTTPConflict was not raised") + + +class MetadataXMLDeserializationTest(test.TestCase): + + deserializer = common.MetadataXMLDeserializer() + + def test_create(self): + request_body = """ + <metadata xmlns="http://docs.openstack.org/compute/api/v1.1"> + <meta key='123'>asdf</meta> + <meta key='567'>jkl;</meta> + </metadata>""" + output = self.deserializer.deserialize(request_body, 'create') + expected = {"body": {"metadata": {"123": "asdf", "567": "jkl;"}}} + self.assertEquals(output, expected) + + def test_create_empty(self): + request_body = """ + <metadata xmlns="http://docs.openstack.org/compute/api/v1.1"/>""" + output = self.deserializer.deserialize(request_body, 'create') + expected = {"body": {"metadata": {}}} + self.assertEquals(output, expected) + + def test_update_all(self): + request_body = """ + <metadata xmlns="http://docs.openstack.org/compute/api/v1.1"> + <meta key='123'>asdf</meta> + <meta key='567'>jkl;</meta> + </metadata>""" + output = self.deserializer.deserialize(request_body, 'update_all') + expected = {"body": {"metadata": {"123": "asdf", "567": "jkl;"}}} + self.assertEquals(output, expected) + + def test_update(self): + request_body = """ + <meta xmlns="http://docs.openstack.org/compute/api/v1.1" + key='123'>asdf</meta>""" + output = self.deserializer.deserialize(request_body, 'update') + expected = {"body": {"meta": {"123": "asdf"}}} + self.assertEquals(output, expected) + + +class MetadataXMLSerializationTest(test.TestCase): + + def test_xml_declaration(self): + serializer = common.MetadataTemplate() + fixture = { + 'metadata': { + 'one': 'two', + 'three': 'four', + }, + } + + output = serializer.serialize(fixture) + print output + has_dec = output.startswith("<?xml version='1.0' encoding='UTF-8'?>") + self.assertTrue(has_dec) + + def test_index(self): + serializer = common.MetadataTemplate() + fixture = { + 'metadata': { + 'one': 'two', + 'three': 'four', + }, + } + output = serializer.serialize(fixture) + print output + root = etree.XML(output) + xmlutil.validate_schema(root, 'metadata') + metadata_dict = fixture['metadata'] + metadata_elems = root.findall('{0}meta'.format(NS)) + self.assertEqual(len(metadata_elems), 2) + for i, metadata_elem in enumerate(metadata_elems): + (meta_key, meta_value) = metadata_dict.items()[i] + self.assertEqual(str(metadata_elem.get('key')), str(meta_key)) + self.assertEqual(str(metadata_elem.text).strip(), str(meta_value)) + + def test_index_null(self): + serializer = common.MetadataTemplate() + fixture = { + 'metadata': { + None: None, + }, + } + output = serializer.serialize(fixture) + print output + root = etree.XML(output) + xmlutil.validate_schema(root, 'metadata') + metadata_dict = fixture['metadata'] + metadata_elems = root.findall('{0}meta'.format(NS)) + self.assertEqual(len(metadata_elems), 1) + for i, metadata_elem in enumerate(metadata_elems): + (meta_key, meta_value) = metadata_dict.items()[i] + self.assertEqual(str(metadata_elem.get('key')), str(meta_key)) + self.assertEqual(str(metadata_elem.text).strip(), str(meta_value)) + + def test_index_unicode(self): + serializer = common.MetadataTemplate() + fixture = { + 'metadata': { + u'three': u'Jos\xe9', + }, + } + output = serializer.serialize(fixture) + print output + root = etree.XML(output) + xmlutil.validate_schema(root, 'metadata') + metadata_dict = fixture['metadata'] + metadata_elems = root.findall('{0}meta'.format(NS)) + self.assertEqual(len(metadata_elems), 1) + for i, metadata_elem in enumerate(metadata_elems): + (meta_key, meta_value) = metadata_dict.items()[i] + self.assertEqual(str(metadata_elem.get('key')), str(meta_key)) + self.assertEqual(metadata_elem.text.strip(), meta_value) + + def test_show(self): + serializer = common.MetaItemTemplate() + fixture = { + 'meta': { + 'one': 'two', + }, + } + output = serializer.serialize(fixture) + print output + root = etree.XML(output) + meta_dict = fixture['meta'] + (meta_key, meta_value) = meta_dict.items()[0] + self.assertEqual(str(root.get('key')), str(meta_key)) + self.assertEqual(root.text.strip(), meta_value) + + def test_update_all(self): + serializer = common.MetadataTemplate() + fixture = { + 'metadata': { + 'key6': 'value6', + 'key4': 'value4', + }, + } + output = serializer.serialize(fixture) + print output + root = etree.XML(output) + xmlutil.validate_schema(root, 'metadata') + metadata_dict = fixture['metadata'] + metadata_elems = root.findall('{0}meta'.format(NS)) + self.assertEqual(len(metadata_elems), 2) + for i, metadata_elem in enumerate(metadata_elems): + (meta_key, meta_value) = metadata_dict.items()[i] + self.assertEqual(str(metadata_elem.get('key')), str(meta_key)) + self.assertEqual(str(metadata_elem.text).strip(), str(meta_value)) + + def test_update_item(self): + serializer = common.MetaItemTemplate() + fixture = { + 'meta': { + 'one': 'two', + }, + } + output = serializer.serialize(fixture) + print output + root = etree.XML(output) + meta_dict = fixture['meta'] + (meta_key, meta_value) = meta_dict.items()[0] + self.assertEqual(str(root.get('key')), str(meta_key)) + self.assertEqual(root.text.strip(), meta_value) + + def test_create(self): + serializer = common.MetadataTemplate() + fixture = { + 'metadata': { + 'key9': 'value9', + 'key2': 'value2', + 'key1': 'value1', + }, + } + output = serializer.serialize(fixture) + print output + root = etree.XML(output) + xmlutil.validate_schema(root, 'metadata') + metadata_dict = fixture['metadata'] + metadata_elems = root.findall('{0}meta'.format(NS)) + self.assertEqual(len(metadata_elems), 3) + for i, metadata_elem in enumerate(metadata_elems): + (meta_key, meta_value) = metadata_dict.items()[i] + self.assertEqual(str(metadata_elem.get('key')), str(meta_key)) + self.assertEqual(str(metadata_elem.text).strip(), str(meta_value)) + actual = minidom.parseString(output.replace(" ", "")) + + expected = minidom.parseString(""" + <metadata xmlns="http://docs.openstack.org/compute/api/v1.1"> + <meta key="key2">value2</meta> + <meta key="key9">value9</meta> + <meta key="key1">value1</meta> + </metadata> + """.replace(" ", "").replace("\n", "")) + + self.assertEqual(expected.toxml(), actual.toxml()) diff --git a/cinder/tests/api/openstack/test_faults.py b/cinder/tests/api/openstack/test_faults.py new file mode 100644 index 000000000..9d85a14f4 --- /dev/null +++ b/cinder/tests/api/openstack/test_faults.py @@ -0,0 +1,208 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC. +# 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 json +from xml.dom import minidom + +import webob +import webob.dec +import webob.exc + +from cinder import test +from cinder.api.openstack import common +from cinder.api.openstack import wsgi + + +class TestFaults(test.TestCase): + """Tests covering `cinder.api.openstack.faults:Fault` class.""" + + def _prepare_xml(self, xml_string): + """Remove characters from string which hinder XML equality testing.""" + xml_string = xml_string.replace(" ", "") + xml_string = xml_string.replace("\n", "") + xml_string = xml_string.replace("\t", "") + return xml_string + + def test_400_fault_json(self): + """Test fault serialized to JSON via file-extension and/or header.""" + requests = [ + webob.Request.blank('/.json'), + webob.Request.blank('/', headers={"Accept": "application/json"}), + ] + + for request in requests: + fault = wsgi.Fault(webob.exc.HTTPBadRequest(explanation='scram')) + response = request.get_response(fault) + + expected = { + "badRequest": { + "message": "scram", + "code": 400, + }, + } + actual = json.loads(response.body) + + self.assertEqual(response.content_type, "application/json") + self.assertEqual(expected, actual) + + def test_413_fault_json(self): + """Test fault serialized to JSON via file-extension and/or header.""" + requests = [ + webob.Request.blank('/.json'), + webob.Request.blank('/', headers={"Accept": "application/json"}), + ] + + for request in requests: + exc = webob.exc.HTTPRequestEntityTooLarge + fault = wsgi.Fault(exc(explanation='sorry', + headers={'Retry-After': 4})) + response = request.get_response(fault) + + expected = { + "overLimit": { + "message": "sorry", + "code": 413, + "retryAfter": 4, + }, + } + actual = json.loads(response.body) + + self.assertEqual(response.content_type, "application/json") + self.assertEqual(expected, actual) + + def test_raise(self): + """Ensure the ability to raise :class:`Fault` in WSGI-ified methods.""" + @webob.dec.wsgify + def raiser(req): + raise wsgi.Fault(webob.exc.HTTPNotFound(explanation='whut?')) + + req = webob.Request.blank('/.xml') + resp = req.get_response(raiser) + self.assertEqual(resp.content_type, "application/xml") + self.assertEqual(resp.status_int, 404) + self.assertTrue('whut?' in resp.body) + + def test_raise_403(self): + """Ensure the ability to raise :class:`Fault` in WSGI-ified methods.""" + @webob.dec.wsgify + def raiser(req): + raise wsgi.Fault(webob.exc.HTTPForbidden(explanation='whut?')) + + req = webob.Request.blank('/.xml') + resp = req.get_response(raiser) + self.assertEqual(resp.content_type, "application/xml") + self.assertEqual(resp.status_int, 403) + self.assertTrue('resizeNotAllowed' not in resp.body) + self.assertTrue('forbidden' in resp.body) + + def test_fault_has_status_int(self): + """Ensure the status_int is set correctly on faults""" + fault = wsgi.Fault(webob.exc.HTTPBadRequest(explanation='what?')) + self.assertEqual(fault.status_int, 400) + + def test_xml_serializer(self): + """Ensure that a v1.1 request responds with a v1 xmlns""" + request = webob.Request.blank('/v1', + headers={"Accept": "application/xml"}) + + fault = wsgi.Fault(webob.exc.HTTPBadRequest(explanation='scram')) + response = request.get_response(fault) + + self.assertTrue(common.XML_NS_V1 in response.body) + self.assertEqual(response.content_type, "application/xml") + self.assertEqual(response.status_int, 400) + + +class FaultsXMLSerializationTestV11(test.TestCase): + """Tests covering `cinder.api.openstack.faults:Fault` class.""" + + def _prepare_xml(self, xml_string): + xml_string = xml_string.replace(" ", "") + xml_string = xml_string.replace("\n", "") + xml_string = xml_string.replace("\t", "") + return xml_string + + def test_400_fault(self): + metadata = {'attributes': {"badRequest": 'code'}} + serializer = wsgi.XMLDictSerializer(metadata=metadata, + xmlns=common.XML_NS_V1) + + fixture = { + "badRequest": { + "message": "scram", + "code": 400, + }, + } + + output = serializer.serialize(fixture) + actual = minidom.parseString(self._prepare_xml(output)) + + expected = minidom.parseString(self._prepare_xml(""" + <badRequest code="400" xmlns="%s"> + <message>scram</message> + </badRequest> + """) % common.XML_NS_V1) + + self.assertEqual(expected.toxml(), actual.toxml()) + + def test_413_fault(self): + metadata = {'attributes': {"overLimit": 'code'}} + serializer = wsgi.XMLDictSerializer(metadata=metadata, + xmlns=common.XML_NS_V1) + + fixture = { + "overLimit": { + "message": "sorry", + "code": 413, + "retryAfter": 4, + }, + } + + output = serializer.serialize(fixture) + actual = minidom.parseString(self._prepare_xml(output)) + + expected = minidom.parseString(self._prepare_xml(""" + <overLimit code="413" xmlns="%s"> + <message>sorry</message> + <retryAfter>4</retryAfter> + </overLimit> + """) % common.XML_NS_V1) + + self.assertEqual(expected.toxml(), actual.toxml()) + + def test_404_fault(self): + metadata = {'attributes': {"itemNotFound": 'code'}} + serializer = wsgi.XMLDictSerializer(metadata=metadata, + xmlns=common.XML_NS_V1) + + fixture = { + "itemNotFound": { + "message": "sorry", + "code": 404, + }, + } + + output = serializer.serialize(fixture) + actual = minidom.parseString(self._prepare_xml(output)) + + expected = minidom.parseString(self._prepare_xml(""" + <itemNotFound code="404" xmlns="%s"> + <message>sorry</message> + </itemNotFound> + """) % common.XML_NS_V1) + + self.assertEqual(expected.toxml(), actual.toxml()) diff --git a/cinder/tests/api/openstack/test_wsgi.py b/cinder/tests/api/openstack/test_wsgi.py new file mode 100644 index 000000000..f9a4a1c92 --- /dev/null +++ b/cinder/tests/api/openstack/test_wsgi.py @@ -0,0 +1,833 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +import inspect +import json +import webob + +from cinder import exception +from cinder import test +from cinder import utils +from cinder.api.openstack import wsgi +from cinder.tests.api.openstack import fakes +import cinder.context + + +class RequestTest(test.TestCase): + def test_content_type_missing(self): + request = wsgi.Request.blank('/tests/123', method='POST') + request.body = "<body />" + self.assertEqual(None, request.get_content_type()) + + def test_content_type_unsupported(self): + request = wsgi.Request.blank('/tests/123', method='POST') + request.headers["Content-Type"] = "text/html" + request.body = "asdf<br />" + self.assertRaises(exception.InvalidContentType, + request.get_content_type) + + def test_content_type_with_charset(self): + request = wsgi.Request.blank('/tests/123') + request.headers["Content-Type"] = "application/json; charset=UTF-8" + result = request.get_content_type() + self.assertEqual(result, "application/json") + + def test_content_type_from_accept(self): + for content_type in ('application/xml', + 'application/vnd.openstack.volume+xml', + 'application/json', + 'application/vnd.openstack.volume+json'): + request = wsgi.Request.blank('/tests/123') + request.headers["Accept"] = content_type + result = request.best_match_content_type() + self.assertEqual(result, content_type) + + def test_content_type_from_accept_best(self): + request = wsgi.Request.blank('/tests/123') + request.headers["Accept"] = "application/xml, application/json" + result = request.best_match_content_type() + self.assertEqual(result, "application/json") + + request = wsgi.Request.blank('/tests/123') + request.headers["Accept"] = ("application/json; q=0.3, " + "application/xml; q=0.9") + result = request.best_match_content_type() + self.assertEqual(result, "application/xml") + + def test_content_type_from_query_extension(self): + request = wsgi.Request.blank('/tests/123.xml') + result = request.best_match_content_type() + self.assertEqual(result, "application/xml") + + request = wsgi.Request.blank('/tests/123.json') + result = request.best_match_content_type() + self.assertEqual(result, "application/json") + + request = wsgi.Request.blank('/tests/123.invalid') + result = request.best_match_content_type() + self.assertEqual(result, "application/json") + + def test_content_type_accept_and_query_extension(self): + request = wsgi.Request.blank('/tests/123.xml') + request.headers["Accept"] = "application/json" + result = request.best_match_content_type() + self.assertEqual(result, "application/xml") + + def test_content_type_accept_default(self): + request = wsgi.Request.blank('/tests/123.unsupported') + request.headers["Accept"] = "application/unsupported1" + result = request.best_match_content_type() + self.assertEqual(result, "application/json") + + +class ActionDispatcherTest(test.TestCase): + def test_dispatch(self): + serializer = wsgi.ActionDispatcher() + serializer.create = lambda x: 'pants' + self.assertEqual(serializer.dispatch({}, action='create'), 'pants') + + def test_dispatch_action_None(self): + serializer = wsgi.ActionDispatcher() + serializer.create = lambda x: 'pants' + serializer.default = lambda x: 'trousers' + self.assertEqual(serializer.dispatch({}, action=None), 'trousers') + + def test_dispatch_default(self): + serializer = wsgi.ActionDispatcher() + serializer.create = lambda x: 'pants' + serializer.default = lambda x: 'trousers' + self.assertEqual(serializer.dispatch({}, action='update'), 'trousers') + + +class DictSerializerTest(test.TestCase): + def test_dispatch_default(self): + serializer = wsgi.DictSerializer() + self.assertEqual(serializer.serialize({}, 'update'), '') + + +class XMLDictSerializerTest(test.TestCase): + def test_xml(self): + input_dict = dict(servers=dict(a=(2, 3))) + expected_xml = '<serversxmlns="asdf"><a>(2,3)</a></servers>' + serializer = wsgi.XMLDictSerializer(xmlns="asdf") + result = serializer.serialize(input_dict) + result = result.replace('\n', '').replace(' ', '') + self.assertEqual(result, expected_xml) + + +class JSONDictSerializerTest(test.TestCase): + def test_json(self): + input_dict = dict(servers=dict(a=(2, 3))) + expected_json = '{"servers":{"a":[2,3]}}' + serializer = wsgi.JSONDictSerializer() + result = serializer.serialize(input_dict) + result = result.replace('\n', '').replace(' ', '') + self.assertEqual(result, expected_json) + + +class TextDeserializerTest(test.TestCase): + def test_dispatch_default(self): + deserializer = wsgi.TextDeserializer() + self.assertEqual(deserializer.deserialize({}, 'update'), {}) + + +class JSONDeserializerTest(test.TestCase): + def test_json(self): + data = """{"a": { + "a1": "1", + "a2": "2", + "bs": ["1", "2", "3", {"c": {"c1": "1"}}], + "d": {"e": "1"}, + "f": "1"}}""" + as_dict = { + 'body': { + 'a': { + 'a1': '1', + 'a2': '2', + 'bs': ['1', '2', '3', {'c': {'c1': '1'}}], + 'd': {'e': '1'}, + 'f': '1', + }, + }, + } + deserializer = wsgi.JSONDeserializer() + self.assertEqual(deserializer.deserialize(data), as_dict) + + +class XMLDeserializerTest(test.TestCase): + def test_xml(self): + xml = """ + <a a1="1" a2="2"> + <bs><b>1</b><b>2</b><b>3</b><b><c c1="1"/></b></bs> + <d><e>1</e></d> + <f>1</f> + </a> + """.strip() + as_dict = { + 'body': { + 'a': { + 'a1': '1', + 'a2': '2', + 'bs': ['1', '2', '3', {'c': {'c1': '1'}}], + 'd': {'e': '1'}, + 'f': '1', + }, + }, + } + metadata = {'plurals': {'bs': 'b', 'ts': 't'}} + deserializer = wsgi.XMLDeserializer(metadata=metadata) + self.assertEqual(deserializer.deserialize(xml), as_dict) + + def test_xml_empty(self): + xml = """<a></a>""" + as_dict = {"body": {"a": {}}} + deserializer = wsgi.XMLDeserializer() + self.assertEqual(deserializer.deserialize(xml), as_dict) + + +class ResourceTest(test.TestCase): + def test_resource_call(self): + class Controller(object): + def index(self, req): + return 'off' + + req = webob.Request.blank('/tests') + app = fakes.TestRouter(Controller()) + response = req.get_response(app) + self.assertEqual(response.body, 'off') + self.assertEqual(response.status_int, 200) + + def test_resource_not_authorized(self): + class Controller(object): + def index(self, req): + raise exception.NotAuthorized() + + req = webob.Request.blank('/tests') + app = fakes.TestRouter(Controller()) + response = req.get_response(app) + self.assertEqual(response.status_int, 403) + + def test_dispatch(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + method, extensions = resource.get_method(None, 'index', None, '') + actual = resource.dispatch(method, None, {'pants': 'off'}) + expected = 'off' + self.assertEqual(actual, expected) + + def test_get_method_unknown_controller_action(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + self.assertRaises(AttributeError, resource.get_method, + None, 'create', None, '') + + def test_get_method_action_json(self): + class Controller(wsgi.Controller): + @wsgi.action('fooAction') + def _action_foo(self, req, id, body): + return body + + controller = Controller() + resource = wsgi.Resource(controller) + method, extensions = resource.get_method(None, 'action', + 'application/json', + '{"fooAction": true}') + self.assertEqual(controller._action_foo, method) + + def test_get_method_action_xml(self): + class Controller(wsgi.Controller): + @wsgi.action('fooAction') + def _action_foo(self, req, id, body): + return body + + controller = Controller() + resource = wsgi.Resource(controller) + method, extensions = resource.get_method(None, 'action', + 'application/xml', + '<fooAction>true</fooAction>') + self.assertEqual(controller._action_foo, method) + + def test_get_method_action_bad_body(self): + class Controller(wsgi.Controller): + @wsgi.action('fooAction') + def _action_foo(self, req, id, body): + return body + + controller = Controller() + resource = wsgi.Resource(controller) + self.assertRaises(exception.MalformedRequestBody, resource.get_method, + None, 'action', 'application/json', '{}') + + def test_get_method_unknown_controller_action(self): + class Controller(wsgi.Controller): + @wsgi.action('fooAction') + def _action_foo(self, req, id, body): + return body + + controller = Controller() + resource = wsgi.Resource(controller) + self.assertRaises(KeyError, resource.get_method, + None, 'action', 'application/json', + '{"barAction": true}') + + def test_get_method_action_method(self): + class Controller(): + def action(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + method, extensions = resource.get_method(None, 'action', + 'application/xml', + '<fooAction>true</fooAction') + self.assertEqual(controller.action, method) + + def test_get_action_args(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + + env = { + 'wsgiorg.routing_args': [None, { + 'controller': None, + 'format': None, + 'action': 'update', + 'id': 12, + }], + } + + expected = {'action': 'update', 'id': 12} + + self.assertEqual(resource.get_action_args(env), expected) + + def test_get_body_bad_content(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + + request = wsgi.Request.blank('/', method='POST') + request.headers['Content-Type'] = 'application/none' + request.body = 'foo' + + content_type, body = resource.get_body(request) + self.assertEqual(content_type, None) + self.assertEqual(body, '') + + def test_get_body_no_content_type(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + + request = wsgi.Request.blank('/', method='POST') + request.body = 'foo' + + content_type, body = resource.get_body(request) + self.assertEqual(content_type, None) + self.assertEqual(body, '') + + def test_get_body_no_content_body(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + + request = wsgi.Request.blank('/', method='POST') + request.headers['Content-Type'] = 'application/json' + request.body = '' + + content_type, body = resource.get_body(request) + self.assertEqual(content_type, None) + self.assertEqual(body, '') + + def test_get_body(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + + request = wsgi.Request.blank('/', method='POST') + request.headers['Content-Type'] = 'application/json' + request.body = 'foo' + + content_type, body = resource.get_body(request) + self.assertEqual(content_type, 'application/json') + self.assertEqual(body, 'foo') + + def test_deserialize_badtype(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + self.assertRaises(exception.InvalidContentType, + resource.deserialize, + controller.index, 'application/none', 'foo') + + def test_deserialize_default(self): + class JSONDeserializer(object): + def deserialize(self, body): + return 'json' + + class XMLDeserializer(object): + def deserialize(self, body): + return 'xml' + + class Controller(object): + @wsgi.deserializers(xml=XMLDeserializer) + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller, json=JSONDeserializer) + + obj = resource.deserialize(controller.index, 'application/json', 'foo') + self.assertEqual(obj, 'json') + + def test_deserialize_decorator(self): + class JSONDeserializer(object): + def deserialize(self, body): + return 'json' + + class XMLDeserializer(object): + def deserialize(self, body): + return 'xml' + + class Controller(object): + @wsgi.deserializers(xml=XMLDeserializer) + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller, json=JSONDeserializer) + + obj = resource.deserialize(controller.index, 'application/xml', 'foo') + self.assertEqual(obj, 'xml') + + def test_register_actions(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + class ControllerExtended(wsgi.Controller): + @wsgi.action('fooAction') + def _action_foo(self, req, id, body): + return body + + @wsgi.action('barAction') + def _action_bar(self, req, id, body): + return body + + controller = Controller() + resource = wsgi.Resource(controller) + self.assertEqual({}, resource.wsgi_actions) + + extended = ControllerExtended() + resource.register_actions(extended) + self.assertEqual({ + 'fooAction': extended._action_foo, + 'barAction': extended._action_bar, + }, resource.wsgi_actions) + + def test_register_extensions(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + class ControllerExtended(wsgi.Controller): + @wsgi.extends + def index(self, req, resp_obj, pants=None): + return None + + @wsgi.extends(action='fooAction') + def _action_foo(self, req, resp, id, body): + return None + + controller = Controller() + resource = wsgi.Resource(controller) + self.assertEqual({}, resource.wsgi_extensions) + self.assertEqual({}, resource.wsgi_action_extensions) + + extended = ControllerExtended() + resource.register_extensions(extended) + self.assertEqual({'index': [extended.index]}, resource.wsgi_extensions) + self.assertEqual({'fooAction': [extended._action_foo]}, + resource.wsgi_action_extensions) + + def test_get_method_extensions(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + class ControllerExtended(wsgi.Controller): + @wsgi.extends + def index(self, req, resp_obj, pants=None): + return None + + controller = Controller() + extended = ControllerExtended() + resource = wsgi.Resource(controller) + resource.register_extensions(extended) + method, extensions = resource.get_method(None, 'index', None, '') + self.assertEqual(method, controller.index) + self.assertEqual(extensions, [extended.index]) + + def test_get_method_action_extensions(self): + class Controller(wsgi.Controller): + def index(self, req, pants=None): + return pants + + @wsgi.action('fooAction') + def _action_foo(self, req, id, body): + return body + + class ControllerExtended(wsgi.Controller): + @wsgi.extends(action='fooAction') + def _action_foo(self, req, resp_obj, id, body): + return None + + controller = Controller() + extended = ControllerExtended() + resource = wsgi.Resource(controller) + resource.register_extensions(extended) + method, extensions = resource.get_method(None, 'action', + 'application/json', + '{"fooAction": true}') + self.assertEqual(method, controller._action_foo) + self.assertEqual(extensions, [extended._action_foo]) + + def test_get_method_action_whitelist_extensions(self): + class Controller(wsgi.Controller): + def index(self, req, pants=None): + return pants + + class ControllerExtended(wsgi.Controller): + @wsgi.action('create') + def _create(self, req, body): + pass + + @wsgi.action('delete') + def _delete(self, req, id): + pass + + controller = Controller() + extended = ControllerExtended() + resource = wsgi.Resource(controller) + resource.register_actions(extended) + + method, extensions = resource.get_method(None, 'create', + 'application/json', + '{"create": true}') + self.assertEqual(method, extended._create) + self.assertEqual(extensions, []) + + method, extensions = resource.get_method(None, 'delete', None, None) + self.assertEqual(method, extended._delete) + self.assertEqual(extensions, []) + + def test_pre_process_extensions_regular(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + + called = [] + + def extension1(req, resp_obj): + called.append(1) + return None + + def extension2(req, resp_obj): + called.append(2) + return None + + extensions = [extension1, extension2] + response, post = resource.pre_process_extensions(extensions, None, {}) + self.assertEqual(called, []) + self.assertEqual(response, None) + self.assertEqual(list(post), [extension2, extension1]) + + def test_pre_process_extensions_generator(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + + called = [] + + def extension1(req): + called.append('pre1') + resp_obj = yield + called.append('post1') + + def extension2(req): + called.append('pre2') + resp_obj = yield + called.append('post2') + + extensions = [extension1, extension2] + response, post = resource.pre_process_extensions(extensions, None, {}) + post = list(post) + self.assertEqual(called, ['pre1', 'pre2']) + self.assertEqual(response, None) + self.assertEqual(len(post), 2) + self.assertTrue(inspect.isgenerator(post[0])) + self.assertTrue(inspect.isgenerator(post[1])) + + for gen in post: + try: + gen.send(None) + except StopIteration: + continue + + self.assertEqual(called, ['pre1', 'pre2', 'post2', 'post1']) + + def test_pre_process_extensions_generator_response(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + + called = [] + + def extension1(req): + called.append('pre1') + yield 'foo' + + def extension2(req): + called.append('pre2') + + extensions = [extension1, extension2] + response, post = resource.pre_process_extensions(extensions, None, {}) + self.assertEqual(called, ['pre1']) + self.assertEqual(response, 'foo') + self.assertEqual(post, []) + + def test_post_process_extensions_regular(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + + called = [] + + def extension1(req, resp_obj): + called.append(1) + return None + + def extension2(req, resp_obj): + called.append(2) + return None + + response = resource.post_process_extensions([extension2, extension1], + None, None, {}) + self.assertEqual(called, [2, 1]) + self.assertEqual(response, None) + + def test_post_process_extensions_regular_response(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + + called = [] + + def extension1(req, resp_obj): + called.append(1) + return None + + def extension2(req, resp_obj): + called.append(2) + return 'foo' + + response = resource.post_process_extensions([extension2, extension1], + None, None, {}) + self.assertEqual(called, [2]) + self.assertEqual(response, 'foo') + + def test_post_process_extensions_generator(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + + called = [] + + def extension1(req): + resp_obj = yield + called.append(1) + + def extension2(req): + resp_obj = yield + called.append(2) + + ext1 = extension1(None) + ext1.next() + ext2 = extension2(None) + ext2.next() + + response = resource.post_process_extensions([ext2, ext1], + None, None, {}) + + self.assertEqual(called, [2, 1]) + self.assertEqual(response, None) + + def test_post_process_extensions_generator_response(self): + class Controller(object): + def index(self, req, pants=None): + return pants + + controller = Controller() + resource = wsgi.Resource(controller) + + called = [] + + def extension1(req): + resp_obj = yield + called.append(1) + + def extension2(req): + resp_obj = yield + called.append(2) + yield 'foo' + + ext1 = extension1(None) + ext1.next() + ext2 = extension2(None) + ext2.next() + + response = resource.post_process_extensions([ext2, ext1], + None, None, {}) + + self.assertEqual(called, [2]) + self.assertEqual(response, 'foo') + + +class ResponseObjectTest(test.TestCase): + def test_default_code(self): + robj = wsgi.ResponseObject({}) + self.assertEqual(robj.code, 200) + + def test_modified_code(self): + robj = wsgi.ResponseObject({}) + robj._default_code = 202 + self.assertEqual(robj.code, 202) + + def test_override_default_code(self): + robj = wsgi.ResponseObject({}, code=404) + self.assertEqual(robj.code, 404) + + def test_override_modified_code(self): + robj = wsgi.ResponseObject({}, code=404) + robj._default_code = 202 + self.assertEqual(robj.code, 404) + + def test_set_header(self): + robj = wsgi.ResponseObject({}) + robj['Header'] = 'foo' + self.assertEqual(robj.headers, {'header': 'foo'}) + + def test_get_header(self): + robj = wsgi.ResponseObject({}) + robj['Header'] = 'foo' + self.assertEqual(robj['hEADER'], 'foo') + + def test_del_header(self): + robj = wsgi.ResponseObject({}) + robj['Header'] = 'foo' + del robj['hEADER'] + self.assertFalse('header' in robj.headers) + + def test_header_isolation(self): + robj = wsgi.ResponseObject({}) + robj['Header'] = 'foo' + hdrs = robj.headers + hdrs['hEADER'] = 'bar' + self.assertEqual(robj['hEADER'], 'foo') + + def test_default_serializers(self): + robj = wsgi.ResponseObject({}) + self.assertEqual(robj.serializers, {}) + + def test_bind_serializers(self): + robj = wsgi.ResponseObject({}, json='foo') + robj._bind_method_serializers(dict(xml='bar', json='baz')) + self.assertEqual(robj.serializers, dict(xml='bar', json='foo')) + + def test_get_serializer(self): + robj = wsgi.ResponseObject({}, json='json', xml='xml', atom='atom') + for content_type, mtype in wsgi._MEDIA_TYPE_MAP.items(): + _mtype, serializer = robj.get_serializer(content_type) + self.assertEqual(serializer, mtype) + + def test_get_serializer_defaults(self): + robj = wsgi.ResponseObject({}) + default_serializers = dict(json='json', xml='xml', atom='atom') + for content_type, mtype in wsgi._MEDIA_TYPE_MAP.items(): + self.assertRaises(exception.InvalidContentType, + robj.get_serializer, content_type) + _mtype, serializer = robj.get_serializer(content_type, + default_serializers) + self.assertEqual(serializer, mtype) + + def test_serialize(self): + class JSONSerializer(object): + def serialize(self, obj): + return 'json' + + class XMLSerializer(object): + def serialize(self, obj): + return 'xml' + + class AtomSerializer(object): + def serialize(self, obj): + return 'atom' + + robj = wsgi.ResponseObject({}, code=202, + json=JSONSerializer, + xml=XMLSerializer, + atom=AtomSerializer) + robj['X-header1'] = 'header1' + robj['X-header2'] = 'header2' + + for content_type, mtype in wsgi._MEDIA_TYPE_MAP.items(): + request = wsgi.Request.blank('/tests/123') + response = robj.serialize(request, content_type) + + self.assertEqual(response.headers['Content-Type'], content_type) + self.assertEqual(response.headers['X-header1'], 'header1') + self.assertEqual(response.headers['X-header2'], 'header2') + self.assertEqual(response.status_int, 202) + self.assertEqual(response.body, mtype) diff --git a/cinder/tests/api/openstack/test_xmlutil.py b/cinder/tests/api/openstack/test_xmlutil.py new file mode 100644 index 000000000..7f2a26044 --- /dev/null +++ b/cinder/tests/api/openstack/test_xmlutil.py @@ -0,0 +1,722 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 lxml import etree + +from cinder import test +from cinder.api.openstack import xmlutil + + +class SelectorTest(test.TestCase): + obj_for_test = { + 'test': { + 'name': 'test', + 'values': [1, 2, 3], + 'attrs': { + 'foo': 1, + 'bar': 2, + 'baz': 3, + }, + }, + } + + def test_empty_selector(self): + sel = xmlutil.Selector() + self.assertEqual(len(sel.chain), 0) + self.assertEqual(sel(self.obj_for_test), self.obj_for_test) + + def test_dict_selector(self): + sel = xmlutil.Selector('test') + self.assertEqual(len(sel.chain), 1) + self.assertEqual(sel.chain[0], 'test') + self.assertEqual(sel(self.obj_for_test), + self.obj_for_test['test']) + + def test_datum_selector(self): + sel = xmlutil.Selector('test', 'name') + self.assertEqual(len(sel.chain), 2) + self.assertEqual(sel.chain[0], 'test') + self.assertEqual(sel.chain[1], 'name') + self.assertEqual(sel(self.obj_for_test), 'test') + + def test_list_selector(self): + sel = xmlutil.Selector('test', 'values', 0) + self.assertEqual(len(sel.chain), 3) + self.assertEqual(sel.chain[0], 'test') + self.assertEqual(sel.chain[1], 'values') + self.assertEqual(sel.chain[2], 0) + self.assertEqual(sel(self.obj_for_test), 1) + + def test_items_selector(self): + sel = xmlutil.Selector('test', 'attrs', xmlutil.get_items) + self.assertEqual(len(sel.chain), 3) + self.assertEqual(sel.chain[2], xmlutil.get_items) + for key, val in sel(self.obj_for_test): + self.assertEqual(self.obj_for_test['test']['attrs'][key], val) + + def test_missing_key_selector(self): + sel = xmlutil.Selector('test2', 'attrs') + self.assertEqual(sel(self.obj_for_test), None) + self.assertRaises(KeyError, sel, self.obj_for_test, True) + + def test_constant_selector(self): + sel = xmlutil.ConstantSelector('Foobar') + self.assertEqual(sel.value, 'Foobar') + self.assertEqual(sel(self.obj_for_test), 'Foobar') + + +class TemplateElementTest(test.TestCase): + def test_element_initial_attributes(self): + # Create a template element with some attributes + elem = xmlutil.TemplateElement('test', attrib=dict(a=1, b=2, c=3), + c=4, d=5, e=6) + + # Verify all the attributes are as expected + expected = dict(a=1, b=2, c=4, d=5, e=6) + for k, v in expected.items(): + self.assertEqual(elem.attrib[k].chain[0], v) + + def test_element_get_attributes(self): + expected = dict(a=1, b=2, c=3) + + # Create a template element with some attributes + elem = xmlutil.TemplateElement('test', attrib=expected) + + # Verify that get() retrieves the attributes + for k, v in expected.items(): + self.assertEqual(elem.get(k).chain[0], v) + + def test_element_set_attributes(self): + attrs = dict(a=None, b='foo', c=xmlutil.Selector('foo', 'bar')) + + # Create a bare template element with no attributes + elem = xmlutil.TemplateElement('test') + + # Set the attribute values + for k, v in attrs.items(): + elem.set(k, v) + + # Now verify what got set + self.assertEqual(len(elem.attrib['a'].chain), 1) + self.assertEqual(elem.attrib['a'].chain[0], 'a') + self.assertEqual(len(elem.attrib['b'].chain), 1) + self.assertEqual(elem.attrib['b'].chain[0], 'foo') + self.assertEqual(elem.attrib['c'], attrs['c']) + + def test_element_attribute_keys(self): + attrs = dict(a=1, b=2, c=3, d=4) + expected = set(attrs.keys()) + + # Create a template element with some attributes + elem = xmlutil.TemplateElement('test', attrib=attrs) + + # Now verify keys + self.assertEqual(set(elem.keys()), expected) + + def test_element_attribute_items(self): + expected = dict(a=xmlutil.Selector(1), + b=xmlutil.Selector(2), + c=xmlutil.Selector(3)) + keys = set(expected.keys()) + + # Create a template element with some attributes + elem = xmlutil.TemplateElement('test', attrib=expected) + + # Now verify items + for k, v in elem.items(): + self.assertEqual(expected[k], v) + keys.remove(k) + + # Did we visit all keys? + self.assertEqual(len(keys), 0) + + def test_element_selector_none(self): + # Create a template element with no selector + elem = xmlutil.TemplateElement('test') + + self.assertEqual(len(elem.selector.chain), 0) + + def test_element_selector_string(self): + # Create a template element with a string selector + elem = xmlutil.TemplateElement('test', selector='test') + + self.assertEqual(len(elem.selector.chain), 1) + self.assertEqual(elem.selector.chain[0], 'test') + + def test_element_selector(self): + sel = xmlutil.Selector('a', 'b') + + # Create a template element with an explicit selector + elem = xmlutil.TemplateElement('test', selector=sel) + + self.assertEqual(elem.selector, sel) + + def test_element_subselector_none(self): + # Create a template element with no subselector + elem = xmlutil.TemplateElement('test') + + self.assertEqual(elem.subselector, None) + + def test_element_subselector_string(self): + # Create a template element with a string subselector + elem = xmlutil.TemplateElement('test', subselector='test') + + self.assertEqual(len(elem.subselector.chain), 1) + self.assertEqual(elem.subselector.chain[0], 'test') + + def test_element_subselector(self): + sel = xmlutil.Selector('a', 'b') + + # Create a template element with an explicit subselector + elem = xmlutil.TemplateElement('test', subselector=sel) + + self.assertEqual(elem.subselector, sel) + + def test_element_append_child(self): + # Create an element + elem = xmlutil.TemplateElement('test') + + # Make sure the element starts off empty + self.assertEqual(len(elem), 0) + + # Create a child element + child = xmlutil.TemplateElement('child') + + # Append the child to the parent + elem.append(child) + + # Verify that the child was added + self.assertEqual(len(elem), 1) + self.assertEqual(elem[0], child) + self.assertEqual('child' in elem, True) + self.assertEqual(elem['child'], child) + + # Ensure that multiple children of the same name are rejected + child2 = xmlutil.TemplateElement('child') + self.assertRaises(KeyError, elem.append, child2) + + def test_element_extend_children(self): + # Create an element + elem = xmlutil.TemplateElement('test') + + # Make sure the element starts off empty + self.assertEqual(len(elem), 0) + + # Create a few children + children = [ + xmlutil.TemplateElement('child1'), + xmlutil.TemplateElement('child2'), + xmlutil.TemplateElement('child3'), + ] + + # Extend the parent by those children + elem.extend(children) + + # Verify that the children were added + self.assertEqual(len(elem), 3) + for idx in range(len(elem)): + self.assertEqual(children[idx], elem[idx]) + self.assertEqual(children[idx].tag in elem, True) + self.assertEqual(elem[children[idx].tag], children[idx]) + + # Ensure that multiple children of the same name are rejected + children2 = [ + xmlutil.TemplateElement('child4'), + xmlutil.TemplateElement('child1'), + ] + self.assertRaises(KeyError, elem.extend, children2) + + # Also ensure that child4 was not added + self.assertEqual(len(elem), 3) + self.assertEqual(elem[-1].tag, 'child3') + + def test_element_insert_child(self): + # Create an element + elem = xmlutil.TemplateElement('test') + + # Make sure the element starts off empty + self.assertEqual(len(elem), 0) + + # Create a few children + children = [ + xmlutil.TemplateElement('child1'), + xmlutil.TemplateElement('child2'), + xmlutil.TemplateElement('child3'), + ] + + # Extend the parent by those children + elem.extend(children) + + # Create a child to insert + child = xmlutil.TemplateElement('child4') + + # Insert it + elem.insert(1, child) + + # Ensure the child was inserted in the right place + self.assertEqual(len(elem), 4) + children.insert(1, child) + for idx in range(len(elem)): + self.assertEqual(children[idx], elem[idx]) + self.assertEqual(children[idx].tag in elem, True) + self.assertEqual(elem[children[idx].tag], children[idx]) + + # Ensure that multiple children of the same name are rejected + child2 = xmlutil.TemplateElement('child2') + self.assertRaises(KeyError, elem.insert, 2, child2) + + def test_element_remove_child(self): + # Create an element + elem = xmlutil.TemplateElement('test') + + # Make sure the element starts off empty + self.assertEqual(len(elem), 0) + + # Create a few children + children = [ + xmlutil.TemplateElement('child1'), + xmlutil.TemplateElement('child2'), + xmlutil.TemplateElement('child3'), + ] + + # Extend the parent by those children + elem.extend(children) + + # Create a test child to remove + child = xmlutil.TemplateElement('child2') + + # Try to remove it + self.assertRaises(ValueError, elem.remove, child) + + # Ensure that no child was removed + self.assertEqual(len(elem), 3) + + # Now remove a legitimate child + elem.remove(children[1]) + + # Ensure that the child was removed + self.assertEqual(len(elem), 2) + self.assertEqual(elem[0], children[0]) + self.assertEqual(elem[1], children[2]) + self.assertEqual('child2' in elem, False) + + # Ensure the child cannot be retrieved by name + def get_key(elem, key): + return elem[key] + self.assertRaises(KeyError, get_key, elem, 'child2') + + def test_element_text(self): + # Create an element + elem = xmlutil.TemplateElement('test') + + # Ensure that it has no text + self.assertEqual(elem.text, None) + + # Try setting it to a string and ensure it becomes a selector + elem.text = 'test' + self.assertEqual(hasattr(elem.text, 'chain'), True) + self.assertEqual(len(elem.text.chain), 1) + self.assertEqual(elem.text.chain[0], 'test') + + # Try resetting the text to None + elem.text = None + self.assertEqual(elem.text, None) + + # Now make up a selector and try setting the text to that + sel = xmlutil.Selector() + elem.text = sel + self.assertEqual(elem.text, sel) + + # Finally, try deleting the text and see what happens + del elem.text + self.assertEqual(elem.text, None) + + def test_apply_attrs(self): + # Create a template element + attrs = dict(attr1=xmlutil.ConstantSelector(1), + attr2=xmlutil.ConstantSelector(2)) + tmpl_elem = xmlutil.TemplateElement('test', attrib=attrs) + + # Create an etree element + elem = etree.Element('test') + + # Apply the template to the element + tmpl_elem.apply(elem, None) + + # Now, verify the correct attributes were set + for k, v in elem.items(): + self.assertEqual(str(attrs[k].value), v) + + def test_apply_text(self): + # Create a template element + tmpl_elem = xmlutil.TemplateElement('test') + tmpl_elem.text = xmlutil.ConstantSelector(1) + + # Create an etree element + elem = etree.Element('test') + + # Apply the template to the element + tmpl_elem.apply(elem, None) + + # Now, verify the text was set + self.assertEqual(str(tmpl_elem.text.value), elem.text) + + def test__render(self): + attrs = dict(attr1=xmlutil.ConstantSelector(1), + attr2=xmlutil.ConstantSelector(2), + attr3=xmlutil.ConstantSelector(3)) + + # Create a master template element + master_elem = xmlutil.TemplateElement('test', attr1=attrs['attr1']) + + # Create a couple of slave template element + slave_elems = [ + xmlutil.TemplateElement('test', attr2=attrs['attr2']), + xmlutil.TemplateElement('test', attr3=attrs['attr3']), + ] + + # Try the render + elem = master_elem._render(None, None, slave_elems, None) + + # Verify the particulars of the render + self.assertEqual(elem.tag, 'test') + self.assertEqual(len(elem.nsmap), 0) + for k, v in elem.items(): + self.assertEqual(str(attrs[k].value), v) + + # Create a parent for the element to be rendered + parent = etree.Element('parent') + + # Try the render again... + elem = master_elem._render(parent, None, slave_elems, dict(a='foo')) + + # Verify the particulars of the render + self.assertEqual(len(parent), 1) + self.assertEqual(parent[0], elem) + self.assertEqual(len(elem.nsmap), 1) + self.assertEqual(elem.nsmap['a'], 'foo') + + def test_render(self): + # Create a template element + tmpl_elem = xmlutil.TemplateElement('test') + tmpl_elem.text = xmlutil.Selector() + + # Create the object we're going to render + obj = ['elem1', 'elem2', 'elem3', 'elem4'] + + # Try a render with no object + elems = tmpl_elem.render(None, None) + self.assertEqual(len(elems), 0) + + # Try a render with one object + elems = tmpl_elem.render(None, 'foo') + self.assertEqual(len(elems), 1) + self.assertEqual(elems[0][0].text, 'foo') + self.assertEqual(elems[0][1], 'foo') + + # Now, try rendering an object with multiple entries + parent = etree.Element('parent') + elems = tmpl_elem.render(parent, obj) + self.assertEqual(len(elems), 4) + + # Check the results + for idx in range(len(obj)): + self.assertEqual(elems[idx][0].text, obj[idx]) + self.assertEqual(elems[idx][1], obj[idx]) + + def test_subelement(self): + # Try the SubTemplateElement constructor + parent = xmlutil.SubTemplateElement(None, 'parent') + self.assertEqual(parent.tag, 'parent') + self.assertEqual(len(parent), 0) + + # Now try it with a parent element + child = xmlutil.SubTemplateElement(parent, 'child') + self.assertEqual(child.tag, 'child') + self.assertEqual(len(parent), 1) + self.assertEqual(parent[0], child) + + def test_wrap(self): + # These are strange methods, but they make things easier + elem = xmlutil.TemplateElement('test') + self.assertEqual(elem.unwrap(), elem) + self.assertEqual(elem.wrap().root, elem) + + def test_dyntag(self): + obj = ['a', 'b', 'c'] + + # Create a template element with a dynamic tag + tmpl_elem = xmlutil.TemplateElement(xmlutil.Selector()) + + # Try the render + parent = etree.Element('parent') + elems = tmpl_elem.render(parent, obj) + + # Verify the particulars of the render + self.assertEqual(len(elems), len(obj)) + for idx in range(len(obj)): + self.assertEqual(elems[idx][0].tag, obj[idx]) + + +class TemplateTest(test.TestCase): + def test_wrap(self): + # These are strange methods, but they make things easier + elem = xmlutil.TemplateElement('test') + tmpl = xmlutil.Template(elem) + self.assertEqual(tmpl.unwrap(), elem) + self.assertEqual(tmpl.wrap(), tmpl) + + def test__siblings(self): + # Set up a basic template + elem = xmlutil.TemplateElement('test') + tmpl = xmlutil.Template(elem) + + # Check that we get the right siblings + siblings = tmpl._siblings() + self.assertEqual(len(siblings), 1) + self.assertEqual(siblings[0], elem) + + def test__nsmap(self): + # Set up a basic template + elem = xmlutil.TemplateElement('test') + tmpl = xmlutil.Template(elem, nsmap=dict(a="foo")) + + # Check out that we get the right namespace dictionary + nsmap = tmpl._nsmap() + self.assertNotEqual(id(nsmap), id(tmpl.nsmap)) + self.assertEqual(len(nsmap), 1) + self.assertEqual(nsmap['a'], 'foo') + + def test_master_attach(self): + # Set up a master template + elem = xmlutil.TemplateElement('test') + tmpl = xmlutil.MasterTemplate(elem, 1) + + # Make sure it has a root but no slaves + self.assertEqual(tmpl.root, elem) + self.assertEqual(len(tmpl.slaves), 0) + + # Try to attach an invalid slave + bad_elem = xmlutil.TemplateElement('test2') + self.assertRaises(ValueError, tmpl.attach, bad_elem) + self.assertEqual(len(tmpl.slaves), 0) + + # Try to attach an invalid and a valid slave + good_elem = xmlutil.TemplateElement('test') + self.assertRaises(ValueError, tmpl.attach, good_elem, bad_elem) + self.assertEqual(len(tmpl.slaves), 0) + + # Try to attach an inapplicable template + class InapplicableTemplate(xmlutil.Template): + def apply(self, master): + return False + inapp_tmpl = InapplicableTemplate(good_elem) + tmpl.attach(inapp_tmpl) + self.assertEqual(len(tmpl.slaves), 0) + + # Now try attaching an applicable template + tmpl.attach(good_elem) + self.assertEqual(len(tmpl.slaves), 1) + self.assertEqual(tmpl.slaves[0].root, good_elem) + + def test_master_copy(self): + # Construct a master template + elem = xmlutil.TemplateElement('test') + tmpl = xmlutil.MasterTemplate(elem, 1, nsmap=dict(a='foo')) + + # Give it a slave + slave = xmlutil.TemplateElement('test') + tmpl.attach(slave) + + # Construct a copy + copy = tmpl.copy() + + # Check to see if we actually managed a copy + self.assertNotEqual(tmpl, copy) + self.assertEqual(tmpl.root, copy.root) + self.assertEqual(tmpl.version, copy.version) + self.assertEqual(id(tmpl.nsmap), id(copy.nsmap)) + self.assertNotEqual(id(tmpl.slaves), id(copy.slaves)) + self.assertEqual(len(tmpl.slaves), len(copy.slaves)) + self.assertEqual(tmpl.slaves[0], copy.slaves[0]) + + def test_slave_apply(self): + # Construct a master template + elem = xmlutil.TemplateElement('test') + master = xmlutil.MasterTemplate(elem, 3) + + # Construct a slave template with applicable minimum version + slave = xmlutil.SlaveTemplate(elem, 2) + self.assertEqual(slave.apply(master), True) + + # Construct a slave template with equal minimum version + slave = xmlutil.SlaveTemplate(elem, 3) + self.assertEqual(slave.apply(master), True) + + # Construct a slave template with inapplicable minimum version + slave = xmlutil.SlaveTemplate(elem, 4) + self.assertEqual(slave.apply(master), False) + + # Construct a slave template with applicable version range + slave = xmlutil.SlaveTemplate(elem, 2, 4) + self.assertEqual(slave.apply(master), True) + + # Construct a slave template with low version range + slave = xmlutil.SlaveTemplate(elem, 1, 2) + self.assertEqual(slave.apply(master), False) + + # Construct a slave template with high version range + slave = xmlutil.SlaveTemplate(elem, 4, 5) + self.assertEqual(slave.apply(master), False) + + # Construct a slave template with matching version range + slave = xmlutil.SlaveTemplate(elem, 3, 3) + self.assertEqual(slave.apply(master), True) + + def test__serialize(self): + # Our test object to serialize + obj = { + 'test': { + 'name': 'foobar', + 'values': [1, 2, 3, 4], + 'attrs': { + 'a': 1, + 'b': 2, + 'c': 3, + 'd': 4, + }, + 'image': { + 'name': 'image_foobar', + 'id': 42, + }, + }, + } + + # Set up our master template + root = xmlutil.TemplateElement('test', selector='test', + name='name') + value = xmlutil.SubTemplateElement(root, 'value', selector='values') + value.text = xmlutil.Selector() + attrs = xmlutil.SubTemplateElement(root, 'attrs', selector='attrs') + xmlutil.SubTemplateElement(attrs, 'attr', selector=xmlutil.get_items, + key=0, value=1) + master = xmlutil.MasterTemplate(root, 1, nsmap=dict(f='foo')) + + # Set up our slave template + root_slave = xmlutil.TemplateElement('test', selector='test') + image = xmlutil.SubTemplateElement(root_slave, 'image', + selector='image', id='id') + image.text = xmlutil.Selector('name') + slave = xmlutil.SlaveTemplate(root_slave, 1, nsmap=dict(b='bar')) + + # Attach the slave to the master... + master.attach(slave) + + # Try serializing our object + siblings = master._siblings() + nsmap = master._nsmap() + result = master._serialize(None, obj, siblings, nsmap) + + # Now we get to manually walk the element tree... + self.assertEqual(result.tag, 'test') + self.assertEqual(len(result.nsmap), 2) + self.assertEqual(result.nsmap['f'], 'foo') + self.assertEqual(result.nsmap['b'], 'bar') + self.assertEqual(result.get('name'), obj['test']['name']) + for idx, val in enumerate(obj['test']['values']): + self.assertEqual(result[idx].tag, 'value') + self.assertEqual(result[idx].text, str(val)) + idx += 1 + self.assertEqual(result[idx].tag, 'attrs') + for attr in result[idx]: + self.assertEqual(attr.tag, 'attr') + self.assertEqual(attr.get('value'), + str(obj['test']['attrs'][attr.get('key')])) + idx += 1 + self.assertEqual(result[idx].tag, 'image') + self.assertEqual(result[idx].get('id'), + str(obj['test']['image']['id'])) + self.assertEqual(result[idx].text, obj['test']['image']['name']) + + +class MasterTemplateBuilder(xmlutil.TemplateBuilder): + def construct(self): + elem = xmlutil.TemplateElement('test') + return xmlutil.MasterTemplate(elem, 1) + + +class SlaveTemplateBuilder(xmlutil.TemplateBuilder): + def construct(self): + elem = xmlutil.TemplateElement('test') + return xmlutil.SlaveTemplate(elem, 1) + + +class TemplateBuilderTest(test.TestCase): + def test_master_template_builder(self): + # Make sure the template hasn't been built yet + self.assertEqual(MasterTemplateBuilder._tmpl, None) + + # Now, construct the template + tmpl1 = MasterTemplateBuilder() + + # Make sure that there is a template cached... + self.assertNotEqual(MasterTemplateBuilder._tmpl, None) + + # Make sure it wasn't what was returned... + self.assertNotEqual(MasterTemplateBuilder._tmpl, tmpl1) + + # Make sure it doesn't get rebuilt + cached = MasterTemplateBuilder._tmpl + tmpl2 = MasterTemplateBuilder() + self.assertEqual(MasterTemplateBuilder._tmpl, cached) + + # Make sure we're always getting fresh copies + self.assertNotEqual(tmpl1, tmpl2) + + # Make sure we can override the copying behavior + tmpl3 = MasterTemplateBuilder(False) + self.assertEqual(MasterTemplateBuilder._tmpl, tmpl3) + + def test_slave_template_builder(self): + # Make sure the template hasn't been built yet + self.assertEqual(SlaveTemplateBuilder._tmpl, None) + + # Now, construct the template + tmpl1 = SlaveTemplateBuilder() + + # Make sure there is a template cached... + self.assertNotEqual(SlaveTemplateBuilder._tmpl, None) + + # Make sure it was what was returned... + self.assertEqual(SlaveTemplateBuilder._tmpl, tmpl1) + + # Make sure it doesn't get rebuilt + tmpl2 = SlaveTemplateBuilder() + self.assertEqual(SlaveTemplateBuilder._tmpl, tmpl1) + + # Make sure we're always getting the cached copy + self.assertEqual(tmpl1, tmpl2) + + +class MiscellaneousXMLUtilTests(test.TestCase): + def test_make_flat_dict(self): + expected_xml = ("<?xml version='1.0' encoding='UTF-8'?>\n" + '<wrapper><a>foo</a><b>bar</b></wrapper>') + root = xmlutil.make_flat_dict('wrapper') + tmpl = xmlutil.MasterTemplate(root, 1) + result = tmpl.serialize(dict(wrapper=dict(a='foo', b='bar'))) + self.assertEqual(result, expected_xml) diff --git a/cinder/tests/api/openstack/volume/__init__.py b/cinder/tests/api/openstack/volume/__init__.py new file mode 100644 index 000000000..3be5ce944 --- /dev/null +++ b/cinder/tests/api/openstack/volume/__init__.py @@ -0,0 +1,19 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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. + +# NOTE(vish): this forces the fixtures from tests/__init.py:setup() to work +from cinder.tests import * diff --git a/cinder/tests/api/openstack/volume/contrib/__init__.py b/cinder/tests/api/openstack/volume/contrib/__init__.py new file mode 100644 index 000000000..3be5ce944 --- /dev/null +++ b/cinder/tests/api/openstack/volume/contrib/__init__.py @@ -0,0 +1,19 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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. + +# NOTE(vish): this forces the fixtures from tests/__init.py:setup() to work +from cinder.tests import * diff --git a/cinder/tests/api/openstack/volume/contrib/test_types_extra_specs.py b/cinder/tests/api/openstack/volume/contrib/test_types_extra_specs.py new file mode 100644 index 000000000..01dd0bf82 --- /dev/null +++ b/cinder/tests/api/openstack/volume/contrib/test_types_extra_specs.py @@ -0,0 +1,202 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 Zadara Storage Inc. +# Copyright (c) 2011 OpenStack LLC. +# Copyright 2011 University of Southern California +# 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 lxml import etree +import webob + +from cinder.api.openstack.volume.contrib import types_extra_specs +from cinder import test +from cinder.tests.api.openstack import fakes +import cinder.wsgi + + +def return_create_volume_type_extra_specs(context, volume_type_id, + extra_specs): + return stub_volume_type_extra_specs() + + +def return_volume_type_extra_specs(context, volume_type_id): + return stub_volume_type_extra_specs() + + +def return_empty_volume_type_extra_specs(context, volume_type_id): + return {} + + +def delete_volume_type_extra_specs(context, volume_type_id, key): + pass + + +def stub_volume_type_extra_specs(): + specs = { + "key1": "value1", + "key2": "value2", + "key3": "value3", + "key4": "value4", + "key5": "value5"} + return specs + + +def volume_type_get(context, volume_type_id): + pass + + +class VolumeTypesExtraSpecsTest(test.TestCase): + + def setUp(self): + super(VolumeTypesExtraSpecsTest, self).setUp() + self.stubs.Set(cinder.db, 'volume_type_get', volume_type_get) + self.api_path = '/v1/fake/os-volume-types/1/extra_specs' + self.controller = types_extra_specs.VolumeTypeExtraSpecsController() + + def test_index(self): + self.stubs.Set(cinder.db, 'volume_type_extra_specs_get', + return_volume_type_extra_specs) + + req = fakes.HTTPRequest.blank(self.api_path) + res_dict = self.controller.index(req, 1) + + self.assertEqual('value1', res_dict['extra_specs']['key1']) + + def test_index_no_data(self): + self.stubs.Set(cinder.db, 'volume_type_extra_specs_get', + return_empty_volume_type_extra_specs) + + req = fakes.HTTPRequest.blank(self.api_path) + res_dict = self.controller.index(req, 1) + + self.assertEqual(0, len(res_dict['extra_specs'])) + + def test_show(self): + self.stubs.Set(cinder.db, 'volume_type_extra_specs_get', + return_volume_type_extra_specs) + + req = fakes.HTTPRequest.blank(self.api_path + '/key5') + res_dict = self.controller.show(req, 1, 'key5') + + self.assertEqual('value5', res_dict['key5']) + + def test_show_spec_not_found(self): + self.stubs.Set(cinder.db, 'volume_type_extra_specs_get', + return_empty_volume_type_extra_specs) + + req = fakes.HTTPRequest.blank(self.api_path + '/key6') + self.assertRaises(webob.exc.HTTPNotFound, self.controller.show, + req, 1, 'key6') + + def test_delete(self): + self.stubs.Set(cinder.db, 'volume_type_extra_specs_delete', + delete_volume_type_extra_specs) + + req = fakes.HTTPRequest.blank(self.api_path + '/key5') + self.controller.delete(req, 1, 'key5') + + def test_create(self): + self.stubs.Set(cinder.db, + 'volume_type_extra_specs_update_or_create', + return_create_volume_type_extra_specs) + body = {"extra_specs": {"key1": "value1"}} + + req = fakes.HTTPRequest.blank(self.api_path) + res_dict = self.controller.create(req, 1, body) + + self.assertEqual('value1', res_dict['extra_specs']['key1']) + + def test_create_empty_body(self): + self.stubs.Set(cinder.db, + 'volume_type_extra_specs_update_or_create', + return_create_volume_type_extra_specs) + + req = fakes.HTTPRequest.blank(self.api_path) + self.assertRaises(webob.exc.HTTPBadRequest, self.controller.create, + req, 1, '') + + def test_update_item(self): + self.stubs.Set(cinder.db, + 'volume_type_extra_specs_update_or_create', + return_create_volume_type_extra_specs) + body = {"key1": "value1"} + + req = fakes.HTTPRequest.blank(self.api_path + '/key1') + res_dict = self.controller.update(req, 1, 'key1', body) + + self.assertEqual('value1', res_dict['key1']) + + def test_update_item_empty_body(self): + self.stubs.Set(cinder.db, + 'volume_type_extra_specs_update_or_create', + return_create_volume_type_extra_specs) + + req = fakes.HTTPRequest.blank(self.api_path + '/key1') + self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update, + req, 1, 'key1', '') + + def test_update_item_too_many_keys(self): + self.stubs.Set(cinder.db, + 'volume_type_extra_specs_update_or_create', + return_create_volume_type_extra_specs) + body = {"key1": "value1", "key2": "value2"} + + req = fakes.HTTPRequest.blank(self.api_path + '/key1') + self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update, + req, 1, 'key1', body) + + def test_update_item_body_uri_mismatch(self): + self.stubs.Set(cinder.db, + 'volume_type_extra_specs_update_or_create', + return_create_volume_type_extra_specs) + body = {"key1": "value1"} + + req = fakes.HTTPRequest.blank(self.api_path + '/bad') + self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update, + req, 1, 'bad', body) + + +class VolumeTypeExtraSpecsSerializerTest(test.TestCase): + def test_index_create_serializer(self): + serializer = types_extra_specs.VolumeTypeExtraSpecsTemplate() + + # Just getting some input data + extra_specs = stub_volume_type_extra_specs() + text = serializer.serialize(dict(extra_specs=extra_specs)) + + print text + tree = etree.fromstring(text) + + self.assertEqual('extra_specs', tree.tag) + self.assertEqual(len(extra_specs), len(tree)) + seen = set(extra_specs.keys()) + for child in tree: + self.assertTrue(child.tag in seen) + self.assertEqual(extra_specs[child.tag], child.text) + seen.remove(child.tag) + self.assertEqual(len(seen), 0) + + def test_update_show_serializer(self): + serializer = types_extra_specs.VolumeTypeExtraSpecTemplate() + + exemplar = dict(key1='value1') + text = serializer.serialize(exemplar) + + print text + tree = etree.fromstring(text) + + self.assertEqual('key1', tree.tag) + self.assertEqual('value1', tree.text) + self.assertEqual(0, len(tree)) diff --git a/cinder/tests/api/openstack/volume/contrib/test_types_manage.py b/cinder/tests/api/openstack/volume/contrib/test_types_manage.py new file mode 100644 index 000000000..f85bf98fd --- /dev/null +++ b/cinder/tests/api/openstack/volume/contrib/test_types_manage.py @@ -0,0 +1,103 @@ +# Copyright 2011 OpenStack LLC. +# 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 webob + +from cinder.api.openstack.volume.contrib import types_manage +from cinder import exception +from cinder import test +from cinder.volume import volume_types +from cinder.tests.api.openstack import fakes + + +def stub_volume_type(id): + specs = { + "key1": "value1", + "key2": "value2", + "key3": "value3", + "key4": "value4", + "key5": "value5"} + return dict(id=id, name='vol_type_%s' % str(id), extra_specs=specs) + + +def return_volume_types_get_volume_type(context, id): + if id == "777": + raise exception.VolumeTypeNotFound(volume_type_id=id) + return stub_volume_type(int(id)) + + +def return_volume_types_destroy(context, name): + if name == "777": + raise exception.VolumeTypeNotFoundByName(volume_type_name=name) + pass + + +def return_volume_types_create(context, name, specs): + pass + + +def return_volume_types_get_by_name(context, name): + if name == "777": + raise exception.VolumeTypeNotFoundByName(volume_type_name=name) + return stub_volume_type(int(name.split("_")[2])) + + +class VolumeTypesManageApiTest(test.TestCase): + def setUp(self): + super(VolumeTypesManageApiTest, self).setUp() + self.controller = types_manage.VolumeTypesManageController() + + def test_volume_types_delete(self): + self.stubs.Set(volume_types, 'get_volume_type', + return_volume_types_get_volume_type) + self.stubs.Set(volume_types, 'destroy', + return_volume_types_destroy) + + req = fakes.HTTPRequest.blank('/v1/fake/types/1') + self.controller._delete(req, 1) + + def test_volume_types_delete_not_found(self): + self.stubs.Set(volume_types, 'get_volume_type', + return_volume_types_get_volume_type) + self.stubs.Set(volume_types, 'destroy', + return_volume_types_destroy) + + req = fakes.HTTPRequest.blank('/v1/fake/types/777') + self.assertRaises(webob.exc.HTTPNotFound, self.controller._delete, + req, '777') + + def test_create(self): + self.stubs.Set(volume_types, 'create', + return_volume_types_create) + self.stubs.Set(volume_types, 'get_volume_type_by_name', + return_volume_types_get_by_name) + + body = {"volume_type": {"name": "vol_type_1", + "extra_specs": {"key1": "value1"}}} + req = fakes.HTTPRequest.blank('/v1/fake/types') + res_dict = self.controller._create(req, body) + + self.assertEqual(1, len(res_dict)) + self.assertEqual('vol_type_1', res_dict['volume_type']['name']) + + def test_create_empty_body(self): + self.stubs.Set(volume_types, 'create', + return_volume_types_create) + self.stubs.Set(volume_types, 'get_volume_type_by_name', + return_volume_types_get_by_name) + + req = fakes.HTTPRequest.blank('/v1/fake/types') + self.assertRaises(webob.exc.HTTPUnprocessableEntity, + self.controller._create, req, '') diff --git a/cinder/tests/api/openstack/volume/extensions/__init__.py b/cinder/tests/api/openstack/volume/extensions/__init__.py new file mode 100644 index 000000000..848908a95 --- /dev/null +++ b/cinder/tests/api/openstack/volume/extensions/__init__.py @@ -0,0 +1,15 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. diff --git a/cinder/tests/api/openstack/volume/extensions/foxinsocks.py b/cinder/tests/api/openstack/volume/extensions/foxinsocks.py new file mode 100644 index 000000000..5fcd6a2ba --- /dev/null +++ b/cinder/tests/api/openstack/volume/extensions/foxinsocks.py @@ -0,0 +1,94 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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 webob.exc + +from cinder.api.openstack import extensions +from cinder.api.openstack import wsgi + + +class FoxInSocksController(object): + + def index(self, req): + return "Try to say this Mr. Knox, sir..." + + +class FoxInSocksServerControllerExtension(wsgi.Controller): + @wsgi.action('add_tweedle') + def _add_tweedle(self, req, id, body): + + return "Tweedle Beetle Added." + + @wsgi.action('delete_tweedle') + def _delete_tweedle(self, req, id, body): + + return "Tweedle Beetle Deleted." + + @wsgi.action('fail') + def _fail(self, req, id, body): + + raise webob.exc.HTTPBadRequest(explanation='Tweedle fail') + + +class FoxInSocksFlavorGooseControllerExtension(wsgi.Controller): + @wsgi.extends + def show(self, req, resp_obj, id): + #NOTE: This only handles JSON responses. + # You can use content type header to test for XML. + resp_obj.obj['flavor']['googoose'] = req.GET.get('chewing') + + +class FoxInSocksFlavorBandsControllerExtension(wsgi.Controller): + @wsgi.extends + def show(self, req, resp_obj, id): + #NOTE: This only handles JSON responses. + # You can use content type header to test for XML. + resp_obj.obj['big_bands'] = 'Pig Bands!' + + +class Foxinsocks(extensions.ExtensionDescriptor): + """The Fox In Socks Extension""" + + name = "Fox In Socks" + alias = "FOXNSOX" + namespace = "http://www.fox.in.socks/api/ext/pie/v1.0" + updated = "2011-01-22T13:25:27-06:00" + + def __init__(self, ext_mgr): + ext_mgr.register(self) + + def get_resources(self): + resources = [] + resource = extensions.ResourceExtension('foxnsocks', + FoxInSocksController()) + resources.append(resource) + return resources + + def get_controller_extensions(self): + extension_list = [] + + extension_set = [ + (FoxInSocksServerControllerExtension, 'servers'), + (FoxInSocksFlavorGooseControllerExtension, 'flavors'), + (FoxInSocksFlavorBandsControllerExtension, 'flavors'), + ] + for klass, collection in extension_set: + controller = klass() + ext = extensions.ControllerExtension(self, collection, controller) + extension_list.append(ext) + + return extension_list diff --git a/cinder/tests/api/openstack/volume/test_extensions.py b/cinder/tests/api/openstack/volume/test_extensions.py new file mode 100644 index 000000000..62b4beba4 --- /dev/null +++ b/cinder/tests/api/openstack/volume/test_extensions.py @@ -0,0 +1,156 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 X.commerce, a business unit of eBay Inc. +# Copyright 2011 OpenStack LLC. +# 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 json + +import webob +from lxml import etree +import iso8601 + +from cinder.api.openstack import volume +from cinder.api.openstack import xmlutil +from cinder import flags +from cinder import test + +FLAGS = flags.FLAGS +NS = "{http://docs.openstack.org/common/api/v1.0}" + + +class ExtensionTestCase(test.TestCase): + def setUp(self): + super(ExtensionTestCase, self).setUp() + ext_list = FLAGS.osapi_volume_extension[:] + fox = ('cinder.tests.api.openstack.volume.extensions.' + 'foxinsocks.Foxinsocks') + if fox not in ext_list: + ext_list.append(fox) + self.flags(osapi_volume_extension=ext_list) + + +class ExtensionControllerTest(ExtensionTestCase): + + def setUp(self): + super(ExtensionControllerTest, self).setUp() + self.ext_list = [ + "TypesManage", + "TypesExtraSpecs", + ] + self.ext_list.sort() + + def test_list_extensions_json(self): + app = volume.APIRouter() + request = webob.Request.blank("/fake/extensions") + response = request.get_response(app) + self.assertEqual(200, response.status_int) + + # Make sure we have all the extensions, extra extensions being OK. + data = json.loads(response.body) + names = [str(x['name']) for x in data['extensions'] + if str(x['name']) in self.ext_list] + names.sort() + self.assertEqual(names, self.ext_list) + + # Ensure all the timestamps are valid according to iso8601 + for ext in data['extensions']: + iso8601.parse_date(ext['updated']) + + # Make sure that at least Fox in Sox is correct. + (fox_ext, ) = [ + x for x in data['extensions'] if x['alias'] == 'FOXNSOX'] + self.assertEqual(fox_ext, { + 'namespace': 'http://www.fox.in.socks/api/ext/pie/v1.0', + 'name': 'Fox In Socks', + 'updated': '2011-01-22T13:25:27-06:00', + 'description': 'The Fox In Socks Extension', + 'alias': 'FOXNSOX', + 'links': [] + }, + ) + + for ext in data['extensions']: + url = '/fake/extensions/%s' % ext['alias'] + request = webob.Request.blank(url) + response = request.get_response(app) + output = json.loads(response.body) + self.assertEqual(output['extension']['alias'], ext['alias']) + + def test_get_extension_json(self): + app = volume.APIRouter() + request = webob.Request.blank("/fake/extensions/FOXNSOX") + response = request.get_response(app) + self.assertEqual(200, response.status_int) + + data = json.loads(response.body) + self.assertEqual(data['extension'], { + "namespace": "http://www.fox.in.socks/api/ext/pie/v1.0", + "name": "Fox In Socks", + "updated": "2011-01-22T13:25:27-06:00", + "description": "The Fox In Socks Extension", + "alias": "FOXNSOX", + "links": []}) + + def test_get_non_existing_extension_json(self): + app = volume.APIRouter() + request = webob.Request.blank("/fake/extensions/4") + response = request.get_response(app) + self.assertEqual(404, response.status_int) + + def test_list_extensions_xml(self): + app = volume.APIRouter() + request = webob.Request.blank("/fake/extensions") + request.accept = "application/xml" + response = request.get_response(app) + self.assertEqual(200, response.status_int) + + root = etree.XML(response.body) + self.assertEqual(root.tag.split('extensions')[0], NS) + + # Make sure we have all the extensions, extras extensions being OK. + exts = root.findall('{0}extension'.format(NS)) + self.assert_(len(exts) >= len(self.ext_list)) + + # Make sure that at least Fox in Sox is correct. + (fox_ext, ) = [x for x in exts if x.get('alias') == 'FOXNSOX'] + self.assertEqual(fox_ext.get('name'), 'Fox In Socks') + self.assertEqual(fox_ext.get('namespace'), + 'http://www.fox.in.socks/api/ext/pie/v1.0') + self.assertEqual(fox_ext.get('updated'), '2011-01-22T13:25:27-06:00') + self.assertEqual(fox_ext.findtext('{0}description'.format(NS)), + 'The Fox In Socks Extension') + + xmlutil.validate_schema(root, 'extensions') + + def test_get_extension_xml(self): + app = volume.APIRouter() + request = webob.Request.blank("/fake/extensions/FOXNSOX") + request.accept = "application/xml" + response = request.get_response(app) + self.assertEqual(200, response.status_int) + xml = response.body + + root = etree.XML(xml) + self.assertEqual(root.tag.split('extension')[0], NS) + self.assertEqual(root.get('alias'), 'FOXNSOX') + self.assertEqual(root.get('name'), 'Fox In Socks') + self.assertEqual(root.get('namespace'), + 'http://www.fox.in.socks/api/ext/pie/v1.0') + self.assertEqual(root.get('updated'), '2011-01-22T13:25:27-06:00') + self.assertEqual(root.findtext('{0}description'.format(NS)), + 'The Fox In Socks Extension') + + xmlutil.validate_schema(root, 'extension') diff --git a/cinder/tests/api/openstack/volume/test_router.py b/cinder/tests/api/openstack/volume/test_router.py new file mode 100644 index 000000000..f7e7afb6c --- /dev/null +++ b/cinder/tests/api/openstack/volume/test_router.py @@ -0,0 +1,105 @@ +# Copyright 2011 Denali 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. + + +from cinder.api.openstack import volume +from cinder.api.openstack.volume import snapshots +from cinder.api.openstack.volume import volumes +from cinder.api.openstack.volume import versions +from cinder.api.openstack import wsgi +from cinder import flags +from cinder import log as logging +from cinder import test +from cinder.tests.api.openstack import fakes + +FLAGS = flags.FLAGS + +LOG = logging.getLogger(__name__) + + +class FakeController(object): + def index(self, req): + return {} + + def detail(self, req): + return {} + + +def create_resource(): + return wsgi.Resource(FakeController()) + + +class VolumeRouterTestCase(test.TestCase): + def setUp(self): + super(VolumeRouterTestCase, self).setUp() + # NOTE(vish): versions is just returning text so, no need to stub. + self.stubs.Set(snapshots, 'create_resource', create_resource) + self.stubs.Set(volumes, 'create_resource', create_resource) + self.app = volume.APIRouter() + + def test_versions(self): + req = fakes.HTTPRequest.blank('') + req.method = 'GET' + req.content_type = 'application/json' + response = req.get_response(self.app) + self.assertEqual(302, response.status_int) + req = fakes.HTTPRequest.blank('/') + req.method = 'GET' + req.content_type = 'application/json' + response = req.get_response(self.app) + self.assertEqual(200, response.status_int) + + def test_versions_dispatch(self): + req = fakes.HTTPRequest.blank('/') + req.method = 'GET' + req.content_type = 'application/json' + resource = versions.Versions() + result = resource.dispatch(resource.index, req, {}) + self.assertTrue(result) + + def test_volumes(self): + req = fakes.HTTPRequest.blank('/fake/volumes') + req.method = 'GET' + req.content_type = 'application/json' + response = req.get_response(self.app) + self.assertEqual(200, response.status_int) + + def test_volumes_detail(self): + req = fakes.HTTPRequest.blank('/fake/volumes/detail') + req.method = 'GET' + req.content_type = 'application/json' + response = req.get_response(self.app) + self.assertEqual(200, response.status_int) + + def test_types(self): + req = fakes.HTTPRequest.blank('/fake/types') + req.method = 'GET' + req.content_type = 'application/json' + response = req.get_response(self.app) + self.assertEqual(200, response.status_int) + + def test_snapshots(self): + req = fakes.HTTPRequest.blank('/fake/snapshots') + req.method = 'GET' + req.content_type = 'application/json' + response = req.get_response(self.app) + self.assertEqual(200, response.status_int) + + def test_snapshots_detail(self): + req = fakes.HTTPRequest.blank('/fake/snapshots/detail') + req.method = 'GET' + req.content_type = 'application/json' + response = req.get_response(self.app) + self.assertEqual(200, response.status_int) diff --git a/cinder/tests/api/openstack/volume/test_snapshots.py b/cinder/tests/api/openstack/volume/test_snapshots.py new file mode 100644 index 000000000..8c87da514 --- /dev/null +++ b/cinder/tests/api/openstack/volume/test_snapshots.py @@ -0,0 +1,214 @@ +# Copyright 2011 Denali 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 datetime + +from lxml import etree +import webob + +from cinder.api.openstack.volume import snapshots +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder import test +from cinder import volume +from cinder.tests.api.openstack import fakes + +FLAGS = flags.FLAGS + +LOG = logging.getLogger(__name__) + + +def _get_default_snapshot_param(): + return { + 'id': 123, + 'volume_id': 12, + 'status': 'available', + 'volume_size': 100, + 'created_at': None, + 'display_name': 'Default name', + 'display_description': 'Default description', + } + + +def stub_snapshot_create(self, context, volume_id, name, description): + snapshot = _get_default_snapshot_param() + snapshot['volume_id'] = volume_id + snapshot['display_name'] = name + snapshot['display_description'] = description + return snapshot + + +def stub_snapshot_delete(self, context, snapshot): + if snapshot['id'] != 123: + raise exception.NotFound + + +def stub_snapshot_get(self, context, snapshot_id): + if snapshot_id != 123: + raise exception.NotFound + + param = _get_default_snapshot_param() + return param + + +def stub_snapshot_get_all(self, context): + param = _get_default_snapshot_param() + return [param] + + +class SnapshotApiTest(test.TestCase): + def setUp(self): + super(SnapshotApiTest, self).setUp() + self.controller = snapshots.SnapshotsController() + + self.stubs.Set(volume.api.API, "get_snapshot", stub_snapshot_get) + self.stubs.Set(volume.api.API, "get_all_snapshots", + stub_snapshot_get_all) + + def test_snapshot_create(self): + self.stubs.Set(volume.api.API, "create_snapshot", stub_snapshot_create) + self.stubs.Set(volume.api.API, 'get', fakes.stub_volume_get) + snapshot = {"volume_id": '12', + "force": False, + "display_name": "Snapshot Test Name", + "display_description": "Snapshot Test Desc"} + body = dict(snapshot=snapshot) + req = fakes.HTTPRequest.blank('/v1/snapshots') + resp_dict = self.controller.create(req, body) + + self.assertTrue('snapshot' in resp_dict) + self.assertEqual(resp_dict['snapshot']['display_name'], + snapshot['display_name']) + self.assertEqual(resp_dict['snapshot']['display_description'], + snapshot['display_description']) + + def test_snapshot_create_force(self): + self.stubs.Set(volume.api.API, "create_snapshot_force", + stub_snapshot_create) + self.stubs.Set(volume.api.API, 'get', fakes.stub_volume_get) + snapshot = {"volume_id": '12', + "force": True, + "display_name": "Snapshot Test Name", + "display_description": "Snapshot Test Desc"} + body = dict(snapshot=snapshot) + req = fakes.HTTPRequest.blank('/v1/snapshots') + resp_dict = self.controller.create(req, body) + + self.assertTrue('snapshot' in resp_dict) + self.assertEqual(resp_dict['snapshot']['display_name'], + snapshot['display_name']) + self.assertEqual(resp_dict['snapshot']['display_description'], + snapshot['display_description']) + + def test_snapshot_delete(self): + self.stubs.Set(volume.api.API, "delete_snapshot", stub_snapshot_delete) + + snapshot_id = 123 + req = fakes.HTTPRequest.blank('/v1/snapshots/%d' % snapshot_id) + resp = self.controller.delete(req, snapshot_id) + self.assertEqual(resp.status_int, 202) + + def test_snapshot_delete_invalid_id(self): + self.stubs.Set(volume.api.API, "delete_snapshot", stub_snapshot_delete) + snapshot_id = 234 + req = fakes.HTTPRequest.blank('/v1/snapshots/%d' % snapshot_id) + self.assertRaises(webob.exc.HTTPNotFound, + self.controller.delete, + req, + snapshot_id) + + def test_snapshot_show(self): + req = fakes.HTTPRequest.blank('/v1/snapshots/123') + resp_dict = self.controller.show(req, 123) + + self.assertTrue('snapshot' in resp_dict) + self.assertEqual(resp_dict['snapshot']['id'], '123') + + def test_snapshot_show_invalid_id(self): + snapshot_id = 234 + req = fakes.HTTPRequest.blank('/v1/snapshots/%d' % snapshot_id) + self.assertRaises(webob.exc.HTTPNotFound, + self.controller.show, + req, + snapshot_id) + + def test_snapshot_detail(self): + req = fakes.HTTPRequest.blank('/v1/snapshots/detail') + resp_dict = self.controller.detail(req) + + self.assertTrue('snapshots' in resp_dict) + resp_snapshots = resp_dict['snapshots'] + self.assertEqual(len(resp_snapshots), 1) + + resp_snapshot = resp_snapshots.pop() + self.assertEqual(resp_snapshot['id'], '123') + + +class SnapshotSerializerTest(test.TestCase): + def _verify_snapshot(self, snap, tree): + self.assertEqual(tree.tag, 'snapshot') + + for attr in ('id', 'status', 'size', 'created_at', + 'display_name', 'display_description', 'volume_id'): + self.assertEqual(str(snap[attr]), tree.get(attr)) + + def test_snapshot_show_create_serializer(self): + serializer = snapshots.SnapshotTemplate() + raw_snapshot = dict( + id='snap_id', + status='snap_status', + size=1024, + created_at=datetime.datetime.now(), + display_name='snap_name', + display_description='snap_desc', + volume_id='vol_id', + ) + text = serializer.serialize(dict(snapshot=raw_snapshot)) + + print text + tree = etree.fromstring(text) + + self._verify_snapshot(raw_snapshot, tree) + + def test_snapshot_index_detail_serializer(self): + serializer = snapshots.SnapshotsTemplate() + raw_snapshots = [dict( + id='snap1_id', + status='snap1_status', + size=1024, + created_at=datetime.datetime.now(), + display_name='snap1_name', + display_description='snap1_desc', + volume_id='vol1_id', + ), + dict( + id='snap2_id', + status='snap2_status', + size=1024, + created_at=datetime.datetime.now(), + display_name='snap2_name', + display_description='snap2_desc', + volume_id='vol2_id', + )] + text = serializer.serialize(dict(snapshots=raw_snapshots)) + + print text + tree = etree.fromstring(text) + + self.assertEqual('snapshots', tree.tag) + self.assertEqual(len(raw_snapshots), len(tree)) + for idx, child in enumerate(tree): + self._verify_snapshot(raw_snapshots[idx], child) diff --git a/cinder/tests/api/openstack/volume/test_types.py b/cinder/tests/api/openstack/volume/test_types.py new file mode 100644 index 000000000..e8d98d7de --- /dev/null +++ b/cinder/tests/api/openstack/volume/test_types.py @@ -0,0 +1,146 @@ +# Copyright 2011 OpenStack LLC. +# 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 lxml import etree +import webob + +from cinder.api.openstack.volume import types +from cinder import exception +from cinder import test +from cinder.volume import volume_types +from cinder.tests.api.openstack import fakes + + +def stub_volume_type(id): + specs = { + "key1": "value1", + "key2": "value2", + "key3": "value3", + "key4": "value4", + "key5": "value5"} + return dict(id=id, name='vol_type_%s' % str(id), extra_specs=specs) + + +def return_volume_types_get_all_types(context): + return dict(vol_type_1=stub_volume_type(1), + vol_type_2=stub_volume_type(2), + vol_type_3=stub_volume_type(3)) + + +def return_empty_volume_types_get_all_types(context): + return {} + + +def return_volume_types_get_volume_type(context, id): + if id == "777": + raise exception.VolumeTypeNotFound(volume_type_id=id) + return stub_volume_type(int(id)) + + +def return_volume_types_get_by_name(context, name): + if name == "777": + raise exception.VolumeTypeNotFoundByName(volume_type_name=name) + return stub_volume_type(int(name.split("_")[2])) + + +class VolumeTypesApiTest(test.TestCase): + def setUp(self): + super(VolumeTypesApiTest, self).setUp() + self.controller = types.VolumeTypesController() + + def test_volume_types_index(self): + self.stubs.Set(volume_types, 'get_all_types', + return_volume_types_get_all_types) + + req = fakes.HTTPRequest.blank('/v1/fake/types') + res_dict = self.controller.index(req) + + self.assertEqual(3, len(res_dict['volume_types'])) + + expected_names = ['vol_type_1', 'vol_type_2', 'vol_type_3'] + actual_names = map(lambda e: e['name'], res_dict['volume_types']) + self.assertEqual(set(actual_names), set(expected_names)) + for entry in res_dict['volume_types']: + self.assertEqual('value1', entry['extra_specs']['key1']) + + def test_volume_types_index_no_data(self): + self.stubs.Set(volume_types, 'get_all_types', + return_empty_volume_types_get_all_types) + + req = fakes.HTTPRequest.blank('/v1/fake/types') + res_dict = self.controller.index(req) + + self.assertEqual(0, len(res_dict['volume_types'])) + + def test_volume_types_show(self): + self.stubs.Set(volume_types, 'get_volume_type', + return_volume_types_get_volume_type) + + req = fakes.HTTPRequest.blank('/v1/fake/types/1') + res_dict = self.controller.show(req, 1) + + self.assertEqual(1, len(res_dict)) + self.assertEqual('1', res_dict['volume_type']['id']) + self.assertEqual('vol_type_1', res_dict['volume_type']['name']) + + def test_volume_types_show_not_found(self): + self.stubs.Set(volume_types, 'get_volume_type', + return_volume_types_get_volume_type) + + req = fakes.HTTPRequest.blank('/v1/fake/types/777') + self.assertRaises(webob.exc.HTTPNotFound, self.controller.show, + req, '777') + + +class VolumeTypesSerializerTest(test.TestCase): + def _verify_volume_type(self, vtype, tree): + self.assertEqual('volume_type', tree.tag) + self.assertEqual(vtype['name'], tree.get('name')) + self.assertEqual(str(vtype['id']), tree.get('id')) + self.assertEqual(1, len(tree)) + extra_specs = tree[0] + self.assertEqual('extra_specs', extra_specs.tag) + seen = set(vtype['extra_specs'].keys()) + for child in extra_specs: + self.assertTrue(child.tag in seen) + self.assertEqual(vtype['extra_specs'][child.tag], child.text) + seen.remove(child.tag) + self.assertEqual(len(seen), 0) + + def test_index_serializer(self): + serializer = types.VolumeTypesTemplate() + + # Just getting some input data + vtypes = return_volume_types_get_all_types(None) + text = serializer.serialize({'volume_types': vtypes.values()}) + + tree = etree.fromstring(text) + + self.assertEqual('volume_types', tree.tag) + self.assertEqual(len(vtypes), len(tree)) + for child in tree: + name = child.get('name') + self.assertTrue(name in vtypes) + self._verify_volume_type(vtypes[name], child) + + def test_voltype_serializer(self): + serializer = types.VolumeTypeTemplate() + + vtype = stub_volume_type(1) + text = serializer.serialize(dict(volume_type=vtype)) + + tree = etree.fromstring(text) + + self._verify_volume_type(vtype, tree) diff --git a/cinder/tests/api/openstack/volume/test_volumes.py b/cinder/tests/api/openstack/volume/test_volumes.py new file mode 100644 index 000000000..9563989a9 --- /dev/null +++ b/cinder/tests/api/openstack/volume/test_volumes.py @@ -0,0 +1,290 @@ +# Copyright 2013 Josh Durgin +# 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 datetime + +from lxml import etree +import webob + +from cinder.api.openstack.volume import volumes +from cinder import flags +from cinder import test +from cinder.tests.api.openstack import fakes +from cinder.volume import api as volume_api + + +FLAGS = flags.FLAGS +NS = '{http://docs.openstack.org/volume/api/v1}' + + +class VolumeApiTest(test.TestCase): + def setUp(self): + super(VolumeApiTest, self).setUp() + self.controller = volumes.VolumeController() + + self.stubs.Set(volume_api.API, 'get_all', fakes.stub_volume_get_all) + self.stubs.Set(volume_api.API, 'get', fakes.stub_volume_get) + self.stubs.Set(volume_api.API, 'delete', fakes.stub_volume_delete) + + def test_volume_create(self): + self.stubs.Set(volume_api.API, "create", fakes.stub_volume_create) + + vol = {"size": 100, + "display_name": "Volume Test Name", + "display_description": "Volume Test Desc", + "availability_zone": "zone1:host1"} + body = {"volume": vol} + req = fakes.HTTPRequest.blank('/v1/volumes') + res_dict = self.controller.create(req, body) + expected = {'volume': {'status': 'fakestatus', + 'display_description': 'Volume Test Desc', + 'availability_zone': 'zone1:host1', + 'display_name': 'Volume Test Name', + 'attachments': [{'device': '/', + 'server_id': 'fakeuuid', + 'id': '1', + 'volume_id': '1'}], + 'volume_type': 'vol_type_name', + 'snapshot_id': None, + 'metadata': {}, + 'id': '1', + 'created_at': datetime.datetime(1, 1, 1, + 1, 1, 1), + 'size': 100}} + self.assertEqual(res_dict, expected) + + def test_volume_create_no_body(self): + body = {} + req = fakes.HTTPRequest.blank('/v1/volumes') + self.assertRaises(webob.exc.HTTPUnprocessableEntity, + self.controller.create, + req, + body) + + def test_volume_list(self): + req = fakes.HTTPRequest.blank('/v1/volumes') + res_dict = self.controller.index(req) + expected = {'volumes': [{'status': 'fakestatus', + 'display_description': 'displaydesc', + 'availability_zone': 'fakeaz', + 'display_name': 'displayname', + 'attachments': [{'device': '/', + 'server_id': 'fakeuuid', + 'id': '1', + 'volume_id': '1'}], + 'volume_type': 'vol_type_name', + 'snapshot_id': None, + 'metadata': {}, + 'id': '1', + 'created_at': datetime.datetime(1, 1, 1, + 1, 1, 1), + 'size': 1}]} + self.assertEqual(res_dict, expected) + + def test_volume_list_detail(self): + req = fakes.HTTPRequest.blank('/v1/volumes/detail') + res_dict = self.controller.index(req) + expected = {'volumes': [{'status': 'fakestatus', + 'display_description': 'displaydesc', + 'availability_zone': 'fakeaz', + 'display_name': 'displayname', + 'attachments': [{'device': '/', + 'server_id': 'fakeuuid', + 'id': '1', + 'volume_id': '1'}], + 'volume_type': 'vol_type_name', + 'snapshot_id': None, + 'metadata': {}, + 'id': '1', + 'created_at': datetime.datetime(1, 1, 1, + 1, 1, 1), + 'size': 1}]} + self.assertEqual(res_dict, expected) + + def test_volume_show(self): + req = fakes.HTTPRequest.blank('/v1/volumes/1') + res_dict = self.controller.show(req, 1) + expected = {'volume': {'status': 'fakestatus', + 'display_description': 'displaydesc', + 'availability_zone': 'fakeaz', + 'display_name': 'displayname', + 'attachments': [{'device': '/', + 'server_id': 'fakeuuid', + 'id': '1', + 'volume_id': '1'}], + 'volume_type': 'vol_type_name', + 'snapshot_id': None, + 'metadata': {}, + 'id': '1', + 'created_at': datetime.datetime(1, 1, 1, + 1, 1, 1), + 'size': 1}} + self.assertEqual(res_dict, expected) + + def test_volume_show_no_attachments(self): + def stub_volume_get(self, context, volume_id): + return fakes.stub_volume(volume_id, attach_status='detached') + + self.stubs.Set(volume_api.API, 'get', stub_volume_get) + + req = fakes.HTTPRequest.blank('/v1/volumes/1') + res_dict = self.controller.show(req, 1) + expected = {'volume': {'status': 'fakestatus', + 'display_description': 'displaydesc', + 'availability_zone': 'fakeaz', + 'display_name': 'displayname', + 'attachments': [], + 'volume_type': 'vol_type_name', + 'snapshot_id': None, + 'metadata': {}, + 'id': '1', + 'created_at': datetime.datetime(1, 1, 1, + 1, 1, 1), + 'size': 1}} + self.assertEqual(res_dict, expected) + + def test_volume_show_no_volume(self): + self.stubs.Set(volume_api.API, "get", fakes.stub_volume_get_notfound) + + req = fakes.HTTPRequest.blank('/v1/volumes/1') + self.assertRaises(webob.exc.HTTPNotFound, + self.controller.show, + req, + 1) + + def test_volume_delete(self): + req = fakes.HTTPRequest.blank('/v1/volumes/1') + resp = self.controller.delete(req, 1) + self.assertEqual(resp.status_int, 202) + + def test_volume_delete_no_volume(self): + self.stubs.Set(volume_api.API, "get", fakes.stub_volume_get_notfound) + + req = fakes.HTTPRequest.blank('/v1/volumes/1') + self.assertRaises(webob.exc.HTTPNotFound, + self.controller.delete, + req, + 1) + + +class VolumeSerializerTest(test.TestCase): + def _verify_volume_attachment(self, attach, tree): + for attr in ('id', 'volume_id', 'server_id', 'device'): + self.assertEqual(str(attach[attr]), tree.get(attr)) + + def _verify_volume(self, vol, tree): + self.assertEqual(tree.tag, NS + 'volume') + + for attr in ('id', 'status', 'size', 'availability_zone', 'created_at', + 'display_name', 'display_description', 'volume_type', + 'snapshot_id'): + self.assertEqual(str(vol[attr]), tree.get(attr)) + + for child in tree: + print child.tag + self.assertTrue(child.tag in (NS + 'attachments', NS + 'metadata')) + if child.tag == 'attachments': + self.assertEqual(1, len(child)) + self.assertEqual('attachment', child[0].tag) + self._verify_volume_attachment(vol['attachments'][0], child[0]) + elif child.tag == 'metadata': + not_seen = set(vol['metadata'].keys()) + for gr_child in child: + self.assertTrue(gr_child.tag in not_seen) + self.assertEqual(str(vol['metadata'][gr_child.tag]), + gr_child.text) + not_seen.remove(gr_child.tag) + self.assertEqual(0, len(not_seen)) + + def test_volume_show_create_serializer(self): + serializer = volumes.VolumeTemplate() + raw_volume = dict( + id='vol_id', + status='vol_status', + size=1024, + availability_zone='vol_availability', + created_at=datetime.datetime.now(), + attachments=[dict( + id='vol_id', + volume_id='vol_id', + server_id='instance_uuid', + device='/foo')], + display_name='vol_name', + display_description='vol_desc', + volume_type='vol_type', + snapshot_id='snap_id', + metadata=dict( + foo='bar', + baz='quux', + ), + ) + text = serializer.serialize(dict(volume=raw_volume)) + + print text + tree = etree.fromstring(text) + + self._verify_volume(raw_volume, tree) + + def test_volume_index_detail_serializer(self): + serializer = volumes.VolumesTemplate() + raw_volumes = [dict( + id='vol1_id', + status='vol1_status', + size=1024, + availability_zone='vol1_availability', + created_at=datetime.datetime.now(), + attachments=[dict( + id='vol1_id', + volume_id='vol1_id', + server_id='instance_uuid', + device='/foo1')], + display_name='vol1_name', + display_description='vol1_desc', + volume_type='vol1_type', + snapshot_id='snap1_id', + metadata=dict( + foo='vol1_foo', + bar='vol1_bar', + ), + ), + dict( + id='vol2_id', + status='vol2_status', + size=1024, + availability_zone='vol2_availability', + created_at=datetime.datetime.now(), + attachments=[dict( + id='vol2_id', + volume_id='vol2_id', + server_id='instance_uuid', + device='/foo2')], + display_name='vol2_name', + display_description='vol2_desc', + volume_type='vol2_type', + snapshot_id='snap2_id', + metadata=dict( + foo='vol2_foo', + bar='vol2_bar', + ), + )] + text = serializer.serialize(dict(volumes=raw_volumes)) + + print text + tree = etree.fromstring(text) + + self.assertEqual(NS + 'volumes', tree.tag) + self.assertEqual(len(raw_volumes), len(tree)) + for idx, child in enumerate(tree): + self._verify_volume(raw_volumes[idx], child) diff --git a/cinder/tests/api/test_auth.py b/cinder/tests/api/test_auth.py new file mode 100644 index 000000000..cfb8b7775 --- /dev/null +++ b/cinder/tests/api/test_auth.py @@ -0,0 +1,58 @@ +# Copyright (c) 2012 OpenStack, LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 webob + +import cinder.api.auth +from cinder import test + + +class TestCinderKeystoneContextMiddleware(test.TestCase): + + def setUp(self): + super(TestCinderKeystoneContextMiddleware, self).setUp() + + @webob.dec.wsgify() + def fake_app(req): + self.context = req.environ['cinder.context'] + return webob.Response() + + self.context = None + self.middleware = cinder.api.auth.CinderKeystoneContext(fake_app) + self.request = webob.Request.blank('/') + self.request.headers['X_TENANT_ID'] = 'testtenantid' + self.request.headers['X_AUTH_TOKEN'] = 'testauthtoken' + + def test_no_user_or_user_id(self): + response = self.request.get_response(self.middleware) + self.assertEqual(response.status, '401 Unauthorized') + + def test_user_only(self): + self.request.headers['X_USER_ID'] = 'testuserid' + response = self.request.get_response(self.middleware) + self.assertEqual(response.status, '200 OK') + self.assertEqual(self.context.user_id, 'testuserid') + + def test_user_id_only(self): + self.request.headers['X_USER'] = 'testuser' + response = self.request.get_response(self.middleware) + self.assertEqual(response.status, '200 OK') + self.assertEqual(self.context.user_id, 'testuser') + + def test_user_id_trumps_user(self): + self.request.headers['X_USER_ID'] = 'testuserid' + self.request.headers['X_USER'] = 'testuser' + response = self.request.get_response(self.middleware) + self.assertEqual(response.status, '200 OK') + self.assertEqual(self.context.user_id, 'testuserid') diff --git a/cinder/tests/api/test_sizelimit.py b/cinder/tests/api/test_sizelimit.py new file mode 100644 index 000000000..280ee9c29 --- /dev/null +++ b/cinder/tests/api/test_sizelimit.py @@ -0,0 +1,51 @@ +# Copyright (c) 2012 OpenStack, LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 webob + +import cinder.api.sizelimit +from cinder import flags +from cinder import test + +FLAGS = flags.FLAGS +MAX_REQUEST_BODY_SIZE = FLAGS.osapi_max_request_body_size + + +class TestRequestBodySizeLimiter(test.TestCase): + + def setUp(self): + super(TestRequestBodySizeLimiter, self).setUp() + + @webob.dec.wsgify() + def fake_app(req): + return webob.Response() + + self.middleware = cinder.api.sizelimit.RequestBodySizeLimiter(fake_app) + self.request = webob.Request.blank('/', method='POST') + + def test_content_length_acceptable(self): + self.request.headers['Content-Length'] = MAX_REQUEST_BODY_SIZE + self.request.body = "0" * MAX_REQUEST_BODY_SIZE + response = self.request.get_response(self.middleware) + self.assertEqual(response.status_int, 200) + + def test_content_length_to_large(self): + self.request.headers['Content-Length'] = MAX_REQUEST_BODY_SIZE + 1 + response = self.request.get_response(self.middleware) + self.assertEqual(response.status_int, 400) + + def test_request_to_large(self): + self.request.body = "0" * (MAX_REQUEST_BODY_SIZE + 1) + response = self.request.get_response(self.middleware) + self.assertEqual(response.status_int, 400) diff --git a/cinder/tests/api/test_wsgi.py b/cinder/tests/api/test_wsgi.py new file mode 100644 index 000000000..c68f8158e --- /dev/null +++ b/cinder/tests/api/test_wsgi.py @@ -0,0 +1,67 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# Copyright 2010 OpenStack LLC. +# 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. + +""" +Test WSGI basics and provide some helper functions for other WSGI tests. +""" + +from cinder import test + +import routes +import webob + +from cinder import wsgi + + +class Test(test.TestCase): + + def test_debug(self): + + class Application(wsgi.Application): + """Dummy application to test debug.""" + + def __call__(self, environ, start_response): + start_response("200", [("X-Test", "checking")]) + return ['Test result'] + + application = wsgi.Debug(Application()) + result = webob.Request.blank('/').get_response(application) + self.assertEqual(result.body, "Test result") + + def test_router(self): + + class Application(wsgi.Application): + """Test application to call from router.""" + + def __call__(self, environ, start_response): + start_response("200", []) + return ['Router result'] + + class Router(wsgi.Router): + """Test router.""" + + def __init__(self): + mapper = routes.Mapper() + mapper.connect("/test", controller=Application()) + super(Router, self).__init__(mapper) + + result = webob.Request.blank('/test').get_response(Router()) + self.assertEqual(result.body, "Router result") + result = webob.Request.blank('/bad').get_response(Router()) + self.assertNotEqual(result.body, "Router result") diff --git a/cinder/tests/db/__init__.py b/cinder/tests/db/__init__.py new file mode 100644 index 000000000..2d43aac42 --- /dev/null +++ b/cinder/tests/db/__init__.py @@ -0,0 +1,20 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2010 Citrix 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. + +""" +:mod:`db` -- Stubs for DB API +============================= +""" diff --git a/cinder/tests/db/fakes.py b/cinder/tests/db/fakes.py new file mode 100644 index 000000000..5cd2284d2 --- /dev/null +++ b/cinder/tests/db/fakes.py @@ -0,0 +1,47 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 X.commerce, a business unit of eBay Inc. +# Copyright 2010 OpenStack, LLC +# 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. + +"""Stubouts, mocks and fixtures for the test suite""" + +from cinder import db +from cinder import exception + + +class FakeModel(object): + """Stubs out for model.""" + def __init__(self, values): + self.values = values + + def __getattr__(self, name): + return self.values[name] + + def __getitem__(self, key): + if key in self.values: + return self.values[key] + else: + raise NotImplementedError() + + def __repr__(self): + return '<FakeModel: %s>' % self.values + + +def stub_out(stubs, funcs): + """Set the stubs in mapping in the db api.""" + for func in funcs: + func_name = '_'.join(func.__name__.split('_')[1:]) + stubs.Set(db, func_name, func) diff --git a/cinder/tests/declare_flags.py b/cinder/tests/declare_flags.py new file mode 100644 index 000000000..ee4733fc1 --- /dev/null +++ b/cinder/tests/declare_flags.py @@ -0,0 +1,23 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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 cinder import flags +from cinder.openstack.common import cfg + +FLAGS = flags.FLAGS +FLAGS.register_opt(cfg.IntOpt('answer', default=42, help='test flag')) diff --git a/cinder/tests/fake_flags.py b/cinder/tests/fake_flags.py new file mode 100644 index 000000000..89d0f84f7 --- /dev/null +++ b/cinder/tests/fake_flags.py @@ -0,0 +1,34 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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 cinder import flags + +FLAGS = flags.FLAGS + +flags.DECLARE('volume_driver', 'cinder.volume.manager') +FLAGS.set_default('volume_driver', 'cinder.volume.driver.FakeISCSIDriver') +FLAGS.set_default('connection_type', 'fake') +FLAGS.set_default('fake_rabbit', True) +FLAGS.set_default('rpc_backend', 'cinder.rpc.impl_fake') +flags.DECLARE('iscsi_num_targets', 'cinder.volume.driver') +FLAGS.set_default('iscsi_num_targets', 8) +FLAGS.set_default('verbose', True) +FLAGS.set_default('sql_connection', "sqlite://") +FLAGS.set_default('sqlite_synchronous', False) +flags.DECLARE('policy_file', 'cinder.policy') +FLAGS.set_default('policy_file', 'cinder/tests/policy.json') diff --git a/cinder/tests/fake_utils.py b/cinder/tests/fake_utils.py new file mode 100644 index 000000000..02f0e14ca --- /dev/null +++ b/cinder/tests/fake_utils.py @@ -0,0 +1,112 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 Citrix 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. + +"""This modules stubs out functions in cinder.utils.""" + +import re + +from eventlet import greenthread + +from cinder import exception +from cinder import log as logging +from cinder import utils + +LOG = logging.getLogger(__name__) + +_fake_execute_repliers = [] +_fake_execute_log = [] + + +def fake_execute_get_log(): + return _fake_execute_log + + +def fake_execute_clear_log(): + global _fake_execute_log + _fake_execute_log = [] + + +def fake_execute_set_repliers(repliers): + """Allows the client to configure replies to commands.""" + global _fake_execute_repliers + _fake_execute_repliers = repliers + + +def fake_execute_default_reply_handler(*ignore_args, **ignore_kwargs): + """A reply handler for commands that haven't been added to the reply list. + + Returns empty strings for stdout and stderr. + + """ + return '', '' + + +def fake_execute(*cmd_parts, **kwargs): + """This function stubs out execute. + + It optionally executes a preconfigued function to return expected data. + + """ + global _fake_execute_repliers + + process_input = kwargs.get('process_input', None) + check_exit_code = kwargs.get('check_exit_code', 0) + delay_on_retry = kwargs.get('delay_on_retry', True) + attempts = kwargs.get('attempts', 1) + run_as_root = kwargs.get('run_as_root', False) + cmd_str = ' '.join(str(part) for part in cmd_parts) + + LOG.debug(_("Faking execution of cmd (subprocess): %s"), cmd_str) + _fake_execute_log.append(cmd_str) + + reply_handler = fake_execute_default_reply_handler + + for fake_replier in _fake_execute_repliers: + if re.match(fake_replier[0], cmd_str): + reply_handler = fake_replier[1] + LOG.debug(_('Faked command matched %s') % fake_replier[0]) + break + + if isinstance(reply_handler, basestring): + # If the reply handler is a string, return it as stdout + reply = reply_handler, '' + else: + try: + # Alternative is a function, so call it + reply = reply_handler(cmd_parts, + process_input=process_input, + delay_on_retry=delay_on_retry, + attempts=attempts, + run_as_root=run_as_root, + check_exit_code=check_exit_code) + except exception.ProcessExecutionError as e: + LOG.debug(_('Faked command raised an exception %s'), e) + raise + + stdout = reply[0] + stderr = reply[1] + LOG.debug(_("Reply to faked command is stdout='%(stdout)s' " + "stderr='%(stderr)s'") % locals()) + + # Replicate the sleep call in the real function + greenthread.sleep(0) + return reply + + +def stub_out_utils_execute(stubs): + fake_execute_set_repliers([]) + fake_execute_clear_log() + stubs.Set(utils, 'execute', fake_execute) diff --git a/cinder/tests/integrated/__init__.py b/cinder/tests/integrated/__init__.py new file mode 100644 index 000000000..7c17b5ad7 --- /dev/null +++ b/cinder/tests/integrated/__init__.py @@ -0,0 +1,22 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 Justin Santa Barbara +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +""" +:mod:`integrated` -- Tests whole systems, using mock services where needed +================================= +""" +# NOTE(vish): this forces the fixtures from tests/__init.py:setup() to work +from cinder.tests import * diff --git a/cinder/tests/integrated/api/__init__.py b/cinder/tests/integrated/api/__init__.py new file mode 100644 index 000000000..5798ab3d1 --- /dev/null +++ b/cinder/tests/integrated/api/__init__.py @@ -0,0 +1,20 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 Justin Santa Barbara +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +""" +:mod:`api` -- OpenStack API client, for testing rather than production +================================= +""" diff --git a/cinder/tests/integrated/api/client.py b/cinder/tests/integrated/api/client.py new file mode 100644 index 000000000..51e247d4f --- /dev/null +++ b/cinder/tests/integrated/api/client.py @@ -0,0 +1,217 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 Justin Santa Barbara +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 json +import httplib +import urllib +import urlparse + +from cinder import log as logging + + +LOG = logging.getLogger(__name__) + + +class OpenStackApiException(Exception): + def __init__(self, message=None, response=None): + self.response = response + if not message: + message = 'Unspecified error' + + if response: + _status = response.status + _body = response.read() + + message = _('%(message)s\nStatus Code: %(_status)s\n' + 'Body: %(_body)s') % locals() + + super(OpenStackApiException, self).__init__(message) + + +class OpenStackApiAuthenticationException(OpenStackApiException): + def __init__(self, response=None, message=None): + if not message: + message = _("Authentication error") + super(OpenStackApiAuthenticationException, self).__init__(message, + response) + + +class OpenStackApiAuthorizationException(OpenStackApiException): + def __init__(self, response=None, message=None): + if not message: + message = _("Authorization error") + super(OpenStackApiAuthorizationException, self).__init__(message, + response) + + +class OpenStackApiNotFoundException(OpenStackApiException): + def __init__(self, response=None, message=None): + if not message: + message = _("Item not found") + super(OpenStackApiNotFoundException, self).__init__(message, response) + + +class TestOpenStackClient(object): + """Simple OpenStack API Client. + + This is a really basic OpenStack API client that is under our control, + so we can make changes / insert hooks for testing + + """ + + def __init__(self, auth_user, auth_key, auth_uri): + super(TestOpenStackClient, self).__init__() + self.auth_result = None + self.auth_user = auth_user + self.auth_key = auth_key + self.auth_uri = auth_uri + # default project_id + self.project_id = 'openstack' + + def request(self, url, method='GET', body=None, headers=None): + _headers = {'Content-Type': 'application/json'} + _headers.update(headers or {}) + + parsed_url = urlparse.urlparse(url) + port = parsed_url.port + hostname = parsed_url.hostname + scheme = parsed_url.scheme + + if scheme == 'http': + conn = httplib.HTTPConnection(hostname, + port=port) + elif scheme == 'https': + conn = httplib.HTTPSConnection(hostname, + port=port) + else: + raise OpenStackApiException("Unknown scheme: %s" % url) + + relative_url = parsed_url.path + if parsed_url.query: + relative_url = relative_url + "?" + parsed_url.query + LOG.info(_("Doing %(method)s on %(relative_url)s") % locals()) + if body: + LOG.info(_("Body: %s") % body) + + conn.request(method, relative_url, body, _headers) + response = conn.getresponse() + return response + + def _authenticate(self): + if self.auth_result: + return self.auth_result + + auth_uri = self.auth_uri + headers = {'X-Auth-User': self.auth_user, + 'X-Auth-Key': self.auth_key, + 'X-Auth-Project-Id': self.project_id} + response = self.request(auth_uri, + headers=headers) + + http_status = response.status + LOG.debug(_("%(auth_uri)s => code %(http_status)s") % locals()) + + if http_status == 401: + raise OpenStackApiAuthenticationException(response=response) + + auth_headers = {} + for k, v in response.getheaders(): + auth_headers[k] = v + + self.auth_result = auth_headers + return self.auth_result + + def api_request(self, relative_uri, check_response_status=None, **kwargs): + auth_result = self._authenticate() + + # NOTE(justinsb): httplib 'helpfully' converts headers to lower case + base_uri = auth_result['x-server-management-url'] + + full_uri = '%s/%s' % (base_uri, relative_uri) + + headers = kwargs.setdefault('headers', {}) + headers['X-Auth-Token'] = auth_result['x-auth-token'] + + response = self.request(full_uri, **kwargs) + + http_status = response.status + LOG.debug(_("%(relative_uri)s => code %(http_status)s") % locals()) + + if check_response_status: + if not http_status in check_response_status: + if http_status == 404: + raise OpenStackApiNotFoundException(response=response) + elif http_status == 401: + raise OpenStackApiAuthorizationException(response=response) + else: + raise OpenStackApiException( + message=_("Unexpected status code"), + response=response) + + return response + + def _decode_json(self, response): + body = response.read() + LOG.debug(_("Decoding JSON: %s") % (body)) + if body: + return json.loads(body) + else: + return "" + + def api_get(self, relative_uri, **kwargs): + kwargs.setdefault('check_response_status', [200]) + response = self.api_request(relative_uri, **kwargs) + return self._decode_json(response) + + def api_post(self, relative_uri, body, **kwargs): + kwargs['method'] = 'POST' + if body: + headers = kwargs.setdefault('headers', {}) + headers['Content-Type'] = 'application/json' + kwargs['body'] = json.dumps(body) + + kwargs.setdefault('check_response_status', [200, 202]) + response = self.api_request(relative_uri, **kwargs) + return self._decode_json(response) + + def api_put(self, relative_uri, body, **kwargs): + kwargs['method'] = 'PUT' + if body: + headers = kwargs.setdefault('headers', {}) + headers['Content-Type'] = 'application/json' + kwargs['body'] = json.dumps(body) + + kwargs.setdefault('check_response_status', [200, 202, 204]) + response = self.api_request(relative_uri, **kwargs) + return self._decode_json(response) + + def api_delete(self, relative_uri, **kwargs): + kwargs['method'] = 'DELETE' + kwargs.setdefault('check_response_status', [200, 202, 204]) + return self.api_request(relative_uri, **kwargs) + + def get_volume(self, volume_id): + return self.api_get('/volumes/%s' % volume_id)['volume'] + + def get_volumes(self, detail=True): + rel_url = '/volumes/detail' if detail else '/volumes' + return self.api_get(rel_url)['volumes'] + + def post_volume(self, volume): + return self.api_post('/volumes', volume)['volume'] + + def delete_volume(self, volume_id): + return self.api_delete('/volumes/%s' % volume_id) diff --git a/cinder/tests/integrated/integrated_helpers.py b/cinder/tests/integrated/integrated_helpers.py new file mode 100644 index 000000000..4b243efc1 --- /dev/null +++ b/cinder/tests/integrated/integrated_helpers.py @@ -0,0 +1,130 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 Justin Santa Barbara +# 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. + +""" +Provides common functionality for integrated unit tests +""" + +import random +import string + +from cinder.log import logging +from cinder import service +from cinder import test # For the flags +from cinder.tests.integrated.api import client +from cinder import utils + + +LOG = logging.getLogger(__name__) + + +def generate_random_alphanumeric(length): + """Creates a random alphanumeric string of specified length.""" + return ''.join(random.choice(string.ascii_uppercase + string.digits) + for _x in range(length)) + + +def generate_random_numeric(length): + """Creates a random numeric string of specified length.""" + return ''.join(random.choice(string.digits) + for _x in range(length)) + + +def generate_new_element(items, prefix, numeric=False): + """Creates a random string with prefix, that is not in 'items' list.""" + while True: + if numeric: + candidate = prefix + generate_random_numeric(8) + else: + candidate = prefix + generate_random_alphanumeric(8) + if not candidate in items: + return candidate + LOG.debug("Random collision on %s" % candidate) + + +class _IntegratedTestBase(test.TestCase): + def setUp(self): + super(_IntegratedTestBase, self).setUp() + + f = self._get_flags() + self.flags(**f) + self.flags(verbose=True) + + # set up services + self.volume = self.start_service('volume') + self.scheduler = self.start_service('scheduler') + + self._start_api_service() + + self.api = client.TestOpenStackClient('fake', 'fake', self.auth_url) + + def tearDown(self): + self.osapi.stop() + super(_IntegratedTestBase, self).tearDown() + + def _start_api_service(self): + self.osapi = service.WSGIService("osapi_volume") + self.osapi.start() + # FIXME(ja): this is not the auth url - this is the service url + # FIXME(ja): this needs fixed in nova as well + self.auth_url = 'http://%s:%s/v1' % (self.osapi.host, self.osapi.port) + LOG.warn(self.auth_url) + + def _get_flags(self): + """An opportunity to setup flags, before the services are started.""" + f = {} + + # Ensure tests only listen on localhost + f['osapi_volume_listen'] = '127.0.0.1' + + # Auto-assign ports to allow concurrent tests + f['osapi_volume_listen_port'] = 0 + + return f + + def get_unused_server_name(self): + servers = self.api.get_servers() + server_names = [server['name'] for server in servers] + return generate_new_element(server_names, 'server') + + def get_invalid_image(self): + return str(utils.gen_uuid()) + + def _build_minimal_create_server_request(self): + server = {} + + image = self.api.get_images()[0] + LOG.debug("Image: %s" % image) + + if 'imageRef' in image: + image_href = image['imageRef'] + else: + image_href = image['id'] + image_href = 'http://fake.server/%s' % image_href + + # We now have a valid imageId + server['imageRef'] = image_href + + # Set a valid flavorId + flavor = self.api.get_flavors()[0] + LOG.debug("Using flavor: %s" % flavor) + server['flavorRef'] = 'http://fake.server/%s' % flavor['id'] + + # Set a valid server name + server_name = self.get_unused_server_name() + server['name'] = server_name + return server diff --git a/cinder/tests/integrated/test_extensions.py b/cinder/tests/integrated/test_extensions.py new file mode 100644 index 000000000..bcb921d83 --- /dev/null +++ b/cinder/tests/integrated/test_extensions.py @@ -0,0 +1,42 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 Justin Santa Barbara +# 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 cinder.api.openstack.volume import extensions +from cinder import flags +from cinder.log import logging +from cinder.tests.integrated import integrated_helpers + + +FLAGS = flags.FLAGS +LOG = logging.getLogger(__name__) + + +class ExtensionsTest(integrated_helpers._IntegratedTestBase): + def _get_flags(self): + f = super(ExtensionsTest, self)._get_flags() + f['osapi_volume_extension'] = FLAGS.osapi_volume_extension[:] + f['osapi_volume_extension'].append( + 'cinder.tests.api.openstack.volume.extensions.' + 'foxinsocks.Foxinsocks') + return f + + def test_get_foxnsocks(self): + """Simple check that fox-n-socks works.""" + response = self.api.api_request('/foxnsocks') + foxnsocks = response.read() + LOG.debug("foxnsocks: %s" % foxnsocks) + self.assertEqual('Try to say this Mr. Knox, sir...', foxnsocks) diff --git a/cinder/tests/integrated/test_login.py b/cinder/tests/integrated/test_login.py new file mode 100644 index 000000000..cd9fb7a16 --- /dev/null +++ b/cinder/tests/integrated/test_login.py @@ -0,0 +1,31 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 Justin Santa Barbara +# 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 cinder.log import logging +from cinder.tests.integrated import integrated_helpers + + +LOG = logging.getLogger(__name__) + + +class LoginTest(integrated_helpers._IntegratedTestBase): + def test_login(self): + """Simple check - we list volumes - so we know we're logged in.""" + volumes = self.api.get_volumes() + for volume in volumes: + LOG.debug(_("volume: %s") % volume) diff --git a/cinder/tests/integrated/test_volumes.py b/cinder/tests/integrated/test_volumes.py new file mode 100644 index 000000000..f94d85604 --- /dev/null +++ b/cinder/tests/integrated/test_volumes.py @@ -0,0 +1,181 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 Justin Santa Barbara +# 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 unittest +import time + +from cinder import service +from cinder.log import logging +from cinder.tests.integrated import integrated_helpers +from cinder.tests.integrated.api import client +from cinder.volume import driver + + +LOG = logging.getLogger(__name__) + + +class VolumesTest(integrated_helpers._IntegratedTestBase): + def setUp(self): + super(VolumesTest, self).setUp() + driver.LoggingVolumeDriver.clear_logs() + + def _start_api_service(self): + self.osapi = service.WSGIService("osapi_volume") + self.osapi.start() + self.auth_url = 'http://%s:%s/v1' % (self.osapi.host, self.osapi.port) + LOG.warn(self.auth_url) + + def _get_flags(self): + f = super(VolumesTest, self)._get_flags() + f['use_local_volumes'] = False # Avoids calling local_path + f['volume_driver'] = 'cinder.volume.driver.LoggingVolumeDriver' + return f + + def test_get_volumes_summary(self): + """Simple check that listing volumes works.""" + volumes = self.api.get_volumes(False) + for volume in volumes: + LOG.debug("volume: %s" % volume) + + def test_get_volumes(self): + """Simple check that listing volumes works.""" + volumes = self.api.get_volumes() + for volume in volumes: + LOG.debug("volume: %s" % volume) + + def _poll_while(self, volume_id, continue_states, max_retries=5): + """Poll (briefly) while the state is in continue_states.""" + retries = 0 + while True: + try: + found_volume = self.api.get_volume(volume_id) + except client.OpenStackApiNotFoundException: + found_volume = None + LOG.debug("Got 404, proceeding") + break + + LOG.debug("Found %s" % found_volume) + + self.assertEqual(volume_id, found_volume['id']) + + if not found_volume['status'] in continue_states: + break + + time.sleep(1) + retries = retries + 1 + if retries > max_retries: + break + return found_volume + + def test_create_and_delete_volume(self): + """Creates and deletes a volume.""" + + # Create volume + created_volume = self.api.post_volume({'volume': {'size': 1}}) + LOG.debug("created_volume: %s" % created_volume) + self.assertTrue(created_volume['id']) + created_volume_id = created_volume['id'] + + # Check it's there + found_volume = self.api.get_volume(created_volume_id) + self.assertEqual(created_volume_id, found_volume['id']) + + # It should also be in the all-volume list + volumes = self.api.get_volumes() + volume_names = [volume['id'] for volume in volumes] + self.assertTrue(created_volume_id in volume_names) + + # Wait (briefly) for creation. Delay is due to the 'message queue' + found_volume = self._poll_while(created_volume_id, ['creating']) + + # It should be available... + self.assertEqual('available', found_volume['status']) + + # Delete the volume + self.api.delete_volume(created_volume_id) + + # Wait (briefly) for deletion. Delay is due to the 'message queue' + found_volume = self._poll_while(created_volume_id, ['deleting']) + + # Should be gone + self.assertFalse(found_volume) + + LOG.debug("Logs: %s" % driver.LoggingVolumeDriver.all_logs()) + + create_actions = driver.LoggingVolumeDriver.logs_like( + 'create_volume', + id=created_volume_id) + LOG.debug("Create_Actions: %s" % create_actions) + + self.assertEquals(1, len(create_actions)) + create_action = create_actions[0] + self.assertEquals(create_action['id'], created_volume_id) + self.assertEquals(create_action['availability_zone'], 'cinder') + self.assertEquals(create_action['size'], 1) + + export_actions = driver.LoggingVolumeDriver.logs_like( + 'create_export', + id=created_volume_id) + self.assertEquals(1, len(export_actions)) + export_action = export_actions[0] + self.assertEquals(export_action['id'], created_volume_id) + self.assertEquals(export_action['availability_zone'], 'cinder') + + delete_actions = driver.LoggingVolumeDriver.logs_like( + 'delete_volume', + id=created_volume_id) + self.assertEquals(1, len(delete_actions)) + delete_action = export_actions[0] + self.assertEquals(delete_action['id'], created_volume_id) + + def test_create_volume_with_metadata(self): + """Creates a volume with metadata.""" + + # Create volume + metadata = {'key1': 'value1', + 'key2': 'value2'} + created_volume = self.api.post_volume( + {'volume': {'size': 1, + 'metadata': metadata}}) + LOG.debug("created_volume: %s" % created_volume) + self.assertTrue(created_volume['id']) + created_volume_id = created_volume['id'] + + # Check it's there and metadata present + found_volume = self.api.get_volume(created_volume_id) + self.assertEqual(created_volume_id, found_volume['id']) + self.assertEqual(metadata, found_volume['metadata']) + + def test_create_volume_in_availability_zone(self): + """Creates a volume in availability_zone.""" + + # Create volume + availability_zone = 'zone1:host1' + created_volume = self.api.post_volume( + {'volume': {'size': 1, + 'availability_zone': availability_zone}}) + LOG.debug("created_volume: %s" % created_volume) + self.assertTrue(created_volume['id']) + created_volume_id = created_volume['id'] + + # Check it's there and availability zone present + found_volume = self.api.get_volume(created_volume_id) + self.assertEqual(created_volume_id, found_volume['id']) + self.assertEqual(availability_zone, found_volume['availability_zone']) + +if __name__ == "__main__": + unittest.main() diff --git a/cinder/tests/integrated/test_xml.py b/cinder/tests/integrated/test_xml.py new file mode 100644 index 000000000..1277b80aa --- /dev/null +++ b/cinder/tests/integrated/test_xml.py @@ -0,0 +1,52 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 Justin Santa Barbara +# 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 lxml import etree + +from cinder.log import logging +from cinder.tests.integrated import integrated_helpers +from cinder.api.openstack import common +from cinder.api.openstack import xmlutil + + +LOG = logging.getLogger(__name__) + + +class XmlTests(integrated_helpers._IntegratedTestBase): + """"Some basic XML sanity checks.""" + + # FIXME(ja): does cinder need limits? + # def test_namespace_limits(self): + # headers = {} + # headers['Accept'] = 'application/xml' + + # response = self.api.api_request('/limits', headers=headers) + # data = response.read() + # LOG.debug("data: %s" % data) + # root = etree.XML(data) + # self.assertEqual(root.nsmap.get(None), xmlutil.XMLNS_COMMON_V10) + + def test_namespace_volumes(self): + """/servers should have v1.1 namespace (has changed in 1.1).""" + headers = {} + headers['Accept'] = 'application/xml' + + response = self.api.api_request('/volumes', headers=headers) + data = response.read() + LOG.warn("data: %s" % data) + root = etree.XML(data) + self.assertEqual(root.nsmap.get(None), common.XML_NS_V1) diff --git a/cinder/tests/monkey_patch_example/__init__.py b/cinder/tests/monkey_patch_example/__init__.py new file mode 100644 index 000000000..25cf9ccfe --- /dev/null +++ b/cinder/tests/monkey_patch_example/__init__.py @@ -0,0 +1,33 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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. +"""Example Module for testing utils.monkey_patch().""" + + +CALLED_FUNCTION = [] + + +def example_decorator(name, function): + """ decorator for notify which is used from utils.monkey_patch() + + :param name: name of the function + :param function: - object of the function + :returns: function -- decorated function + """ + def wrapped_func(*args, **kwarg): + CALLED_FUNCTION.append(name) + return function(*args, **kwarg) + return wrapped_func diff --git a/cinder/tests/monkey_patch_example/example_a.py b/cinder/tests/monkey_patch_example/example_a.py new file mode 100644 index 000000000..21e79bcb0 --- /dev/null +++ b/cinder/tests/monkey_patch_example/example_a.py @@ -0,0 +1,29 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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. +"""Example Module A for testing utils.monkey_patch().""" + + +def example_function_a(): + return 'Example function' + + +class ExampleClassA(): + def example_method(self): + return 'Example method' + + def example_method_add(self, arg1, arg2): + return arg1 + arg2 diff --git a/cinder/tests/monkey_patch_example/example_b.py b/cinder/tests/monkey_patch_example/example_b.py new file mode 100644 index 000000000..9d8f6d339 --- /dev/null +++ b/cinder/tests/monkey_patch_example/example_b.py @@ -0,0 +1,30 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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. + +"""Example Module B for testing utils.monkey_patch().""" + + +def example_function_b(): + return 'Example function' + + +class ExampleClassB(): + def example_method(self): + return 'Example method' + + def example_method_add(self, arg1, arg2): + return arg1 + arg2 diff --git a/cinder/tests/notifier/__init__.py b/cinder/tests/notifier/__init__.py new file mode 100644 index 000000000..643e7c463 --- /dev/null +++ b/cinder/tests/notifier/__init__.py @@ -0,0 +1,16 @@ +# Copyright 2011 OpenStack LLC. +# 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 cinder.tests import * diff --git a/cinder/tests/notifier/test_capacity_notifier.py b/cinder/tests/notifier/test_capacity_notifier.py new file mode 100644 index 000000000..298de5f60 --- /dev/null +++ b/cinder/tests/notifier/test_capacity_notifier.py @@ -0,0 +1,59 @@ +# Copyright 2011 OpenStack LLC. +# 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 cinder.db.api +from cinder.notifier import capacity_notifier as cn +from cinder import test +from cinder import utils + + +class CapacityNotifierTestCase(test.TestCase): + """Test case for the Capacity updating notifier.""" + + def _make_msg(self, host, event): + usage_info = dict(memory_mb=123, disk_gb=456) + payload = utils.to_primitive(usage_info, convert_instances=True) + return dict( + publisher_id="compute.%s" % host, + event_type="compute.instance.%s" % event, + payload=payload + ) + + def test_event_type(self): + msg = self._make_msg("myhost", "mymethod") + msg['event_type'] = 'random' + self.assertFalse(cn.notify(msg)) + + def test_bad_event_suffix(self): + msg = self._make_msg("myhost", "mymethod.badsuffix") + self.assertFalse(cn.notify(msg)) + + def test_bad_publisher_id(self): + msg = self._make_msg("myhost", "mymethod.start") + msg['publisher_id'] = 'badpublisher' + self.assertFalse(cn.notify(msg)) + + def test_update_called(self): + def _verify_called(host, context, free_ram_mb_delta, + free_disk_gb_delta, work_delta, vm_delta): + self.assertEquals(free_ram_mb_delta, 123) + self.assertEquals(free_disk_gb_delta, 456) + self.assertEquals(vm_delta, -1) + self.assertEquals(work_delta, -1) + + self.stubs.Set(cinder.db.api, "compute_node_utilization_update", + _verify_called) + msg = self._make_msg("myhost", "delete.end") + self.assertTrue(cn.notify(msg)) diff --git a/cinder/tests/notifier/test_list_notifier.py b/cinder/tests/notifier/test_list_notifier.py new file mode 100644 index 000000000..83e380764 --- /dev/null +++ b/cinder/tests/notifier/test_list_notifier.py @@ -0,0 +1,84 @@ +# Copyright 2011 OpenStack LLC. +# 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 cinder +from cinder import log as logging +import cinder.notifier.api +import cinder.notifier.log_notifier +import cinder.notifier.no_op_notifier +from cinder.notifier import list_notifier +from cinder import test + + +class NotifierListTestCase(test.TestCase): + """Test case for notifications""" + + def setUp(self): + super(NotifierListTestCase, self).setUp() + list_notifier._reset_drivers() + # Mock log to add one to exception_count when log.exception is called + + def mock_exception(cls, *args): + self.exception_count += 1 + + self.exception_count = 0 + list_notifier_log = logging.getLogger('cinder.notifier.list_notifier') + self.stubs.Set(list_notifier_log, "exception", mock_exception) + # Mock no_op notifier to add one to notify_count when called. + + def mock_notify(cls, *args): + self.notify_count += 1 + + self.notify_count = 0 + self.stubs.Set(cinder.notifier.no_op_notifier, 'notify', mock_notify) + # Mock log_notifier to raise RuntimeError when called. + + def mock_notify2(cls, *args): + raise RuntimeError("Bad notifier.") + + self.stubs.Set(cinder.notifier.log_notifier, 'notify', mock_notify2) + + def tearDown(self): + list_notifier._reset_drivers() + super(NotifierListTestCase, self).tearDown() + + def test_send_notifications_successfully(self): + self.flags(notification_driver='cinder.notifier.list_notifier', + list_notifier_drivers=['cinder.notifier.no_op_notifier', + 'cinder.notifier.no_op_notifier']) + cinder.notifier.api.notify('publisher_id', 'event_type', + cinder.notifier.api.WARN, dict(a=3)) + self.assertEqual(self.notify_count, 2) + self.assertEqual(self.exception_count, 0) + + def test_send_notifications_with_errors(self): + + self.flags(notification_driver='cinder.notifier.list_notifier', + list_notifier_drivers=['cinder.notifier.no_op_notifier', + 'cinder.notifier.log_notifier']) + cinder.notifier.api.notify('publisher_id', + 'event_type', cinder.notifier.api.WARN, dict(a=3)) + self.assertEqual(self.notify_count, 1) + self.assertEqual(self.exception_count, 1) + + def test_when_driver_fails_to_import(self): + self.flags(notification_driver='cinder.notifier.list_notifier', + list_notifier_drivers=['cinder.notifier.no_op_notifier', + 'cinder.notifier.logo_notifier', + 'fdsjgsdfhjkhgsfkj']) + cinder.notifier.api.notify('publisher_id', + 'event_type', cinder.notifier.api.WARN, dict(a=3)) + self.assertEqual(self.exception_count, 2) + self.assertEqual(self.notify_count, 1) diff --git a/cinder/tests/policy.json b/cinder/tests/policy.json new file mode 100644 index 000000000..940dedb45 --- /dev/null +++ b/cinder/tests/policy.json @@ -0,0 +1,25 @@ +{ + "volume:create": [], + "volume:get": [], + "volume:get_all": [], + "volume:get_volume_metadata": [], + "volume:delete": [], + "volume:update": [], + "volume:delete_volume_metadata": [], + "volume:update_volume_metadata": [], + "volume:attach": [], + "volume:detach": [], + "volume:reserve_volume": [], + "volume:unreserve_volume": [], + "volume:check_attach": [], + "volume:check_detach": [], + "volume:initialize_connection": [], + "volume:terminate_connection": [], + "volume:create_snapshot": [], + "volume:delete_snapshot": [], + "volume:get_snapshot": [], + "volume:get_all_snapshots": [], + + "volume_extension:types_manage": [], + "volume_extension:types_extra_specs": [] +} diff --git a/cinder/tests/rpc/__init__.py b/cinder/tests/rpc/__init__.py new file mode 100644 index 000000000..3be5ce944 --- /dev/null +++ b/cinder/tests/rpc/__init__.py @@ -0,0 +1,19 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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. + +# NOTE(vish): this forces the fixtures from tests/__init.py:setup() to work +from cinder.tests import * diff --git a/cinder/tests/rpc/common.py b/cinder/tests/rpc/common.py new file mode 100644 index 000000000..4de1be144 --- /dev/null +++ b/cinder/tests/rpc/common.py @@ -0,0 +1,239 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. +""" +Unit Tests for remote procedure calls shared between all implementations +""" + +import time + +from eventlet import greenthread +import nose + +from cinder import context +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder.rpc import amqp as rpc_amqp +from cinder.rpc import common as rpc_common +from cinder import test + + +FLAGS = flags.FLAGS +LOG = logging.getLogger(__name__) + + +class BaseRpcTestCase(test.TestCase): + def setUp(self, supports_timeouts=True): + super(BaseRpcTestCase, self).setUp() + self.conn = self.rpc.create_connection(FLAGS, True) + self.receiver = TestReceiver() + self.conn.create_consumer('test', self.receiver, False) + self.conn.consume_in_thread() + self.context = context.get_admin_context() + self.supports_timeouts = supports_timeouts + + def tearDown(self): + self.conn.close() + super(BaseRpcTestCase, self).tearDown() + + def test_call_succeed(self): + value = 42 + result = self.rpc.call(FLAGS, self.context, 'test', + {"method": "echo", "args": {"value": value}}) + self.assertEqual(value, result) + + def test_call_succeed_despite_multiple_returns_yield(self): + value = 42 + result = self.rpc.call(FLAGS, self.context, 'test', + {"method": "echo_three_times_yield", + "args": {"value": value}}) + self.assertEqual(value + 2, result) + + def test_multicall_succeed_once(self): + value = 42 + result = self.rpc.multicall(FLAGS, self.context, + 'test', + {"method": "echo", + "args": {"value": value}}) + for i, x in enumerate(result): + if i > 0: + self.fail('should only receive one response') + self.assertEqual(value + i, x) + + def test_multicall_three_nones(self): + value = 42 + result = self.rpc.multicall(FLAGS, self.context, + 'test', + {"method": "multicall_three_nones", + "args": {"value": value}}) + for i, x in enumerate(result): + self.assertEqual(x, None) + # i should have been 0, 1, and finally 2: + self.assertEqual(i, 2) + + def test_multicall_succeed_three_times_yield(self): + value = 42 + result = self.rpc.multicall(FLAGS, self.context, + 'test', + {"method": "echo_three_times_yield", + "args": {"value": value}}) + for i, x in enumerate(result): + self.assertEqual(value + i, x) + + def test_context_passed(self): + """Makes sure a context is passed through rpc call.""" + value = 42 + result = self.rpc.call(FLAGS, self.context, + 'test', {"method": "context", + "args": {"value": value}}) + self.assertEqual(self.context.to_dict(), result) + + def test_nested_calls(self): + """Test that we can do an rpc.call inside another call.""" + class Nested(object): + @staticmethod + def echo(context, queue, value): + """Calls echo in the passed queue""" + LOG.debug(_("Nested received %(queue)s, %(value)s") + % locals()) + # TODO(comstud): + # so, it will replay the context and use the same REQID? + # that's bizarre. + ret = self.rpc.call(FLAGS, context, + queue, + {"method": "echo", + "args": {"value": value}}) + LOG.debug(_("Nested return %s"), ret) + return value + + nested = Nested() + conn = self.rpc.create_connection(FLAGS, True) + conn.create_consumer('nested', nested, False) + conn.consume_in_thread() + value = 42 + result = self.rpc.call(FLAGS, self.context, + 'nested', {"method": "echo", + "args": {"queue": "test", + "value": value}}) + conn.close() + self.assertEqual(value, result) + + def test_call_timeout(self): + """Make sure rpc.call will time out""" + if not self.supports_timeouts: + raise nose.SkipTest(_("RPC backend does not support timeouts")) + + value = 42 + self.assertRaises(rpc_common.Timeout, + self.rpc.call, + FLAGS, self.context, + 'test', + {"method": "block", + "args": {"value": value}}, timeout=1) + try: + self.rpc.call(FLAGS, self.context, + 'test', + {"method": "block", + "args": {"value": value}}, + timeout=1) + self.fail("should have thrown Timeout") + except rpc_common.Timeout as exc: + pass + + +class BaseRpcAMQPTestCase(BaseRpcTestCase): + """Base test class for all AMQP-based RPC tests""" + def test_proxycallback_handles_exceptions(self): + """Make sure exceptions unpacking messages don't cause hangs.""" + orig_unpack = rpc_amqp.unpack_context + + info = {'unpacked': False} + + def fake_unpack_context(*args, **kwargs): + info['unpacked'] = True + raise test.TestingException('moo') + + self.stubs.Set(rpc_amqp, 'unpack_context', fake_unpack_context) + + value = 41 + self.rpc.cast(FLAGS, self.context, 'test', + {"method": "echo", "args": {"value": value}}) + + # Wait for the cast to complete. + for x in xrange(50): + if info['unpacked']: + break + greenthread.sleep(0.1) + else: + self.fail("Timeout waiting for message to be consued") + + # Now see if we get a response even though we raised an + # exception for the cast above. + self.stubs.Set(rpc_amqp, 'unpack_context', orig_unpack) + + value = 42 + result = self.rpc.call(FLAGS, self.context, 'test', + {"method": "echo", + "args": {"value": value}}) + self.assertEqual(value, result) + + +class TestReceiver(object): + """Simple Proxy class so the consumer has methods to call. + + Uses static methods because we aren't actually storing any state. + + """ + + @staticmethod + def echo(context, value): + """Simply returns whatever value is sent in.""" + LOG.debug(_("Received %s"), value) + return value + + @staticmethod + def context(context, value): + """Returns dictionary version of context.""" + LOG.debug(_("Received %s"), context) + return context.to_dict() + + @staticmethod + def multicall_three_nones(context, value): + yield None + yield None + yield None + + @staticmethod + def echo_three_times_yield(context, value): + yield value + yield value + 1 + yield value + 2 + + @staticmethod + def fail(context, value): + """Raises an exception with the value sent in.""" + raise NotImplementedError(value) + + @staticmethod + def fail_converted(context, value): + """Raises an exception with the value sent in.""" + raise exception.ConvertedException(explanation=value) + + @staticmethod + def block(context, value): + time.sleep(2) diff --git a/cinder/tests/rpc/test_common.py b/cinder/tests/rpc/test_common.py new file mode 100644 index 000000000..5fd257a6b --- /dev/null +++ b/cinder/tests/rpc/test_common.py @@ -0,0 +1,147 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 OpenStack, LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 'common' functons used through rpc code. +""" + +import json +import sys + +from cinder import context +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder import test +from cinder.rpc import amqp as rpc_amqp +from cinder.rpc import common as rpc_common +from cinder.tests.rpc import common + +FLAGS = flags.FLAGS +LOG = logging.getLogger(__name__) + + +def raise_exception(): + raise Exception("test") + + +class FakeUserDefinedException(Exception): + def __init__(self): + Exception.__init__(self, "Test Message") + + +class RpcCommonTestCase(test.TestCase): + def test_serialize_remote_exception(self): + expected = { + 'class': 'Exception', + 'module': 'exceptions', + 'message': 'test', + } + + try: + raise_exception() + except Exception as exc: + failure = rpc_common.serialize_remote_exception(sys.exc_info()) + + failure = json.loads(failure) + #assure the traceback was added + self.assertEqual(expected['class'], failure['class']) + self.assertEqual(expected['module'], failure['module']) + self.assertEqual(expected['message'], failure['message']) + + def test_serialize_remote_cinder_exception(self): + def raise_cinder_exception(): + raise exception.CinderException("test", code=500) + + expected = { + 'class': 'CinderException', + 'module': 'cinder.exception', + 'kwargs': {'code': 500}, + 'message': 'test' + } + + try: + raise_cinder_exception() + except Exception as exc: + failure = rpc_common.serialize_remote_exception(sys.exc_info()) + + failure = json.loads(failure) + #assure the traceback was added + self.assertEqual(expected['class'], failure['class']) + self.assertEqual(expected['module'], failure['module']) + self.assertEqual(expected['kwargs'], failure['kwargs']) + self.assertEqual(expected['message'], failure['message']) + + def test_deserialize_remote_exception(self): + failure = { + 'class': 'CinderException', + 'module': 'cinder.exception', + 'message': 'test message', + 'tb': ['raise CinderException'], + } + serialized = json.dumps(failure) + + after_exc = rpc_common.deserialize_remote_exception(FLAGS, serialized) + self.assertTrue(isinstance(after_exc, exception.CinderException)) + self.assertTrue('test message' in unicode(after_exc)) + #assure the traceback was added + self.assertTrue('raise CinderException' in unicode(after_exc)) + + def test_deserialize_remote_exception_bad_module(self): + failure = { + 'class': 'popen2', + 'module': 'os', + 'kwargs': {'cmd': '/bin/echo failed'}, + 'message': 'foo', + } + serialized = json.dumps(failure) + + after_exc = rpc_common.deserialize_remote_exception(FLAGS, serialized) + self.assertTrue(isinstance(after_exc, rpc_common.RemoteError)) + + def test_deserialize_remote_exception_user_defined_exception(self): + """Ensure a user defined exception can be deserialized.""" + self.flags(allowed_rpc_exception_modules=[self.__class__.__module__]) + failure = { + 'class': 'FakeUserDefinedException', + 'module': self.__class__.__module__, + 'tb': ['raise FakeUserDefinedException'], + } + serialized = json.dumps(failure) + + after_exc = rpc_common.deserialize_remote_exception(FLAGS, serialized) + self.assertTrue(isinstance(after_exc, FakeUserDefinedException)) + #assure the traceback was added + self.assertTrue('raise FakeUserDefinedException' in unicode(after_exc)) + + def test_deserialize_remote_exception_cannot_recreate(self): + """Ensure a RemoteError is returned on initialization failure. + + If an exception cannot be recreated with it's original class then a + RemoteError with the exception informations should still be returned. + + """ + self.flags(allowed_rpc_exception_modules=[self.__class__.__module__]) + failure = { + 'class': 'FakeIDontExistException', + 'module': self.__class__.__module__, + 'tb': ['raise FakeIDontExistException'], + } + serialized = json.dumps(failure) + + after_exc = rpc_common.deserialize_remote_exception(FLAGS, serialized) + self.assertTrue(isinstance(after_exc, rpc_common.RemoteError)) + #assure the traceback was added + self.assertTrue('raise FakeIDontExistException' in unicode(after_exc)) diff --git a/cinder/tests/rpc/test_fake.py b/cinder/tests/rpc/test_fake.py new file mode 100644 index 000000000..4f6722ab3 --- /dev/null +++ b/cinder/tests/rpc/test_fake.py @@ -0,0 +1,33 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. +""" +Unit Tests for remote procedure calls using fake_impl +""" + +from cinder import log as logging +from cinder.rpc import impl_fake +from cinder.tests.rpc import common + + +LOG = logging.getLogger(__name__) + + +class RpcFakeTestCase(common.BaseRpcTestCase): + def setUp(self): + self.rpc = impl_fake + super(RpcFakeTestCase, self).setUp() diff --git a/cinder/tests/rpc/test_kombu.py b/cinder/tests/rpc/test_kombu.py new file mode 100644 index 000000000..3ce5337c6 --- /dev/null +++ b/cinder/tests/rpc/test_kombu.py @@ -0,0 +1,350 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. +""" +Unit Tests for remote procedure calls using kombu +""" + +from cinder import context +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder import test +from cinder.rpc import amqp as rpc_amqp +from cinder.rpc import impl_kombu +from cinder.tests.rpc import common + +FLAGS = flags.FLAGS +LOG = logging.getLogger(__name__) + + +class MyException(Exception): + pass + + +def _raise_exc_stub(stubs, times, obj, method, exc_msg, + exc_class=MyException): + info = {'called': 0} + orig_method = getattr(obj, method) + + def _raise_stub(*args, **kwargs): + info['called'] += 1 + if info['called'] <= times: + raise exc_class(exc_msg) + orig_method(*args, **kwargs) + stubs.Set(obj, method, _raise_stub) + return info + + +class RpcKombuTestCase(common.BaseRpcAMQPTestCase): + def setUp(self): + self.rpc = impl_kombu + impl_kombu.register_opts(FLAGS) + super(RpcKombuTestCase, self).setUp() + + def tearDown(self): + impl_kombu.cleanup() + super(RpcKombuTestCase, self).tearDown() + + def test_reusing_connection(self): + """Test that reusing a connection returns same one.""" + conn_context = self.rpc.create_connection(FLAGS, new=False) + conn1 = conn_context.connection + conn_context.close() + conn_context = self.rpc.create_connection(FLAGS, new=False) + conn2 = conn_context.connection + conn_context.close() + self.assertEqual(conn1, conn2) + + def test_topic_send_receive(self): + """Test sending to a topic exchange/queue""" + + conn = self.rpc.create_connection(FLAGS) + message = 'topic test message' + + self.received_message = None + + def _callback(message): + self.received_message = message + + conn.declare_topic_consumer('a_topic', _callback) + conn.topic_send('a_topic', message) + conn.consume(limit=1) + conn.close() + + self.assertEqual(self.received_message, message) + + def test_direct_send_receive(self): + """Test sending to a direct exchange/queue""" + conn = self.rpc.create_connection(FLAGS) + message = 'direct test message' + + self.received_message = None + + def _callback(message): + self.received_message = message + + conn.declare_direct_consumer('a_direct', _callback) + conn.direct_send('a_direct', message) + conn.consume(limit=1) + conn.close() + + self.assertEqual(self.received_message, message) + + def test_cast_interface_uses_default_options(self): + """Test kombu rpc.cast""" + + ctxt = context.RequestContext('fake_user', 'fake_project') + + class MyConnection(impl_kombu.Connection): + def __init__(myself, *args, **kwargs): + super(MyConnection, myself).__init__(*args, **kwargs) + self.assertEqual(myself.params, + {'hostname': FLAGS.rabbit_host, + 'userid': FLAGS.rabbit_userid, + 'password': FLAGS.rabbit_password, + 'port': FLAGS.rabbit_port, + 'virtual_host': FLAGS.rabbit_virtual_host, + 'transport': 'memory'}) + + def topic_send(_context, topic, msg): + pass + + MyConnection.pool = rpc_amqp.Pool(FLAGS, MyConnection) + self.stubs.Set(impl_kombu, 'Connection', MyConnection) + + impl_kombu.cast(FLAGS, ctxt, 'fake_topic', {'msg': 'fake'}) + + def test_cast_to_server_uses_server_params(self): + """Test kombu rpc.cast""" + + ctxt = context.RequestContext('fake_user', 'fake_project') + + server_params = {'username': 'fake_username', + 'password': 'fake_password', + 'hostname': 'fake_hostname', + 'port': 31337, + 'virtual_host': 'fake_virtual_host'} + + class MyConnection(impl_kombu.Connection): + def __init__(myself, *args, **kwargs): + super(MyConnection, myself).__init__(*args, **kwargs) + self.assertEqual(myself.params, + {'hostname': server_params['hostname'], + 'userid': server_params['username'], + 'password': server_params['password'], + 'port': server_params['port'], + 'virtual_host': server_params['virtual_host'], + 'transport': 'memory'}) + + def topic_send(_context, topic, msg): + pass + + MyConnection.pool = rpc_amqp.Pool(FLAGS, MyConnection) + self.stubs.Set(impl_kombu, 'Connection', MyConnection) + + impl_kombu.cast_to_server(FLAGS, ctxt, server_params, + 'fake_topic', {'msg': 'fake'}) + + @test.skip_test("kombu memory transport seems buggy with fanout queues " + "as this test passes when you use rabbit (fake_rabbit=False)") + def test_fanout_send_receive(self): + """Test sending to a fanout exchange and consuming from 2 queues""" + + conn = self.rpc.create_connection() + conn2 = self.rpc.create_connection() + message = 'fanout test message' + + self.received_message = None + + def _callback(message): + self.received_message = message + + conn.declare_fanout_consumer('a_fanout', _callback) + conn2.declare_fanout_consumer('a_fanout', _callback) + conn.fanout_send('a_fanout', message) + + conn.consume(limit=1) + conn.close() + self.assertEqual(self.received_message, message) + + self.received_message = None + conn2.consume(limit=1) + conn2.close() + self.assertEqual(self.received_message, message) + + def test_declare_consumer_errors_will_reconnect(self): + # Test that any exception with 'timeout' in it causes a + # reconnection + info = _raise_exc_stub(self.stubs, 2, self.rpc.DirectConsumer, + '__init__', 'foo timeout foo') + + conn = self.rpc.Connection(FLAGS) + result = conn.declare_consumer(self.rpc.DirectConsumer, + 'test_topic', None) + + self.assertEqual(info['called'], 3) + self.assertTrue(isinstance(result, self.rpc.DirectConsumer)) + + # Test that any exception in transport.connection_errors causes + # a reconnection + self.stubs.UnsetAll() + + info = _raise_exc_stub(self.stubs, 1, self.rpc.DirectConsumer, + '__init__', 'meow') + + conn = self.rpc.Connection(FLAGS) + conn.connection_errors = (MyException, ) + + result = conn.declare_consumer(self.rpc.DirectConsumer, + 'test_topic', None) + + self.assertEqual(info['called'], 2) + self.assertTrue(isinstance(result, self.rpc.DirectConsumer)) + + def test_declare_consumer_ioerrors_will_reconnect(self): + """Test that an IOError exception causes a reconnection""" + info = _raise_exc_stub(self.stubs, 2, self.rpc.DirectConsumer, + '__init__', 'Socket closed', exc_class=IOError) + + conn = self.rpc.Connection(FLAGS) + result = conn.declare_consumer(self.rpc.DirectConsumer, + 'test_topic', None) + + self.assertEqual(info['called'], 3) + self.assertTrue(isinstance(result, self.rpc.DirectConsumer)) + + def test_publishing_errors_will_reconnect(self): + # Test that any exception with 'timeout' in it causes a + # reconnection when declaring the publisher class and when + # calling send() + info = _raise_exc_stub(self.stubs, 2, self.rpc.DirectPublisher, + '__init__', 'foo timeout foo') + + conn = self.rpc.Connection(FLAGS) + conn.publisher_send(self.rpc.DirectPublisher, 'test_topic', 'msg') + + self.assertEqual(info['called'], 3) + self.stubs.UnsetAll() + + info = _raise_exc_stub(self.stubs, 2, self.rpc.DirectPublisher, + 'send', 'foo timeout foo') + + conn = self.rpc.Connection(FLAGS) + conn.publisher_send(self.rpc.DirectPublisher, 'test_topic', 'msg') + + self.assertEqual(info['called'], 3) + + # Test that any exception in transport.connection_errors causes + # a reconnection when declaring the publisher class and when + # calling send() + self.stubs.UnsetAll() + + info = _raise_exc_stub(self.stubs, 1, self.rpc.DirectPublisher, + '__init__', 'meow') + + conn = self.rpc.Connection(FLAGS) + conn.connection_errors = (MyException, ) + + conn.publisher_send(self.rpc.DirectPublisher, 'test_topic', 'msg') + + self.assertEqual(info['called'], 2) + self.stubs.UnsetAll() + + info = _raise_exc_stub(self.stubs, 1, self.rpc.DirectPublisher, + 'send', 'meow') + + conn = self.rpc.Connection(FLAGS) + conn.connection_errors = (MyException, ) + + conn.publisher_send(self.rpc.DirectPublisher, 'test_topic', 'msg') + + self.assertEqual(info['called'], 2) + + @test.skip_test("kombu memory transport hangs here on precise") + def test_iterconsume_errors_will_reconnect(self): + conn = self.rpc.Connection(FLAGS) + message = 'reconnect test message' + + self.received_message = None + + def _callback(message): + self.received_message = message + + conn.declare_direct_consumer('a_direct', _callback) + conn.direct_send('a_direct', message) + + info = _raise_exc_stub(self.stubs, 1, conn.connection, + 'drain_events', 'foo timeout foo') + conn.consume(limit=1) + conn.close() + + self.assertEqual(self.received_message, message) + # Only called once, because our stub goes away during reconnection + + def test_call_exception(self): + """Test that exception gets passed back properly. + + rpc.call returns an Exception object. The value of the + exception is converted to a string. + + """ + self.flags(allowed_rpc_exception_modules=['exceptions']) + value = "This is the exception message" + self.assertRaises(NotImplementedError, + self.rpc.call, + FLAGS, + self.context, + 'test', + {"method": "fail", + "args": {"value": value}}) + try: + self.rpc.call(FLAGS, self.context, + 'test', + {"method": "fail", + "args": {"value": value}}) + self.fail("should have thrown Exception") + except NotImplementedError as exc: + self.assertTrue(value in unicode(exc)) + #Traceback should be included in exception message + self.assertTrue('raise NotImplementedError(value)' in unicode(exc)) + + def test_call_converted_exception(self): + """Test that exception gets passed back properly. + + rpc.call returns an Exception object. The value of the + exception is converted to a string. + + """ + value = "This is the exception message" + self.assertRaises(exception.ConvertedException, + self.rpc.call, + FLAGS, + self.context, + 'test', + {"method": "fail_converted", + "args": {"value": value}}) + try: + self.rpc.call(FLAGS, self.context, + 'test', + {"method": "fail_converted", + "args": {"value": value}}) + self.fail("should have thrown Exception") + except exception.ConvertedException as exc: + self.assertTrue(value in unicode(exc)) + #Traceback should be included in exception message + self.assertTrue('exception.ConvertedException' in unicode(exc)) diff --git a/cinder/tests/rpc/test_kombu_ssl.py b/cinder/tests/rpc/test_kombu_ssl.py new file mode 100644 index 000000000..b1addec92 --- /dev/null +++ b/cinder/tests/rpc/test_kombu_ssl.py @@ -0,0 +1,58 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. +""" +Unit Tests for remote procedure calls using kombu + ssl +""" + +from cinder import flags +from cinder import test +from cinder.rpc import impl_kombu + +# Flag settings we will ensure get passed to amqplib +SSL_VERSION = "SSLv2" +SSL_CERT = "/tmp/cert.blah.blah" +SSL_CA_CERT = "/tmp/cert.ca.blah.blah" +SSL_KEYFILE = "/tmp/keyfile.blah.blah" + +FLAGS = flags.FLAGS + + +class RpcKombuSslTestCase(test.TestCase): + + def setUp(self): + super(RpcKombuSslTestCase, self).setUp() + impl_kombu.register_opts(FLAGS) + self.flags(kombu_ssl_keyfile=SSL_KEYFILE, + kombu_ssl_ca_certs=SSL_CA_CERT, + kombu_ssl_certfile=SSL_CERT, + kombu_ssl_version=SSL_VERSION, + rabbit_use_ssl=True) + + def test_ssl_on_extended(self): + rpc = impl_kombu + conn = rpc.create_connection(FLAGS, True) + c = conn.connection + #This might be kombu version dependent... + #Since we are now peaking into the internals of kombu... + self.assertTrue(isinstance(c.connection.ssl, dict)) + self.assertEqual(SSL_VERSION, c.connection.ssl.get("ssl_version")) + self.assertEqual(SSL_CERT, c.connection.ssl.get("certfile")) + self.assertEqual(SSL_CA_CERT, c.connection.ssl.get("ca_certs")) + self.assertEqual(SSL_KEYFILE, c.connection.ssl.get("keyfile")) + #That hash then goes into amqplib which then goes + #Into python ssl creation... diff --git a/cinder/tests/rpc/test_qpid.py b/cinder/tests/rpc/test_qpid.py new file mode 100644 index 000000000..4ec865169 --- /dev/null +++ b/cinder/tests/rpc/test_qpid.py @@ -0,0 +1,340 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# All Rights Reserved. +# 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 remote procedure calls using qpid +""" + +import mox + +from cinder import context +from cinder import flags +from cinder import log as logging +from cinder.rpc import amqp as rpc_amqp +from cinder import test + +try: + import qpid + from cinder.rpc import impl_qpid +except ImportError: + qpid = None + impl_qpid = None + + +FLAGS = flags.FLAGS +LOG = logging.getLogger(__name__) + + +class RpcQpidTestCase(test.TestCase): + """ + Exercise the public API of impl_qpid utilizing mox. + + This set of tests utilizes mox to replace the Qpid objects and ensures + that the right operations happen on them when the various public rpc API + calls are exercised. The API calls tested here include: + + cinder.rpc.create_connection() + cinder.rpc.common.Connection.create_consumer() + cinder.rpc.common.Connection.close() + cinder.rpc.cast() + cinder.rpc.fanout_cast() + cinder.rpc.call() + cinder.rpc.multicall() + """ + + def setUp(self): + super(RpcQpidTestCase, self).setUp() + + self.mock_connection = None + self.mock_session = None + self.mock_sender = None + self.mock_receiver = None + + if qpid: + impl_qpid.register_opts(FLAGS) + self.orig_connection = qpid.messaging.Connection + self.orig_session = qpid.messaging.Session + self.orig_sender = qpid.messaging.Sender + self.orig_receiver = qpid.messaging.Receiver + qpid.messaging.Connection = lambda *_x, **_y: self.mock_connection + qpid.messaging.Session = lambda *_x, **_y: self.mock_session + qpid.messaging.Sender = lambda *_x, **_y: self.mock_sender + qpid.messaging.Receiver = lambda *_x, **_y: self.mock_receiver + + def tearDown(self): + if qpid: + qpid.messaging.Connection = self.orig_connection + qpid.messaging.Session = self.orig_session + qpid.messaging.Sender = self.orig_sender + qpid.messaging.Receiver = self.orig_receiver + if impl_qpid: + # Need to reset this in case we changed the connection_cls + # in self._setup_to_server_tests() + impl_qpid.Connection.pool.connection_cls = impl_qpid.Connection + + super(RpcQpidTestCase, self).tearDown() + + @test.skip_if(qpid is None, "Test requires qpid") + def test_create_connection(self): + self.mock_connection = self.mox.CreateMock(self.orig_connection) + self.mock_session = self.mox.CreateMock(self.orig_session) + + self.mock_connection.opened().AndReturn(False) + self.mock_connection.open() + self.mock_connection.session().AndReturn(self.mock_session) + self.mock_connection.close() + + self.mox.ReplayAll() + + connection = impl_qpid.create_connection(FLAGS) + connection.close() + + def _test_create_consumer(self, fanout): + self.mock_connection = self.mox.CreateMock(self.orig_connection) + self.mock_session = self.mox.CreateMock(self.orig_session) + self.mock_receiver = self.mox.CreateMock(self.orig_receiver) + + self.mock_connection.opened().AndReturn(False) + self.mock_connection.open() + self.mock_connection.session().AndReturn(self.mock_session) + if fanout: + # The link name includes a UUID, so match it with a regex. + expected_address = mox.Regex(r'^impl_qpid_test_fanout ; ' + '{"node": {"x-declare": {"auto-delete": true, "durable": ' + 'false, "type": "fanout"}, "type": "topic"}, "create": ' + '"always", "link": {"x-declare": {"auto-delete": true, ' + '"exclusive": true, "durable": false}, "durable": true, ' + '"name": "impl_qpid_test_fanout_.*"}}$') + else: + expected_address = ( + 'cinder/impl_qpid_test ; {"node": {"x-declare": ' + '{"auto-delete": true, "durable": true}, "type": "topic"}, ' + '"create": "always", "link": {"x-declare": {"auto-delete": ' + 'true, "exclusive": false, "durable": false}, "durable": ' + 'true, "name": "impl_qpid_test"}}') + self.mock_session.receiver(expected_address).AndReturn( + self.mock_receiver) + self.mock_receiver.capacity = 1 + self.mock_connection.close() + + self.mox.ReplayAll() + + connection = impl_qpid.create_connection(FLAGS) + connection.create_consumer("impl_qpid_test", + lambda *_x, **_y: None, + fanout) + connection.close() + + @test.skip_if(qpid is None, "Test requires qpid") + def test_create_consumer(self): + self._test_create_consumer(fanout=False) + + @test.skip_if(qpid is None, "Test requires qpid") + def test_create_consumer_fanout(self): + self._test_create_consumer(fanout=True) + + def _test_cast(self, fanout, server_params=None): + self.mock_connection = self.mox.CreateMock(self.orig_connection) + self.mock_session = self.mox.CreateMock(self.orig_session) + self.mock_sender = self.mox.CreateMock(self.orig_sender) + + self.mock_connection.opened().AndReturn(False) + self.mock_connection.open() + + self.mock_connection.session().AndReturn(self.mock_session) + if fanout: + expected_address = ('impl_qpid_test_fanout ; ' + '{"node": {"x-declare": {"auto-delete": true, ' + '"durable": false, "type": "fanout"}, ' + '"type": "topic"}, "create": "always"}') + else: + expected_address = ( + 'cinder/impl_qpid_test ; {"node": {"x-declare": ' + '{"auto-delete": true, "durable": false}, "type": "topic"}, ' + '"create": "always"}') + self.mock_session.sender(expected_address).AndReturn(self.mock_sender) + self.mock_sender.send(mox.IgnoreArg()) + if not server_params: + # This is a pooled connection, so instead of closing it, it + # gets reset, which is just creating a new session on the + # connection. + self.mock_session.close() + self.mock_connection.session().AndReturn(self.mock_session) + + self.mox.ReplayAll() + + try: + ctx = context.RequestContext("user", "project") + + args = [FLAGS, ctx, "impl_qpid_test", + {"method": "test_method", "args": {}}] + + if server_params: + args.insert(2, server_params) + if fanout: + method = impl_qpid.fanout_cast_to_server + else: + method = impl_qpid.cast_to_server + else: + if fanout: + method = impl_qpid.fanout_cast + else: + method = impl_qpid.cast + + method(*args) + finally: + while impl_qpid.Connection.pool.free_items: + # Pull the mock connection object out of the connection pool so + # that it doesn't mess up other test cases. + impl_qpid.Connection.pool.get() + + @test.skip_if(qpid is None, "Test requires qpid") + def test_cast(self): + self._test_cast(fanout=False) + + @test.skip_if(qpid is None, "Test requires qpid") + def test_fanout_cast(self): + self._test_cast(fanout=True) + + def _setup_to_server_tests(self, server_params): + class MyConnection(impl_qpid.Connection): + def __init__(myself, *args, **kwargs): + super(MyConnection, myself).__init__(*args, **kwargs) + self.assertEqual(myself.connection.username, + server_params['username']) + self.assertEqual(myself.connection.password, + server_params['password']) + self.assertEqual(myself.broker, + server_params['hostname'] + ':' + + str(server_params['port'])) + + MyConnection.pool = rpc_amqp.Pool(FLAGS, MyConnection) + self.stubs.Set(impl_qpid, 'Connection', MyConnection) + + @test.skip_if(qpid is None, "Test requires qpid") + def test_cast_to_server(self): + server_params = {'username': 'fake_username', + 'password': 'fake_password', + 'hostname': 'fake_hostname', + 'port': 31337} + self._setup_to_server_tests(server_params) + self._test_cast(fanout=False, server_params=server_params) + + @test.skip_if(qpid is None, "Test requires qpid") + def test_fanout_cast_to_server(self): + server_params = {'username': 'fake_username', + 'password': 'fake_password', + 'hostname': 'fake_hostname', + 'port': 31337} + self._setup_to_server_tests(server_params) + self._test_cast(fanout=True, server_params=server_params) + + def _test_call(self, multi): + self.mock_connection = self.mox.CreateMock(self.orig_connection) + self.mock_session = self.mox.CreateMock(self.orig_session) + self.mock_sender = self.mox.CreateMock(self.orig_sender) + self.mock_receiver = self.mox.CreateMock(self.orig_receiver) + + self.mock_connection.opened().AndReturn(False) + self.mock_connection.open() + self.mock_connection.session().AndReturn(self.mock_session) + rcv_addr = mox.Regex(r'^.*/.* ; {"node": {"x-declare": {"auto-delete":' + ' true, "durable": true, "type": "direct"}, "type": ' + '"topic"}, "create": "always", "link": {"x-declare": ' + '{"auto-delete": true, "exclusive": true, "durable": ' + 'false}, "durable": true, "name": ".*"}}') + self.mock_session.receiver(rcv_addr).AndReturn(self.mock_receiver) + self.mock_receiver.capacity = 1 + send_addr = ('cinder/impl_qpid_test ; {"node": {"x-declare": ' + '{"auto-delete": true, "durable": false}, "type": "topic"}, ' + '"create": "always"}') + self.mock_session.sender(send_addr).AndReturn(self.mock_sender) + self.mock_sender.send(mox.IgnoreArg()) + + self.mock_session.next_receiver(timeout=mox.IsA(int)).AndReturn( + self.mock_receiver) + self.mock_receiver.fetch().AndReturn(qpid.messaging.Message( + {"result": "foo", "failure": False, "ending": False})) + if multi: + self.mock_session.next_receiver(timeout=mox.IsA(int)).AndReturn( + self.mock_receiver) + self.mock_receiver.fetch().AndReturn( + qpid.messaging.Message( + {"result": "bar", "failure": False, + "ending": False})) + self.mock_session.next_receiver(timeout=mox.IsA(int)).AndReturn( + self.mock_receiver) + self.mock_receiver.fetch().AndReturn( + qpid.messaging.Message( + {"result": "baz", "failure": False, + "ending": False})) + self.mock_session.next_receiver(timeout=mox.IsA(int)).AndReturn( + self.mock_receiver) + self.mock_receiver.fetch().AndReturn(qpid.messaging.Message( + {"failure": False, "ending": True})) + self.mock_session.close() + self.mock_connection.session().AndReturn(self.mock_session) + + self.mox.ReplayAll() + + try: + ctx = context.RequestContext("user", "project") + + if multi: + method = impl_qpid.multicall + else: + method = impl_qpid.call + + res = method(FLAGS, ctx, "impl_qpid_test", + {"method": "test_method", "args": {}}) + + if multi: + self.assertEquals(list(res), ["foo", "bar", "baz"]) + else: + self.assertEquals(res, "foo") + finally: + while impl_qpid.Connection.pool.free_items: + # Pull the mock connection object out of the connection pool so + # that it doesn't mess up other test cases. + impl_qpid.Connection.pool.get() + + @test.skip_if(qpid is None, "Test requires qpid") + def test_call(self): + self._test_call(multi=False) + + @test.skip_if(qpid is None, "Test requires qpid") + def test_multicall(self): + self._test_call(multi=True) + + +# +#from cinder.tests.rpc import common +# +# Qpid does not have a handy in-memory transport like kombu, so it's not +# terribly straight forward to take advantage of the common unit tests. +# However, at least at the time of this writing, the common unit tests all pass +# with qpidd running. +# +# class RpcQpidCommonTestCase(common._BaseRpcTestCase): +# def setUp(self): +# self.rpc = impl_qpid +# super(RpcQpidCommonTestCase, self).setUp() +# +# def tearDown(self): +# super(RpcQpidCommonTestCase, self).tearDown() +# diff --git a/cinder/tests/runtime_flags.py b/cinder/tests/runtime_flags.py new file mode 100644 index 000000000..4327561fc --- /dev/null +++ b/cinder/tests/runtime_flags.py @@ -0,0 +1,23 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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 cinder import flags +from cinder.openstack.common import cfg + +FLAGS = flags.FLAGS +FLAGS.register_opt(cfg.IntOpt('runtime_answer', default=54, help='test flag')) diff --git a/cinder/tests/scheduler/__init__.py b/cinder/tests/scheduler/__init__.py new file mode 100644 index 000000000..3be5ce944 --- /dev/null +++ b/cinder/tests/scheduler/__init__.py @@ -0,0 +1,19 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# 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. + +# NOTE(vish): this forces the fixtures from tests/__init.py:setup() to work +from cinder.tests import * diff --git a/cinder/tests/scheduler/fakes.py b/cinder/tests/scheduler/fakes.py new file mode 100644 index 000000000..384dae7ba --- /dev/null +++ b/cinder/tests/scheduler/fakes.py @@ -0,0 +1,62 @@ +# Copyright 2011 OpenStack LLC. +# 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. +""" +Fakes For Scheduler tests. +""" + +import mox + +from cinder import db +from cinder.scheduler import host_manager + + +class FakeHostManager(host_manager.HostManager): + """host1: free_ram_mb=1024-512-512=0, free_disk_gb=1024-512-512=0 + host2: free_ram_mb=2048-512=1536 free_disk_gb=2048-512=1536 + host3: free_ram_mb=4096-1024=3072 free_disk_gb=4096-1024=3072 + host4: free_ram_mb=8192 free_disk_gb=8192""" + + def __init__(self): + super(FakeHostManager, self).__init__() + + self.service_states = { + 'host1': { + 'compute': {'host_memory_free': 1073741824}, + }, + 'host2': { + 'compute': {'host_memory_free': 2147483648}, + }, + 'host3': { + 'compute': {'host_memory_free': 3221225472}, + }, + 'host4': { + 'compute': {'host_memory_free': 999999999}, + }, + } + + def get_host_list_from_db(self, context): + return [ + ('host1', dict(free_disk_gb=1024, free_ram_mb=1024)), + ('host2', dict(free_disk_gb=2048, free_ram_mb=2048)), + ('host3', dict(free_disk_gb=4096, free_ram_mb=4096)), + ('host4', dict(free_disk_gb=8192, free_ram_mb=8192)), + ] + + +class FakeHostState(host_manager.HostState): + def __init__(self, host, topic, attribute_dict): + super(FakeHostState, self).__init__(host, topic) + for (key, val) in attribute_dict.iteritems(): + setattr(self, key, val) diff --git a/cinder/tests/scheduler/test_scheduler.py b/cinder/tests/scheduler/test_scheduler.py new file mode 100644 index 000000000..346132a7d --- /dev/null +++ b/cinder/tests/scheduler/test_scheduler.py @@ -0,0 +1,322 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. +""" +Tests For Scheduler +""" + +import datetime +import json + +from cinder import context +from cinder import db +from cinder import exception +from cinder import flags +from cinder.notifier import api as notifier +from cinder import rpc +from cinder.rpc import common as rpc_common +from cinder.scheduler import driver +from cinder.scheduler import manager +from cinder import test +from cinder.tests.scheduler import fakes +from cinder import utils + +FLAGS = flags.FLAGS + + +class SchedulerManagerTestCase(test.TestCase): + """Test case for scheduler manager""" + + manager_cls = manager.SchedulerManager + driver_cls = driver.Scheduler + driver_cls_name = 'cinder.scheduler.driver.Scheduler' + + class AnException(Exception): + pass + + def setUp(self): + super(SchedulerManagerTestCase, self).setUp() + self.flags(scheduler_driver=self.driver_cls_name) + self.manager = self.manager_cls() + self.context = context.RequestContext('fake_user', 'fake_project') + self.topic = 'fake_topic' + self.fake_args = (1, 2, 3) + self.fake_kwargs = {'cat': 'meow', 'dog': 'woof'} + + def test_1_correct_init(self): + # Correct scheduler driver + manager = self.manager + self.assertTrue(isinstance(manager.driver, self.driver_cls)) + + def test_get_host_list(self): + expected = 'fake_hosts' + + self.mox.StubOutWithMock(self.manager.driver, 'get_host_list') + self.manager.driver.get_host_list().AndReturn(expected) + + self.mox.ReplayAll() + result = self.manager.get_host_list(self.context) + self.assertEqual(result, expected) + + def test_get_service_capabilities(self): + expected = 'fake_service_capabs' + + self.mox.StubOutWithMock(self.manager.driver, + 'get_service_capabilities') + self.manager.driver.get_service_capabilities().AndReturn( + expected) + + self.mox.ReplayAll() + result = self.manager.get_service_capabilities(self.context) + self.assertEqual(result, expected) + + def test_update_service_capabilities(self): + service_name = 'fake_service' + host = 'fake_host' + + self.mox.StubOutWithMock(self.manager.driver, + 'update_service_capabilities') + + # Test no capabilities passes empty dictionary + self.manager.driver.update_service_capabilities(service_name, + host, {}) + self.mox.ReplayAll() + result = self.manager.update_service_capabilities(self.context, + service_name=service_name, host=host) + self.mox.VerifyAll() + + self.mox.ResetAll() + # Test capabilities passes correctly + capabilities = {'fake_capability': 'fake_value'} + self.manager.driver.update_service_capabilities( + service_name, host, capabilities) + self.mox.ReplayAll() + result = self.manager.update_service_capabilities(self.context, + service_name=service_name, host=host, + capabilities=capabilities) + + def test_existing_method(self): + def stub_method(self, *args, **kwargs): + pass + setattr(self.manager.driver, 'schedule_stub_method', stub_method) + + self.mox.StubOutWithMock(self.manager.driver, + 'schedule_stub_method') + self.manager.driver.schedule_stub_method(self.context, + *self.fake_args, **self.fake_kwargs) + + self.mox.ReplayAll() + self.manager.stub_method(self.context, self.topic, + *self.fake_args, **self.fake_kwargs) + + def test_missing_method_fallback(self): + self.mox.StubOutWithMock(self.manager.driver, 'schedule') + self.manager.driver.schedule(self.context, self.topic, + 'noexist', *self.fake_args, **self.fake_kwargs) + + self.mox.ReplayAll() + self.manager.noexist(self.context, self.topic, + *self.fake_args, **self.fake_kwargs) + + def _mox_schedule_method_helper(self, method_name): + # Make sure the method exists that we're going to test call + def stub_method(*args, **kwargs): + pass + + setattr(self.manager.driver, method_name, stub_method) + + self.mox.StubOutWithMock(self.manager.driver, + method_name) + + +class SchedulerTestCase(test.TestCase): + """Test case for base scheduler driver class""" + + # So we can subclass this test and re-use tests if we need. + driver_cls = driver.Scheduler + + def setUp(self): + super(SchedulerTestCase, self).setUp() + self.driver = self.driver_cls() + self.context = context.RequestContext('fake_user', 'fake_project') + self.topic = 'fake_topic' + + def test_get_host_list(self): + expected = 'fake_hosts' + + self.mox.StubOutWithMock(self.driver.host_manager, 'get_host_list') + self.driver.host_manager.get_host_list().AndReturn(expected) + + self.mox.ReplayAll() + result = self.driver.get_host_list() + self.assertEqual(result, expected) + + def test_get_service_capabilities(self): + expected = 'fake_service_capabs' + + self.mox.StubOutWithMock(self.driver.host_manager, + 'get_service_capabilities') + self.driver.host_manager.get_service_capabilities().AndReturn( + expected) + + self.mox.ReplayAll() + result = self.driver.get_service_capabilities() + self.assertEqual(result, expected) + + def test_update_service_capabilities(self): + service_name = 'fake_service' + host = 'fake_host' + + self.mox.StubOutWithMock(self.driver.host_manager, + 'update_service_capabilities') + + capabilities = {'fake_capability': 'fake_value'} + self.driver.host_manager.update_service_capabilities( + service_name, host, capabilities) + self.mox.ReplayAll() + result = self.driver.update_service_capabilities(service_name, + host, capabilities) + + def test_hosts_up(self): + service1 = {'host': 'host1'} + service2 = {'host': 'host2'} + services = [service1, service2] + + self.mox.StubOutWithMock(db, 'service_get_all_by_topic') + self.mox.StubOutWithMock(utils, 'service_is_up') + + db.service_get_all_by_topic(self.context, + self.topic).AndReturn(services) + utils.service_is_up(service1).AndReturn(False) + utils.service_is_up(service2).AndReturn(True) + + self.mox.ReplayAll() + result = self.driver.hosts_up(self.context, self.topic) + self.assertEqual(result, ['host2']) + + +class SchedulerDriverBaseTestCase(SchedulerTestCase): + """Test cases for base scheduler driver class methods + that can't will fail if the driver is changed""" + + def test_unimplemented_schedule(self): + fake_args = (1, 2, 3) + fake_kwargs = {'cat': 'meow'} + + self.assertRaises(NotImplementedError, self.driver.schedule, + self.context, self.topic, 'schedule_something', + *fake_args, **fake_kwargs) + + +class SchedulerDriverModuleTestCase(test.TestCase): + """Test case for scheduler driver module methods""" + + def setUp(self): + super(SchedulerDriverModuleTestCase, self).setUp() + self.context = context.RequestContext('fake_user', 'fake_project') + + def test_cast_to_volume_host_update_db_with_volume_id(self): + host = 'fake_host1' + method = 'fake_method' + fake_kwargs = {'volume_id': 31337, + 'extra_arg': 'meow'} + queue = 'fake_queue' + + self.mox.StubOutWithMock(utils, 'utcnow') + self.mox.StubOutWithMock(db, 'volume_update') + self.mox.StubOutWithMock(db, 'queue_get_for') + self.mox.StubOutWithMock(rpc, 'cast') + + utils.utcnow().AndReturn('fake-now') + db.volume_update(self.context, 31337, + {'host': host, 'scheduled_at': 'fake-now'}) + db.queue_get_for(self.context, 'volume', host).AndReturn(queue) + rpc.cast(self.context, queue, + {'method': method, + 'args': fake_kwargs}) + + self.mox.ReplayAll() + driver.cast_to_volume_host(self.context, host, method, + update_db=True, **fake_kwargs) + + def test_cast_to_volume_host_update_db_without_volume_id(self): + host = 'fake_host1' + method = 'fake_method' + fake_kwargs = {'extra_arg': 'meow'} + queue = 'fake_queue' + + self.mox.StubOutWithMock(db, 'queue_get_for') + self.mox.StubOutWithMock(rpc, 'cast') + + db.queue_get_for(self.context, 'volume', host).AndReturn(queue) + rpc.cast(self.context, queue, + {'method': method, + 'args': fake_kwargs}) + + self.mox.ReplayAll() + driver.cast_to_volume_host(self.context, host, method, + update_db=True, **fake_kwargs) + + def test_cast_to_volume_host_no_update_db(self): + host = 'fake_host1' + method = 'fake_method' + fake_kwargs = {'extra_arg': 'meow'} + queue = 'fake_queue' + + self.mox.StubOutWithMock(db, 'queue_get_for') + self.mox.StubOutWithMock(rpc, 'cast') + + db.queue_get_for(self.context, 'volume', host).AndReturn(queue) + rpc.cast(self.context, queue, + {'method': method, + 'args': fake_kwargs}) + + self.mox.ReplayAll() + driver.cast_to_volume_host(self.context, host, method, + update_db=False, **fake_kwargs) + + def test_cast_to_host_volume_topic(self): + host = 'fake_host1' + method = 'fake_method' + fake_kwargs = {'extra_arg': 'meow'} + + self.mox.StubOutWithMock(driver, 'cast_to_volume_host') + driver.cast_to_volume_host(self.context, host, method, + update_db=False, **fake_kwargs) + + self.mox.ReplayAll() + driver.cast_to_host(self.context, 'volume', host, method, + update_db=False, **fake_kwargs) + + def test_cast_to_host_unknown_topic(self): + host = 'fake_host1' + method = 'fake_method' + fake_kwargs = {'extra_arg': 'meow'} + topic = 'unknown' + queue = 'fake_queue' + + self.mox.StubOutWithMock(db, 'queue_get_for') + self.mox.StubOutWithMock(rpc, 'cast') + + db.queue_get_for(self.context, topic, host).AndReturn(queue) + rpc.cast(self.context, queue, + {'method': method, + 'args': fake_kwargs}) + + self.mox.ReplayAll() + driver.cast_to_host(self.context, topic, host, method, + update_db=False, **fake_kwargs) diff --git a/cinder/tests/test_SolidFireSanISCSIDriver.py b/cinder/tests/test_SolidFireSanISCSIDriver.py new file mode 100644 index 000000000..4a1a60121 --- /dev/null +++ b/cinder/tests/test_SolidFireSanISCSIDriver.py @@ -0,0 +1,186 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 OpenStack LLC. +# 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 cinder import exception +from cinder import log as logging +from cinder.volume import san +from cinder import test + +LOG = logging.getLogger(__name__) + + +class SolidFireVolumeTestCase(test.TestCase): + def setUp(self): + super(SolidFireVolumeTestCase, self).setUp() + + def fake_issue_api_request(obj, method, params): + if method is 'GetClusterInfo': + LOG.info('Called Fake GetClusterInfo...') + results = {'result': {'clusterInfo': + {'name': 'fake-cluster', + 'mvip': '1.1.1.1', + 'svip': '1.1.1.1', + 'uniqueID': 'unqid', + 'repCount': 2, + 'attributes': {}}}} + return results + + elif method is 'AddAccount': + LOG.info('Called Fake AddAccount...') + return {'result': {'accountID': 25}, 'id': 1} + + elif method is 'GetAccountByName': + LOG.info('Called Fake GetAccountByName...') + results = {'result': {'account': { + 'accountID': 25, + 'username': params['username'], + 'status': 'active', + 'initiatorSecret': '123456789012', + 'targetSecret': '123456789012', + 'attributes': {}, + 'volumes': [6, 7, 20]}}, + "id": 1} + return results + + elif method is 'CreateVolume': + LOG.info('Called Fake CreateVolume...') + return {'result': {'volumeID': 5}, 'id': 1} + + elif method is 'DeleteVolume': + LOG.info('Called Fake DeleteVolume...') + return {'result': {}, 'id': 1} + + elif method is 'ListVolumesForAccount': + LOG.info('Called Fake ListVolumesForAccount...') + result = {'result': {'volumes': [{ + 'volumeID': '5', + 'name': 'test_volume', + 'accountID': 25, + 'sliceCount': 1, + 'totalSize': 1048576 * 1024, + 'enable512e': False, + 'access': "readWrite", + 'status': "active", + 'attributes':None, + 'qos':None}]}} + return result + + else: + LOG.error('Crap, unimplemented API call in Fake:%s' % method) + + def fake_issue_api_request_fails(obj, method, params): + return {'error': { + 'code': 000, + 'name': 'DummyError', + 'message': 'This is a fake error response'}, + 'id': 1} + + def test_create_volume(self): + self.stubs.Set(san.SolidFireSanISCSIDriver, '_issue_api_request', + self.fake_issue_api_request) + testvol = {'project_id': 'testprjid', + 'name': 'testvol', + 'size': 1} + sfv = san.SolidFireSanISCSIDriver() + model_update = sfv.create_volume(testvol) + + def test_create_volume_fails(self): + self.stubs.Set(san.SolidFireSanISCSIDriver, '_issue_api_request', + self.fake_issue_api_request_fails) + testvol = {'project_id': 'testprjid', + 'name': 'testvol', + 'size': 1} + sfv = san.SolidFireSanISCSIDriver() + try: + sfv.create_volume(testvol) + self.fail("Should have thrown Error") + except Exception: + pass + + def test_create_sfaccount(self): + sfv = san.SolidFireSanISCSIDriver() + self.stubs.Set(san.SolidFireSanISCSIDriver, '_issue_api_request', + self.fake_issue_api_request) + account = sfv._create_sfaccount('project-id') + self.assertNotEqual(account, None) + + def test_create_sfaccount_fails(self): + sfv = san.SolidFireSanISCSIDriver() + self.stubs.Set(san.SolidFireSanISCSIDriver, '_issue_api_request', + self.fake_issue_api_request_fails) + account = sfv._create_sfaccount('project-id') + self.assertEqual(account, None) + + def test_get_sfaccount_by_name(self): + sfv = san.SolidFireSanISCSIDriver() + self.stubs.Set(san.SolidFireSanISCSIDriver, '_issue_api_request', + self.fake_issue_api_request) + account = sfv._get_sfaccount_by_name('some-name') + self.assertNotEqual(account, None) + + def test_get_sfaccount_by_name_fails(self): + sfv = san.SolidFireSanISCSIDriver() + self.stubs.Set(san.SolidFireSanISCSIDriver, '_issue_api_request', + self.fake_issue_api_request_fails) + account = sfv._get_sfaccount_by_name('some-name') + self.assertEqual(account, None) + + def test_delete_volume(self): + self.stubs.Set(san.SolidFireSanISCSIDriver, '_issue_api_request', + self.fake_issue_api_request) + testvol = {'project_id': 'testprjid', + 'name': 'test_volume', + 'size': 1} + sfv = san.SolidFireSanISCSIDriver() + model_update = sfv.delete_volume(testvol) + + def test_delete_volume_fails_no_volume(self): + self.stubs.Set(san.SolidFireSanISCSIDriver, '_issue_api_request', + self.fake_issue_api_request) + testvol = {'project_id': 'testprjid', + 'name': 'no-name', + 'size': 1} + sfv = san.SolidFireSanISCSIDriver() + try: + model_update = sfv.delete_volume(testvol) + self.fail("Should have thrown Error") + except Exception: + pass + + def test_delete_volume_fails_account_lookup(self): + self.stubs.Set(san.SolidFireSanISCSIDriver, '_issue_api_request', + self.fake_issue_api_request) + testvol = {'project_id': 'testprjid', + 'name': 'no-name', + 'size': 1} + sfv = san.SolidFireSanISCSIDriver() + self.assertRaises(exception.DuplicateSfVolumeNames, + sfv.delete_volume, + testvol) + + def test_get_cluster_info(self): + self.stubs.Set(san.SolidFireSanISCSIDriver, '_issue_api_request', + self.fake_issue_api_request) + sfv = san.SolidFireSanISCSIDriver() + sfv._get_cluster_info() + + def test_get_cluster_info_fail(self): + self.stubs.Set(san.SolidFireSanISCSIDriver, '_issue_api_request', + self.fake_issue_api_request_fails) + sfv = san.SolidFireSanISCSIDriver() + self.assertRaises(exception.SolidFireAPIException, + sfv._get_cluster_info) diff --git a/cinder/tests/test_api.py b/cinder/tests/test_api.py new file mode 100644 index 000000000..8a158c706 --- /dev/null +++ b/cinder/tests/test_api.py @@ -0,0 +1,75 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Unit tests for the API endpoint""" + +import httplib +import StringIO + +import webob + + +class FakeHttplibSocket(object): + """a fake socket implementation for httplib.HTTPResponse, trivial""" + def __init__(self, response_string): + self.response_string = response_string + self._buffer = StringIO.StringIO(response_string) + + def makefile(self, _mode, _other): + """Returns the socket's internal buffer""" + return self._buffer + + +class FakeHttplibConnection(object): + """A fake httplib.HTTPConnection for boto to use + + requests made via this connection actually get translated and routed into + our WSGI app, we then wait for the response and turn it back into + the httplib.HTTPResponse that boto expects. + """ + def __init__(self, app, host, is_secure=False): + self.app = app + self.host = host + + def request(self, method, path, data, headers): + req = webob.Request.blank(path) + req.method = method + req.body = data + req.headers = headers + req.headers['Accept'] = 'text/html' + req.host = self.host + # Call the WSGI app, get the HTTP response + resp = str(req.get_response(self.app)) + # For some reason, the response doesn't have "HTTP/1.0 " prepended; I + # guess that's a function the web server usually provides. + resp = "HTTP/1.0 %s" % resp + self.sock = FakeHttplibSocket(resp) + self.http_response = httplib.HTTPResponse(self.sock) + # NOTE(vish): boto is accessing private variables for some reason + self._HTTPConnection__response = self.http_response + self.http_response.begin() + + def getresponse(self): + return self.http_response + + def getresponsebody(self): + return self.sock.response_string + + def close(self): + """Required for compatibility with boto/tornado""" + pass diff --git a/cinder/tests/test_compat_flagfile.py b/cinder/tests/test_compat_flagfile.py new file mode 100644 index 000000000..a98b88fc1 --- /dev/null +++ b/cinder/tests/test_compat_flagfile.py @@ -0,0 +1,175 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 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. + +import contextlib +import os +import shutil +import StringIO +import textwrap +import tempfile +import unittest +import uuid + +from cinder.compat import flagfile +from cinder import test + + +class ThatLastTwoPercentCoverageTestCase(unittest.TestCase): + def test_open_file_for_reading(self): + with flagfile._open_file_for_reading(__file__): + pass + + def test_open_fd_for_writing(self): + (fd, path) = tempfile.mkstemp() + try: + with flagfile._open_fd_for_writing(fd, None): + pass + finally: + os.remove(path) + + +class CompatFlagfileTestCase(test.TestCase): + def setUp(self): + super(CompatFlagfileTestCase, self).setUp() + self.files = {} + self.tempdir = str(uuid.uuid4()) + self.tempfiles = [] + + self.stubs.Set(flagfile, '_open_file_for_reading', self._fake_open) + self.stubs.Set(flagfile, '_open_fd_for_writing', self._fake_open) + self.stubs.Set(tempfile, 'mkdtemp', self._fake_mkdtemp) + self.stubs.Set(tempfile, 'mkstemp', self._fake_mkstemp) + self.stubs.Set(shutil, 'rmtree', self._fake_rmtree) + + def _fake_open(self, *args): + @contextlib.contextmanager + def managed_stringio(path): + if not path in self.files: + self.files[path] = "" + sio = StringIO.StringIO(textwrap.dedent(self.files[path])) + try: + yield sio + finally: + self.files[path] = sio.getvalue() + sio.close() + if len(args) == 2: + args = args[1:] # remove the fd arg for fdopen() case + return managed_stringio(args[0]) + + def _fake_mkstemp(self, *args, **kwargs): + self.assertTrue('dir' in kwargs) + self.assertEquals(kwargs['dir'], self.tempdir) + self.tempfiles.append(str(uuid.uuid4())) + return (None, self.tempfiles[-1]) + + def _fake_mkdtemp(self, *args, **kwargs): + return self.tempdir + + def _fake_rmtree(self, path): + self.assertEquals(self.tempdir, path) + self.tempdir = None + + def test_no_args(self): + before = [] + after = flagfile.handle_flagfiles(before, tempdir=self.tempdir) + self.assertEquals(after, before) + + def _do_test_empty_flagfile(self, before): + self.files['foo.flags'] = '' + after = flagfile.handle_flagfiles(before, tempdir=self.tempdir) + self.assertEquals(after, ['--config-file=' + self.tempfiles[-1]]) + self.assertEquals(self.files[self.tempfiles[-1]], '[DEFAULT]\n') + + def test_empty_flagfile(self): + self._do_test_empty_flagfile(['--flagfile=foo.flags']) + + def test_empty_flagfile_separated(self): + self._do_test_empty_flagfile(['--flagfile', 'foo.flags']) + + def test_empty_flagfile_single_hyphen(self): + self._do_test_empty_flagfile(['-flagfile=foo.flags']) + + def test_empty_flagfile_single_hyphen_separated_separated(self): + self._do_test_empty_flagfile(['-flagfile', 'foo.flags']) + + def test_empty_flagfile_with_other_args(self): + self.files['foo.flags'] = '' + + before = [ + '--foo', 'bar', + '--flagfile=foo.flags', + '--blaa=foo', + '--foo-flagfile', + '--flagfile-foo' + ] + + after = flagfile.handle_flagfiles(before, tempdir=self.tempdir) + + self.assertEquals(after, [ + '--foo', 'bar', + '--config-file=' + self.tempfiles[-1], + '--blaa=foo', + '--foo-flagfile', + '--flagfile-foo']) + self.assertEquals(self.files[self.tempfiles[-1]], '[DEFAULT]\n') + + def _do_test_flagfile(self, flags, conf): + self.files['foo.flags'] = flags + + before = ['--flagfile=foo.flags'] + + after = flagfile.handle_flagfiles(before, tempdir=self.tempdir) + + self.assertEquals(after, + ['--config-file=' + t + for t in reversed(self.tempfiles)]) + self.assertEquals(self.files[self.tempfiles[-1]], + '[DEFAULT]\n' + conf) + + def test_flagfile(self): + self._do_test_flagfile('--bar=foo', 'bar=foo\n') + + def test_boolean_flag(self): + self._do_test_flagfile('--verbose', 'verbose=true\n') + + def test_boolean_inverted_flag(self): + self._do_test_flagfile('--noverbose', 'verbose=false\n') + + def test_flagfile_comments(self): + self._do_test_flagfile(' \n\n#foo\n--bar=foo\n--foo=bar\n//bar', + 'bar=foo\nfoo=bar\n') + + def test_flagfile_is_config(self): + self.files['foo.flags'] = '\n\n#foo\n//bar\n[DEFAULT]\nbar=foo' + before = ['--flagfile=foo.flags'] + after = flagfile.handle_flagfiles(before, tempdir=self.tempdir) + self.assertEquals(after, ['--config-file=foo.flags']) + + def test_flagfile_nested(self): + self.files['bar.flags'] = '--foo=bar' + + self._do_test_flagfile('--flagfile=bar.flags', '') + + self.assertEquals(self.files[self.tempfiles[-2]], + '[DEFAULT]\nfoo=bar\n') + + def test_flagfile_managed(self): + self.files['foo.flags'] = '' + before = ['--flagfile=foo.flags'] + with flagfile.handle_flagfiles_managed(before) as after: + self.assertEquals(after, ['--config-file=' + self.tempfiles[-1]]) + self.assertEquals(self.files[self.tempfiles[-1]], '[DEFAULT]\n') + self.assertTrue(self.tempdir is None) diff --git a/cinder/tests/test_context.py b/cinder/tests/test_context.py new file mode 100644 index 000000000..afa78cda6 --- /dev/null +++ b/cinder/tests/test_context.py @@ -0,0 +1,70 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 cinder import context +from cinder import test + + +class ContextTestCase(test.TestCase): + + def test_request_context_sets_is_admin(self): + ctxt = context.RequestContext('111', + '222', + roles=['admin', 'weasel']) + self.assertEquals(ctxt.is_admin, True) + + def test_request_context_sets_is_admin_upcase(self): + ctxt = context.RequestContext('111', + '222', + roles=['Admin', 'weasel']) + self.assertEquals(ctxt.is_admin, True) + + def test_request_context_read_deleted(self): + ctxt = context.RequestContext('111', + '222', + read_deleted='yes') + self.assertEquals(ctxt.read_deleted, 'yes') + + ctxt.read_deleted = 'no' + self.assertEquals(ctxt.read_deleted, 'no') + + def test_request_context_read_deleted_invalid(self): + self.assertRaises(ValueError, + context.RequestContext, + '111', + '222', + read_deleted=True) + + ctxt = context.RequestContext('111', '222') + self.assertRaises(ValueError, + setattr, + ctxt, + 'read_deleted', + True) + + def test_extra_args_to_context_get_logged(self): + info = {} + + def fake_warn(log_msg): + info['log_msg'] = log_msg + + self.stubs.Set(context.LOG, 'warn', fake_warn) + + c = context.RequestContext('user', 'project', + extra_arg1='meow', extra_arg2='wuff') + self.assertTrue(c) + self.assertIn("'extra_arg1': 'meow'", info['log_msg']) + self.assertIn("'extra_arg2': 'wuff'", info['log_msg']) diff --git a/cinder/tests/test_db_api.py b/cinder/tests/test_db_api.py new file mode 100644 index 000000000..93e079d0e --- /dev/null +++ b/cinder/tests/test_db_api.py @@ -0,0 +1,331 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Unit tests for the DB API""" + +from cinder import test +from cinder import context +from cinder import db +from cinder import exception +from cinder import flags + +FLAGS = flags.FLAGS + + +def _get_fake_aggr_values(): + return {'name': 'fake_aggregate', + 'availability_zone': 'fake_avail_zone', } + + +def _get_fake_aggr_metadata(): + return {'fake_key1': 'fake_value1', + 'fake_key2': 'fake_value2'} + + +def _get_fake_aggr_hosts(): + return ['foo.openstack.org'] + + +def _create_aggregate(context=context.get_admin_context(), + values=_get_fake_aggr_values(), + metadata=_get_fake_aggr_metadata()): + return db.aggregate_create(context, values, metadata) + + +def _create_aggregate_with_hosts(context=context.get_admin_context(), + values=_get_fake_aggr_values(), + metadata=_get_fake_aggr_metadata(), + hosts=_get_fake_aggr_hosts()): + result = _create_aggregate(context=context, + values=values, metadata=metadata) + for host in hosts: + db.aggregate_host_add(context, result.id, host) + return result + + +class AggregateDBApiTestCase(test.TestCase): + def setUp(self): + super(AggregateDBApiTestCase, self).setUp() + self.user_id = 'fake' + self.project_id = 'fake' + self.context = context.RequestContext(self.user_id, self.project_id) + + def test_aggregate_create(self): + """Ensure aggregate can be created with no metadata.""" + result = _create_aggregate(metadata=None) + self.assertEqual(result['operational_state'], 'created') + + def test_aggregate_create_avoid_name_conflict(self): + """Test we can avoid conflict on deleted aggregates.""" + r1 = _create_aggregate(metadata=None) + db.aggregate_delete(context.get_admin_context(), r1.id) + values = {'name': r1.name, 'availability_zone': 'new_zone'} + r2 = _create_aggregate(values=values) + self.assertEqual(r2.name, values['name']) + self.assertEqual(r2.availability_zone, values['availability_zone']) + self.assertEqual(r2.operational_state, "created") + + def test_aggregate_create_raise_exist_exc(self): + """Ensure aggregate names are distinct.""" + _create_aggregate(metadata=None) + self.assertRaises(exception.AggregateNameExists, + _create_aggregate, metadata=None) + + def test_aggregate_get_raise_not_found(self): + """Ensure AggregateNotFound is raised when getting an aggregate.""" + ctxt = context.get_admin_context() + # this does not exist! + aggregate_id = 1 + self.assertRaises(exception.AggregateNotFound, + db.aggregate_get, + ctxt, aggregate_id) + + def test_aggregate_metadata_get_raise_not_found(self): + """Ensure AggregateNotFound is raised when getting metadata.""" + ctxt = context.get_admin_context() + # this does not exist! + aggregate_id = 1 + self.assertRaises(exception.AggregateNotFound, + db.aggregate_metadata_get, + ctxt, aggregate_id) + + def test_aggregate_create_with_metadata(self): + """Ensure aggregate can be created with metadata.""" + ctxt = context.get_admin_context() + result = _create_aggregate(context=ctxt) + expected_metadata = db.aggregate_metadata_get(ctxt, result['id']) + self.assertDictMatch(expected_metadata, _get_fake_aggr_metadata()) + + def test_aggregate_create_low_privi_context(self): + """Ensure right context is applied when creating aggregate.""" + self.assertRaises(exception.AdminRequired, + db.aggregate_create, + self.context, _get_fake_aggr_values()) + + def test_aggregate_get(self): + """Ensure we can get aggregate with all its relations.""" + ctxt = context.get_admin_context() + result = _create_aggregate_with_hosts(context=ctxt) + expected = db.aggregate_get(ctxt, result.id) + self.assertEqual(_get_fake_aggr_hosts(), expected.hosts) + self.assertEqual(_get_fake_aggr_metadata(), expected.metadetails) + + def test_aggregate_get_by_host(self): + """Ensure we can get an aggregate by host.""" + ctxt = context.get_admin_context() + r1 = _create_aggregate_with_hosts(context=ctxt) + r2 = db.aggregate_get_by_host(ctxt, 'foo.openstack.org') + self.assertEqual(r1.id, r2.id) + + def test_aggregate_get_by_host_not_found(self): + """Ensure AggregateHostNotFound is raised with unknown host.""" + ctxt = context.get_admin_context() + _create_aggregate_with_hosts(context=ctxt) + self.assertRaises(exception.AggregateHostNotFound, + db.aggregate_get_by_host, ctxt, 'unknown_host') + + def test_aggregate_delete_raise_not_found(self): + """Ensure AggregateNotFound is raised when deleting an aggregate.""" + ctxt = context.get_admin_context() + # this does not exist! + aggregate_id = 1 + self.assertRaises(exception.AggregateNotFound, + db.aggregate_delete, + ctxt, aggregate_id) + + def test_aggregate_delete(self): + """Ensure we can delete an aggregate.""" + ctxt = context.get_admin_context() + result = _create_aggregate(context=ctxt, metadata=None) + db.aggregate_delete(ctxt, result['id']) + expected = db.aggregate_get_all(ctxt) + self.assertEqual(0, len(expected)) + aggregate = db.aggregate_get(ctxt.elevated(read_deleted='yes'), + result['id']) + self.assertEqual(aggregate["operational_state"], "dismissed") + + def test_aggregate_update(self): + """Ensure an aggregate can be updated.""" + ctxt = context.get_admin_context() + result = _create_aggregate(context=ctxt, metadata=None) + new_values = _get_fake_aggr_values() + new_values['availability_zone'] = 'different_avail_zone' + updated = db.aggregate_update(ctxt, 1, new_values) + self.assertNotEqual(result.availability_zone, + updated.availability_zone) + + def test_aggregate_update_with_metadata(self): + """Ensure an aggregate can be updated with metadata.""" + ctxt = context.get_admin_context() + result = _create_aggregate(context=ctxt, metadata=None) + values = _get_fake_aggr_values() + values['metadata'] = _get_fake_aggr_metadata() + db.aggregate_update(ctxt, 1, values) + expected = db.aggregate_metadata_get(ctxt, result.id) + self.assertDictMatch(_get_fake_aggr_metadata(), expected) + + def test_aggregate_update_with_existing_metadata(self): + """Ensure an aggregate can be updated with existing metadata.""" + ctxt = context.get_admin_context() + result = _create_aggregate(context=ctxt) + values = _get_fake_aggr_values() + values['metadata'] = _get_fake_aggr_metadata() + values['metadata']['fake_key1'] = 'foo' + db.aggregate_update(ctxt, 1, values) + expected = db.aggregate_metadata_get(ctxt, result.id) + self.assertDictMatch(values['metadata'], expected) + + def test_aggregate_update_raise_not_found(self): + """Ensure AggregateNotFound is raised when updating an aggregate.""" + ctxt = context.get_admin_context() + # this does not exist! + aggregate_id = 1 + new_values = _get_fake_aggr_values() + self.assertRaises(exception.AggregateNotFound, + db.aggregate_update, ctxt, aggregate_id, new_values) + + def test_aggregate_get_all(self): + """Ensure we can get all aggregates.""" + ctxt = context.get_admin_context() + counter = 3 + for c in xrange(counter): + _create_aggregate(context=ctxt, + values={'name': 'fake_aggregate_%d' % c, + 'availability_zone': 'fake_avail_zone'}, + metadata=None) + results = db.aggregate_get_all(ctxt) + self.assertEqual(len(results), counter) + + def test_aggregate_get_all_non_deleted(self): + """Ensure we get only non-deleted aggregates.""" + ctxt = context.get_admin_context() + add_counter = 5 + remove_counter = 2 + aggregates = [] + for c in xrange(1, add_counter): + values = {'name': 'fake_aggregate_%d' % c, + 'availability_zone': 'fake_avail_zone'} + aggregates.append(_create_aggregate(context=ctxt, + values=values, metadata=None)) + for c in xrange(1, remove_counter): + db.aggregate_delete(ctxt, aggregates[c - 1].id) + results = db.aggregate_get_all(ctxt) + self.assertEqual(len(results), add_counter - remove_counter) + + def test_aggregate_metadata_add(self): + """Ensure we can add metadata for the aggregate.""" + ctxt = context.get_admin_context() + result = _create_aggregate(context=ctxt, metadata=None) + metadata = _get_fake_aggr_metadata() + db.aggregate_metadata_add(ctxt, result.id, metadata) + expected = db.aggregate_metadata_get(ctxt, result.id) + self.assertDictMatch(metadata, expected) + + def test_aggregate_metadata_update(self): + """Ensure we can update metadata for the aggregate.""" + ctxt = context.get_admin_context() + result = _create_aggregate(context=ctxt) + metadata = _get_fake_aggr_metadata() + key = metadata.keys()[0] + db.aggregate_metadata_delete(ctxt, result.id, key) + new_metadata = {key: 'foo'} + db.aggregate_metadata_add(ctxt, result.id, new_metadata) + expected = db.aggregate_metadata_get(ctxt, result.id) + metadata[key] = 'foo' + self.assertDictMatch(metadata, expected) + + def test_aggregate_metadata_delete(self): + """Ensure we can delete metadata for the aggregate.""" + ctxt = context.get_admin_context() + result = _create_aggregate(context=ctxt, metadata=None) + metadata = _get_fake_aggr_metadata() + db.aggregate_metadata_add(ctxt, result.id, metadata) + db.aggregate_metadata_delete(ctxt, result.id, metadata.keys()[0]) + expected = db.aggregate_metadata_get(ctxt, result.id) + del metadata[metadata.keys()[0]] + self.assertDictMatch(metadata, expected) + + def test_aggregate_metadata_delete_raise_not_found(self): + """Ensure AggregateMetadataNotFound is raised when deleting.""" + ctxt = context.get_admin_context() + result = _create_aggregate(context=ctxt) + self.assertRaises(exception.AggregateMetadataNotFound, + db.aggregate_metadata_delete, + ctxt, result.id, 'foo_key') + + def test_aggregate_host_add(self): + """Ensure we can add host to the aggregate.""" + ctxt = context.get_admin_context() + result = _create_aggregate_with_hosts(context=ctxt, metadata=None) + expected = db.aggregate_host_get_all(ctxt, result.id) + self.assertEqual(_get_fake_aggr_hosts(), expected) + + def test_aggregate_host_add_deleted(self): + """Ensure we can add a host that was previously deleted.""" + ctxt = context.get_admin_context() + result = _create_aggregate_with_hosts(context=ctxt, metadata=None) + host = _get_fake_aggr_hosts()[0] + db.aggregate_host_delete(ctxt, result.id, host) + db.aggregate_host_add(ctxt, result.id, host) + expected = db.aggregate_host_get_all(ctxt, result.id) + self.assertEqual(len(expected), 1) + + def test_aggregate_host_add_duplicate_raise_conflict(self): + """Ensure we cannot add host to distinct aggregates.""" + ctxt = context.get_admin_context() + _create_aggregate_with_hosts(context=ctxt, metadata=None) + self.assertRaises(exception.AggregateHostConflict, + _create_aggregate_with_hosts, ctxt, + values={'name': 'fake_aggregate2', + 'availability_zone': 'fake_avail_zone2', }, + metadata=None) + + def test_aggregate_host_add_duplicate_raise_exist_exc(self): + """Ensure we cannot add host to the same aggregate.""" + ctxt = context.get_admin_context() + result = _create_aggregate_with_hosts(context=ctxt, metadata=None) + self.assertRaises(exception.AggregateHostExists, + db.aggregate_host_add, + ctxt, result.id, _get_fake_aggr_hosts()[0]) + + def test_aggregate_host_add_raise_not_found(self): + """Ensure AggregateFound when adding a host.""" + ctxt = context.get_admin_context() + # this does not exist! + aggregate_id = 1 + host = _get_fake_aggr_hosts()[0] + self.assertRaises(exception.AggregateNotFound, + db.aggregate_host_add, + ctxt, aggregate_id, host) + + def test_aggregate_host_delete(self): + """Ensure we can add host to the aggregate.""" + ctxt = context.get_admin_context() + result = _create_aggregate_with_hosts(context=ctxt, metadata=None) + db.aggregate_host_delete(ctxt, result.id, + _get_fake_aggr_hosts()[0]) + expected = db.aggregate_host_get_all(ctxt, result.id) + self.assertEqual(0, len(expected)) + + def test_aggregate_host_delete_raise_not_found(self): + """Ensure AggregateHostNotFound is raised when deleting a host.""" + ctxt = context.get_admin_context() + result = _create_aggregate(context=ctxt) + self.assertRaises(exception.AggregateHostNotFound, + db.aggregate_host_delete, + ctxt, result.id, _get_fake_aggr_hosts()[0]) diff --git a/cinder/tests/test_exception.py b/cinder/tests/test_exception.py new file mode 100644 index 000000000..717fb3d85 --- /dev/null +++ b/cinder/tests/test_exception.py @@ -0,0 +1,126 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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 cinder import test +from cinder import exception + + +class FakeNotifier(object): + """Acts like the cinder.notifier.api module.""" + ERROR = 88 + + def __init__(self): + self.provided_publisher = None + self.provided_event = None + self.provided_priority = None + self.provided_payload = None + + def notify(self, publisher, event, priority, payload): + self.provided_publisher = publisher + self.provided_event = event + self.provided_priority = priority + self.provided_payload = payload + + +def good_function(): + return 99 + + +def bad_function_error(): + raise exception.Error() + + +def bad_function_exception(): + raise test.TestingException() + + +class WrapExceptionTestCase(test.TestCase): + def test_wrap_exception_good_return(self): + wrapped = exception.wrap_exception() + self.assertEquals(99, wrapped(good_function)()) + + def test_wrap_exception_throws_error(self): + wrapped = exception.wrap_exception() + self.assertRaises(exception.Error, wrapped(bad_function_error)) + + def test_wrap_exception_throws_exception(self): + wrapped = exception.wrap_exception() + self.assertRaises(test.TestingException, + wrapped(bad_function_exception)) + + def test_wrap_exception_with_notifier(self): + notifier = FakeNotifier() + wrapped = exception.wrap_exception(notifier, "publisher", "event", + "level") + self.assertRaises(test.TestingException, + wrapped(bad_function_exception)) + self.assertEquals(notifier.provided_publisher, "publisher") + self.assertEquals(notifier.provided_event, "event") + self.assertEquals(notifier.provided_priority, "level") + for key in ['exception', 'args']: + self.assertTrue(key in notifier.provided_payload.keys()) + + def test_wrap_exception_with_notifier_defaults(self): + notifier = FakeNotifier() + wrapped = exception.wrap_exception(notifier) + self.assertRaises(test.TestingException, + wrapped(bad_function_exception)) + self.assertEquals(notifier.provided_publisher, None) + self.assertEquals(notifier.provided_event, "bad_function_exception") + self.assertEquals(notifier.provided_priority, notifier.ERROR) + + +class CinderExceptionTestCase(test.TestCase): + def test_default_error_msg(self): + class FakeCinderException(exception.CinderException): + message = "default message" + + exc = FakeCinderException() + self.assertEquals(unicode(exc), 'default message') + + def test_error_msg(self): + self.assertEquals(unicode(exception.CinderException('test')), + 'test') + + def test_default_error_msg_with_kwargs(self): + class FakeCinderException(exception.CinderException): + message = "default message: %(code)s" + + exc = FakeCinderException(code=500) + self.assertEquals(unicode(exc), 'default message: 500') + + def test_error_msg_exception_with_kwargs(self): + class FakeCinderException(exception.CinderException): + message = "default message: %(mispelled_code)s" + + exc = FakeCinderException(code=500) + self.assertEquals(unicode(exc), 'default message: %(mispelled_code)s') + + def test_default_error_code(self): + class FakeCinderException(exception.CinderException): + code = 404 + + exc = FakeCinderException() + self.assertEquals(exc.kwargs['code'], 404) + + def test_error_code_from_kwarg(self): + class FakeCinderException(exception.CinderException): + code = 500 + + exc = FakeCinderException(code=404) + self.assertEquals(exc.kwargs['code'], 404) diff --git a/cinder/tests/test_flags.py b/cinder/tests/test_flags.py new file mode 100644 index 000000000..e94c3484e --- /dev/null +++ b/cinder/tests/test_flags.py @@ -0,0 +1,146 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# All Rights Reserved. +# Copyright 2011 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. + +import os +import tempfile + +from cinder import flags +from cinder.openstack.common import cfg +from cinder import test + +FLAGS = flags.FLAGS +FLAGS.register_opt(cfg.StrOpt('flags_unittest', + default='foo', + help='for testing purposes only')) + + +class FlagsTestCase(test.TestCase): + + def setUp(self): + super(FlagsTestCase, self).setUp() + self.FLAGS = flags.CinderConfigOpts() + self.global_FLAGS = flags.FLAGS + + def test_declare(self): + self.assert_('answer' not in self.global_FLAGS) + flags.DECLARE('answer', 'cinder.tests.declare_flags') + self.assert_('answer' in self.global_FLAGS) + self.assertEqual(self.global_FLAGS.answer, 42) + + # Make sure we don't overwrite anything + self.global_FLAGS.set_override('answer', 256) + self.assertEqual(self.global_FLAGS.answer, 256) + flags.DECLARE('answer', 'cinder.tests.declare_flags') + self.assertEqual(self.global_FLAGS.answer, 256) + + def test_getopt_non_interspersed_args(self): + self.assert_('runtime_answer' not in self.global_FLAGS) + + argv = ['flags_test', 'extra_arg', '--runtime_answer=60'] + args = self.global_FLAGS(argv) + self.assertEqual(len(args), 3) + self.assertEqual(argv, args) + + def test_runtime_and_unknown_flags(self): + self.assert_('runtime_answer' not in self.global_FLAGS) + import cinder.tests.runtime_flags + self.assert_('runtime_answer' in self.global_FLAGS) + self.assertEqual(self.global_FLAGS.runtime_answer, 54) + + def test_long_vs_short_flags(self): + self.global_FLAGS.reset() + self.global_FLAGS.register_cli_opt(cfg.StrOpt('duplicate_answer_long', + default='val', + help='desc')) + argv = ['flags_test', '--duplicate_answer=60', 'extra_arg'] + args = self.global_FLAGS(argv) + + self.assert_('duplicate_answer' not in self.global_FLAGS) + self.assert_(self.global_FLAGS.duplicate_answer_long, 60) + + self.global_FLAGS.reset() + self.global_FLAGS.register_cli_opt(cfg.IntOpt('duplicate_answer', + default=60, + help='desc')) + args = self.global_FLAGS(argv) + self.assertEqual(self.global_FLAGS.duplicate_answer, 60) + self.assertEqual(self.global_FLAGS.duplicate_answer_long, 'val') + + def test_flag_leak_left(self): + self.assertEqual(FLAGS.flags_unittest, 'foo') + self.flags(flags_unittest='bar') + self.assertEqual(FLAGS.flags_unittest, 'bar') + + def test_flag_leak_right(self): + self.assertEqual(FLAGS.flags_unittest, 'foo') + self.flags(flags_unittest='bar') + self.assertEqual(FLAGS.flags_unittest, 'bar') + + def test_flag_overrides(self): + self.assertEqual(FLAGS.flags_unittest, 'foo') + self.flags(flags_unittest='bar') + self.assertEqual(FLAGS.flags_unittest, 'bar') + self.reset_flags() + self.assertEqual(FLAGS.flags_unittest, 'foo') + + def test_flagfile(self): + opts = [ + cfg.StrOpt('string', default='default', help='desc'), + cfg.IntOpt('int', default=1, help='desc'), + cfg.BoolOpt('false', default=False, help='desc'), + cfg.BoolOpt('true', default=True, help='desc'), + cfg.MultiStrOpt('multi', default=['blaa'], help='desc'), + ] + + self.FLAGS.register_opts(opts) + + (fd, path) = tempfile.mkstemp(prefix='cinder', suffix='.flags') + + try: + os.write(fd, '--string=foo\n--int=2\n--false\n--notrue\n') + os.write(fd, '--multi=bar\n') + os.close(fd) + + self.FLAGS(['flags_test', '--flagfile=' + path]) + + self.assertEqual(self.FLAGS.string, 'foo') + self.assertEqual(self.FLAGS.int, 2) + self.assertEqual(self.FLAGS.false, True) + self.assertEqual(self.FLAGS.true, False) + self.assertEqual(self.FLAGS.multi, ['bar']) + + # Re-parse to test multistring isn't append multiple times + self.FLAGS(['flags_test', '--flagfile=' + path]) + self.assertEqual(self.FLAGS.multi, ['bar']) + finally: + os.remove(path) + + def test_defaults(self): + self.FLAGS.register_opt(cfg.StrOpt('foo', default='bar', help='desc')) + self.assertEqual(self.FLAGS.foo, 'bar') + + self.FLAGS.set_default('foo', 'blaa') + self.assertEqual(self.FLAGS.foo, 'blaa') + + def test_templated_values(self): + self.FLAGS.register_opt(cfg.StrOpt('foo', default='foo', help='desc')) + self.FLAGS.register_opt(cfg.StrOpt('bar', default='bar', help='desc')) + self.FLAGS.register_opt(cfg.StrOpt('blaa', + default='$foo$bar', help='desc')) + self.assertEqual(self.FLAGS.blaa, 'foobar') diff --git a/cinder/tests/test_iscsi.py b/cinder/tests/test_iscsi.py new file mode 100644 index 000000000..d81b4ca5e --- /dev/null +++ b/cinder/tests/test_iscsi.py @@ -0,0 +1,116 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 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. + +import string + +from cinder import test +from cinder.volume import iscsi + + +class TargetAdminTestCase(object): + + def setUp(self): + self.cmds = [] + + self.tid = 1 + self.target_name = 'iqn.2011-09.org.foo.bar:blaa' + self.lun = 10 + self.path = '/foo/bar/blaa' + + self.script_template = None + + def get_script_params(self): + return {'tid': self.tid, + 'target_name': self.target_name, + 'lun': self.lun, + 'path': self.path} + + def get_script(self): + return self.script_template % self.get_script_params() + + def fake_execute(self, *cmd, **kwargs): + self.cmds.append(string.join(cmd)) + return "", None + + def clear_cmds(self): + cmds = [] + + def verify_cmds(self, cmds): + self.assertEqual(len(cmds), len(self.cmds)) + for a, b in zip(cmds, self.cmds): + self.assertEqual(a, b) + + def verify(self): + script = self.get_script() + cmds = [] + for line in script.split('\n'): + if not line.strip(): + continue + cmds.append(line) + self.verify_cmds(cmds) + + def run_commands(self): + tgtadm = iscsi.get_target_admin() + tgtadm.set_execute(self.fake_execute) + tgtadm.new_target(self.target_name, self.tid) + tgtadm.show_target(self.tid) + tgtadm.new_logicalunit(self.tid, self.lun, self.path) + tgtadm.delete_logicalunit(self.tid, self.lun) + tgtadm.delete_target(self.tid) + + def test_target_admin(self): + self.clear_cmds() + self.run_commands() + self.verify() + + +class TgtAdmTestCase(test.TestCase, TargetAdminTestCase): + + def setUp(self): + super(TgtAdmTestCase, self).setUp() + TargetAdminTestCase.setUp(self) + self.flags(iscsi_helper='tgtadm') + self.script_template = "\n".join([ + "tgtadm --op new --lld=iscsi --mode=target --tid=%(tid)s " + "--targetname=%(target_name)s", + "tgtadm --op bind --lld=iscsi --mode=target --initiator-address=ALL " + "--tid=%(tid)s", + "tgtadm --op show --lld=iscsi --mode=target --tid=%(tid)s", + "tgtadm --op new --lld=iscsi --mode=logicalunit --tid=%(tid)s " + "--lun=%(lun)d --backing-store=%(path)s", + "tgtadm --op delete --lld=iscsi --mode=logicalunit --tid=%(tid)s " + "--lun=%(lun)d", + "tgtadm --op delete --lld=iscsi --mode=target --tid=%(tid)s"]) + + def get_script_params(self): + params = super(TgtAdmTestCase, self).get_script_params() + params['lun'] += 1 + return params + + +class IetAdmTestCase(test.TestCase, TargetAdminTestCase): + + def setUp(self): + super(IetAdmTestCase, self).setUp() + TargetAdminTestCase.setUp(self) + self.flags(iscsi_helper='ietadm') + self.script_template = "\n".join([ + "ietadm --op new --tid=%(tid)s --params Name=%(target_name)s", + "ietadm --op show --tid=%(tid)s", + "ietadm --op new --tid=%(tid)s --lun=%(lun)d " + "--params Path=%(path)s,Type=fileio", + "ietadm --op delete --tid=%(tid)s --lun=%(lun)d", + "ietadm --op delete --tid=%(tid)s"]) diff --git a/cinder/tests/test_log.py b/cinder/tests/test_log.py new file mode 100644 index 000000000..3d07df447 --- /dev/null +++ b/cinder/tests/test_log.py @@ -0,0 +1,218 @@ +import cStringIO +import json +import logging +import sys + +from cinder import context +from cinder import flags +from cinder import log +from cinder.notifier import api as notifier +from cinder import test + +FLAGS = flags.FLAGS +flags.DECLARE('list_notifier_drivers', + 'cinder.notifier.list_notifier') + + +def _fake_context(): + return context.RequestContext(1, 1) + + +class LoggerTestCase(test.TestCase): + def setUp(self): + super(LoggerTestCase, self).setUp() + self.log = log.getLogger() + + def test_handlers_have_cinder_formatter(self): + formatters = [] + for h in self.log.logger.handlers: + f = h.formatter + if isinstance(f, log.LegacyCinderFormatter): + formatters.append(f) + self.assert_(formatters) + self.assertEqual(len(formatters), len(self.log.logger.handlers)) + + def test_handles_context_kwarg(self): + self.log.info("foo", context=_fake_context()) + self.assert_(True) # didn't raise exception + + def test_audit_handles_context_arg(self): + self.log.audit("foo", context=_fake_context()) + self.assert_(True) # didn't raise exception + + def test_will_be_verbose_if_verbose_flag_set(self): + self.flags(verbose=True) + log.setup() + self.assertEqual(logging.DEBUG, self.log.logger.getEffectiveLevel()) + + def test_will_not_be_verbose_if_verbose_flag_not_set(self): + self.flags(verbose=False) + log.setup() + self.assertEqual(logging.INFO, self.log.logger.getEffectiveLevel()) + + def test_no_logging_via_module(self): + for func in ('critical', 'error', 'exception', 'warning', 'warn', + 'info', 'debug', 'log', 'audit'): + self.assertRaises(AttributeError, getattr, log, func) + + +class LogHandlerTestCase(test.TestCase): + def test_log_path_logdir(self): + self.flags(logdir='/some/path', logfile=None) + self.assertEquals(log._get_log_file_path(binary='foo-bar'), + '/some/path/foo-bar.log') + + def test_log_path_logfile(self): + self.flags(logfile='/some/path/foo-bar.log') + self.assertEquals(log._get_log_file_path(binary='foo-bar'), + '/some/path/foo-bar.log') + + def test_log_path_none(self): + self.flags(logdir=None, logfile=None) + self.assertTrue(log._get_log_file_path(binary='foo-bar') is None) + + def test_log_path_logfile_overrides_logdir(self): + self.flags(logdir='/some/other/path', + logfile='/some/path/foo-bar.log') + self.assertEquals(log._get_log_file_path(binary='foo-bar'), + '/some/path/foo-bar.log') + + +class PublishErrorsHandlerTestCase(test.TestCase): + """Tests for cinder.log.PublishErrorsHandler""" + def setUp(self): + super(PublishErrorsHandlerTestCase, self).setUp() + self.publiserrorshandler = log.PublishErrorsHandler(logging.ERROR) + + def test_emit_cfg_list_notifier_drivers_in_flags(self): + self.stub_flg = False + + def fake_notifier(*args, **kwargs): + self.stub_flg = True + + self.stubs.Set(notifier, 'notify', fake_notifier) + logrecord = logging.LogRecord('name', 'WARN', '/tmp', 1, + 'Message', None, None) + self.publiserrorshandler.emit(logrecord) + self.assertTrue(self.stub_flg) + + def test_emit_cfg_log_notifier_in_list_notifier_drivers(self): + self.flags(list_notifier_drivers=['cinder.notifier.rabbit_notifier', + 'cinder.notifier.log_notifier']) + self.stub_flg = True + + def fake_notifier(*args, **kwargs): + self.stub_flg = False + + self.stubs.Set(notifier, 'notify', fake_notifier) + logrecord = logging.LogRecord('name', 'WARN', '/tmp', 1, + 'Message', None, None) + self.publiserrorshandler.emit(logrecord) + self.assertTrue(self.stub_flg) + + +class CinderFormatterTestCase(test.TestCase): + def setUp(self): + super(CinderFormatterTestCase, self).setUp() + self.flags(logging_context_format_string="HAS CONTEXT " + "[%(request_id)s]: " + "%(message)s", + logging_default_format_string="NOCTXT: %(message)s", + logging_debug_format_suffix="--DBG") + self.log = log.getLogger() + self.stream = cStringIO.StringIO() + self.handler = logging.StreamHandler(self.stream) + self.handler.setFormatter(log.LegacyCinderFormatter()) + self.log.logger.addHandler(self.handler) + self.level = self.log.logger.getEffectiveLevel() + self.log.logger.setLevel(logging.DEBUG) + + def tearDown(self): + self.log.logger.setLevel(self.level) + self.log.logger.removeHandler(self.handler) + super(CinderFormatterTestCase, self).tearDown() + + def test_uncontextualized_log(self): + self.log.info("foo") + self.assertEqual("NOCTXT: foo\n", self.stream.getvalue()) + + def test_contextualized_log(self): + ctxt = _fake_context() + self.log.info("bar", context=ctxt) + expected = "HAS CONTEXT [%s]: bar\n" % ctxt.request_id + self.assertEqual(expected, self.stream.getvalue()) + + def test_debugging_log(self): + self.log.debug("baz") + self.assertEqual("NOCTXT: baz --DBG\n", self.stream.getvalue()) + + +class CinderLoggerTestCase(test.TestCase): + def setUp(self): + super(CinderLoggerTestCase, self).setUp() + levels = FLAGS.default_log_levels + levels.append("cinder-test=AUDIT") + self.flags(default_log_levels=levels, + verbose=True) + log.setup() + self.log = log.getLogger('cinder-test') + + def test_has_level_from_flags(self): + self.assertEqual(logging.AUDIT, self.log.logger.getEffectiveLevel()) + + def test_child_log_has_level_of_parent_flag(self): + l = log.getLogger('cinder-test.foo') + self.assertEqual(logging.AUDIT, l.logger.getEffectiveLevel()) + + +class JSONFormatterTestCase(test.TestCase): + def setUp(self): + super(JSONFormatterTestCase, self).setUp() + self.log = log.getLogger('test-json') + self.stream = cStringIO.StringIO() + handler = logging.StreamHandler(self.stream) + handler.setFormatter(log.JSONFormatter()) + self.log.logger.addHandler(handler) + self.log.logger.setLevel(logging.DEBUG) + + def test_json(self): + test_msg = 'This is a %(test)s line' + test_data = {'test': 'log'} + self.log.debug(test_msg, test_data) + + data = json.loads(self.stream.getvalue()) + self.assertTrue(data) + self.assertTrue('extra' in data) + self.assertEqual('test-json', data['name']) + + self.assertEqual(test_msg % test_data, data['message']) + self.assertEqual(test_msg, data['msg']) + self.assertEqual(test_data, data['args']) + + self.assertEqual('test_log.py', data['filename']) + self.assertEqual('test_json', data['funcname']) + + self.assertEqual('DEBUG', data['levelname']) + self.assertEqual(logging.DEBUG, data['levelno']) + self.assertFalse(data['traceback']) + + def test_json_exception(self): + test_msg = 'This is %s' + test_data = 'exceptional' + try: + raise Exception('This is exceptional') + except Exception: + self.log.exception(test_msg, test_data) + + data = json.loads(self.stream.getvalue()) + self.assertTrue(data) + self.assertTrue('extra' in data) + self.assertEqual('test-json', data['name']) + + self.assertEqual(test_msg % test_data, data['message']) + self.assertEqual(test_msg, data['msg']) + self.assertEqual([test_data], data['args']) + + self.assertEqual('ERROR', data['levelname']) + self.assertEqual(logging.ERROR, data['levelno']) + self.assertTrue(data['traceback']) diff --git a/cinder/tests/test_migrations.conf b/cinder/tests/test_migrations.conf new file mode 100644 index 000000000..774f14994 --- /dev/null +++ b/cinder/tests/test_migrations.conf @@ -0,0 +1,9 @@ +[DEFAULT] +# Set up any number of migration data stores you want, one +# The "name" used in the test is the config variable key. +#sqlite=sqlite:///test_migrations.db +sqlite=sqlite:// +#mysql=mysql://root:@localhost/test_migrations +#postgresql=postgresql://user:pass@localhost/test_migrations +[walk_style] +snake_walk=yes diff --git a/cinder/tests/test_migrations.py b/cinder/tests/test_migrations.py new file mode 100644 index 000000000..e16e9d04f --- /dev/null +++ b/cinder/tests/test_migrations.py @@ -0,0 +1,296 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010-2011 OpenStack, LLC +# 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. + +""" +Tests for database migrations. This test case reads the configuration +file test_migrations.conf for database connection settings +to use in the tests. For each connection found in the config file, +the test case runs a series of test cases to ensure that migrations work +properly both upgrading and downgrading, and that no data loss occurs +if possible. +""" + +import ConfigParser +import commands +import os +import unittest +import urlparse + +from migrate.versioning import repository +import sqlalchemy + +import cinder.db.sqlalchemy.migrate_repo +from cinder.db.sqlalchemy.migration import versioning_api as migration_api +from cinder import log as logging +from cinder import test + +LOG = logging.getLogger('cinder.tests.test_migrations') + + +def _mysql_get_connect_string(user="openstack_citest", + passwd="openstack_citest", + database="openstack_citest"): + """ + Try to get a connection with a very specfic set of values, if we get + these then we'll run the mysql tests, otherwise they are skipped + """ + return "mysql://%(user)s:%(passwd)s@localhost/%(database)s" % locals() + + +def _is_mysql_avail(user="openstack_citest", + passwd="openstack_citest", + database="openstack_citest"): + try: + connect_uri = _mysql_get_connect_string( + user=user, passwd=passwd, database=database) + engine = sqlalchemy.create_engine(connect_uri) + connection = engine.connect() + except Exception: + # intential catch all to handle exceptions even if we don't + # have mysql code loaded at all. + return False + else: + connection.close() + return True + + +def _missing_mysql(): + if "NOVA_TEST_MYSQL_PRESENT" in os.environ: + return True + return not _is_mysql_avail() + + +class TestMigrations(test.TestCase): + """Test sqlalchemy-migrate migrations""" + + TEST_DATABASES = {} + DEFAULT_CONFIG_FILE = os.path.join(os.path.dirname(__file__), + 'test_migrations.conf') + # Test machines can set the CINDER_TEST_MIGRATIONS_CONF variable + # to override the location of the config file for migration testing + CONFIG_FILE_PATH = os.environ.get('CINDER_TEST_MIGRATIONS_CONF', + DEFAULT_CONFIG_FILE) + MIGRATE_FILE = cinder.db.sqlalchemy.migrate_repo.__file__ + REPOSITORY = repository.Repository( + os.path.abspath(os.path.dirname(MIGRATE_FILE))) + + def setUp(self): + super(TestMigrations, self).setUp() + + self.snake_walk = False + + # Load test databases from the config file. Only do this + # once. No need to re-run this on each test... + LOG.debug('config_path is %s' % TestMigrations.CONFIG_FILE_PATH) + if not TestMigrations.TEST_DATABASES: + if os.path.exists(TestMigrations.CONFIG_FILE_PATH): + cp = ConfigParser.RawConfigParser() + try: + cp.read(TestMigrations.CONFIG_FILE_PATH) + defaults = cp.defaults() + for key, value in defaults.items(): + TestMigrations.TEST_DATABASES[key] = value + self.snake_walk = cp.getboolean('walk_style', 'snake_walk') + except ConfigParser.ParsingError, e: + self.fail("Failed to read test_migrations.conf config " + "file. Got error: %s" % e) + else: + self.fail("Failed to find test_migrations.conf config " + "file.") + + self.engines = {} + for key, value in TestMigrations.TEST_DATABASES.items(): + self.engines[key] = sqlalchemy.create_engine(value) + + # We start each test case with a completely blank slate. + self._reset_databases() + + def tearDown(self): + + # We destroy the test data store between each test case, + # and recreate it, which ensures that we have no side-effects + # from the tests + self._reset_databases() + + # remove these from the list so they aren't used in the migration tests + if "mysqlcitest" in self.engines: + del self.engines["mysqlcitest"] + if "mysqlcitest" in TestMigrations.TEST_DATABASES: + del TestMigrations.TEST_DATABASES["mysqlcitest"] + super(TestMigrations, self).tearDown() + + def _reset_databases(self): + def execute_cmd(cmd=None): + status, output = commands.getstatusoutput(cmd) + LOG.debug(output) + self.assertEqual(0, status) + for key, engine in self.engines.items(): + conn_string = TestMigrations.TEST_DATABASES[key] + conn_pieces = urlparse.urlparse(conn_string) + if conn_string.startswith('sqlite'): + # We can just delete the SQLite database, which is + # the easiest and cleanest solution + db_path = conn_pieces.path.strip('/') + if os.path.exists(db_path): + os.unlink(db_path) + # No need to recreate the SQLite DB. SQLite will + # create it for us if it's not there... + elif conn_string.startswith('mysql'): + # We can execute the MySQL client to destroy and re-create + # the MYSQL database, which is easier and less error-prone + # than using SQLAlchemy to do this via MetaData...trust me. + database = conn_pieces.path.strip('/') + loc_pieces = conn_pieces.netloc.split('@') + host = loc_pieces[1] + auth_pieces = loc_pieces[0].split(':') + user = auth_pieces[0] + password = "" + if len(auth_pieces) > 1: + if auth_pieces[1].strip(): + password = "-p\"%s\"" % auth_pieces[1] + sql = ("drop database if exists %(database)s; " + "create database %(database)s;") % locals() + cmd = ("mysql -u \"%(user)s\" %(password)s -h %(host)s " + "-e \"%(sql)s\"") % locals() + execute_cmd(cmd) + elif conn_string.startswith('postgresql'): + database = conn_pieces.path.strip('/') + loc_pieces = conn_pieces.netloc.split('@') + host = loc_pieces[1] + auth_pieces = loc_pieces[0].split(':') + user = auth_pieces[0] + password = "" + if len(auth_pieces) > 1: + if auth_pieces[1].strip(): + password = auth_pieces[1] + cmd = ("touch ~/.pgpass;" + "chmod 0600 ~/.pgpass;" + "sed -i -e" + "'1{s/^.*$/\*:\*:\*:%(user)s:%(password)s/};" + "1!d' ~/.pgpass") % locals() + execute_cmd(cmd) + sql = ("UPDATE pg_catalog.pg_database SET datallowconn=false " + "WHERE datname='%(database)s';") % locals() + cmd = ("psql -U%(user)s -h%(host)s -c\"%(sql)s\"") % locals() + execute_cmd(cmd) + sql = ("SELECT pg_catalog.pg_terminate_backend(procpid) " + "FROM pg_catalog.pg_stat_activity " + "WHERE datname='%(database)s';") % locals() + cmd = ("psql -U%(user)s -h%(host)s -c\"%(sql)s\"") % locals() + execute_cmd(cmd) + sql = ("drop database if exists %(database)s;") % locals() + cmd = ("psql -U%(user)s -h%(host)s -c\"%(sql)s\"") % locals() + execute_cmd(cmd) + sql = ("create database %(database)s;") % locals() + cmd = ("psql -U%(user)s -h%(host)s -c\"%(sql)s\"") % locals() + execute_cmd(cmd) + + def test_walk_versions(self): + """ + Walks all version scripts for each tested database, ensuring + that there are no errors in the version scripts for each engine + """ + for key, engine in self.engines.items(): + self._walk_versions(engine, self.snake_walk) + + def test_mysql_connect_fail(self): + """ + Test that we can trigger a mysql connection failure and we fail + gracefully to ensure we don't break people without mysql + """ + if _is_mysql_avail(user="openstack_cifail"): + self.fail("Shouldn't have connected") + + @test.skip_if(_missing_mysql(), "mysql not available") + def test_mysql_innodb(self): + """ + Test that table creation on mysql only builds InnoDB tables + """ + # add this to the global lists to make reset work with it, it's removed + # automaticaly in tearDown so no need to clean it up here. + connect_string = _mysql_get_connect_string() + engine = sqlalchemy.create_engine(connect_string) + self.engines["mysqlcitest"] = engine + TestMigrations.TEST_DATABASES["mysqlcitest"] = connect_string + + # build a fully populated mysql database with all the tables + self._reset_databases() + self._walk_versions(engine, False, False) + + uri = self._mysql_get_connect_string(database="information_schema") + connection = sqlalchemy.create_engine(uri).connect() + + # sanity check + total = connection.execute("SELECT count(*) " + "from information_schema.TABLES " + "where TABLE_SCHEMA='openstack_citest'") + self.assertTrue(total.scalar() > 0, "No tables found. Wrong schema?") + + noninnodb = connection.execute("SELECT count(*) " + "from information_schema.TABLES " + "where TABLE_SCHEMA='openstack_citest' " + "and ENGINE!='InnoDB'") + count = noninnodb.scalar() + self.assertEqual(count, 0, "%d non InnoDB tables created" % count) + + def _walk_versions(self, engine=None, snake_walk=False, downgrade=True): + # Determine latest version script from the repo, then + # upgrade from 1 through to the latest, with no data + # in the databases. This just checks that the schema itself + # upgrades successfully. + + # Place the database under version control + migration_api.version_control(engine, TestMigrations.REPOSITORY) + self.assertEqual(0, + migration_api.db_version(engine, + TestMigrations.REPOSITORY)) + + LOG.debug('latest version is %s' % TestMigrations.REPOSITORY.latest) + + for version in xrange(1, TestMigrations.REPOSITORY.latest + 1): + # upgrade -> downgrade -> upgrade + self._migrate_up(engine, version) + if snake_walk: + self._migrate_down(engine, version - 1) + self._migrate_up(engine, version) + + if downgrade: + # Now walk it back down to 0 from the latest, testing + # the downgrade paths. + for version in reversed( + xrange(0, TestMigrations.REPOSITORY.latest)): + # downgrade -> upgrade -> downgrade + self._migrate_down(engine, version) + if snake_walk: + self._migrate_up(engine, version + 1) + self._migrate_down(engine, version) + + def _migrate_down(self, engine, version): + migration_api.downgrade(engine, + TestMigrations.REPOSITORY, + version) + self.assertEqual(version, + migration_api.db_version(engine, + TestMigrations.REPOSITORY)) + + def _migrate_up(self, engine, version): + migration_api.upgrade(engine, + TestMigrations.REPOSITORY, + version) + self.assertEqual(version, + migration_api.db_version(engine, + TestMigrations.REPOSITORY)) diff --git a/cinder/tests/test_misc.py b/cinder/tests/test_misc.py new file mode 100644 index 000000000..d89b2a698 --- /dev/null +++ b/cinder/tests/test_misc.py @@ -0,0 +1,184 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 commands +import errno +import glob +import os +import select + +from eventlet import greenpool +from eventlet import greenthread +import lockfile + +from cinder import exception +from cinder import test +from cinder import utils + + +class ExceptionTestCase(test.TestCase): + @staticmethod + def _raise_exc(exc): + raise exc() + + def test_exceptions_raise(self): + for name in dir(exception): + exc = getattr(exception, name) + if isinstance(exc, type): + self.assertRaises(exc, self._raise_exc, exc) + + +class ProjectTestCase(test.TestCase): + def test_authors_up_to_date(self): + topdir = os.path.normpath(os.path.dirname(__file__) + '/../../') + missing = set() + contributors = set() + mailmap = utils.parse_mailmap(os.path.join(topdir, '.mailmap')) + authors_file = open(os.path.join(topdir, + 'Authors'), 'r').read().lower() + + if os.path.exists(os.path.join(topdir, '.git')): + for email in commands.getoutput('git log --format=%ae').split(): + if not email: + continue + if "jenkins" in email and "openstack.org" in email: + continue + email = '<' + email.lower() + '>' + contributors.add(utils.str_dict_replace(email, mailmap)) + else: + return + + for contributor in contributors: + if contributor == 'cinder-core': + continue + if not contributor in authors_file: + missing.add(contributor) + + self.assertTrue(len(missing) == 0, + '%r not listed in Authors' % missing) + + def test_all_migrations_have_downgrade(self): + topdir = os.path.normpath(os.path.dirname(__file__) + '/../../') + py_glob = os.path.join(topdir, "cinder", "db", "sqlalchemy", + "migrate_repo", "versions", "*.py") + missing_downgrade = [] + for path in glob.iglob(py_glob): + has_upgrade = False + has_downgrade = False + with open(path, "r") as f: + for line in f: + if 'def upgrade(' in line: + has_upgrade = True + if 'def downgrade(' in line: + has_downgrade = True + + if has_upgrade and not has_downgrade: + fname = os.path.basename(path) + missing_downgrade.append(fname) + + helpful_msg = (_("The following migrations are missing a downgrade:" + "\n\t%s") % '\n\t'.join(sorted(missing_downgrade))) + self.assert_(not missing_downgrade, helpful_msg) + + +class LockTestCase(test.TestCase): + def test_synchronized_wrapped_function_metadata(self): + @utils.synchronized('whatever') + def foo(): + """Bar""" + pass + self.assertEquals(foo.__doc__, 'Bar', "Wrapped function's docstring " + "got lost") + self.assertEquals(foo.__name__, 'foo', "Wrapped function's name " + "got mangled") + + def test_synchronized_internally(self): + """We can lock across multiple green threads""" + saved_sem_num = len(utils._semaphores) + seen_threads = list() + + @utils.synchronized('testlock2', external=False) + def f(id): + for x in range(10): + seen_threads.append(id) + greenthread.sleep(0) + + threads = [] + pool = greenpool.GreenPool(10) + for i in range(10): + threads.append(pool.spawn(f, i)) + + for thread in threads: + thread.wait() + + self.assertEquals(len(seen_threads), 100) + # Looking at the seen threads, split it into chunks of 10, and verify + # that the last 9 match the first in each chunk. + for i in range(10): + for j in range(9): + self.assertEquals(seen_threads[i * 10], + seen_threads[i * 10 + 1 + j]) + + self.assertEqual(saved_sem_num, len(utils._semaphores), + "Semaphore leak detected") + + def test_nested_external_fails(self): + """We can not nest external syncs""" + + @utils.synchronized('testlock1', external=True) + def outer_lock(): + + @utils.synchronized('testlock2', external=True) + def inner_lock(): + pass + inner_lock() + try: + self.assertRaises(lockfile.NotMyLock, outer_lock) + finally: + utils.cleanup_file_locks() + + def test_synchronized_externally(self): + """We can lock across multiple processes""" + rpipe1, wpipe1 = os.pipe() + rpipe2, wpipe2 = os.pipe() + + @utils.synchronized('testlock1', external=True) + def f(rpipe, wpipe): + try: + os.write(wpipe, "foo") + except OSError, e: + self.assertEquals(e.errno, errno.EPIPE) + return + + rfds, _wfds, _efds = select.select([rpipe], [], [], 1) + self.assertEquals(len(rfds), 0, "The other process, which was" + " supposed to be locked, " + "wrote on its end of the " + "pipe") + os.close(rpipe) + + pid = os.fork() + if pid > 0: + os.close(wpipe1) + os.close(rpipe2) + + f(rpipe1, wpipe2) + else: + os.close(rpipe1) + os.close(wpipe2) + + f(rpipe2, wpipe1) + os._exit(0) diff --git a/cinder/tests/test_netapp.py b/cinder/tests/test_netapp.py new file mode 100644 index 000000000..179e46b8b --- /dev/null +++ b/cinder/tests/test_netapp.py @@ -0,0 +1,927 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2012 NetApp, 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. +""" +Tests for NetApp volume driver + +""" + +import BaseHTTPServer +import httplib +import StringIO + +from lxml import etree + +from cinder import log as logging +from cinder import test +from cinder.volume import netapp + +LOG = logging.getLogger("cinder.volume.driver") + + +WSDL_HEADER = """<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:na="http://www.netapp.com/management/v1" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="NetAppDfm" + targetNamespace="http://www.netapp.com/management/v1">""" + +WSDL_TYPES = """<types> +<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" + targetNamespace="http://www.netapp.com/management/v1"> +<xsd:element name="ApiProxy"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Request" type="na:Request"/> + <xsd:element name="Target" type="xsd:string"/> + <xsd:element minOccurs="0" name="Timeout" type="xsd:integer"/> + <xsd:element minOccurs="0" name="Username" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="ApiProxyResult"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Response" type="na:Response"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetEditBegin"> + <xsd:complexType> + <xsd:all> + <xsd:element name="DatasetNameOrId" type="na:ObjNameOrId"/> + <xsd:element minOccurs="0" name="Force" type="xsd:boolean"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetEditBeginResult"> + <xsd:complexType> + <xsd:all> + <xsd:element name="EditLockId" type="xsd:integer"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetEditCommit"> + <xsd:complexType> + <xsd:all> + <xsd:element minOccurs="0" name="AssumeConfirmation" + type="xsd:boolean"/> + <xsd:element name="EditLockId" type="xsd:integer"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetEditCommitResult"> + <xsd:complexType> + <xsd:all> + <xsd:element minOccurs="0" name="IsProvisioningFailure" + type="xsd:boolean"/> + <xsd:element minOccurs="0" name="JobIds" type="na:ArrayOfJobInfo"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetEditRollback"> + <xsd:complexType> + <xsd:all> + <xsd:element name="EditLockId" type="xsd:integer"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetEditRollbackResult"> + <xsd:complexType/> +</xsd:element> +<xsd:element name="DatasetListInfoIterEnd"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Tag" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetListInfoIterEndResult"> + <xsd:complexType/> +</xsd:element> +<xsd:element name="DatasetListInfoIterNext"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Maximum" type="xsd:integer"/> + <xsd:element name="Tag" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetListInfoIterNextResult"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Datasets" type="na:ArrayOfDatasetInfo"/> + <xsd:element name="Records" type="xsd:integer"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetListInfoIterStart"> + <xsd:complexType> + <xsd:all> + <xsd:element minOccurs="0" name="ObjectNameOrId" + type="na:ObjNameOrId"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetListInfoIterStartResult"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Records" type="xsd:integer"/> + <xsd:element name="Tag" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetMemberListInfoIterEnd"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Tag" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetMemberListInfoIterEndResult"> + <xsd:complexType/> +</xsd:element> +<xsd:element name="DatasetMemberListInfoIterNext"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Maximum" type="xsd:integer"/> + <xsd:element name="Tag" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetMemberListInfoIterNextResult"> + <xsd:complexType> + <xsd:all> + <xsd:element name="DatasetMembers" + type="na:ArrayOfDatasetMemberInfo"/> + <xsd:element name="Records" type="xsd:integer"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetMemberListInfoIterStart"> + <xsd:complexType> + <xsd:all> + <xsd:element name="DatasetNameOrId" type="na:ObjNameOrId"/> + <xsd:element minOccurs="0" name="IncludeExportsInfo" + type="xsd:boolean"/> + <xsd:element minOccurs="0" name="IncludeIndirect" + type="xsd:boolean"/> + <xsd:element minOccurs="0" name="MemberType" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetMemberListInfoIterStartResult"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Records" type="xsd:integer"/> + <xsd:element name="Tag" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetProvisionMember"> + <xsd:complexType> + <xsd:all> + <xsd:element name="EditLockId" type="xsd:integer"/> + <xsd:element name="ProvisionMemberRequestInfo" + type="na:ProvisionMemberRequestInfo"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetProvisionMemberResult"> + <xsd:complexType/> +</xsd:element> +<xsd:element name="DatasetRemoveMember"> + <xsd:complexType> + <xsd:all> + <xsd:element name="DatasetMemberParameters" + type="na:ArrayOfDatasetMemberParameter"/> + <xsd:element minOccurs="0" name="Destroy" type="xsd:boolean"/> + <xsd:element name="EditLockId" type="xsd:integer"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DatasetRemoveMemberResult"> + <xsd:complexType/> +</xsd:element> +<xsd:element name="DpJobProgressEventListIterEnd"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Tag" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DpJobProgressEventListIterEndResult"> + <xsd:complexType/> +</xsd:element> +<xsd:element name="DpJobProgressEventListIterNext"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Maximum" type="xsd:integer"/> + <xsd:element name="Tag" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DpJobProgressEventListIterNextResult"> + <xsd:complexType> + <xsd:all> + <xsd:element name="ProgressEvents" + type="na:ArrayOfDpJobProgressEventInfo"/> + <xsd:element name="Records" type="xsd:integer"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DpJobProgressEventListIterStart"> + <xsd:complexType> + <xsd:all> + <xsd:element minOccurs="0" name="JobId" type="xsd:integer"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DpJobProgressEventListIterStartResult"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Records" type="xsd:integer"/> + <xsd:element name="Tag" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DfmAbout"> + <xsd:complexType> + <xsd:all> + <xsd:element minOccurs="0" name="IncludeDirectorySizeInfo" + type="xsd:boolean"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="DfmAboutResult"> + <xsd:complexType> + <xsd:all/> + </xsd:complexType> +</xsd:element> +<xsd:element name="HostListInfoIterEnd"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Tag" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="HostListInfoIterEndResult"> + <xsd:complexType/> +</xsd:element> +<xsd:element name="HostListInfoIterNext"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Maximum" type="xsd:integer"/> + <xsd:element name="Tag" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="HostListInfoIterNextResult"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Hosts" type="na:ArrayOfHostInfo"/> + <xsd:element name="Records" type="xsd:integer"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="HostListInfoIterStart"> + <xsd:complexType> + <xsd:all> + <xsd:element minOccurs="0" name="ObjectNameOrId" + type="na:ObjNameOrId"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="HostListInfoIterStartResult"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Records" type="xsd:integer"/> + <xsd:element name="Tag" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="LunListInfoIterEnd"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Tag" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="LunListInfoIterEndResult"> + <xsd:complexType/> +</xsd:element> +<xsd:element name="LunListInfoIterNext"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Maximum" type="xsd:integer"/> + <xsd:element name="Tag" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="LunListInfoIterNextResult"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Luns" type="na:ArrayOfLunInfo"/> + <xsd:element name="Records" type="xsd:integer"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="LunListInfoIterStart"> + <xsd:complexType> + <xsd:all> + <xsd:element minOccurs="0" name="ObjectNameOrId" + type="na:ObjNameOrId"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="LunListInfoIterStartResult"> + <xsd:complexType> + <xsd:all> + <xsd:element name="Records" type="xsd:integer"/> + <xsd:element name="Tag" type="xsd:string"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="StorageServiceDatasetProvision"> + <xsd:complexType> + <xsd:all> + <xsd:element minOccurs="0" name="AssumeConfirmation" + type="xsd:boolean"/> + <xsd:element name="DatasetName" type="na:ObjName"/> + <xsd:element name="StorageServiceNameOrId" type="na:ObjNameOrId"/> + <xsd:element minOccurs="0" name="StorageSetDetails" + type="na:ArrayOfStorageSetInfo"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:element name="StorageServiceDatasetProvisionResult"> + <xsd:complexType> + <xsd:all> + <xsd:element minOccurs="0" name="ConformanceAlerts" + type="na:ArrayOfConformanceAlert"/> + <xsd:element name="DatasetId" type="na:ObjId"/> + <xsd:element minOccurs="0" name="DryRunResults" + type="na:ArrayOfDryRunResult"/> + </xsd:all> + </xsd:complexType> +</xsd:element> +<xsd:complexType name="ArrayOfDatasetInfo"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="DatasetInfo" + type="na:DatasetInfo"/> + </xsd:sequence> +</xsd:complexType> +<xsd:complexType name="ArrayOfDatasetMemberInfo"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="DatasetMemberInfo" + type="na:DatasetMemberInfo"/> + </xsd:sequence> +</xsd:complexType> +<xsd:complexType name="ArrayOfDatasetMemberParameter"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="DatasetMemberParameter" + type="na:DatasetMemberParameter"/> + </xsd:sequence> +</xsd:complexType> +<xsd:complexType name="ArrayOfDpJobProgressEventInfo"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="DpJobProgressEventInfo" + type="na:DpJobProgressEventInfo"/> + </xsd:sequence> +</xsd:complexType> +<xsd:complexType name="ArrayOfHostInfo"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="HostInfo" type="na:HostInfo"/> + </xsd:sequence> +</xsd:complexType> +<xsd:complexType name="ArrayOfJobInfo"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="JobInfo" type="na:JobInfo"/> + </xsd:sequence> +</xsd:complexType> +<xsd:complexType name="ArrayOfLunInfo"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="LunInfo" type="na:LunInfo"/> + </xsd:sequence> +</xsd:complexType> +<xsd:complexType name="ArrayOfStorageSetInfo"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="StorageSetInfo" + type="na:StorageSetInfo"/> + </xsd:sequence> +</xsd:complexType> +<xsd:complexType name="DatasetExportInfo"> + <xsd:all> + <xsd:element minOccurs="0" name="DatasetExportProtocol" + type="na:DatasetExportProtocol"/> + <xsd:element minOccurs="0" name="DatasetLunMappingInfo" + type="na:DatasetLunMappingInfo"/> + </xsd:all> +</xsd:complexType> +<xsd:simpleType name="DatasetExportProtocol"> + <xsd:restriction base="xsd:string"/> +</xsd:simpleType> +<xsd:complexType name="DatasetInfo"> + <xsd:all> + <xsd:element name="DatasetId" type="na:ObjId"/> + </xsd:all> +</xsd:complexType> +<xsd:complexType name="DatasetLunMappingInfo"> + <xsd:all> + <xsd:element name="IgroupOsType" type="xsd:string"/> + </xsd:all> +</xsd:complexType> +<xsd:complexType name="DatasetMemberInfo"> + <xsd:all> + <xsd:element name="MemberId" type="na:ObjId"/> + <xsd:element name="MemberName" type="na:ObjName"/> + </xsd:all> +</xsd:complexType> +<xsd:complexType name="DatasetMemberParameter"> + <xsd:all> + <xsd:element name="ObjectNameOrId" type="na:ObjNameOrId"/> + </xsd:all> +</xsd:complexType> +<xsd:complexType name="DpJobProgressEventInfo"> + <xsd:all> + <xsd:element name="EventStatus" type="na:ObjStatus"/> + <xsd:element name="EventType" type="xsd:string"/> + <xsd:element minOccurs="0" name="ProgressLunInfo" + type="na:ProgressLunInfo"/> + </xsd:all> +</xsd:complexType> +<xsd:simpleType name="DpPolicyNodeName"> + <xsd:restriction base="xsd:string"/> +</xsd:simpleType> +<xsd:simpleType name="HostId"> + <xsd:restriction base="xsd:integer"/> +</xsd:simpleType> +<xsd:complexType name="HostInfo"> + <xsd:all> + <xsd:element name="HostAddress" type="xsd:string"/> + <xsd:element name="HostId" type="na:HostId"/> + <xsd:element name="HostName" type="xsd:string"/> + </xsd:all> +</xsd:complexType> +<xsd:complexType name="JobInfo"> + <xsd:all> + <xsd:element name="JobId" type="xsd:integer"/> + </xsd:all> +</xsd:complexType> +<xsd:complexType name="LunInfo"> + <xsd:all> + <xsd:element name="HostId" type="na:ObjId"/> + <xsd:element name="LunPath" type="na:ObjName"/> + </xsd:all> +</xsd:complexType> +<xsd:simpleType name="ObjId"> + <xsd:restriction base="xsd:integer"/> +</xsd:simpleType> +<xsd:simpleType name="ObjName"> + <xsd:restriction base="xsd:string"/> +</xsd:simpleType> +<xsd:simpleType name="ObjNameOrId"> + <xsd:restriction base="xsd:string"/> +</xsd:simpleType> +<xsd:simpleType name="ObjStatus"> + <xsd:restriction base="xsd:string"/> +</xsd:simpleType> +<xsd:complexType name="ProgressLunInfo"> + <xsd:all> + <xsd:element name="LunPathId" type="na:ObjId"/> + </xsd:all> +</xsd:complexType> +<xsd:complexType name="ProvisionMemberRequestInfo"> + <xsd:all> + <xsd:element minOccurs="0" name="Description" type="xsd:string"/> + <xsd:element minOccurs="0" name="MaximumSnapshotSpace" + type="xsd:integer"/> + <xsd:element name="Name" type="xsd:string"/> + <xsd:element name="Size" type="xsd:integer"/> + </xsd:all> +</xsd:complexType> +<xsd:complexType name="Request"> + <xsd:all> + <xsd:element minOccurs="0" name="Args"> + <xsd:complexType> + <xsd:sequence> + <xsd:any maxOccurs="unbounded" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + <xsd:element name="Name" type="xsd:string"> + </xsd:element> + </xsd:all> +</xsd:complexType> +<xsd:complexType name="Response"> + <xsd:all> + <xsd:element minOccurs="0" name="Errno" type="xsd:integer"/> + <xsd:element minOccurs="0" name="Reason" type="xsd:string"/> + <xsd:element minOccurs="0" name="Results"> + <xsd:complexType> + <xsd:sequence> + <xsd:any maxOccurs="unbounded" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + <xsd:element name="Status" type="xsd:string"/> + </xsd:all> +</xsd:complexType> +<xsd:complexType name="StorageSetInfo"> + <xsd:all> + <xsd:element minOccurs="0" name="DatasetExportInfo" + type="na:DatasetExportInfo"/> + <xsd:element minOccurs="0" name="DpNodeName" + type="na:DpPolicyNodeName"/> + <xsd:element minOccurs="0" name="ServerNameOrId" + type="na:ObjNameOrId"/> + </xsd:all> +</xsd:complexType> +</xsd:schema></types>""" + +WSDL_TRAILER = """<service name="DfmService"> +<port binding="na:DfmBinding" name="DfmPort"> +<soap:address location="https://HOST_NAME:8488/apis/soap/v1"/> +</port></service></definitions>""" + +RESPONSE_PREFIX = """<?xml version="1.0" encoding="UTF-8"?> +<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" + xmlns:na="http://www.netapp.com/management/v1"><env:Header/><env:Body>""" + +RESPONSE_SUFFIX = """</env:Body></env:Envelope>""" + +APIS = ['ApiProxy', 'DatasetListInfoIterStart', 'DatasetListInfoIterNext', + 'DatasetListInfoIterEnd', 'DatasetEditBegin', 'DatasetEditCommit', + 'DatasetProvisionMember', 'DatasetRemoveMember', 'DfmAbout', + 'DpJobProgressEventListIterStart', 'DpJobProgressEventListIterNext', + 'DpJobProgressEventListIterEnd', 'DatasetMemberListInfoIterStart', + 'DatasetMemberListInfoIterNext', 'DatasetMemberListInfoIterEnd', + 'HostListInfoIterStart', 'HostListInfoIterNext', 'HostListInfoIterEnd', + 'LunListInfoIterStart', 'LunListInfoIterNext', 'LunListInfoIterEnd', + 'StorageServiceDatasetProvision'] + +iter_count = 0 +iter_table = {} + + +class FakeDfmServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): + """HTTP handler that fakes enough stuff to allow the driver to run""" + + def do_GET(s): + """Respond to a GET request.""" + if '/dfm.wsdl' != s.path: + s.send_response(404) + s.end_headers + return + s.send_response(200) + s.send_header("Content-Type", "application/wsdl+xml") + s.end_headers() + out = s.wfile + out.write(WSDL_HEADER) + out.write(WSDL_TYPES) + for api in APIS: + out.write('<message name="%sRequest">' % api) + out.write('<part element="na:%s" name="parameters"/>' % api) + out.write('</message>') + out.write('<message name="%sResponse">' % api) + out.write('<part element="na:%sResult" name="results"/>' % api) + out.write('</message>') + out.write('<portType name="DfmInterface">') + for api in APIS: + out.write('<operation name="%s">' % api) + out.write('<input message="na:%sRequest"/>' % api) + out.write('<output message="na:%sResponse"/>' % api) + out.write('</operation>') + out.write('</portType>') + out.write('<binding name="DfmBinding" type="na:DfmInterface">') + out.write('<soap:binding style="document" ' + + 'transport="http://schemas.xmlsoap.org/soap/http"/>') + for api in APIS: + out.write('<operation name="%s">' % api) + out.write('<soap:operation soapAction="urn:%s"/>' % api) + out.write('<input><soap:body use="literal"/></input>') + out.write('<output><soap:body use="literal"/></output>') + out.write('</operation>') + out.write('</binding>') + out.write(WSDL_TRAILER) + + def do_POST(s): + """Respond to a POST request.""" + if '/apis/soap/v1' != s.path: + s.send_response(404) + s.end_headers + return + request_xml = s.rfile.read(int(s.headers['Content-Length'])) + ntap_ns = 'http://www.netapp.com/management/v1' + nsmap = {'env': 'http://schemas.xmlsoap.org/soap/envelope/', + 'na': ntap_ns} + root = etree.fromstring(request_xml) + + body = root.xpath('/env:Envelope/env:Body', namespaces=nsmap)[0] + request = body.getchildren()[0] + tag = request.tag + if not tag.startswith('{' + ntap_ns + '}'): + s.send_response(500) + s.end_headers + return + api = tag[(2 + len(ntap_ns)):] + global iter_count + global iter_table + if 'DatasetListInfoIterStart' == api: + body = """<na:DatasetListInfoIterStartResult> + <na:Records>1</na:Records> + <na:Tag>dataset</na:Tag> + </na:DatasetListInfoIterStartResult>""" + elif 'DatasetListInfoIterNext' == api: + body = """<na:DatasetListInfoIterNextResult> + <na:Datasets> + <na:DatasetInfo> + <na:DatasetId>0</na:DatasetId> + </na:DatasetInfo> + </na:Datasets> + <na:Records>1</na:Records> + </na:DatasetListInfoIterNextResult>""" + elif 'DatasetListInfoIterEnd' == api: + body = """<na:DatasetListInfoIterEndResult/>""" + elif 'DatasetEditBegin' == api: + body = """<na:DatasetEditBeginResult> + <na:EditLockId>0</na:EditLockId> + </na:DatasetEditBeginResult>""" + elif 'DatasetEditCommit' == api: + body = """<na:DatasetEditCommitResult> + <na:IsProvisioningFailure>false</na:IsProvisioningFailure> + <na:JobIds> + <na:JobInfo> + <na:JobId>0</na:JobId> + </na:JobInfo> + </na:JobIds> + </na:DatasetEditCommitResult>""" + elif 'DatasetProvisionMember' == api: + body = """<na:DatasetProvisionMemberResult/>""" + elif 'DatasetRemoveMember' == api: + body = """<na:DatasetRemoveMemberResult/>""" + elif 'DfmAbout' == api: + body = """<na:DfmAboutResult/>""" + elif 'DpJobProgressEventListIterStart' == api: + iter_name = 'dpjobprogress_%s' % iter_count + iter_count = iter_count + 1 + iter_table[iter_name] = 0 + body = """<na:DpJobProgressEventListIterStartResult> + <na:Records>2</na:Records> + <na:Tag>%s</na:Tag> + </na:DpJobProgressEventListIterStartResult>""" % iter_name + elif 'DpJobProgressEventListIterNext' == api: + tags = body.xpath('na:DpJobProgressEventListIterNext/na:Tag', + namespaces=nsmap) + iter_name = tags[0].text + if iter_table[iter_name]: + body = """<na:DpJobProgressEventListIterNextResult/>""" + else: + iter_table[iter_name] = 1 + body = """<na:DpJobProgressEventListIterNextResult> + <na:ProgressEvents> + <na:DpJobProgressEventInfo> + <na:EventStatus>normal</na:EventStatus> + <na:EventType>lun-create</na:EventType> + <na:ProgressLunInfo> + <na:LunPathId>0</na:LunPathId> + </na:ProgressLunInfo> + </na:DpJobProgressEventInfo> + <na:DpJobProgressEventInfo> + <na:EventStatus>normal</na:EventStatus> + <na:EventType>job-end</na:EventType> + </na:DpJobProgressEventInfo> + </na:ProgressEvents> + <na:Records>2</na:Records> + </na:DpJobProgressEventListIterNextResult>""" + elif 'DpJobProgressEventListIterEnd' == api: + body = """<na:DpJobProgressEventListIterEndResult/>""" + elif 'DatasetMemberListInfoIterStart' == api: + body = """<na:DatasetMemberListInfoIterStartResult> + <na:Records>1</na:Records> + <na:Tag>dataset-member</na:Tag> + </na:DatasetMemberListInfoIterStartResult>""" + elif 'DatasetMemberListInfoIterNext' == api: + name = 'filer:/OpenStack_testproj/volume-00000001/volume-00000001' + body = """<na:DatasetMemberListInfoIterNextResult> + <na:DatasetMembers> + <na:DatasetMemberInfo> + <na:MemberId>0</na:MemberId> + <na:MemberName>%s</na:MemberName> + </na:DatasetMemberInfo> + </na:DatasetMembers> + <na:Records>1</na:Records> + </na:DatasetMemberListInfoIterNextResult>""" % name + elif 'DatasetMemberListInfoIterEnd' == api: + body = """<na:DatasetMemberListInfoIterEndResult/>""" + elif 'HostListInfoIterStart' == api: + body = """<na:HostListInfoIterStartResult> + <na:Records>1</na:Records> + <na:Tag>host</na:Tag> + </na:HostListInfoIterStartResult>""" + elif 'HostListInfoIterNext' == api: + body = """<na:HostListInfoIterNextResult> + <na:Hosts> + <na:HostInfo> + <na:HostAddress>1.2.3.4</na:HostAddress> + <na:HostId>0</na:HostId> + <na:HostName>filer</na:HostName> + </na:HostInfo> + </na:Hosts> + <na:Records>1</na:Records> + </na:HostListInfoIterNextResult>""" + elif 'HostListInfoIterEnd' == api: + body = """<na:HostListInfoIterEndResult/>""" + elif 'LunListInfoIterStart' == api: + body = """<na:LunListInfoIterStartResult> + <na:Records>1</na:Records> + <na:Tag>lun</na:Tag> + </na:LunListInfoIterStartResult>""" + elif 'LunListInfoIterNext' == api: + path = 'OpenStack_testproj/volume-00000001/volume-00000001' + body = """<na:LunListInfoIterNextResult> + <na:Luns> + <na:LunInfo> + <na:HostId>0</na:HostId> + <na:LunPath>%s</na:LunPath> + </na:LunInfo> + </na:Luns> + <na:Records>1</na:Records> + </na:LunListInfoIterNextResult>""" % path + elif 'LunListInfoIterEnd' == api: + body = """<na:LunListInfoIterEndResult/>""" + elif 'ApiProxy' == api: + names = body.xpath('na:ApiProxy/na:Request/na:Name', + namespaces=nsmap) + proxy = names[0].text + if 'igroup-list-info' == proxy: + igroup = 'openstack-iqn.1993-08.org.debian:01:23456789' + initiator = 'iqn.1993-08.org.debian:01:23456789' + proxy_body = """<initiator-groups> + <initiator-group-info> + <initiator-group-name>%s</initiator-group-name> + <initiator-group-type>iscsi</initiator-group-type> + <initiator-group-os-type>linux</initiator-group-os-type> + <initiators> + <initiator-info> + <initiator-name>%s</initiator-name> + </initiator-info> + </initiators> + </initiator-group-info> + </initiator-groups>""" % (igroup, initiator) + elif 'igroup-create' == proxy: + proxy_body = '' + elif 'igroup-add' == proxy: + proxy_body = '' + elif 'lun-map-list-info' == proxy: + proxy_body = '<initiator-groups/>' + elif 'lun-map' == proxy: + proxy_body = '<lun-id-assigned>0</lun-id-assigned>' + elif 'lun-unmap' == proxy: + proxy_body = '' + elif 'iscsi-portal-list-info' == proxy: + proxy_body = """<iscsi-portal-list-entries> + <iscsi-portal-list-entry-info> + <ip-address>1.2.3.4</ip-address> + <ip-port>3260</ip-port> + <tpgroup-tag>1000</tpgroup-tag> + </iscsi-portal-list-entry-info> + </iscsi-portal-list-entries>""" + elif 'iscsi-node-get-name' == proxy: + target = 'iqn.1992-08.com.netapp:sn.111111111' + proxy_body = '<node-name>%s</node-name>' % target + else: + # Unknown proxy API + s.send_response(500) + s.end_headers + return + api = api + ':' + proxy + proxy_header = '<na:ApiProxyResult><na:Response><na:Results>' + proxy_trailer = """</na:Results><na:Status>passed</na:Status> + </na:Response></na:ApiProxyResult>""" + body = proxy_header + proxy_body + proxy_trailer + else: + # Unknown API + s.send_response(500) + s.end_headers + return + s.send_response(200) + s.send_header("Content-Type", "text/xml; charset=utf-8") + s.end_headers() + s.wfile.write(RESPONSE_PREFIX) + s.wfile.write(body) + s.wfile.write(RESPONSE_SUFFIX) + + +class FakeHttplibSocket(object): + """A fake socket implementation for httplib.HTTPResponse""" + def __init__(self, value): + self._rbuffer = StringIO.StringIO(value) + self._wbuffer = StringIO.StringIO('') + oldclose = self._wbuffer.close + + def newclose(): + self.result = self._wbuffer.getvalue() + oldclose() + self._wbuffer.close = newclose + + def makefile(self, mode, _other): + """Returns the socket's internal buffer""" + if mode == 'r' or mode == 'rb': + return self._rbuffer + if mode == 'w' or mode == 'wb': + return self._wbuffer + + +class FakeHTTPConnection(object): + """A fake httplib.HTTPConnection for netapp tests + + Requests made via this connection actually get translated and routed into + the fake Dfm handler above, we then turn the response into + the httplib.HTTPResponse that the caller expects. + """ + def __init__(self, host, timeout=None): + self.host = host + + def request(self, method, path, data=None, headers=None): + if not headers: + headers = {} + req_str = '%s %s HTTP/1.1\r\n' % (method, path) + for key, value in headers.iteritems(): + req_str += "%s: %s\r\n" % (key, value) + if data: + req_str += '\r\n%s' % data + + # NOTE(vish): normally the http transport normailizes from unicode + sock = FakeHttplibSocket(req_str.decode("latin-1").encode("utf-8")) + # NOTE(vish): stop the server from trying to look up address from + # the fake socket + FakeDfmServerHandler.address_string = lambda x: '127.0.0.1' + self.app = FakeDfmServerHandler(sock, '127.0.0.1:8088', None) + + self.sock = FakeHttplibSocket(sock.result) + self.http_response = httplib.HTTPResponse(self.sock) + + def set_debuglevel(self, level): + pass + + def getresponse(self): + self.http_response.begin() + return self.http_response + + def getresponsebody(self): + return self.sock.result + + +class NetAppDriverTestCase(test.TestCase): + """Test case for NetAppISCSIDriver""" + STORAGE_SERVICE = 'Thin Provisioned Space for VMFS Datastores' + PROJECT_ID = 'testproj' + VOLUME_NAME = 'volume-00000001' + VOLUME_SIZE = 2147483648L # 2 GB + INITIATOR = 'iqn.1993-08.org.debian:01:23456789' + + def setUp(self): + super(NetAppDriverTestCase, self).setUp() + driver = netapp.NetAppISCSIDriver() + self.stubs.Set(httplib, 'HTTPConnection', FakeHTTPConnection) + driver._create_client('http://localhost:8088/dfm.wsdl', + 'root', 'password', 'localhost', 8088) + driver._set_storage_service(self.STORAGE_SERVICE) + self.driver = driver + + def test_connect(self): + self.driver.check_for_setup_error() + + def test_create_destroy(self): + self.driver._provision(self.VOLUME_NAME, None, self.PROJECT_ID, + self.VOLUME_SIZE) + self.driver._remove_destroy(self.VOLUME_NAME, self.PROJECT_ID) + + def test_map_unmap(self): + self.driver._provision(self.VOLUME_NAME, None, self.PROJECT_ID, + self.VOLUME_SIZE) + volume = {'name': self.VOLUME_NAME, 'project_id': self.PROJECT_ID, + 'id': 0, 'provider_auth': None} + updates = self.driver._get_export(volume) + self.assertTrue(updates['provider_location']) + volume['provider_location'] = updates['provider_location'] + connector = {'initiator': self.INITIATOR} + connection_info = self.driver.initialize_connection(volume, connector) + self.assertEqual(connection_info['driver_volume_type'], 'iscsi') + properties = connection_info['data'] + self.driver.terminate_connection(volume, connector) + self.driver._remove_destroy(self.VOLUME_NAME, self.PROJECT_ID) diff --git a/cinder/tests/test_nexenta.py b/cinder/tests/test_nexenta.py new file mode 100644 index 000000000..5a33318b1 --- /dev/null +++ b/cinder/tests/test_nexenta.py @@ -0,0 +1,281 @@ +#!/usr/bin/env python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 +# +# Copyright 2011 Nexenta 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. +""" +Unit tests for OpenStack Cinder volume driver +""" + +import base64 +import urllib2 + +import cinder.flags +import cinder.test +from cinder.volume import nexenta +from cinder.volume.nexenta import volume +from cinder.volume.nexenta import jsonrpc + +FLAGS = cinder.flags.FLAGS + + +class TestNexentaDriver(cinder.test.TestCase): + TEST_VOLUME_NAME = 'volume1' + TEST_VOLUME_NAME2 = 'volume2' + TEST_SNAPSHOT_NAME = 'snapshot1' + TEST_VOLUME_REF = { + 'name': TEST_VOLUME_NAME, + 'size': 1, + } + TEST_VOLUME_REF2 = { + 'name': TEST_VOLUME_NAME2, + 'size': 1, + } + TEST_SNAPSHOT_REF = { + 'name': TEST_SNAPSHOT_NAME, + 'volume_name': TEST_VOLUME_NAME, + } + + def __init__(self, method): + super(TestNexentaDriver, self).__init__(method) + + def setUp(self): + super(TestNexentaDriver, self).setUp() + self.flags( + nexenta_host='1.1.1.1', + nexenta_volume='cinder', + nexenta_target_prefix='iqn:', + nexenta_target_group_prefix='cinder/', + nexenta_blocksize='8K', + nexenta_sparse=True, + ) + self.nms_mock = self.mox.CreateMockAnything() + for mod in ['volume', 'zvol', 'iscsitarget', + 'stmf', 'scsidisk', 'snapshot']: + setattr(self.nms_mock, mod, self.mox.CreateMockAnything()) + self.stubs.Set(jsonrpc, 'NexentaJSONProxy', + lambda *_, **__: self.nms_mock) + self.drv = volume.NexentaDriver() + self.drv.do_setup({}) + + def test_setup_error(self): + self.nms_mock.volume.object_exists('cinder').AndReturn(True) + self.mox.ReplayAll() + self.drv.check_for_setup_error() + + def test_setup_error_fail(self): + self.nms_mock.volume.object_exists('cinder').AndReturn(False) + self.mox.ReplayAll() + self.assertRaises(LookupError, self.drv.check_for_setup_error) + + def test_local_path(self): + self.assertRaises(NotImplementedError, self.drv.local_path, '') + + def test_create_volume(self): + self.nms_mock.zvol.create('cinder/volume1', '1G', '8K', True) + self.mox.ReplayAll() + self.drv.create_volume(self.TEST_VOLUME_REF) + + def test_delete_volume(self): + self.nms_mock.zvol.destroy('cinder/volume1', '') + self.mox.ReplayAll() + self.drv.delete_volume(self.TEST_VOLUME_REF) + + def test_create_snapshot(self): + self.nms_mock.zvol.create_snapshot('cinder/volume1', 'snapshot1', '') + self.mox.ReplayAll() + self.drv.create_snapshot(self.TEST_SNAPSHOT_REF) + + def test_create_volume_from_snapshot(self): + self.nms_mock.zvol.clone('cinder/volume1@snapshot1', 'cinder/volume2') + self.mox.ReplayAll() + self.drv.create_volume_from_snapshot(self.TEST_VOLUME_REF2, + self.TEST_SNAPSHOT_REF) + + def test_delete_snapshot(self): + self.nms_mock.snapshot.destroy('cinder/volume1@snapshot1', '') + self.mox.ReplayAll() + self.drv.delete_snapshot(self.TEST_SNAPSHOT_REF) + + _CREATE_EXPORT_METHODS = [ + ('iscsitarget', 'create_target', ({'target_name': 'iqn:volume1'},), + u'Unable to create iscsi target\n' + u' iSCSI target iqn.1986-03.com.sun:02:cinder-volume1 already' + u' configured\n' + u' itadm create-target failed with error 17\n', + ), + ('stmf', 'create_targetgroup', ('cinder/volume1',), + u'Unable to create targetgroup: stmfadm: cinder/volume1:' + u' already exists\n', + ), + ('stmf', 'add_targetgroup_member', ('cinder/volume1', 'iqn:volume1'), + u'Unable to add member to targetgroup: stmfadm:' + u' iqn.1986-03.com.sun:02:cinder-volume1: already exists\n', + ), + ('scsidisk', 'create_lu', ('cinder/volume1', {}), + u"Unable to create lu with zvol 'cinder/volume1':\n" + u" sbdadm: filename /dev/zvol/rdsk/cinder/volume1: in use\n", + ), + ('scsidisk', 'add_lun_mapping_entry', ('cinder/volume1', { + 'target_group': 'cinder/volume1', 'lun': '0'}), + u"Unable to add view to zvol 'cinder/volume1' (LUNs in use: ):\n" + u" stmfadm: view entry exists\n", + ), + ] + + def _stub_export_method(self, module, method, args, error, fail=False): + m = getattr(self.nms_mock, module) + m = getattr(m, method) + mock = m(*args) + if fail: + mock.AndRaise(nexenta.NexentaException(error)) + + def _stub_all_export_methods(self, fail=False): + for params in self._CREATE_EXPORT_METHODS: + self._stub_export_method(*params, fail=fail) + + def test_create_export(self): + self._stub_all_export_methods() + self.mox.ReplayAll() + retval = self.drv.create_export({}, self.TEST_VOLUME_REF) + self.assertEquals(retval, + {'provider_location': + '%s:%s,1 %s%s' % (FLAGS.nexenta_host, + FLAGS.nexenta_iscsi_target_portal_port, + FLAGS.nexenta_target_prefix, + self.TEST_VOLUME_NAME)}) + + def __get_test(i): + def _test_create_export_fail(self): + for params in self._CREATE_EXPORT_METHODS[:i]: + self._stub_export_method(*params) + self._stub_export_method(*self._CREATE_EXPORT_METHODS[i], + fail=True) + self.mox.ReplayAll() + self.assertRaises(nexenta.NexentaException, + self.drv.create_export, {}, self.TEST_VOLUME_REF) + return _test_create_export_fail + + for i in range(len(_CREATE_EXPORT_METHODS)): + locals()['test_create_export_fail_%d' % i] = __get_test(i) + + def test_ensure_export(self): + self._stub_all_export_methods(fail=True) + self.mox.ReplayAll() + self.drv.ensure_export({}, self.TEST_VOLUME_REF) + + def test_remove_export(self): + self.nms_mock.scsidisk.delete_lu('cinder/volume1') + self.nms_mock.stmf.destroy_targetgroup('cinder/volume1') + self.nms_mock.iscsitarget.delete_target('iqn:volume1') + self.mox.ReplayAll() + self.drv.remove_export({}, self.TEST_VOLUME_REF) + + def test_remove_export_fail_0(self): + self.nms_mock.scsidisk.delete_lu('cinder/volume1') + self.nms_mock.stmf.destroy_targetgroup('cinder/volume1').AndRaise( + nexenta.NexentaException()) + self.nms_mock.iscsitarget.delete_target('iqn:volume1') + self.mox.ReplayAll() + self.drv.remove_export({}, self.TEST_VOLUME_REF) + + def test_remove_export_fail_1(self): + self.nms_mock.scsidisk.delete_lu('cinder/volume1') + self.nms_mock.stmf.destroy_targetgroup('cinder/volume1') + self.nms_mock.iscsitarget.delete_target('iqn:volume1').AndRaise( + nexenta.NexentaException()) + self.mox.ReplayAll() + self.drv.remove_export({}, self.TEST_VOLUME_REF) + + +class TestNexentaJSONRPC(cinder.test.TestCase): + URL = 'http://example.com/' + URL_S = 'https://example.com/' + USER = 'user' + PASSWORD = 'password' + HEADERS = {'Authorization': 'Basic %s' % (base64.b64encode( + ':'.join((USER, PASSWORD))),), + 'Content-Type': 'application/json'} + REQUEST = 'the request' + + def setUp(self): + super(TestNexentaJSONRPC, self).setUp() + self.proxy = jsonrpc.NexentaJSONProxy( + self.URL, self.USER, self.PASSWORD, auto=True) + self.mox.StubOutWithMock(urllib2, 'Request', True) + self.mox.StubOutWithMock(urllib2, 'urlopen') + self.resp_mock = self.mox.CreateMockAnything() + self.resp_info_mock = self.mox.CreateMockAnything() + self.resp_mock.info().AndReturn(self.resp_info_mock) + urllib2.urlopen(self.REQUEST).AndReturn(self.resp_mock) + + def test_call(self): + urllib2.Request(self.URL, + '{"object": null, "params": ["arg1", "arg2"], "method": null}', + self.HEADERS).AndReturn(self.REQUEST) + self.resp_info_mock.status = '' + self.resp_mock.read().AndReturn( + '{"error": null, "result": "the result"}') + self.mox.ReplayAll() + result = self.proxy('arg1', 'arg2') + self.assertEquals("the result", result) + + def test_call_deep(self): + urllib2.Request(self.URL, + '{"object": "obj1.subobj", "params": ["arg1", "arg2"],' + ' "method": "meth"}', + self.HEADERS).AndReturn(self.REQUEST) + self.resp_info_mock.status = '' + self.resp_mock.read().AndReturn( + '{"error": null, "result": "the result"}') + self.mox.ReplayAll() + result = self.proxy.obj1.subobj.meth('arg1', 'arg2') + self.assertEquals("the result", result) + + def test_call_auto(self): + urllib2.Request(self.URL, + '{"object": null, "params": ["arg1", "arg2"], "method": null}', + self.HEADERS).AndReturn(self.REQUEST) + urllib2.Request(self.URL_S, + '{"object": null, "params": ["arg1", "arg2"], "method": null}', + self.HEADERS).AndReturn(self.REQUEST) + self.resp_info_mock.status = 'EOF in headers' + self.resp_mock.read().AndReturn( + '{"error": null, "result": "the result"}') + urllib2.urlopen(self.REQUEST).AndReturn(self.resp_mock) + self.mox.ReplayAll() + result = self.proxy('arg1', 'arg2') + self.assertEquals("the result", result) + + def test_call_error(self): + urllib2.Request(self.URL, + '{"object": null, "params": ["arg1", "arg2"], "method": null}', + self.HEADERS).AndReturn(self.REQUEST) + self.resp_info_mock.status = '' + self.resp_mock.read().AndReturn( + '{"error": {"message": "the error"}, "result": "the result"}') + self.mox.ReplayAll() + self.assertRaises(jsonrpc.NexentaJSONException, + self.proxy, 'arg1', 'arg2') + + def test_call_fail(self): + urllib2.Request(self.URL, + '{"object": null, "params": ["arg1", "arg2"], "method": null}', + self.HEADERS).AndReturn(self.REQUEST) + self.resp_info_mock.status = 'EOF in headers' + self.proxy.auto = False + self.mox.ReplayAll() + self.assertRaises(jsonrpc.NexentaJSONException, + self.proxy, 'arg1', 'arg2') diff --git a/cinder/tests/test_notifier.py b/cinder/tests/test_notifier.py new file mode 100644 index 000000000..e147f786c --- /dev/null +++ b/cinder/tests/test_notifier.py @@ -0,0 +1,133 @@ +# Copyright 2011 OpenStack LLC. +# 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 cinder +from cinder import flags +from cinder import log +import cinder.notifier.no_op_notifier +from cinder.notifier import api as notifier_api +from cinder import test + + +class NotifierTestCase(test.TestCase): + """Test case for notifications""" + def setUp(self): + super(NotifierTestCase, self).setUp() + self.flags(notification_driver='cinder.notifier.no_op_notifier') + + def test_send_notification(self): + self.notify_called = False + + def mock_notify(cls, *args): + self.notify_called = True + + self.stubs.Set(cinder.notifier.no_op_notifier, 'notify', + mock_notify) + + notifier_api.notify('publisher_id', 'event_type', + cinder.notifier.api.WARN, dict(a=3)) + self.assertEqual(self.notify_called, True) + + def test_verify_message_format(self): + """A test to ensure changing the message format is prohibitively + annoying""" + + def message_assert(message): + fields = [('publisher_id', 'publisher_id'), + ('event_type', 'event_type'), + ('priority', 'WARN'), + ('payload', dict(a=3))] + for k, v in fields: + self.assertEqual(message[k], v) + self.assertTrue(len(message['message_id']) > 0) + self.assertTrue(len(message['timestamp']) > 0) + + self.stubs.Set(cinder.notifier.no_op_notifier, 'notify', + message_assert) + notifier_api.notify('publisher_id', 'event_type', + cinder.notifier.api.WARN, dict(a=3)) + + def test_send_rabbit_notification(self): + self.stubs.Set(cinder.flags.FLAGS, 'notification_driver', + 'cinder.notifier.rabbit_notifier') + self.mock_notify = False + + def mock_notify(cls, *args): + self.mock_notify = True + + self.stubs.Set(cinder.rpc, 'notify', mock_notify) + notifier_api.notify('publisher_id', 'event_type', + cinder.notifier.api.WARN, dict(a=3)) + + self.assertEqual(self.mock_notify, True) + + def test_invalid_priority(self): + self.assertRaises(cinder.notifier.api.BadPriorityException, + notifier_api.notify, 'publisher_id', + 'event_type', 'not a priority', dict(a=3)) + + def test_rabbit_priority_queue(self): + flags.DECLARE('notification_topics', 'cinder.notifier.rabbit_notifier') + self.stubs.Set(cinder.flags.FLAGS, 'notification_driver', + 'cinder.notifier.rabbit_notifier') + self.stubs.Set(cinder.flags.FLAGS, 'notification_topics', + ['testnotify', ]) + + self.test_topic = None + + def mock_notify(context, topic, msg): + self.test_topic = topic + + self.stubs.Set(cinder.rpc, 'notify', mock_notify) + notifier_api.notify('publisher_id', 'event_type', 'DEBUG', dict(a=3)) + self.assertEqual(self.test_topic, 'testnotify.debug') + + def test_error_notification(self): + self.stubs.Set(cinder.flags.FLAGS, 'notification_driver', + 'cinder.notifier.rabbit_notifier') + self.stubs.Set(cinder.flags.FLAGS, 'publish_errors', True) + LOG = log.getLogger('cinder') + log.setup() + msgs = [] + + def mock_notify(context, topic, data): + msgs.append(data) + + self.stubs.Set(cinder.rpc, 'notify', mock_notify) + LOG.error('foo') + self.assertEqual(1, len(msgs)) + msg = msgs[0] + self.assertEqual(msg['event_type'], 'error_notification') + self.assertEqual(msg['priority'], 'ERROR') + self.assertEqual(msg['payload']['error'], 'foo') + + def test_send_notification_by_decorator(self): + self.notify_called = False + + def example_api(arg1, arg2): + return arg1 + arg2 + + example_api = cinder.notifier.api.notify_decorator( + 'example_api', + example_api) + + def mock_notify(cls, *args): + self.notify_called = True + + self.stubs.Set(cinder.notifier.no_op_notifier, 'notify', + mock_notify) + + self.assertEqual(3, example_api(1, 2)) + self.assertEqual(self.notify_called, True) diff --git a/cinder/tests/test_nova_rootwrap.py b/cinder/tests/test_nova_rootwrap.py new file mode 100644 index 000000000..42fd5ee5f --- /dev/null +++ b/cinder/tests/test_nova_rootwrap.py @@ -0,0 +1,133 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 subprocess + +from cinder.rootwrap import filters +from cinder.rootwrap import wrapper +from cinder import test + + +class RootwrapTestCase(test.TestCase): + + def setUp(self): + super(RootwrapTestCase, self).setUp() + self.filters = [ + filters.RegExpFilter("/bin/ls", "root", 'ls', '/[a-z]+'), + filters.CommandFilter("/usr/bin/foo_bar_not_exist", "root"), + filters.RegExpFilter("/bin/cat", "root", 'cat', '/[a-z]+'), + filters.CommandFilter("/nonexistant/cat", "root"), + filters.CommandFilter("/bin/cat", "root") # Keep this one last + ] + + def test_RegExpFilter_match(self): + usercmd = ["ls", "/root"] + filtermatch = wrapper.match_filter(self.filters, usercmd) + self.assertFalse(filtermatch is None) + self.assertEqual(filtermatch.get_command(usercmd), + ["/bin/ls", "/root"]) + + def test_RegExpFilter_reject(self): + usercmd = ["ls", "root"] + filtermatch = wrapper.match_filter(self.filters, usercmd) + self.assertTrue(filtermatch is None) + + def test_missing_command(self): + valid_but_missing = ["foo_bar_not_exist"] + invalid = ["foo_bar_not_exist_and_not_matched"] + filtermatch = wrapper.match_filter(self.filters, valid_but_missing) + self.assertTrue(filtermatch is not None) + filtermatch = wrapper.match_filter(self.filters, invalid) + self.assertTrue(filtermatch is None) + + def test_DnsmasqFilter(self): + usercmd = ['FLAGFILE=A', 'NETWORK_ID=foobar', 'dnsmasq', 'foo'] + f = filters.DnsmasqFilter("/usr/bin/dnsmasq", "root") + self.assertTrue(f.match(usercmd)) + self.assertEqual(f.get_command(usercmd), ['/usr/bin/dnsmasq', 'foo']) + env = f.get_environment(usercmd) + self.assertEqual(env.get('FLAGFILE'), 'A') + self.assertEqual(env.get('NETWORK_ID'), 'foobar') + + @test.skip_if(not os.path.exists("/proc/%d" % os.getpid()), + "Test requires /proc filesystem (procfs)") + def test_KillFilter(self): + p = subprocess.Popen(["/bin/sleep", "5"]) + f = filters.KillFilter("/bin/kill", "root", + ["-ALRM"], + ["/bin/sleep"]) + usercmd = ['kill', '-9', p.pid] + # Incorrect signal should fail + self.assertFalse(f.match(usercmd)) + usercmd = ['kill', p.pid] + # Providing no signal should fail + self.assertFalse(f.match(usercmd)) + + f = filters.KillFilter("/bin/kill", "root", + ["-9", ""], + ["/bin/sleep"]) + usercmd = ['kill', '-9', os.getpid()] + # Our own PID does not match /bin/sleep, so it should fail + self.assertFalse(f.match(usercmd)) + usercmd = ['kill', '-9', 999999] + # Nonexistant PID should fail + self.assertFalse(f.match(usercmd)) + usercmd = ['kill', p.pid] + # Providing no signal should work + self.assertTrue(f.match(usercmd)) + usercmd = ['kill', '-9', p.pid] + # Providing -9 signal should work + self.assertTrue(f.match(usercmd)) + + def test_KillFilter_no_raise(self): + """Makes sure ValueError from bug 926412 is gone""" + f = filters.KillFilter("/bin/kill", "root", [""]) + # Providing anything other than kill should be False + usercmd = ['notkill', 999999] + self.assertFalse(f.match(usercmd)) + # Providing something that is not a pid should be False + usercmd = ['kill', 'notapid'] + self.assertFalse(f.match(usercmd)) + + def test_KillFilter_deleted_exe(self): + """Makes sure deleted exe's are killed correctly""" + # See bug #967931. + def fake_readlink(blah): + return '/bin/commandddddd (deleted)' + + f = filters.KillFilter("/bin/kill", "root", + [""], + ["/bin/commandddddd"]) + usercmd = ['kill', 1234] + # Providing no signal should work + self.stubs.Set(os, 'readlink', fake_readlink) + self.assertTrue(f.match(usercmd)) + + def test_ReadFileFilter(self): + goodfn = '/good/file.name' + f = filters.ReadFileFilter(goodfn) + usercmd = ['cat', '/bad/file'] + self.assertFalse(f.match(['cat', '/bad/file'])) + usercmd = ['cat', goodfn] + self.assertEqual(f.get_command(usercmd), ['/bin/cat', goodfn]) + self.assertTrue(f.match(usercmd)) + + def test_skips(self): + # Check that all filters are skipped and that the last matches + usercmd = ["cat", "/"] + filtermatch = wrapper.match_filter(self.filters, usercmd) + self.assertTrue(filtermatch is self.filters[-1]) diff --git a/cinder/tests/test_policy.py b/cinder/tests/test_policy.py new file mode 100644 index 000000000..4cb66f088 --- /dev/null +++ b/cinder/tests/test_policy.py @@ -0,0 +1,189 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 Piston Cloud Computing, 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. + +"""Test of Policy Engine For Cinder""" + +import os.path +import StringIO +import urllib2 + +from cinder.common import policy as common_policy +from cinder import context +from cinder import exception +from cinder import flags +import cinder.common.policy +from cinder import policy +from cinder import test +from cinder import utils + +FLAGS = flags.FLAGS + + +class PolicyFileTestCase(test.TestCase): + def setUp(self): + super(PolicyFileTestCase, self).setUp() + policy.reset() + self.context = context.RequestContext('fake', 'fake') + self.target = {} + + def tearDown(self): + super(PolicyFileTestCase, self).tearDown() + policy.reset() + + def test_modified_policy_reloads(self): + with utils.tempdir() as tmpdir: + tmpfilename = os.path.join(tmpdir, 'policy') + self.flags(policy_file=tmpfilename) + + action = "example:test" + with open(tmpfilename, "w") as policyfile: + policyfile.write("""{"example:test": []}""") + policy.enforce(self.context, action, self.target) + with open(tmpfilename, "w") as policyfile: + policyfile.write("""{"example:test": ["false:false"]}""") + # NOTE(vish): reset stored policy cache so we don't have to + # sleep(1) + policy._POLICY_CACHE = {} + self.assertRaises(exception.PolicyNotAuthorized, policy.enforce, + self.context, action, self.target) + + +class PolicyTestCase(test.TestCase): + def setUp(self): + super(PolicyTestCase, self).setUp() + policy.reset() + # NOTE(vish): preload rules to circumvent reloading from file + policy.init() + rules = { + "true": [], + "example:allowed": [], + "example:denied": [["false:false"]], + "example:get_http": [["http:http://www.example.com"]], + "example:my_file": [["role:compute_admin"], + ["project_id:%(project_id)s"]], + "example:early_and_fail": [["false:false", "rule:true"]], + "example:early_or_success": [["rule:true"], ["false:false"]], + "example:lowercase_admin": [["role:admin"], ["role:sysadmin"]], + "example:uppercase_admin": [["role:ADMIN"], ["role:sysadmin"]], + } + # NOTE(vish): then overload underlying brain + common_policy.set_brain(common_policy.HttpBrain(rules)) + self.context = context.RequestContext('fake', 'fake', roles=['member']) + self.target = {} + + def tearDown(self): + policy.reset() + super(PolicyTestCase, self).tearDown() + + def test_enforce_nonexistent_action_throws(self): + action = "example:noexist" + self.assertRaises(exception.PolicyNotAuthorized, policy.enforce, + self.context, action, self.target) + + def test_enforce_bad_action_throws(self): + action = "example:denied" + self.assertRaises(exception.PolicyNotAuthorized, policy.enforce, + self.context, action, self.target) + + def test_enforce_good_action(self): + action = "example:allowed" + policy.enforce(self.context, action, self.target) + + def test_enforce_http_true(self): + + def fakeurlopen(url, post_data): + return StringIO.StringIO("True") + self.stubs.Set(urllib2, 'urlopen', fakeurlopen) + action = "example:get_http" + target = {} + result = policy.enforce(self.context, action, target) + self.assertEqual(result, None) + + def test_enforce_http_false(self): + + def fakeurlopen(url, post_data): + return StringIO.StringIO("False") + self.stubs.Set(urllib2, 'urlopen', fakeurlopen) + action = "example:get_http" + target = {} + self.assertRaises(exception.PolicyNotAuthorized, policy.enforce, + self.context, action, target) + + def test_templatized_enforcement(self): + target_mine = {'project_id': 'fake'} + target_not_mine = {'project_id': 'another'} + action = "example:my_file" + policy.enforce(self.context, action, target_mine) + self.assertRaises(exception.PolicyNotAuthorized, policy.enforce, + self.context, action, target_not_mine) + + def test_early_AND_enforcement(self): + action = "example:early_and_fail" + self.assertRaises(exception.PolicyNotAuthorized, policy.enforce, + self.context, action, self.target) + + def test_early_OR_enforcement(self): + action = "example:early_or_success" + policy.enforce(self.context, action, self.target) + + def test_ignore_case_role_check(self): + lowercase_action = "example:lowercase_admin" + uppercase_action = "example:uppercase_admin" + # NOTE(dprince) we mix case in the Admin role here to ensure + # case is ignored + admin_context = context.RequestContext('admin', + 'fake', + roles=['AdMiN']) + policy.enforce(admin_context, lowercase_action, self.target) + policy.enforce(admin_context, uppercase_action, self.target) + + +class DefaultPolicyTestCase(test.TestCase): + + def setUp(self): + super(DefaultPolicyTestCase, self).setUp() + policy.reset() + policy.init() + + self.rules = { + "default": [], + "example:exist": [["false:false"]] + } + + self._set_brain('default') + + self.context = context.RequestContext('fake', 'fake') + + def _set_brain(self, default_rule): + brain = cinder.common.policy.HttpBrain(self.rules, default_rule) + cinder.common.policy.set_brain(brain) + + def tearDown(self): + super(DefaultPolicyTestCase, self).tearDown() + policy.reset() + + def test_policy_called(self): + self.assertRaises(exception.PolicyNotAuthorized, policy.enforce, + self.context, "example:exist", {}) + + def test_not_found_policy_calls_default(self): + policy.enforce(self.context, "example:noexist", {}) + + def test_default_not_found(self): + self._set_brain("default_noexist") + self.assertRaises(exception.PolicyNotAuthorized, policy.enforce, + self.context, "example:noexist", {}) diff --git a/cinder/tests/test_quota.py b/cinder/tests/test_quota.py new file mode 100644 index 000000000..6e794d6e4 --- /dev/null +++ b/cinder/tests/test_quota.py @@ -0,0 +1,316 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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 cinder import context +from cinder import db +from cinder import flags +from cinder import quota +from cinder import exception +from cinder import rpc +from cinder import test +from cinder import volume +from cinder.scheduler import driver as scheduler_driver + + +FLAGS = flags.FLAGS + + +class GetQuotaTestCase(test.TestCase): + def setUp(self): + super(GetQuotaTestCase, self).setUp() + self.flags(quota_instances=10, + quota_cores=20, + quota_ram=50 * 1024, + quota_volumes=10, + quota_gigabytes=1000, + quota_floating_ips=10, + quota_security_groups=10, + quota_security_group_rules=20, + quota_metadata_items=128, + quota_injected_files=5, + quota_injected_file_content_bytes=10 * 1024) + self.context = context.RequestContext('admin', 'admin', is_admin=True) + + def _stub_class(self): + def fake_quota_class_get_all_by_name(context, quota_class): + result = dict(class_name=quota_class) + if quota_class == 'test_class': + result.update( + instances=5, + cores=10, + ram=25 * 1024, + volumes=5, + gigabytes=500, + floating_ips=5, + quota_security_groups=10, + quota_security_group_rules=20, + metadata_items=64, + injected_files=2, + injected_file_content_bytes=5 * 1024, + invalid_quota=100, + ) + return result + + self.stubs.Set(db, 'quota_class_get_all_by_name', + fake_quota_class_get_all_by_name) + + def _stub_project(self, override=False): + def fake_quota_get_all_by_project(context, project_id): + result = dict(project_id=project_id) + if override: + result.update( + instances=2, + cores=5, + ram=12 * 1024, + volumes=2, + gigabytes=250, + floating_ips=2, + security_groups=5, + security_group_rules=10, + metadata_items=32, + injected_files=1, + injected_file_content_bytes=2 * 1024, + invalid_quota=50, + ) + return result + + self.stubs.Set(db, 'quota_get_all_by_project', + fake_quota_get_all_by_project) + + def test_default_quotas(self): + result = quota._get_default_quotas() + self.assertEqual(result, dict( + instances=10, + cores=20, + ram=50 * 1024, + volumes=10, + gigabytes=1000, + floating_ips=10, + security_groups=10, + security_group_rules=20, + metadata_items=128, + injected_files=5, + injected_file_content_bytes=10 * 1024, + )) + + def test_default_quotas_unlimited(self): + self.flags(quota_instances=-1, + quota_cores=-1, + quota_ram=-1, + quota_volumes=-1, + quota_gigabytes=-1, + quota_floating_ips=-1, + quota_security_groups=-1, + quota_security_group_rules=-1, + quota_metadata_items=-1, + quota_injected_files=-1, + quota_injected_file_content_bytes=-1) + result = quota._get_default_quotas() + self.assertEqual(result, dict( + instances=-1, + cores=-1, + ram=-1, + volumes=-1, + gigabytes=-1, + floating_ips=-1, + security_groups=-1, + security_group_rules=-1, + metadata_items=-1, + injected_files=-1, + injected_file_content_bytes=-1, + )) + + def test_class_quotas_noclass(self): + self._stub_class() + result = quota.get_class_quotas(self.context, 'noclass') + self.assertEqual(result, dict( + instances=10, + cores=20, + ram=50 * 1024, + volumes=10, + gigabytes=1000, + floating_ips=10, + security_groups=10, + security_group_rules=20, + metadata_items=128, + injected_files=5, + injected_file_content_bytes=10 * 1024, + )) + + def test_class_quotas(self): + self._stub_class() + result = quota.get_class_quotas(self.context, 'test_class') + self.assertEqual(result, dict( + instances=5, + cores=10, + ram=25 * 1024, + volumes=5, + gigabytes=500, + floating_ips=5, + security_groups=10, + security_group_rules=20, + metadata_items=64, + injected_files=2, + injected_file_content_bytes=5 * 1024, + )) + + def test_project_quotas_defaults_noclass(self): + self._stub_class() + self._stub_project() + result = quota.get_project_quotas(self.context, 'admin') + self.assertEqual(result, dict( + instances=10, + cores=20, + ram=50 * 1024, + volumes=10, + gigabytes=1000, + floating_ips=10, + security_groups=10, + security_group_rules=20, + metadata_items=128, + injected_files=5, + injected_file_content_bytes=10 * 1024, + )) + + def test_project_quotas_overrides_noclass(self): + self._stub_class() + self._stub_project(True) + result = quota.get_project_quotas(self.context, 'admin') + self.assertEqual(result, dict( + instances=2, + cores=5, + ram=12 * 1024, + volumes=2, + gigabytes=250, + floating_ips=2, + security_groups=5, + security_group_rules=10, + metadata_items=32, + injected_files=1, + injected_file_content_bytes=2 * 1024, + )) + + def test_project_quotas_defaults_withclass(self): + self._stub_class() + self._stub_project() + self.context.quota_class = 'test_class' + result = quota.get_project_quotas(self.context, 'admin') + self.assertEqual(result, dict( + instances=5, + cores=10, + ram=25 * 1024, + volumes=5, + gigabytes=500, + floating_ips=5, + security_groups=10, + security_group_rules=20, + metadata_items=64, + injected_files=2, + injected_file_content_bytes=5 * 1024, + )) + + def test_project_quotas_overrides_withclass(self): + self._stub_class() + self._stub_project(True) + self.context.quota_class = 'test_class' + result = quota.get_project_quotas(self.context, 'admin') + self.assertEqual(result, dict( + instances=2, + cores=5, + ram=12 * 1024, + volumes=2, + gigabytes=250, + floating_ips=2, + security_groups=5, + security_group_rules=10, + metadata_items=32, + injected_files=1, + injected_file_content_bytes=2 * 1024, + )) + + +class QuotaTestCase(test.TestCase): + + class StubImageService(object): + + def show(self, *args, **kwargs): + return {"properties": {}} + + def setUp(self): + super(QuotaTestCase, self).setUp() + self.flags(quota_volumes=2, + quota_gigabytes=20) + self.user_id = 'admin' + self.project_id = 'admin' + self.context = context.RequestContext(self.user_id, + self.project_id, + is_admin=True) + orig_rpc_call = rpc.call + + def rpc_call_wrapper(context, topic, msg): + """Stub out the scheduler creating the instance entry""" + if (topic == FLAGS.scheduler_topic and + msg['method'] == 'run_instance'): + scheduler = scheduler_driver.Scheduler + instance = scheduler().create_instance_db_entry( + context, + msg['args']['request_spec']) + return [scheduler_driver.encode_instance(instance)] + else: + return orig_rpc_call(context, topic, msg) + + self.stubs.Set(rpc, 'call', rpc_call_wrapper) + + def _create_volume(self, size=10): + """Create a test volume""" + vol = {} + vol['user_id'] = self.user_id + vol['project_id'] = self.project_id + vol['size'] = size + return db.volume_create(self.context, vol)['id'] + + def test_unlimited_volumes(self): + self.flags(quota_volumes=10, quota_gigabytes=-1) + volumes = quota.allowed_volumes(self.context, 100, 1) + self.assertEqual(volumes, 10) + db.quota_create(self.context, self.project_id, 'volumes', -1) + volumes = quota.allowed_volumes(self.context, 100, 1) + self.assertEqual(volumes, 100) + volumes = quota.allowed_volumes(self.context, 101, 1) + self.assertEqual(volumes, 101) + + def test_too_many_volumes(self): + volume_ids = [] + for i in range(FLAGS.quota_volumes): + volume_id = self._create_volume() + volume_ids.append(volume_id) + self.assertRaises(exception.QuotaError, + volume.API().create, + self.context, 10, '', '', None) + for volume_id in volume_ids: + db.volume_destroy(self.context, volume_id) + + def test_too_many_gigabytes(self): + volume_ids = [] + volume_id = self._create_volume(size=20) + volume_ids.append(volume_id) + self.assertRaises(exception.QuotaError, + volume.API().create, + self.context, 10, '', '', None) + for volume_id in volume_ids: + db.volume_destroy(self.context, volume_id) diff --git a/cinder/tests/test_service.py b/cinder/tests/test_service.py new file mode 100644 index 000000000..c0c2561e4 --- /dev/null +++ b/cinder/tests/test_service.py @@ -0,0 +1,221 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +""" +Unit Tests for remote procedure calls using queue +""" + +import mox + +from cinder import context +from cinder import db +from cinder import exception +from cinder import flags +from cinder.openstack.common import cfg +from cinder import test +from cinder import service +from cinder import manager +from cinder import wsgi + + +test_service_opts = [ + cfg.StrOpt("fake_manager", + default="cinder.tests.test_service.FakeManager", + help="Manager for testing"), + cfg.StrOpt("test_service_listen", + default=None, + help="Host to bind test service to"), + cfg.IntOpt("test_service_listen_port", + default=0, + help="Port number to bind test service to"), + ] + +flags.FLAGS.register_opts(test_service_opts) + + +class FakeManager(manager.Manager): + """Fake manager for tests""" + def test_method(self): + return 'manager' + + +class ExtendedService(service.Service): + def test_method(self): + return 'service' + + +class ServiceManagerTestCase(test.TestCase): + """Test cases for Services""" + + def test_message_gets_to_manager(self): + serv = service.Service('test', + 'test', + 'test', + 'cinder.tests.test_service.FakeManager') + serv.start() + self.assertEqual(serv.test_method(), 'manager') + + def test_override_manager_method(self): + serv = ExtendedService('test', + 'test', + 'test', + 'cinder.tests.test_service.FakeManager') + serv.start() + self.assertEqual(serv.test_method(), 'service') + + +class ServiceFlagsTestCase(test.TestCase): + def test_service_enabled_on_create_based_on_flag(self): + self.flags(enable_new_services=True) + host = 'foo' + binary = 'cinder-fake' + app = service.Service.create(host=host, binary=binary) + app.start() + app.stop() + ref = db.service_get(context.get_admin_context(), app.service_id) + db.service_destroy(context.get_admin_context(), app.service_id) + self.assert_(not ref['disabled']) + + def test_service_disabled_on_create_based_on_flag(self): + self.flags(enable_new_services=False) + host = 'foo' + binary = 'cinder-fake' + app = service.Service.create(host=host, binary=binary) + app.start() + app.stop() + ref = db.service_get(context.get_admin_context(), app.service_id) + db.service_destroy(context.get_admin_context(), app.service_id) + self.assert_(ref['disabled']) + + +class ServiceTestCase(test.TestCase): + """Test cases for Services""" + + def setUp(self): + super(ServiceTestCase, self).setUp() + self.mox.StubOutWithMock(service, 'db') + + def test_create(self): + host = 'foo' + binary = 'cinder-fake' + topic = 'fake' + + # NOTE(vish): Create was moved out of mox replay to make sure that + # the looping calls are created in StartService. + app = service.Service.create(host=host, binary=binary, topic=topic) + + self.assert_(app) + + def test_report_state_newly_disconnected(self): + host = 'foo' + binary = 'bar' + topic = 'test' + service_create = {'host': host, + 'binary': binary, + 'topic': topic, + 'report_count': 0, + 'availability_zone': 'cinder'} + service_ref = {'host': host, + 'binary': binary, + 'topic': topic, + 'report_count': 0, + 'availability_zone': 'cinder', + 'id': 1} + + service.db.service_get_by_args(mox.IgnoreArg(), + host, + binary).AndRaise(exception.NotFound()) + service.db.service_create(mox.IgnoreArg(), + service_create).AndReturn(service_ref) + service.db.service_get(mox.IgnoreArg(), + mox.IgnoreArg()).AndRaise(Exception()) + + self.mox.ReplayAll() + serv = service.Service(host, + binary, + topic, + 'cinder.tests.test_service.FakeManager') + serv.start() + serv.report_state() + self.assert_(serv.model_disconnected) + + def test_report_state_newly_connected(self): + host = 'foo' + binary = 'bar' + topic = 'test' + service_create = {'host': host, + 'binary': binary, + 'topic': topic, + 'report_count': 0, + 'availability_zone': 'cinder'} + service_ref = {'host': host, + 'binary': binary, + 'topic': topic, + 'report_count': 0, + 'availability_zone': 'cinder', + 'id': 1} + + service.db.service_get_by_args(mox.IgnoreArg(), + host, + binary).AndRaise(exception.NotFound()) + service.db.service_create(mox.IgnoreArg(), + service_create).AndReturn(service_ref) + service.db.service_get(mox.IgnoreArg(), + service_ref['id']).AndReturn(service_ref) + service.db.service_update(mox.IgnoreArg(), service_ref['id'], + mox.ContainsKeyValue('report_count', 1)) + + self.mox.ReplayAll() + serv = service.Service(host, + binary, + topic, + 'cinder.tests.test_service.FakeManager') + serv.start() + serv.model_disconnected = True + serv.report_state() + + self.assert_(not serv.model_disconnected) + + +class TestWSGIService(test.TestCase): + + def setUp(self): + super(TestWSGIService, self).setUp() + self.stubs.Set(wsgi.Loader, "load_app", mox.MockAnything()) + + def test_service_random_port(self): + test_service = service.WSGIService("test_service") + self.assertEquals(0, test_service.port) + test_service.start() + self.assertNotEqual(0, test_service.port) + test_service.stop() + + +class TestLauncher(test.TestCase): + + def setUp(self): + super(TestLauncher, self).setUp() + self.stubs.Set(wsgi.Loader, "load_app", mox.MockAnything()) + self.service = service.WSGIService("test_service") + + def test_launch_app(self): + self.assertEquals(0, self.service.port) + launcher = service.Launcher() + launcher.launch_server(self.service) + self.assertEquals(0, self.service.port) + launcher.stop() diff --git a/cinder/tests/test_skip_examples.py b/cinder/tests/test_skip_examples.py new file mode 100644 index 000000000..2e51aef34 --- /dev/null +++ b/cinder/tests/test_skip_examples.py @@ -0,0 +1,47 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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 cinder import test + + +class ExampleSkipTestCase(test.TestCase): + test_counter = 0 + + @test.skip_test("Example usage of @test.skip_test()") + def test_skip_test_example(self): + self.fail("skip_test failed to work properly.") + + @test.skip_if(True, "Example usage of @test.skip_if()") + def test_skip_if_example(self): + self.fail("skip_if failed to work properly.") + + @test.skip_unless(False, "Example usage of @test.skip_unless()") + def test_skip_unless_example(self): + self.fail("skip_unless failed to work properly.") + + @test.skip_if(False, "This test case should never be skipped.") + def test_001_increase_test_counter(self): + ExampleSkipTestCase.test_counter += 1 + + @test.skip_unless(True, "This test case should never be skipped.") + def test_002_increase_test_counter(self): + ExampleSkipTestCase.test_counter += 1 + + def test_003_verify_test_counter(self): + self.assertEquals(ExampleSkipTestCase.test_counter, 2, + "Tests were not skipped appropriately") diff --git a/cinder/tests/test_test.py b/cinder/tests/test_test.py new file mode 100644 index 000000000..8ff84c1ad --- /dev/null +++ b/cinder/tests/test_test.py @@ -0,0 +1,44 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Tests for the testing base code.""" + +from cinder import rpc +from cinder import test + + +class IsolationTestCase(test.TestCase): + """Ensure that things are cleaned up after failed tests. + + These tests don't really do much here, but if isolation fails a bunch + of other tests should fail. + + """ + def test_service_isolation(self): + self.start_service('volume') + + def test_rpc_consumer_isolation(self): + class NeverCalled(object): + + def __getattribute__(*args): + assert False, "I should never get called." + + connection = rpc.create_connection(new=True) + proxy = NeverCalled() + connection.create_consumer('volume', proxy, fanout=False) + connection.consume_in_thread() diff --git a/cinder/tests/test_test_utils.py b/cinder/tests/test_test_utils.py new file mode 100644 index 000000000..5e9063cc5 --- /dev/null +++ b/cinder/tests/test_test_utils.py @@ -0,0 +1,29 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 +# +# Copyright 2010 OpenStack LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 cinder import db +from cinder import test +from cinder.tests import utils as test_utils + + +class TestUtilsTestCase(test.TestCase): + def test_get_test_admin_context(self): + """get_test_admin_context's return value behaves like admin context""" + ctxt = test_utils.get_test_admin_context() + + # TODO(soren): This should verify the full interface context + # objects expose. + self.assertTrue(ctxt.is_admin) diff --git a/cinder/tests/test_utils.py b/cinder/tests/test_utils.py new file mode 100644 index 000000000..ee946e7d9 --- /dev/null +++ b/cinder/tests/test_utils.py @@ -0,0 +1,1188 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 Justin Santa Barbara +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 __builtin__ +import datetime +import hashlib +import os +import os.path +import socket +import shutil +import StringIO +import tempfile + +import eventlet +from eventlet import greenpool +import iso8601 +import lockfile +import mox + +import cinder +from cinder import exception +from cinder import flags +from cinder import test +from cinder import utils + + +FLAGS = flags.FLAGS + + +class ExecuteTestCase(test.TestCase): + def test_retry_on_failure(self): + fd, tmpfilename = tempfile.mkstemp() + _, tmpfilename2 = tempfile.mkstemp() + try: + fp = os.fdopen(fd, 'w+') + fp.write('''#!/bin/sh +# If stdin fails to get passed during one of the runs, make a note. +if ! grep -q foo +then + echo 'failure' > "$1" +fi +# If stdin has failed to get passed during this or a previous run, exit early. +if grep failure "$1" +then + exit 1 +fi +runs="$(cat $1)" +if [ -z "$runs" ] +then + runs=0 +fi +runs=$(($runs + 1)) +echo $runs > "$1" +exit 1 +''') + fp.close() + os.chmod(tmpfilename, 0755) + self.assertRaises(exception.ProcessExecutionError, + utils.execute, + tmpfilename, tmpfilename2, attempts=10, + process_input='foo', + delay_on_retry=False) + fp = open(tmpfilename2, 'r+') + runs = fp.read() + fp.close() + self.assertNotEquals(runs.strip(), 'failure', 'stdin did not ' + 'always get passed ' + 'correctly') + runs = int(runs.strip()) + self.assertEquals(runs, 10, + 'Ran %d times instead of 10.' % (runs,)) + finally: + os.unlink(tmpfilename) + os.unlink(tmpfilename2) + + def test_unknown_kwargs_raises_error(self): + self.assertRaises(exception.Error, + utils.execute, + '/usr/bin/env', 'true', + this_is_not_a_valid_kwarg=True) + + def test_check_exit_code_boolean(self): + utils.execute('/usr/bin/env', 'false', check_exit_code=False) + self.assertRaises(exception.ProcessExecutionError, + utils.execute, + '/usr/bin/env', 'false', check_exit_code=True) + + def test_no_retry_on_success(self): + fd, tmpfilename = tempfile.mkstemp() + _, tmpfilename2 = tempfile.mkstemp() + try: + fp = os.fdopen(fd, 'w+') + fp.write('''#!/bin/sh +# If we've already run, bail out. +grep -q foo "$1" && exit 1 +# Mark that we've run before. +echo foo > "$1" +# Check that stdin gets passed correctly. +grep foo +''') + fp.close() + os.chmod(tmpfilename, 0755) + utils.execute(tmpfilename, + tmpfilename2, + process_input='foo', + attempts=2) + finally: + os.unlink(tmpfilename) + os.unlink(tmpfilename2) + + +class GetFromPathTestCase(test.TestCase): + def test_tolerates_nones(self): + f = utils.get_from_path + + input = [] + self.assertEquals([], f(input, "a")) + self.assertEquals([], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + input = [None] + self.assertEquals([], f(input, "a")) + self.assertEquals([], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + input = [{'a': None}] + self.assertEquals([], f(input, "a")) + self.assertEquals([], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + input = [{'a': {'b': None}}] + self.assertEquals([{'b': None}], f(input, "a")) + self.assertEquals([], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + input = [{'a': {'b': {'c': None}}}] + self.assertEquals([{'b': {'c': None}}], f(input, "a")) + self.assertEquals([{'c': None}], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + input = [{'a': {'b': {'c': None}}}, {'a': None}] + self.assertEquals([{'b': {'c': None}}], f(input, "a")) + self.assertEquals([{'c': None}], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + input = [{'a': {'b': {'c': None}}}, {'a': {'b': None}}] + self.assertEquals([{'b': {'c': None}}, {'b': None}], f(input, "a")) + self.assertEquals([{'c': None}], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + def test_does_select(self): + f = utils.get_from_path + + input = [{'a': 'a_1'}] + self.assertEquals(['a_1'], f(input, "a")) + self.assertEquals([], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + input = [{'a': {'b': 'b_1'}}] + self.assertEquals([{'b': 'b_1'}], f(input, "a")) + self.assertEquals(['b_1'], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + input = [{'a': {'b': {'c': 'c_1'}}}] + self.assertEquals([{'b': {'c': 'c_1'}}], f(input, "a")) + self.assertEquals([{'c': 'c_1'}], f(input, "a/b")) + self.assertEquals(['c_1'], f(input, "a/b/c")) + + input = [{'a': {'b': {'c': 'c_1'}}}, {'a': None}] + self.assertEquals([{'b': {'c': 'c_1'}}], f(input, "a")) + self.assertEquals([{'c': 'c_1'}], f(input, "a/b")) + self.assertEquals(['c_1'], f(input, "a/b/c")) + + input = [{'a': {'b': {'c': 'c_1'}}}, + {'a': {'b': None}}] + self.assertEquals([{'b': {'c': 'c_1'}}, {'b': None}], f(input, "a")) + self.assertEquals([{'c': 'c_1'}], f(input, "a/b")) + self.assertEquals(['c_1'], f(input, "a/b/c")) + + input = [{'a': {'b': {'c': 'c_1'}}}, + {'a': {'b': {'c': 'c_2'}}}] + self.assertEquals([{'b': {'c': 'c_1'}}, {'b': {'c': 'c_2'}}], + f(input, "a")) + self.assertEquals([{'c': 'c_1'}, {'c': 'c_2'}], f(input, "a/b")) + self.assertEquals(['c_1', 'c_2'], f(input, "a/b/c")) + + self.assertEquals([], f(input, "a/b/c/d")) + self.assertEquals([], f(input, "c/a/b/d")) + self.assertEquals([], f(input, "i/r/t")) + + def test_flattens_lists(self): + f = utils.get_from_path + + input = [{'a': [1, 2, 3]}] + self.assertEquals([1, 2, 3], f(input, "a")) + self.assertEquals([], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + input = [{'a': {'b': [1, 2, 3]}}] + self.assertEquals([{'b': [1, 2, 3]}], f(input, "a")) + self.assertEquals([1, 2, 3], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + input = [{'a': {'b': [1, 2, 3]}}, {'a': {'b': [4, 5, 6]}}] + self.assertEquals([1, 2, 3, 4, 5, 6], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + input = [{'a': [{'b': [1, 2, 3]}, {'b': [4, 5, 6]}]}] + self.assertEquals([1, 2, 3, 4, 5, 6], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + input = [{'a': [1, 2, {'b': 'b_1'}]}] + self.assertEquals([1, 2, {'b': 'b_1'}], f(input, "a")) + self.assertEquals(['b_1'], f(input, "a/b")) + + def test_bad_xpath(self): + f = utils.get_from_path + + self.assertRaises(exception.Error, f, [], None) + self.assertRaises(exception.Error, f, [], "") + self.assertRaises(exception.Error, f, [], "/") + self.assertRaises(exception.Error, f, [], "/a") + self.assertRaises(exception.Error, f, [], "/a/") + self.assertRaises(exception.Error, f, [], "//") + self.assertRaises(exception.Error, f, [], "//a") + self.assertRaises(exception.Error, f, [], "a//a") + self.assertRaises(exception.Error, f, [], "a//a/") + self.assertRaises(exception.Error, f, [], "a/a/") + + def test_real_failure1(self): + # Real world failure case... + # We weren't coping when the input was a Dictionary instead of a List + # This led to test_accepts_dictionaries + f = utils.get_from_path + + inst = {'fixed_ip': {'floating_ips': [{'address': '1.2.3.4'}], + 'address': '192.168.0.3'}, + 'hostname': ''} + + private_ips = f(inst, 'fixed_ip/address') + public_ips = f(inst, 'fixed_ip/floating_ips/address') + self.assertEquals(['192.168.0.3'], private_ips) + self.assertEquals(['1.2.3.4'], public_ips) + + def test_accepts_dictionaries(self): + f = utils.get_from_path + + input = {'a': [1, 2, 3]} + self.assertEquals([1, 2, 3], f(input, "a")) + self.assertEquals([], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + input = {'a': {'b': [1, 2, 3]}} + self.assertEquals([{'b': [1, 2, 3]}], f(input, "a")) + self.assertEquals([1, 2, 3], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + input = {'a': [{'b': [1, 2, 3]}, {'b': [4, 5, 6]}]} + self.assertEquals([1, 2, 3, 4, 5, 6], f(input, "a/b")) + self.assertEquals([], f(input, "a/b/c")) + + input = {'a': [1, 2, {'b': 'b_1'}]} + self.assertEquals([1, 2, {'b': 'b_1'}], f(input, "a")) + self.assertEquals(['b_1'], f(input, "a/b")) + + +class GenericUtilsTestCase(test.TestCase): + def test_parse_server_string(self): + result = utils.parse_server_string('::1') + self.assertEqual(('::1', ''), result) + result = utils.parse_server_string('[::1]:8773') + self.assertEqual(('::1', '8773'), result) + result = utils.parse_server_string('2001:db8::192.168.1.1') + self.assertEqual(('2001:db8::192.168.1.1', ''), result) + result = utils.parse_server_string('[2001:db8::192.168.1.1]:8773') + self.assertEqual(('2001:db8::192.168.1.1', '8773'), result) + result = utils.parse_server_string('192.168.1.1') + self.assertEqual(('192.168.1.1', ''), result) + result = utils.parse_server_string('192.168.1.2:8773') + self.assertEqual(('192.168.1.2', '8773'), result) + result = utils.parse_server_string('192.168.1.3') + self.assertEqual(('192.168.1.3', ''), result) + result = utils.parse_server_string('www.example.com:8443') + self.assertEqual(('www.example.com', '8443'), result) + result = utils.parse_server_string('www.example.com') + self.assertEqual(('www.example.com', ''), result) + # error case + result = utils.parse_server_string('www.exa:mple.com:8443') + self.assertEqual(('', ''), result) + + def test_hostname_unicode_sanitization(self): + hostname = u"\u7684.test.example.com" + self.assertEqual("test.example.com", + utils.sanitize_hostname(hostname)) + + def test_hostname_sanitize_periods(self): + hostname = "....test.example.com..." + self.assertEqual("test.example.com", + utils.sanitize_hostname(hostname)) + + def test_hostname_sanitize_dashes(self): + hostname = "----test.example.com---" + self.assertEqual("test.example.com", + utils.sanitize_hostname(hostname)) + + def test_hostname_sanitize_characters(self): + hostname = "(#@&$!(@*--#&91)(__=+--test-host.example!!.com-0+" + self.assertEqual("91----test-host.example.com-0", + utils.sanitize_hostname(hostname)) + + def test_hostname_translate(self): + hostname = "<}\x1fh\x10e\x08l\x02l\x05o\x12!{>" + self.assertEqual("hello", utils.sanitize_hostname(hostname)) + + def test_bool_from_str(self): + self.assertTrue(utils.bool_from_str('1')) + self.assertTrue(utils.bool_from_str('2')) + self.assertTrue(utils.bool_from_str('-1')) + self.assertTrue(utils.bool_from_str('true')) + self.assertTrue(utils.bool_from_str('True')) + self.assertTrue(utils.bool_from_str('tRuE')) + self.assertFalse(utils.bool_from_str('False')) + self.assertFalse(utils.bool_from_str('false')) + self.assertFalse(utils.bool_from_str('0')) + self.assertFalse(utils.bool_from_str(None)) + self.assertFalse(utils.bool_from_str('junk')) + + def test_generate_glance_url(self): + generated_url = utils.generate_glance_url() + actual_url = "http://%s:%d" % (FLAGS.glance_host, FLAGS.glance_port) + self.assertEqual(generated_url, actual_url) + + def test_read_cached_file(self): + self.mox.StubOutWithMock(os.path, "getmtime") + os.path.getmtime(mox.IgnoreArg()).AndReturn(1) + self.mox.ReplayAll() + + cache_data = {"data": 1123, "mtime": 1} + data = utils.read_cached_file("/this/is/a/fake", cache_data) + self.assertEqual(cache_data["data"], data) + + def test_read_modified_cached_file(self): + self.mox.StubOutWithMock(os.path, "getmtime") + self.mox.StubOutWithMock(__builtin__, 'open') + os.path.getmtime(mox.IgnoreArg()).AndReturn(2) + + fake_contents = "lorem ipsum" + fake_file = self.mox.CreateMockAnything() + fake_file.read().AndReturn(fake_contents) + fake_context_manager = self.mox.CreateMockAnything() + fake_context_manager.__enter__().AndReturn(fake_file) + fake_context_manager.__exit__(mox.IgnoreArg(), + mox.IgnoreArg(), + mox.IgnoreArg()) + + __builtin__.open(mox.IgnoreArg()).AndReturn(fake_context_manager) + + self.mox.ReplayAll() + cache_data = {"data": 1123, "mtime": 1} + self.reload_called = False + + def test_reload(reloaded_data): + self.assertEqual(reloaded_data, fake_contents) + self.reload_called = True + + data = utils.read_cached_file("/this/is/a/fake", cache_data, + reload_func=test_reload) + self.assertEqual(data, fake_contents) + self.assertTrue(self.reload_called) + + def test_generate_password(self): + password = utils.generate_password() + self.assertTrue([c for c in password if c in '0123456789']) + self.assertTrue([c for c in password + if c in 'abcdefghijklmnopqrstuvwxyz']) + self.assertTrue([c for c in password + if c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ']) + + def test_read_file_as_root(self): + def fake_execute(*args, **kwargs): + if args[1] == 'bad': + raise exception.ProcessExecutionError + return 'fakecontents', None + + self.stubs.Set(utils, 'execute', fake_execute) + contents = utils.read_file_as_root('good') + self.assertEqual(contents, 'fakecontents') + self.assertRaises(exception.FileNotFound, + utils.read_file_as_root, 'bad') + + def test_strcmp_const_time(self): + self.assertTrue(utils.strcmp_const_time('abc123', 'abc123')) + self.assertFalse(utils.strcmp_const_time('a', 'aaaaa')) + self.assertFalse(utils.strcmp_const_time('ABC123', 'abc123')) + + def test_temporary_chown(self): + def fake_execute(*args, **kwargs): + if args[0] == 'chown': + fake_execute.uid = args[1] + self.stubs.Set(utils, 'execute', fake_execute) + + with tempfile.NamedTemporaryFile() as f: + with utils.temporary_chown(f.name, owner_uid=2): + self.assertEqual(fake_execute.uid, 2) + self.assertEqual(fake_execute.uid, os.getuid()) + + +class IsUUIDLikeTestCase(test.TestCase): + def assertUUIDLike(self, val, expected): + result = utils.is_uuid_like(val) + self.assertEqual(result, expected) + + def test_good_uuid(self): + val = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' + self.assertUUIDLike(val, True) + + def test_integer_passed(self): + val = 1 + self.assertUUIDLike(val, False) + + def test_non_uuid_string_passed(self): + val = 'foo-fooo' + self.assertUUIDLike(val, False) + + def test_non_uuid_string_passed2(self): + val = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' + self.assertUUIDLike(val, False) + + def test_gen_valid_uuid(self): + self.assertUUIDLike(str(utils.gen_uuid()), True) + + +class ToPrimitiveTestCase(test.TestCase): + def test_list(self): + self.assertEquals(utils.to_primitive([1, 2, 3]), [1, 2, 3]) + + def test_empty_list(self): + self.assertEquals(utils.to_primitive([]), []) + + def test_tuple(self): + self.assertEquals(utils.to_primitive((1, 2, 3)), [1, 2, 3]) + + def test_dict(self): + self.assertEquals(utils.to_primitive(dict(a=1, b=2, c=3)), + dict(a=1, b=2, c=3)) + + def test_empty_dict(self): + self.assertEquals(utils.to_primitive({}), {}) + + def test_datetime(self): + x = datetime.datetime(1, 2, 3, 4, 5, 6, 7) + self.assertEquals(utils.to_primitive(x), "0001-02-03 04:05:06.000007") + + def test_iter(self): + class IterClass(object): + def __init__(self): + self.data = [1, 2, 3, 4, 5] + self.index = 0 + + def __iter__(self): + return self + + def next(self): + if self.index == len(self.data): + raise StopIteration + self.index = self.index + 1 + return self.data[self.index - 1] + + x = IterClass() + self.assertEquals(utils.to_primitive(x), [1, 2, 3, 4, 5]) + + def test_iteritems(self): + class IterItemsClass(object): + def __init__(self): + self.data = dict(a=1, b=2, c=3).items() + self.index = 0 + + def __iter__(self): + return self + + def next(self): + if self.index == len(self.data): + raise StopIteration + self.index = self.index + 1 + return self.data[self.index - 1] + + x = IterItemsClass() + ordered = utils.to_primitive(x) + ordered.sort() + self.assertEquals(ordered, [['a', 1], ['b', 2], ['c', 3]]) + + def test_instance(self): + class MysteryClass(object): + a = 10 + + def __init__(self): + self.b = 1 + + x = MysteryClass() + self.assertEquals(utils.to_primitive(x, convert_instances=True), + dict(b=1)) + + self.assertEquals(utils.to_primitive(x), x) + + def test_typeerror(self): + x = bytearray # Class, not instance + self.assertEquals(utils.to_primitive(x), u"<type 'bytearray'>") + + def test_nasties(self): + def foo(): + pass + x = [datetime, foo, dir] + ret = utils.to_primitive(x) + self.assertEquals(len(ret), 3) + self.assertTrue(ret[0].startswith(u"<module 'datetime' from ")) + self.assertTrue(ret[1].startswith('<function foo at 0x')) + self.assertEquals(ret[2], '<built-in function dir>') + + +class MonkeyPatchTestCase(test.TestCase): + """Unit test for utils.monkey_patch().""" + def setUp(self): + super(MonkeyPatchTestCase, self).setUp() + self.example_package = 'cinder.tests.monkey_patch_example.' + self.flags( + monkey_patch=True, + monkey_patch_modules=[self.example_package + 'example_a' + ':' + + self.example_package + 'example_decorator']) + + def test_monkey_patch(self): + utils.monkey_patch() + cinder.tests.monkey_patch_example.CALLED_FUNCTION = [] + from cinder.tests.monkey_patch_example import example_a + from cinder.tests.monkey_patch_example import example_b + + self.assertEqual('Example function', example_a.example_function_a()) + exampleA = example_a.ExampleClassA() + exampleA.example_method() + ret_a = exampleA.example_method_add(3, 5) + self.assertEqual(ret_a, 8) + + self.assertEqual('Example function', example_b.example_function_b()) + exampleB = example_b.ExampleClassB() + exampleB.example_method() + ret_b = exampleB.example_method_add(3, 5) + + self.assertEqual(ret_b, 8) + package_a = self.example_package + 'example_a.' + self.assertTrue(package_a + 'example_function_a' + in cinder.tests.monkey_patch_example.CALLED_FUNCTION) + + self.assertTrue(package_a + 'ExampleClassA.example_method' + in cinder.tests.monkey_patch_example.CALLED_FUNCTION) + self.assertTrue(package_a + 'ExampleClassA.example_method_add' + in cinder.tests.monkey_patch_example.CALLED_FUNCTION) + package_b = self.example_package + 'example_b.' + self.assertFalse(package_b + 'example_function_b' + in cinder.tests.monkey_patch_example.CALLED_FUNCTION) + self.assertFalse(package_b + 'ExampleClassB.example_method' + in cinder.tests.monkey_patch_example.CALLED_FUNCTION) + self.assertFalse(package_b + 'ExampleClassB.example_method_add' + in cinder.tests.monkey_patch_example.CALLED_FUNCTION) + + +class DeprecationTest(test.TestCase): + def setUp(self): + super(DeprecationTest, self).setUp() + + def fake_warn_deprecated_class(cls, msg): + self.warn = ('class', cls, msg) + + def fake_warn_deprecated_function(func, msg): + self.warn = ('function', func, msg) + + self.stubs.Set(utils, 'warn_deprecated_class', + fake_warn_deprecated_class) + self.stubs.Set(utils, 'warn_deprecated_function', + fake_warn_deprecated_function) + self.warn = None + + def test_deprecated_function_no_message(self): + def test_function(): + pass + + decorated = utils.deprecated()(test_function) + + decorated() + self.assertEqual(self.warn, ('function', test_function, '')) + + def test_deprecated_function_with_message(self): + def test_function(): + pass + + decorated = utils.deprecated('string')(test_function) + + decorated() + self.assertEqual(self.warn, ('function', test_function, 'string')) + + def test_deprecated_class_no_message(self): + @utils.deprecated() + class TestClass(object): + pass + + TestClass() + self.assertEqual(self.warn, ('class', TestClass, '')) + + def test_deprecated_class_with_message(self): + @utils.deprecated('string') + class TestClass(object): + pass + + TestClass() + self.assertEqual(self.warn, ('class', TestClass, 'string')) + + def test_deprecated_classmethod_no_message(self): + @utils.deprecated() + class TestClass(object): + @classmethod + def class_method(cls): + pass + + TestClass.class_method() + self.assertEqual(self.warn, ('class', TestClass, '')) + + def test_deprecated_classmethod_with_message(self): + @utils.deprecated('string') + class TestClass(object): + @classmethod + def class_method(cls): + pass + + TestClass.class_method() + self.assertEqual(self.warn, ('class', TestClass, 'string')) + + def test_deprecated_staticmethod_no_message(self): + @utils.deprecated() + class TestClass(object): + @staticmethod + def static_method(): + pass + + TestClass.static_method() + self.assertEqual(self.warn, ('class', TestClass, '')) + + def test_deprecated_staticmethod_with_message(self): + @utils.deprecated('string') + class TestClass(object): + @staticmethod + def static_method(): + pass + + TestClass.static_method() + self.assertEqual(self.warn, ('class', TestClass, 'string')) + + def test_deprecated_instancemethod(self): + @utils.deprecated() + class TestClass(object): + def instance_method(self): + pass + + # Instantiate the class... + obj = TestClass() + self.assertEqual(self.warn, ('class', TestClass, '')) + + # Reset warn... + self.warn = None + + # Call the instance method... + obj.instance_method() + + # Make sure that did *not* generate a warning + self.assertEqual(self.warn, None) + + def test_service_is_up(self): + fts_func = datetime.datetime.fromtimestamp + fake_now = 1000 + down_time = 5 + + self.flags(service_down_time=down_time) + self.mox.StubOutWithMock(utils, 'utcnow') + + # Up (equal) + utils.utcnow().AndReturn(fts_func(fake_now)) + service = {'updated_at': fts_func(fake_now - down_time), + 'created_at': fts_func(fake_now - down_time)} + self.mox.ReplayAll() + result = utils.service_is_up(service) + self.assertTrue(result) + + self.mox.ResetAll() + # Up + utils.utcnow().AndReturn(fts_func(fake_now)) + service = {'updated_at': fts_func(fake_now - down_time + 1), + 'created_at': fts_func(fake_now - down_time + 1)} + self.mox.ReplayAll() + result = utils.service_is_up(service) + self.assertTrue(result) + + self.mox.ResetAll() + # Down + utils.utcnow().AndReturn(fts_func(fake_now)) + service = {'updated_at': fts_func(fake_now - down_time - 1), + 'created_at': fts_func(fake_now - down_time - 1)} + self.mox.ReplayAll() + result = utils.service_is_up(service) + self.assertFalse(result) + + def test_xhtml_escape(self): + self.assertEqual('"foo"', utils.xhtml_escape('"foo"')) + self.assertEqual(''foo'', utils.xhtml_escape("'foo'")) + + def test_hash_file(self): + data = 'Mary had a little lamb, its fleece as white as snow' + flo = StringIO.StringIO(data) + h1 = utils.hash_file(flo) + h2 = hashlib.sha1(data).hexdigest() + self.assertEquals(h1, h2) + + +class Iso8601TimeTest(test.TestCase): + + def _instaneous(self, timestamp, yr, mon, day, hr, min, sec, micro): + self.assertEquals(timestamp.year, yr) + self.assertEquals(timestamp.month, mon) + self.assertEquals(timestamp.day, day) + self.assertEquals(timestamp.hour, hr) + self.assertEquals(timestamp.minute, min) + self.assertEquals(timestamp.second, sec) + self.assertEquals(timestamp.microsecond, micro) + + def _do_test(self, str, yr, mon, day, hr, min, sec, micro, shift): + DAY_SECONDS = 24 * 60 * 60 + timestamp = utils.parse_isotime(str) + self._instaneous(timestamp, yr, mon, day, hr, min, sec, micro) + offset = timestamp.tzinfo.utcoffset(None) + self.assertEqual(offset.seconds + offset.days * DAY_SECONDS, shift) + + def test_zulu(self): + str = '2012-02-14T20:53:07Z' + self._do_test(str, 2012, 02, 14, 20, 53, 7, 0, 0) + + def test_zulu_micros(self): + str = '2012-02-14T20:53:07.123Z' + self._do_test(str, 2012, 02, 14, 20, 53, 7, 123000, 0) + + def test_offset_east(self): + str = '2012-02-14T20:53:07+04:30' + offset = 4.5 * 60 * 60 + self._do_test(str, 2012, 02, 14, 20, 53, 7, 0, offset) + + def test_offset_east_micros(self): + str = '2012-02-14T20:53:07.42+04:30' + offset = 4.5 * 60 * 60 + self._do_test(str, 2012, 02, 14, 20, 53, 7, 420000, offset) + + def test_offset_west(self): + str = '2012-02-14T20:53:07-05:30' + offset = -5.5 * 60 * 60 + self._do_test(str, 2012, 02, 14, 20, 53, 7, 0, offset) + + def test_offset_west_micros(self): + str = '2012-02-14T20:53:07.654321-05:30' + offset = -5.5 * 60 * 60 + self._do_test(str, 2012, 02, 14, 20, 53, 7, 654321, offset) + + def test_compare(self): + zulu = utils.parse_isotime('2012-02-14T20:53:07') + east = utils.parse_isotime('2012-02-14T20:53:07-01:00') + west = utils.parse_isotime('2012-02-14T20:53:07+01:00') + self.assertTrue(east > west) + self.assertTrue(east > zulu) + self.assertTrue(zulu > west) + + def test_compare_micros(self): + zulu = utils.parse_isotime('2012-02-14T20:53:07.6544') + east = utils.parse_isotime('2012-02-14T19:53:07.654321-01:00') + west = utils.parse_isotime('2012-02-14T21:53:07.655+01:00') + self.assertTrue(east < west) + self.assertTrue(east < zulu) + self.assertTrue(zulu < west) + + def test_zulu_roundtrip(self): + str = '2012-02-14T20:53:07Z' + zulu = utils.parse_isotime(str) + self.assertEquals(zulu.tzinfo, iso8601.iso8601.UTC) + self.assertEquals(utils.isotime(zulu), str) + + def test_east_roundtrip(self): + str = '2012-02-14T20:53:07-07:00' + east = utils.parse_isotime(str) + self.assertEquals(east.tzinfo.tzname(None), '-07:00') + self.assertEquals(utils.isotime(east), str) + + def test_west_roundtrip(self): + str = '2012-02-14T20:53:07+11:30' + west = utils.parse_isotime(str) + self.assertEquals(west.tzinfo.tzname(None), '+11:30') + self.assertEquals(utils.isotime(west), str) + + def test_now_roundtrip(self): + str = utils.isotime() + now = utils.parse_isotime(str) + self.assertEquals(now.tzinfo, iso8601.iso8601.UTC) + self.assertEquals(utils.isotime(now), str) + + def test_zulu_normalize(self): + str = '2012-02-14T20:53:07Z' + zulu = utils.parse_isotime(str) + normed = utils.normalize_time(zulu) + self._instaneous(normed, 2012, 2, 14, 20, 53, 07, 0) + + def test_east_normalize(self): + str = '2012-02-14T20:53:07-07:00' + east = utils.parse_isotime(str) + normed = utils.normalize_time(east) + self._instaneous(normed, 2012, 2, 15, 03, 53, 07, 0) + + def test_west_normalize(self): + str = '2012-02-14T20:53:07+21:00' + west = utils.parse_isotime(str) + normed = utils.normalize_time(west) + self._instaneous(normed, 2012, 2, 13, 23, 53, 07, 0) + + +class TestGreenLocks(test.TestCase): + def test_concurrent_green_lock_succeeds(self): + """Verify spawn_n greenthreads with two locks run concurrently. + + This succeeds with spawn but fails with spawn_n because lockfile + gets the same thread id for both spawn_n threads. Our workaround + of using the GreenLockFile will work even if the issue is fixed. + """ + self.completed = False + with utils.tempdir() as tmpdir: + + def locka(wait): + a = utils.GreenLockFile(os.path.join(tmpdir, 'a')) + a.acquire() + wait.wait() + a.release() + self.completed = True + + def lockb(wait): + b = utils.GreenLockFile(os.path.join(tmpdir, 'b')) + b.acquire() + wait.wait() + b.release() + + wait1 = eventlet.event.Event() + wait2 = eventlet.event.Event() + pool = greenpool.GreenPool() + pool.spawn_n(locka, wait1) + pool.spawn_n(lockb, wait2) + wait2.send() + eventlet.sleep(0) + wait1.send() + pool.waitall() + self.assertTrue(self.completed) + + +class TestLockCleanup(test.TestCase): + """unit tests for utils.cleanup_file_locks()""" + + def setUp(self): + super(TestLockCleanup, self).setUp() + + self.pid = os.getpid() + self.dead_pid = self._get_dead_pid() + self.tempdir = tempfile.mkdtemp() + self.flags(lock_path=self.tempdir) + self.lock_name = 'cinder-testlock' + self.lock_file = os.path.join(FLAGS.lock_path, + self.lock_name + '.lock') + self.hostname = socket.gethostname() + print self.pid, self.dead_pid + try: + os.unlink(self.lock_file) + except OSError as (errno, strerror): + if errno == 2: + pass + + def tearDown(self): + shutil.rmtree(self.tempdir) + super(TestLockCleanup, self).tearDown() + + def _get_dead_pid(self): + """get a pid for a process that does not exist""" + + candidate_pid = self.pid - 1 + while os.path.exists(os.path.join('/proc', str(candidate_pid))): + candidate_pid -= 1 + if candidate_pid == 1: + return 0 + return candidate_pid + + def _get_sentinel_name(self, hostname, pid, thread='MainThread'): + return os.path.join(FLAGS.lock_path, + '%s.%s-%d' % (hostname, thread, pid)) + + def _create_sentinel(self, hostname, pid, thread='MainThread'): + name = self._get_sentinel_name(hostname, pid, thread) + open(name, 'wb').close() + return name + + def test_clean_stale_locks(self): + """verify locks for dead processes are cleaned up""" + + # create sentinels for two processes, us and a 'dead' one + # no active lock + sentinel1 = self._create_sentinel(self.hostname, self.pid) + sentinel2 = self._create_sentinel(self.hostname, self.dead_pid) + + utils.cleanup_file_locks() + + self.assertTrue(os.path.exists(sentinel1)) + self.assertFalse(os.path.exists(self.lock_file)) + self.assertFalse(os.path.exists(sentinel2)) + + os.unlink(sentinel1) + + def test_clean_stale_locks_active(self): + """verify locks for dead processes are cleaned with an active lock """ + + # create sentinels for two processes, us and a 'dead' one + # create an active lock for us + sentinel1 = self._create_sentinel(self.hostname, self.pid) + sentinel2 = self._create_sentinel(self.hostname, self.dead_pid) + os.link(sentinel1, self.lock_file) + + utils.cleanup_file_locks() + + self.assertTrue(os.path.exists(sentinel1)) + self.assertTrue(os.path.exists(self.lock_file)) + self.assertFalse(os.path.exists(sentinel2)) + + os.unlink(sentinel1) + os.unlink(self.lock_file) + + def test_clean_stale_with_threads(self): + """verify locks for multiple threads are cleaned up """ + + # create sentinels for four threads in our process, and a 'dead' + # process. no lock. + sentinel1 = self._create_sentinel(self.hostname, self.pid, 'Default-1') + sentinel2 = self._create_sentinel(self.hostname, self.pid, 'Default-2') + sentinel3 = self._create_sentinel(self.hostname, self.pid, 'Default-3') + sentinel4 = self._create_sentinel(self.hostname, self.pid, 'Default-4') + sentinel5 = self._create_sentinel(self.hostname, self.dead_pid, + 'Default-1') + + utils.cleanup_file_locks() + + self.assertTrue(os.path.exists(sentinel1)) + self.assertTrue(os.path.exists(sentinel2)) + self.assertTrue(os.path.exists(sentinel3)) + self.assertTrue(os.path.exists(sentinel4)) + self.assertFalse(os.path.exists(self.lock_file)) + self.assertFalse(os.path.exists(sentinel5)) + + os.unlink(sentinel1) + os.unlink(sentinel2) + os.unlink(sentinel3) + os.unlink(sentinel4) + + def test_clean_stale_with_threads_active(self): + """verify locks for multiple threads are cleaned up """ + + # create sentinels for four threads in our process, and a 'dead' + # process + sentinel1 = self._create_sentinel(self.hostname, self.pid, 'Default-1') + sentinel2 = self._create_sentinel(self.hostname, self.pid, 'Default-2') + sentinel3 = self._create_sentinel(self.hostname, self.pid, 'Default-3') + sentinel4 = self._create_sentinel(self.hostname, self.pid, 'Default-4') + sentinel5 = self._create_sentinel(self.hostname, self.dead_pid, + 'Default-1') + + os.link(sentinel1, self.lock_file) + + utils.cleanup_file_locks() + + self.assertTrue(os.path.exists(sentinel1)) + self.assertTrue(os.path.exists(sentinel2)) + self.assertTrue(os.path.exists(sentinel3)) + self.assertTrue(os.path.exists(sentinel4)) + self.assertTrue(os.path.exists(self.lock_file)) + self.assertFalse(os.path.exists(sentinel5)) + + os.unlink(sentinel1) + os.unlink(sentinel2) + os.unlink(sentinel3) + os.unlink(sentinel4) + os.unlink(self.lock_file) + + def test_clean_bogus_lockfiles(self): + """verify lockfiles are cleaned """ + + lock1 = os.path.join(FLAGS.lock_path, 'cinder-testlock1.lock') + lock2 = os.path.join(FLAGS.lock_path, 'cinder-testlock2.lock') + lock3 = os.path.join(FLAGS.lock_path, 'testlock3.lock') + + open(lock1, 'wb').close() + open(lock2, 'wb').close() + open(lock3, 'wb').close() + + utils.cleanup_file_locks() + + self.assertFalse(os.path.exists(lock1)) + self.assertFalse(os.path.exists(lock2)) + self.assertTrue(os.path.exists(lock3)) + + os.unlink(lock3) + + +class AuditPeriodTest(test.TestCase): + + def setUp(self): + super(AuditPeriodTest, self).setUp() + #a fairly random time to test with + self.test_time = datetime.datetime(second=23, + minute=12, + hour=8, + day=5, + month=3, + year=2012) + utils.set_time_override(override_time=self.test_time) + + def tearDown(self): + utils.clear_time_override() + super(AuditPeriodTest, self).tearDown() + + def test_hour(self): + begin, end = utils.last_completed_audit_period(unit='hour') + self.assertEquals(begin, datetime.datetime( + hour=7, + day=5, + month=3, + year=2012)) + self.assertEquals(end, datetime.datetime( + hour=8, + day=5, + month=3, + year=2012)) + + def test_hour_with_offset_before_current(self): + begin, end = utils.last_completed_audit_period(unit='hour@10') + self.assertEquals(begin, datetime.datetime( + minute=10, + hour=7, + day=5, + month=3, + year=2012)) + self.assertEquals(end, datetime.datetime( + minute=10, + hour=8, + day=5, + month=3, + year=2012)) + + def test_hour_with_offset_after_current(self): + begin, end = utils.last_completed_audit_period(unit='hour@30') + self.assertEquals(begin, datetime.datetime( + minute=30, + hour=6, + day=5, + month=3, + year=2012)) + self.assertEquals(end, datetime.datetime( + minute=30, + hour=7, + day=5, + month=3, + year=2012)) + + def test_day(self): + begin, end = utils.last_completed_audit_period(unit='day') + self.assertEquals(begin, datetime.datetime( + day=4, + month=3, + year=2012)) + self.assertEquals(end, datetime.datetime( + day=5, + month=3, + year=2012)) + + def test_day_with_offset_before_current(self): + begin, end = utils.last_completed_audit_period(unit='day@6') + self.assertEquals(begin, datetime.datetime( + hour=6, + day=4, + month=3, + year=2012)) + self.assertEquals(end, datetime.datetime( + hour=6, + day=5, + month=3, + year=2012)) + + def test_day_with_offset_after_current(self): + begin, end = utils.last_completed_audit_period(unit='day@10') + self.assertEquals(begin, datetime.datetime( + hour=10, + day=3, + month=3, + year=2012)) + self.assertEquals(end, datetime.datetime( + hour=10, + day=4, + month=3, + year=2012)) + + def test_month(self): + begin, end = utils.last_completed_audit_period(unit='month') + self.assertEquals(begin, datetime.datetime( + day=1, + month=2, + year=2012)) + self.assertEquals(end, datetime.datetime( + day=1, + month=3, + year=2012)) + + def test_month_with_offset_before_current(self): + begin, end = utils.last_completed_audit_period(unit='month@2') + self.assertEquals(begin, datetime.datetime( + day=2, + month=2, + year=2012)) + self.assertEquals(end, datetime.datetime( + day=2, + month=3, + year=2012)) + + def test_month_with_offset_after_current(self): + begin, end = utils.last_completed_audit_period(unit='month@15') + self.assertEquals(begin, datetime.datetime( + day=15, + month=1, + year=2012)) + self.assertEquals(end, datetime.datetime( + day=15, + month=2, + year=2012)) + + def test_year(self): + begin, end = utils.last_completed_audit_period(unit='year') + self.assertEquals(begin, datetime.datetime( + day=1, + month=1, + year=2011)) + self.assertEquals(end, datetime.datetime( + day=1, + month=1, + year=2012)) + + def test_year_with_offset_before_current(self): + begin, end = utils.last_completed_audit_period(unit='year@2') + self.assertEquals(begin, datetime.datetime( + day=1, + month=2, + year=2011)) + self.assertEquals(end, datetime.datetime( + day=1, + month=2, + year=2012)) + + def test_year_with_offset_after_current(self): + begin, end = utils.last_completed_audit_period(unit='year@6') + self.assertEquals(begin, datetime.datetime( + day=1, + month=6, + year=2010)) + self.assertEquals(end, datetime.datetime( + day=1, + month=6, + year=2011)) diff --git a/cinder/tests/test_versions.py b/cinder/tests/test_versions.py new file mode 100644 index 000000000..c7a88c5a3 --- /dev/null +++ b/cinder/tests/test_versions.py @@ -0,0 +1,59 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 Ken Pepple +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 cinder import test +from cinder import version + + +class VersionTestCase(test.TestCase): + """Test cases for Versions code""" + def setUp(self): + """setup test with unchanging values""" + super(VersionTestCase, self).setUp() + self.version = version + self.version.FINAL = False + self.version.CINDER_VERSION = ['2012', '10'] + self.version.YEAR, self.version.COUNT = self.version.CINDER_VERSION + self.version.version_info = {'branch_nick': u'LOCALBRANCH', + 'revision_id': 'LOCALREVISION', + 'revno': 0} + + def test_version_string_is_good(self): + """Ensure version string works""" + self.assertEqual("2012.10-dev", self.version.version_string()) + + def test_canonical_version_string_is_good(self): + """Ensure canonical version works""" + self.assertEqual("2012.10", self.version.canonical_version_string()) + + def test_final_version_strings_are_identical(self): + """Ensure final version strings match only at release""" + self.assertNotEqual(self.version.canonical_version_string(), + self.version.version_string()) + self.version.FINAL = True + self.assertEqual(self.version.canonical_version_string(), + self.version.version_string()) + + def test_vcs_version_string_is_good(self): + """Ensure uninstalled code generates local """ + self.assertEqual("LOCALBRANCH:LOCALREVISION", + self.version.vcs_version_string()) + + def test_version_string_with_vcs_is_good(self): + """Ensure uninstalled code get version string""" + self.assertEqual("2012.10-LOCALBRANCH:LOCALREVISION", + self.version.version_string_with_vcs()) diff --git a/cinder/tests/test_volume.py b/cinder/tests/test_volume.py new file mode 100644 index 000000000..aebc25942 --- /dev/null +++ b/cinder/tests/test_volume.py @@ -0,0 +1,501 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. +""" +Tests for Volume Code. + +""" + +import cStringIO + +import mox + +from cinder import context +from cinder import exception +from cinder import db +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import importutils +import cinder.policy +from cinder import rpc +from cinder import test +import cinder.volume.api + +FLAGS = flags.FLAGS +LOG = logging.getLogger(__name__) + + +class VolumeTestCase(test.TestCase): + """Test Case for volumes.""" + + def setUp(self): + super(VolumeTestCase, self).setUp() + self.flags(connection_type='fake') + self.volume = importutils.import_object(FLAGS.volume_manager) + self.context = context.get_admin_context() + + def tearDown(self): + super(VolumeTestCase, self).tearDown() + + @staticmethod + def _create_volume(size='0', snapshot_id=None): + """Create a volume object.""" + vol = {} + vol['size'] = size + vol['snapshot_id'] = snapshot_id + vol['user_id'] = 'fake' + vol['project_id'] = 'fake' + vol['availability_zone'] = FLAGS.storage_availability_zone + vol['status'] = "creating" + vol['attach_status'] = "detached" + return db.volume_create(context.get_admin_context(), vol) + + def test_create_delete_volume(self): + """Test volume can be created and deleted.""" + volume = self._create_volume() + volume_id = volume['id'] + self.volume.create_volume(self.context, volume_id) + self.assertEqual(volume_id, db.volume_get(context.get_admin_context(), + volume_id).id) + + self.volume.delete_volume(self.context, volume_id) + self.assertRaises(exception.NotFound, + db.volume_get, + self.context, + volume_id) + + def test_delete_busy_volume(self): + """Test volume survives deletion if driver reports it as busy.""" + volume = self._create_volume() + volume_id = volume['id'] + self.volume.create_volume(self.context, volume_id) + + self.mox.StubOutWithMock(self.volume.driver, 'delete_volume') + self.volume.driver.delete_volume(mox.IgnoreArg()) \ + .AndRaise(exception.VolumeIsBusy) + self.mox.ReplayAll() + res = self.volume.delete_volume(self.context, volume_id) + self.assertEqual(True, res) + volume_ref = db.volume_get(context.get_admin_context(), volume_id) + self.assertEqual(volume_id, volume_ref.id) + self.assertEqual("available", volume_ref.status) + + self.mox.UnsetStubs() + self.volume.delete_volume(self.context, volume_id) + + def test_create_volume_from_snapshot(self): + """Test volume can be created from a snapshot.""" + volume_src = self._create_volume() + self.volume.create_volume(self.context, volume_src['id']) + snapshot_id = self._create_snapshot(volume_src['id']) + self.volume.create_snapshot(self.context, volume_src['id'], + snapshot_id) + volume_dst = self._create_volume(0, snapshot_id) + self.volume.create_volume(self.context, volume_dst['id'], snapshot_id) + self.assertEqual(volume_dst['id'], + db.volume_get( + context.get_admin_context(), + volume_dst['id']).id) + self.assertEqual(snapshot_id, db.volume_get( + context.get_admin_context(), + volume_dst['id']).snapshot_id) + + self.volume.delete_volume(self.context, volume_dst['id']) + self.volume.delete_snapshot(self.context, snapshot_id) + self.volume.delete_volume(self.context, volume_src['id']) + + def test_too_big_volume(self): + """Ensure failure if a too large of a volume is requested.""" + # FIXME(vish): validation needs to move into the data layer in + # volume_create + return True + try: + volume = self._create_volume('1001') + self.volume.create_volume(self.context, volume) + self.fail("Should have thrown TypeError") + except TypeError: + pass + + def test_too_many_volumes(self): + """Ensure that NoMoreTargets is raised when we run out of volumes.""" + vols = [] + total_slots = FLAGS.iscsi_num_targets + for _index in xrange(total_slots): + volume = self._create_volume() + self.volume.create_volume(self.context, volume['id']) + vols.append(volume['id']) + volume = self._create_volume() + self.assertRaises(db.NoMoreTargets, + self.volume.create_volume, + self.context, + volume['id']) + db.volume_destroy(context.get_admin_context(), volume['id']) + for volume_id in vols: + self.volume.delete_volume(self.context, volume_id) + + def test_run_attach_detach_volume(self): + """Make sure volume can be attached and detached from instance.""" + instance_id = 'fake-inst' + mountpoint = "/dev/sdf" + volume = self._create_volume() + volume_id = volume['id'] + self.volume.create_volume(self.context, volume_id) + if FLAGS.fake_tests: + db.volume_attached(self.context, volume_id, instance_id, + mountpoint) + else: + self.compute.attach_volume(self.context, + instance_id, + volume_id, + mountpoint) + vol = db.volume_get(context.get_admin_context(), volume_id) + self.assertEqual(vol['status'], "in-use") + self.assertEqual(vol['attach_status'], "attached") + self.assertEqual(vol['mountpoint'], mountpoint) + self.assertEqual(vol['instance_id'], instance_id) + + self.assertRaises(exception.Error, + self.volume.delete_volume, + self.context, + volume_id) + if FLAGS.fake_tests: + db.volume_detached(self.context, volume_id) + else: + pass + self.compute.detach_volume(self.context, + instance_id, + volume_id) + vol = db.volume_get(self.context, volume_id) + self.assertEqual(vol['status'], "available") + + self.volume.delete_volume(self.context, volume_id) + self.assertRaises(exception.VolumeNotFound, + db.volume_get, + self.context, + volume_id) + + def test_concurrent_volumes_get_different_targets(self): + """Ensure multiple concurrent volumes get different targets.""" + volume_ids = [] + targets = [] + + def _check(volume_id): + """Make sure targets aren't duplicated.""" + volume_ids.append(volume_id) + admin_context = context.get_admin_context() + iscsi_target = db.volume_get_iscsi_target_num(admin_context, + volume_id) + self.assert_(iscsi_target not in targets) + targets.append(iscsi_target) + LOG.debug(_("Target %s allocated"), iscsi_target) + total_slots = FLAGS.iscsi_num_targets + for _index in xrange(total_slots): + volume = self._create_volume() + d = self.volume.create_volume(self.context, volume['id']) + _check(d) + for volume_id in volume_ids: + self.volume.delete_volume(self.context, volume_id) + + def test_multi_node(self): + # TODO(termie): Figure out how to test with two nodes, + # each of them having a different FLAG for storage_node + # This will allow us to test cross-node interactions + pass + + @staticmethod + def _create_snapshot(volume_id, size='0'): + """Create a snapshot object.""" + snap = {} + snap['volume_size'] = size + snap['user_id'] = 'fake' + snap['project_id'] = 'fake' + snap['volume_id'] = volume_id + snap['status'] = "creating" + return db.snapshot_create(context.get_admin_context(), snap)['id'] + + def test_create_delete_snapshot(self): + """Test snapshot can be created and deleted.""" + volume = self._create_volume() + self.volume.create_volume(self.context, volume['id']) + snapshot_id = self._create_snapshot(volume['id']) + self.volume.create_snapshot(self.context, volume['id'], snapshot_id) + self.assertEqual(snapshot_id, + db.snapshot_get(context.get_admin_context(), + snapshot_id).id) + + self.volume.delete_snapshot(self.context, snapshot_id) + self.assertRaises(exception.NotFound, + db.snapshot_get, + self.context, + snapshot_id) + self.volume.delete_volume(self.context, volume['id']) + + def test_cant_delete_volume_with_snapshots(self): + """Test snapshot can be created and deleted.""" + volume = self._create_volume() + self.volume.create_volume(self.context, volume['id']) + snapshot_id = self._create_snapshot(volume['id']) + self.volume.create_snapshot(self.context, volume['id'], snapshot_id) + self.assertEqual(snapshot_id, + db.snapshot_get(context.get_admin_context(), + snapshot_id).id) + + volume['status'] = 'available' + volume['host'] = 'fakehost' + + volume_api = cinder.volume.api.API() + + self.assertRaises(exception.InvalidVolume, + volume_api.delete, + self.context, + volume) + self.volume.delete_snapshot(self.context, snapshot_id) + self.volume.delete_volume(self.context, volume['id']) + + def test_can_delete_errored_snapshot(self): + """Test snapshot can be created and deleted.""" + volume = self._create_volume() + self.volume.create_volume(self.context, volume['id']) + snapshot_id = self._create_snapshot(volume['id']) + self.volume.create_snapshot(self.context, volume['id'], snapshot_id) + snapshot = db.snapshot_get(context.get_admin_context(), + snapshot_id) + + volume_api = cinder.volume.api.API() + + snapshot['status'] = 'badstatus' + self.assertRaises(exception.InvalidVolume, + volume_api.delete_snapshot, + self.context, + snapshot) + + snapshot['status'] = 'error' + self.volume.delete_snapshot(self.context, snapshot_id) + self.volume.delete_volume(self.context, volume['id']) + + def test_create_snapshot_force(self): + """Test snapshot in use can be created forcibly.""" + + def fake_cast(ctxt, topic, msg): + pass + self.stubs.Set(rpc, 'cast', fake_cast) + instance_id = 'fake-inst' + + volume = self._create_volume() + self.volume.create_volume(self.context, volume['id']) + db.volume_attached(self.context, volume['id'], instance_id, + '/dev/sda1') + + volume_api = cinder.volume.api.API() + volume = volume_api.get(self.context, volume['id']) + self.assertRaises(exception.InvalidVolume, + volume_api.create_snapshot, + self.context, volume, + 'fake_name', 'fake_description') + snapshot_ref = volume_api.create_snapshot_force(self.context, + volume, + 'fake_name', + 'fake_description') + db.snapshot_destroy(self.context, snapshot_ref['id']) + db.volume_destroy(self.context, volume['id']) + + def test_delete_busy_snapshot(self): + """Test snapshot can be created and deleted.""" + volume = self._create_volume() + volume_id = volume['id'] + self.volume.create_volume(self.context, volume_id) + snapshot_id = self._create_snapshot(volume_id) + self.volume.create_snapshot(self.context, volume_id, snapshot_id) + + self.mox.StubOutWithMock(self.volume.driver, 'delete_snapshot') + self.volume.driver.delete_snapshot(mox.IgnoreArg()) \ + .AndRaise(exception.SnapshotIsBusy) + self.mox.ReplayAll() + self.volume.delete_snapshot(self.context, snapshot_id) + snapshot_ref = db.snapshot_get(self.context, snapshot_id) + self.assertEqual(snapshot_id, snapshot_ref.id) + self.assertEqual("available", snapshot_ref.status) + + self.mox.UnsetStubs() + self.volume.delete_snapshot(self.context, snapshot_id) + self.volume.delete_volume(self.context, volume_id) + + +class DriverTestCase(test.TestCase): + """Base Test class for Drivers.""" + driver_name = "cinder.volume.driver.FakeBaseDriver" + + def setUp(self): + super(DriverTestCase, self).setUp() + self.flags(volume_driver=self.driver_name, + logging_default_format_string="%(message)s") + self.volume = importutils.import_object(FLAGS.volume_manager) + self.context = context.get_admin_context() + self.output = "" + + def _fake_execute(_command, *_args, **_kwargs): + """Fake _execute.""" + return self.output, None + self.volume.driver.set_execute(_fake_execute) + + log = logging.getLogger() + self.stream = cStringIO.StringIO() + log.logger.addHandler(logging.logging.StreamHandler(self.stream)) + + def _attach_volume(self): + """Attach volumes to an instance. This function also sets + a fake log message.""" + return [] + + def _detach_volume(self, volume_id_list): + """Detach volumes from an instance.""" + for volume_id in volume_id_list: + db.volume_detached(self.context, volume_id) + self.volume.delete_volume(self.context, volume_id) + + +class VolumeDriverTestCase(DriverTestCase): + """Test case for VolumeDriver""" + driver_name = "cinder.volume.driver.VolumeDriver" + + def test_delete_busy_volume(self): + """Test deleting a busy volume.""" + self.stubs.Set(self.volume.driver, '_volume_not_present', + lambda x: False) + self.stubs.Set(self.volume.driver, '_delete_volume', + lambda x, y: False) + # Want DriverTestCase._fake_execute to return 'o' so that + # volume.driver.delete_volume() raises the VolumeIsBusy exception. + self.output = 'o' + self.assertRaises(exception.VolumeIsBusy, + self.volume.driver.delete_volume, + {'name': 'test1', 'size': 1024}) + # when DriverTestCase._fake_execute returns something other than + # 'o' volume.driver.delete_volume() does not raise an exception. + self.output = 'x' + self.volume.driver.delete_volume({'name': 'test1', 'size': 1024}) + + +class ISCSITestCase(DriverTestCase): + """Test Case for ISCSIDriver""" + driver_name = "cinder.volume.driver.ISCSIDriver" + + def _attach_volume(self): + """Attach volumes to an instance. This function also sets + a fake log message.""" + volume_id_list = [] + for index in xrange(3): + vol = {} + vol['size'] = 0 + vol_ref = db.volume_create(self.context, vol) + self.volume.create_volume(self.context, vol_ref['id']) + vol_ref = db.volume_get(self.context, vol_ref['id']) + + # each volume has a different mountpoint + mountpoint = "/dev/sd" + chr((ord('b') + index)) + instance_id = 'fake-inst' + db.volume_attached(self.context, vol_ref['id'], instance_id, + mountpoint) + volume_id_list.append(vol_ref['id']) + + return volume_id_list + + def test_check_for_export_with_no_volume(self): + """No log message when no volume is attached to an instance.""" + self.stream.truncate(0) + instance_id = 'fake-inst' + self.volume.check_for_export(self.context, instance_id) + self.assertEqual(self.stream.getvalue(), '') + + def test_check_for_export_with_all_volume_exported(self): + """No log message when all the processes are running.""" + volume_id_list = self._attach_volume() + + self.mox.StubOutWithMock(self.volume.driver.tgtadm, 'show_target') + for i in volume_id_list: + tid = db.volume_get_iscsi_target_num(self.context, i) + self.volume.driver.tgtadm.show_target(tid) + + self.stream.truncate(0) + self.mox.ReplayAll() + instance_id = 'fake-inst' + self.volume.check_for_export(self.context, instance_id) + self.assertEqual(self.stream.getvalue(), '') + self.mox.UnsetStubs() + + self._detach_volume(volume_id_list) + + def test_check_for_export_with_some_volume_missing(self): + """Output a warning message when some volumes are not recognied + by ietd.""" + volume_id_list = self._attach_volume() + instance_id = 'fake-inst' + + tid = db.volume_get_iscsi_target_num(self.context, volume_id_list[0]) + self.mox.StubOutWithMock(self.volume.driver.tgtadm, 'show_target') + self.volume.driver.tgtadm.show_target(tid).AndRaise( + exception.ProcessExecutionError()) + + self.mox.ReplayAll() + self.assertRaises(exception.ProcessExecutionError, + self.volume.check_for_export, + self.context, + instance_id) + msg = _("Cannot confirm exported volume id:%s.") % volume_id_list[0] + self.assertTrue(0 <= self.stream.getvalue().find(msg)) + self.mox.UnsetStubs() + + self._detach_volume(volume_id_list) + + +class VolumePolicyTestCase(test.TestCase): + + def setUp(self): + super(VolumePolicyTestCase, self).setUp() + + cinder.policy.reset() + cinder.policy.init() + + self.context = context.get_admin_context() + + def tearDown(self): + super(VolumePolicyTestCase, self).tearDown() + cinder.policy.reset() + + def _set_rules(self, rules): + cinder.common.policy.set_brain(cinder.common.policy.HttpBrain(rules)) + + def test_check_policy(self): + self.mox.StubOutWithMock(cinder.policy, 'enforce') + target = { + 'project_id': self.context.project_id, + 'user_id': self.context.user_id, + } + cinder.policy.enforce(self.context, 'volume:attach', target) + self.mox.ReplayAll() + cinder.volume.api.check_policy(self.context, 'attach') + + def test_check_policy_with_target(self): + self.mox.StubOutWithMock(cinder.policy, 'enforce') + target = { + 'project_id': self.context.project_id, + 'user_id': self.context.user_id, + 'id': 2, + } + cinder.policy.enforce(self.context, 'volume:attach', target) + self.mox.ReplayAll() + cinder.volume.api.check_policy(self.context, 'attach', {'id': 2}) diff --git a/cinder/tests/test_volume_types.py b/cinder/tests/test_volume_types.py new file mode 100644 index 000000000..494bd0c99 --- /dev/null +++ b/cinder/tests/test_volume_types.py @@ -0,0 +1,167 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 Zadara Storage Inc. +# Copyright (c) 2011 OpenStack LLC. +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 volume types code +""" +import time + +from cinder import context +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder import test +from cinder.volume import volume_types +from cinder.db.sqlalchemy import session as sql_session +from cinder.db.sqlalchemy import models + +FLAGS = flags.FLAGS +LOG = logging.getLogger(__name__) + + +class VolumeTypeTestCase(test.TestCase): + """Test cases for volume type code""" + def setUp(self): + super(VolumeTypeTestCase, self).setUp() + + self.ctxt = context.get_admin_context() + self.vol_type1_name = str(int(time.time())) + self.vol_type1_specs = dict( + type="physical drive", + drive_type="SAS", + size="300", + rpm="7200", + visible="True") + + def test_volume_type_create_then_destroy(self): + """Ensure volume types can be created and deleted""" + prev_all_vtypes = volume_types.get_all_types(self.ctxt) + + volume_types.create(self.ctxt, + self.vol_type1_name, + self.vol_type1_specs) + new = volume_types.get_volume_type_by_name(self.ctxt, + self.vol_type1_name) + + LOG.info(_("Given data: %s"), self.vol_type1_specs) + LOG.info(_("Result data: %s"), new) + + for k, v in self.vol_type1_specs.iteritems(): + self.assertEqual(v, new['extra_specs'][k], + 'one of fields doesnt match') + + new_all_vtypes = volume_types.get_all_types(self.ctxt) + self.assertEqual(len(prev_all_vtypes) + 1, + len(new_all_vtypes), + 'drive type was not created') + + volume_types.destroy(self.ctxt, self.vol_type1_name) + new_all_vtypes = volume_types.get_all_types(self.ctxt) + self.assertEqual(prev_all_vtypes, + new_all_vtypes, + 'drive type was not deleted') + + def test_get_all_volume_types(self): + """Ensures that all volume types can be retrieved""" + session = sql_session.get_session() + total_volume_types = session.query(models.VolumeTypes).count() + vol_types = volume_types.get_all_types(self.ctxt) + self.assertEqual(total_volume_types, len(vol_types)) + + def test_non_existant_vol_type_shouldnt_delete(self): + """Ensures that volume type creation fails with invalid args""" + self.assertRaises(exception.VolumeTypeNotFoundByName, + volume_types.destroy, self.ctxt, "sfsfsdfdfs") + + def test_repeated_vol_types_shouldnt_raise(self): + """Ensures that volume duplicates don't raise""" + new_name = self.vol_type1_name + "dup" + volume_types.create(self.ctxt, new_name) + volume_types.destroy(self.ctxt, new_name) + volume_types.create(self.ctxt, new_name) + + def test_invalid_volume_types_params(self): + """Ensures that volume type creation fails with invalid args""" + self.assertRaises(exception.InvalidVolumeType, + volume_types.destroy, self.ctxt, None) + self.assertRaises(exception.InvalidVolumeType, + volume_types.get_volume_type, self.ctxt, None) + self.assertRaises(exception.InvalidVolumeType, + volume_types.get_volume_type_by_name, + self.ctxt, None) + + def test_volume_type_get_by_id_and_name(self): + """Ensure volume types get returns same entry""" + volume_types.create(self.ctxt, + self.vol_type1_name, + self.vol_type1_specs) + new = volume_types.get_volume_type_by_name(self.ctxt, + self.vol_type1_name) + + new2 = volume_types.get_volume_type(self.ctxt, new['id']) + self.assertEqual(new, new2) + + def test_volume_type_search_by_extra_spec(self): + """Ensure volume types get by extra spec returns correct type""" + volume_types.create(self.ctxt, "type1", {"key1": "val1", + "key2": "val2"}) + volume_types.create(self.ctxt, "type2", {"key2": "val2", + "key3": "val3"}) + volume_types.create(self.ctxt, "type3", {"key3": "another_value", + "key4": "val4"}) + + vol_types = volume_types.get_all_types(self.ctxt, + search_opts={'extra_specs': {"key1": "val1"}}) + LOG.info("vol_types: %s" % vol_types) + self.assertEqual(len(vol_types), 1) + self.assertTrue("type1" in vol_types.keys()) + self.assertEqual(vol_types['type1']['extra_specs'], + {"key1": "val1", "key2": "val2"}) + + vol_types = volume_types.get_all_types(self.ctxt, + search_opts={'extra_specs': {"key2": "val2"}}) + LOG.info("vol_types: %s" % vol_types) + self.assertEqual(len(vol_types), 2) + self.assertTrue("type1" in vol_types.keys()) + self.assertTrue("type2" in vol_types.keys()) + + vol_types = volume_types.get_all_types(self.ctxt, + search_opts={'extra_specs': {"key3": "val3"}}) + LOG.info("vol_types: %s" % vol_types) + self.assertEqual(len(vol_types), 1) + self.assertTrue("type2" in vol_types.keys()) + + def test_volume_type_search_by_extra_spec_multiple(self): + """Ensure volume types get by extra spec returns correct type""" + volume_types.create(self.ctxt, "type1", {"key1": "val1", + "key2": "val2", + "key3": "val3"}) + volume_types.create(self.ctxt, "type2", {"key2": "val2", + "key3": "val3"}) + volume_types.create(self.ctxt, "type3", {"key1": "val1", + "key3": "val3", + "key4": "val4"}) + + vol_types = volume_types.get_all_types(self.ctxt, + search_opts={'extra_specs': {"key1": "val1", + "key3": "val3"}}) + LOG.info("vol_types: %s" % vol_types) + self.assertEqual(len(vol_types), 2) + self.assertTrue("type1" in vol_types.keys()) + self.assertTrue("type3" in vol_types.keys()) + self.assertEqual(vol_types['type1']['extra_specs'], + {"key1": "val1", "key2": "val2", "key3": "val3"}) + self.assertEqual(vol_types['type3']['extra_specs'], + {"key1": "val1", "key3": "val3", "key4": "val4"}) diff --git a/cinder/tests/test_volume_types_extra_specs.py b/cinder/tests/test_volume_types_extra_specs.py new file mode 100644 index 000000000..e7241086f --- /dev/null +++ b/cinder/tests/test_volume_types_extra_specs.py @@ -0,0 +1,130 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 Zadara Storage Inc. +# Copyright (c) 2011 OpenStack LLC. +# Copyright 2011 University of Southern California +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# 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 volume types extra specs code +""" + +from cinder import context +from cinder import db +from cinder import test + + +class VolumeTypeExtraSpecsTestCase(test.TestCase): + + def setUp(self): + super(VolumeTypeExtraSpecsTestCase, self).setUp() + self.context = context.get_admin_context() + self.vol_type1 = dict(name="TEST: Regular volume test") + self.vol_type1_specs = dict(vol_extra1="value1", + vol_extra2="value2", + vol_extra3=3) + self.vol_type1['extra_specs'] = self.vol_type1_specs + ref = db.volume_type_create(self.context, self.vol_type1) + self.volume_type1_id = ref.id + for k, v in self.vol_type1_specs.iteritems(): + self.vol_type1_specs[k] = str(v) + + self.vol_type2_noextra = dict(name="TEST: Volume type without extra") + ref = db.volume_type_create(self.context, self.vol_type2_noextra) + self.vol_type2_id = ref.id + + def tearDown(self): + # Remove the volume type from the database + db.volume_type_destroy(context.get_admin_context(), + self.vol_type1['name']) + db.volume_type_destroy(context.get_admin_context(), + self.vol_type2_noextra['name']) + super(VolumeTypeExtraSpecsTestCase, self).tearDown() + + def test_volume_type_specs_get(self): + expected_specs = self.vol_type1_specs.copy() + actual_specs = db.volume_type_extra_specs_get( + context.get_admin_context(), + self.volume_type1_id) + self.assertEquals(expected_specs, actual_specs) + + def test_volume_type_extra_specs_delete(self): + expected_specs = self.vol_type1_specs.copy() + del expected_specs['vol_extra2'] + db.volume_type_extra_specs_delete(context.get_admin_context(), + self.volume_type1_id, + 'vol_extra2') + actual_specs = db.volume_type_extra_specs_get( + context.get_admin_context(), + self.volume_type1_id) + self.assertEquals(expected_specs, actual_specs) + + def test_volume_type_extra_specs_update(self): + expected_specs = self.vol_type1_specs.copy() + expected_specs['vol_extra3'] = "4" + db.volume_type_extra_specs_update_or_create( + context.get_admin_context(), + self.volume_type1_id, + dict(vol_extra3=4)) + actual_specs = db.volume_type_extra_specs_get( + context.get_admin_context(), + self.volume_type1_id) + self.assertEquals(expected_specs, actual_specs) + + def test_volume_type_extra_specs_create(self): + expected_specs = self.vol_type1_specs.copy() + expected_specs['vol_extra4'] = 'value4' + expected_specs['vol_extra5'] = 'value5' + db.volume_type_extra_specs_update_or_create( + context.get_admin_context(), + self.volume_type1_id, + dict(vol_extra4="value4", + vol_extra5="value5")) + actual_specs = db.volume_type_extra_specs_get( + context.get_admin_context(), + self.volume_type1_id) + self.assertEquals(expected_specs, actual_specs) + + def test_volume_type_get_with_extra_specs(self): + volume_type = db.volume_type_get( + context.get_admin_context(), + self.volume_type1_id) + self.assertEquals(volume_type['extra_specs'], + self.vol_type1_specs) + + volume_type = db.volume_type_get( + context.get_admin_context(), + self.vol_type2_id) + self.assertEquals(volume_type['extra_specs'], {}) + + def test_volume_type_get_by_name_with_extra_specs(self): + volume_type = db.volume_type_get_by_name( + context.get_admin_context(), + self.vol_type1['name']) + self.assertEquals(volume_type['extra_specs'], + self.vol_type1_specs) + + volume_type = db.volume_type_get_by_name( + context.get_admin_context(), + self.vol_type2_noextra['name']) + self.assertEquals(volume_type['extra_specs'], {}) + + def test_volume_type_get_all(self): + expected_specs = self.vol_type1_specs.copy() + + types = db.volume_type_get_all(context.get_admin_context()) + + self.assertEquals( + types[self.vol_type1['name']]['extra_specs'], expected_specs) + + self.assertEquals( + types[self.vol_type2_noextra['name']]['extra_specs'], {}) diff --git a/cinder/tests/test_wsgi.py b/cinder/tests/test_wsgi.py new file mode 100644 index 000000000..cc8fb6874 --- /dev/null +++ b/cinder/tests/test_wsgi.py @@ -0,0 +1,92 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +"""Unit tests for `cinder.wsgi`.""" + +import os.path +import tempfile + +import unittest + +import cinder.exception +from cinder import test +import cinder.wsgi + + +class TestLoaderNothingExists(test.TestCase): + """Loader tests where os.path.exists always returns False.""" + + def setUp(self): + super(TestLoaderNothingExists, self).setUp() + self.stubs.Set(os.path, 'exists', lambda _: False) + + def test_config_not_found(self): + self.assertRaises( + cinder.exception.ConfigNotFound, + cinder.wsgi.Loader, + ) + + +class TestLoaderNormalFilesystem(unittest.TestCase): + """Loader tests with normal filesystem (unmodified os.path module).""" + + _paste_config = """ +[app:test_app] +use = egg:Paste#static +document_root = /tmp + """ + + def setUp(self): + self.config = tempfile.NamedTemporaryFile(mode="w+t") + self.config.write(self._paste_config.lstrip()) + self.config.seek(0) + self.config.flush() + self.loader = cinder.wsgi.Loader(self.config.name) + + def test_config_found(self): + self.assertEquals(self.config.name, self.loader.config_path) + + def test_app_not_found(self): + self.assertRaises( + cinder.exception.PasteAppNotFound, + self.loader.load_app, + "non-existant app", + ) + + def test_app_found(self): + url_parser = self.loader.load_app("test_app") + self.assertEquals("/tmp", url_parser.directory) + + def tearDown(self): + self.config.close() + + +class TestWSGIServer(unittest.TestCase): + """WSGI server tests.""" + + def test_no_app(self): + server = cinder.wsgi.Server("test_app", None) + self.assertEquals("test_app", server.name) + + def test_start_random_port(self): + server = cinder.wsgi.Server("test_random_port", None, host="127.0.0.1") + self.assertEqual(0, server.port) + server.start() + self.assertNotEqual(0, server.port) + server.stop() + server.wait() diff --git a/cinder/tests/utils.py b/cinder/tests/utils.py new file mode 100644 index 000000000..5b9086b75 --- /dev/null +++ b/cinder/tests/utils.py @@ -0,0 +1,25 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 +# +# Copyright 2011 OpenStack LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# + +import cinder.context +import cinder.db +import cinder.flags + +FLAGS = cinder.flags.FLAGS + + +def get_test_admin_context(): + return cinder.context.get_admin_context() diff --git a/cinder/utils.py b/cinder/utils.py new file mode 100644 index 000000000..f80fb1431 --- /dev/null +++ b/cinder/utils.py @@ -0,0 +1,1678 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# Copyright 2011 Justin Santa Barbara +# 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. + +"""Utilities and helper functions.""" + +import contextlib +import datetime +import errno +import functools +import hashlib +import inspect +import itertools +import json +import os +import pyclbr +import random +import re +import shlex +import shutil +import socket +import struct +import sys +import tempfile +import threading +import time +import types +import uuid +import warnings +from xml.sax import saxutils + +from eventlet import corolocal +from eventlet import event +from eventlet import greenthread +from eventlet import semaphore +from eventlet.green import subprocess +import iso8601 +import lockfile +import netaddr + +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder.openstack.common import importutils + + +LOG = logging.getLogger(__name__) +ISO_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S" +PERFECT_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%f" +FLAGS = flags.FLAGS + +FLAGS.register_opt( + cfg.BoolOpt('disable_process_locking', default=False, + help='Whether to disable inter-process locks')) + + +def find_config(config_path): + """Find a configuration file using the given hint. + + :param config_path: Full or relative path to the config. + :returns: Full path of the config, if it exists. + :raises: `cinder.exception.ConfigNotFound` + + """ + possible_locations = [ + config_path, + os.path.join(FLAGS.state_path, "etc", "cinder", config_path), + os.path.join(FLAGS.state_path, "etc", config_path), + os.path.join(FLAGS.state_path, config_path), + "/etc/cinder/%s" % config_path, + ] + + for path in possible_locations: + if os.path.exists(path): + return os.path.abspath(path) + + raise exception.ConfigNotFound(path=os.path.abspath(config_path)) + + +def vpn_ping(address, port, timeout=0.05, session_id=None): + """Sends a vpn negotiation packet and returns the server session. + + Returns False on a failure. Basic packet structure is below. + + Client packet (14 bytes):: + + 0 1 8 9 13 + +-+--------+-----+ + |x| cli_id |?????| + +-+--------+-----+ + x = packet identifier 0x38 + cli_id = 64 bit identifier + ? = unknown, probably flags/padding + + Server packet (26 bytes):: + + 0 1 8 9 13 14 21 2225 + +-+--------+-----+--------+----+ + |x| srv_id |?????| cli_id |????| + +-+--------+-----+--------+----+ + x = packet identifier 0x40 + cli_id = 64 bit identifier + ? = unknown, probably flags/padding + bit 9 was 1 and the rest were 0 in testing + + """ + if session_id is None: + session_id = random.randint(0, 0xffffffffffffffff) + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + data = struct.pack('!BQxxxxx', 0x38, session_id) + sock.sendto(data, (address, port)) + sock.settimeout(timeout) + try: + received = sock.recv(2048) + except socket.timeout: + return False + finally: + sock.close() + fmt = '!BQxxxxxQxxxx' + if len(received) != struct.calcsize(fmt): + print struct.calcsize(fmt) + return False + (identifier, server_sess, client_sess) = struct.unpack(fmt, received) + if identifier == 0x40 and client_sess == session_id: + return server_sess + + +def fetchfile(url, target): + LOG.debug(_('Fetching %s') % url) + execute('curl', '--fail', url, '-o', target) + + +def execute(*cmd, **kwargs): + """Helper method to execute command with optional retry. + + If you add a run_as_root=True command, don't forget to add the + corresponding filter to cinder.rootwrap ! + + :param cmd: Passed to subprocess.Popen. + :param process_input: Send to opened process. + :param check_exit_code: Single bool, int, or list of allowed exit + codes. Defaults to [0]. Raise + exception.ProcessExecutionError unless + program exits with one of these code. + :param delay_on_retry: True | False. Defaults to True. If set to + True, wait a short amount of time + before retrying. + :param attempts: How many times to retry cmd. + :param run_as_root: True | False. Defaults to False. If set to True, + the command is prefixed by the command specified + in the root_helper FLAG. + + :raises exception.Error: on receiving unknown arguments + :raises exception.ProcessExecutionError: + + :returns: a tuple, (stdout, stderr) from the spawned process, or None if + the command fails. + """ + + process_input = kwargs.pop('process_input', None) + check_exit_code = kwargs.pop('check_exit_code', [0]) + ignore_exit_code = False + if isinstance(check_exit_code, bool): + ignore_exit_code = not check_exit_code + check_exit_code = [0] + elif isinstance(check_exit_code, int): + check_exit_code = [check_exit_code] + delay_on_retry = kwargs.pop('delay_on_retry', True) + attempts = kwargs.pop('attempts', 1) + run_as_root = kwargs.pop('run_as_root', False) + shell = kwargs.pop('shell', False) + + if len(kwargs): + raise exception.Error(_('Got unknown keyword args ' + 'to utils.execute: %r') % kwargs) + + if run_as_root: + cmd = shlex.split(FLAGS.root_helper) + list(cmd) + cmd = map(str, cmd) + + while attempts > 0: + attempts -= 1 + try: + LOG.debug(_('Running cmd (subprocess): %s'), ' '.join(cmd)) + _PIPE = subprocess.PIPE # pylint: disable=E1101 + obj = subprocess.Popen(cmd, + stdin=_PIPE, + stdout=_PIPE, + stderr=_PIPE, + close_fds=True, + shell=shell) + result = None + if process_input is not None: + result = obj.communicate(process_input) + else: + result = obj.communicate() + obj.stdin.close() # pylint: disable=E1101 + _returncode = obj.returncode # pylint: disable=E1101 + if _returncode: + LOG.debug(_('Result was %s') % _returncode) + if not ignore_exit_code and _returncode not in check_exit_code: + (stdout, stderr) = result + raise exception.ProcessExecutionError( + exit_code=_returncode, + stdout=stdout, + stderr=stderr, + cmd=' '.join(cmd)) + return result + except exception.ProcessExecutionError: + if not attempts: + raise + else: + LOG.debug(_('%r failed. Retrying.'), cmd) + if delay_on_retry: + greenthread.sleep(random.randint(20, 200) / 100.0) + finally: + # NOTE(termie): this appears to be necessary to let the subprocess + # call clean something up in between calls, without + # it two execute calls in a row hangs the second one + greenthread.sleep(0) + + +def trycmd(*args, **kwargs): + """ + A wrapper around execute() to more easily handle warnings and errors. + + Returns an (out, err) tuple of strings containing the output of + the command's stdout and stderr. If 'err' is not empty then the + command can be considered to have failed. + + :discard_warnings True | False. Defaults to False. If set to True, + then for succeeding commands, stderr is cleared + + """ + discard_warnings = kwargs.pop('discard_warnings', False) + + try: + out, err = execute(*args, **kwargs) + failed = False + except exception.ProcessExecutionError, exn: + out, err = '', str(exn) + LOG.debug(err) + failed = True + + if not failed and discard_warnings and err: + # Handle commands that output to stderr but otherwise succeed + LOG.debug(err) + err = '' + + return out, err + + +def ssh_execute(ssh, cmd, process_input=None, + addl_env=None, check_exit_code=True): + LOG.debug(_('Running cmd (SSH): %s'), ' '.join(cmd)) + if addl_env: + raise exception.Error(_('Environment not supported over SSH')) + + if process_input: + # This is (probably) fixable if we need it... + raise exception.Error(_('process_input not supported over SSH')) + + stdin_stream, stdout_stream, stderr_stream = ssh.exec_command(cmd) + channel = stdout_stream.channel + + #stdin.write('process_input would go here') + #stdin.flush() + + # NOTE(justinsb): This seems suspicious... + # ...other SSH clients have buffering issues with this approach + stdout = stdout_stream.read() + stderr = stderr_stream.read() + stdin_stream.close() + + exit_status = channel.recv_exit_status() + + # exit_status == -1 if no exit code was returned + if exit_status != -1: + LOG.debug(_('Result was %s') % exit_status) + if check_exit_code and exit_status != 0: + raise exception.ProcessExecutionError(exit_code=exit_status, + stdout=stdout, + stderr=stderr, + cmd=' '.join(cmd)) + + return (stdout, stderr) + + +def cinderdir(): + import cinder + return os.path.abspath(cinder.__file__).split('cinder/__init__.py')[0] + + +def default_flagfile(filename='cinder.conf', args=None): + if args is None: + args = sys.argv + for arg in args: + if arg.find('flagfile') != -1: + return arg[arg.index('flagfile') + len('flagfile') + 1:] + else: + if not os.path.isabs(filename): + # turn relative filename into an absolute path + script_dir = os.path.dirname(inspect.stack()[-1][1]) + filename = os.path.abspath(os.path.join(script_dir, filename)) + if not os.path.exists(filename): + filename = "./cinder.conf" + if not os.path.exists(filename): + filename = '/etc/cinder/cinder.conf' + if os.path.exists(filename): + flagfile = '--flagfile=%s' % filename + args.insert(1, flagfile) + return filename + + +def debug(arg): + LOG.debug(_('debug in callback: %s'), arg) + return arg + + +def generate_uid(topic, size=8): + characters = '01234567890abcdefghijklmnopqrstuvwxyz' + choices = [random.choice(characters) for x in xrange(size)] + return '%s-%s' % (topic, ''.join(choices)) + + +# Default symbols to use for passwords. Avoids visually confusing characters. +# ~6 bits per symbol +DEFAULT_PASSWORD_SYMBOLS = ('23456789', # Removed: 0,1 + 'ABCDEFGHJKLMNPQRSTUVWXYZ', # Removed: I, O + 'abcdefghijkmnopqrstuvwxyz') # Removed: l + + +# ~5 bits per symbol +EASIER_PASSWORD_SYMBOLS = ('23456789', # Removed: 0, 1 + 'ABCDEFGHJKLMNPQRSTUVWXYZ') # Removed: I, O + + +def last_completed_audit_period(unit=None): + """This method gives you the most recently *completed* audit period. + + arguments: + units: string, one of 'hour', 'day', 'month', 'year' + Periods normally begin at the beginning (UTC) of the + period unit (So a 'day' period begins at midnight UTC, + a 'month' unit on the 1st, a 'year' on Jan, 1) + unit string may be appended with an optional offset + like so: 'day@18' This will begin the period at 18:00 + UTC. 'month@15' starts a monthly period on the 15th, + and year@3 begins a yearly one on March 1st. + + + returns: 2 tuple of datetimes (begin, end) + The begin timestamp of this audit period is the same as the + end of the previous.""" + if not unit: + unit = FLAGS.instance_usage_audit_period + + offset = 0 + if '@' in unit: + unit, offset = unit.split("@", 1) + offset = int(offset) + + rightnow = utcnow() + if unit not in ('month', 'day', 'year', 'hour'): + raise ValueError('Time period must be hour, day, month or year') + if unit == 'month': + if offset == 0: + offset = 1 + end = datetime.datetime(day=offset, + month=rightnow.month, + year=rightnow.year) + if end >= rightnow: + year = rightnow.year + if 1 >= rightnow.month: + year -= 1 + month = 12 + (rightnow.month - 1) + else: + month = rightnow.month - 1 + end = datetime.datetime(day=offset, + month=month, + year=year) + year = end.year + if 1 >= end.month: + year -= 1 + month = 12 + (end.month - 1) + else: + month = end.month - 1 + begin = datetime.datetime(day=offset, month=month, year=year) + + elif unit == 'year': + if offset == 0: + offset = 1 + end = datetime.datetime(day=1, month=offset, year=rightnow.year) + if end >= rightnow: + end = datetime.datetime(day=1, + month=offset, + year=rightnow.year - 1) + begin = datetime.datetime(day=1, + month=offset, + year=rightnow.year - 2) + else: + begin = datetime.datetime(day=1, + month=offset, + year=rightnow.year - 1) + + elif unit == 'day': + end = datetime.datetime(hour=offset, + day=rightnow.day, + month=rightnow.month, + year=rightnow.year) + if end >= rightnow: + end = end - datetime.timedelta(days=1) + begin = end - datetime.timedelta(days=1) + + elif unit == 'hour': + end = rightnow.replace(minute=offset, second=0, microsecond=0) + if end >= rightnow: + end = end - datetime.timedelta(hours=1) + begin = end - datetime.timedelta(hours=1) + + return (begin, end) + + +def generate_password(length=20, symbolgroups=DEFAULT_PASSWORD_SYMBOLS): + """Generate a random password from the supplied symbol groups. + + At least one symbol from each group will be included. Unpredictable + results if length is less than the number of symbol groups. + + Believed to be reasonably secure (with a reasonable password length!) + + """ + r = random.SystemRandom() + + # NOTE(jerdfelt): Some password policies require at least one character + # from each group of symbols, so start off with one random character + # from each symbol group + password = [r.choice(s) for s in symbolgroups] + # If length < len(symbolgroups), the leading characters will only + # be from the first length groups. Try our best to not be predictable + # by shuffling and then truncating. + r.shuffle(password) + password = password[:length] + length -= len(password) + + # then fill with random characters from all symbol groups + symbols = ''.join(symbolgroups) + password.extend([r.choice(symbols) for _i in xrange(length)]) + + # finally shuffle to ensure first x characters aren't from a + # predictable group + r.shuffle(password) + + return ''.join(password) + + +def last_octet(address): + return int(address.split('.')[-1]) + + +def get_my_linklocal(interface): + try: + if_str = execute('ip', '-f', 'inet6', '-o', 'addr', 'show', interface) + condition = '\s+inet6\s+([0-9a-f:]+)/\d+\s+scope\s+link' + links = [re.search(condition, x) for x in if_str[0].split('\n')] + address = [w.group(1) for w in links if w is not None] + if address[0] is not None: + return address[0] + else: + raise exception.Error(_('Link Local address is not found.:%s') + % if_str) + except Exception as ex: + raise exception.Error(_("Couldn't get Link Local IP of %(interface)s" + " :%(ex)s") % locals()) + + +def utcnow(): + """Overridable version of utils.utcnow.""" + if utcnow.override_time: + return utcnow.override_time + return datetime.datetime.utcnow() + + +utcnow.override_time = None + + +def is_older_than(before, seconds): + """Return True if before is older than seconds.""" + return utcnow() - before > datetime.timedelta(seconds=seconds) + + +def utcnow_ts(): + """Timestamp version of our utcnow function.""" + return time.mktime(utcnow().timetuple()) + + +def set_time_override(override_time=datetime.datetime.utcnow()): + """Override utils.utcnow to return a constant time.""" + utcnow.override_time = override_time + + +def advance_time_delta(timedelta): + """Advance overriden time using a datetime.timedelta.""" + assert(not utcnow.override_time is None) + utcnow.override_time += timedelta + + +def advance_time_seconds(seconds): + """Advance overriden time by seconds.""" + advance_time_delta(datetime.timedelta(0, seconds)) + + +def clear_time_override(): + """Remove the overridden time.""" + utcnow.override_time = None + + +def strtime(at=None, fmt=PERFECT_TIME_FORMAT): + """Returns formatted utcnow.""" + if not at: + at = utcnow() + return at.strftime(fmt) + + +def parse_strtime(timestr, fmt=PERFECT_TIME_FORMAT): + """Turn a formatted time back into a datetime.""" + return datetime.datetime.strptime(timestr, fmt) + + +def isotime(at=None): + """Stringify time in ISO 8601 format""" + if not at: + at = datetime.datetime.utcnow() + str = at.strftime(ISO_TIME_FORMAT) + tz = at.tzinfo.tzname(None) if at.tzinfo else 'UTC' + str += ('Z' if tz == 'UTC' else tz) + return str + + +def parse_isotime(timestr): + """Turn an iso formatted time back into a datetime.""" + try: + return iso8601.parse_date(timestr) + except (iso8601.ParseError, TypeError) as e: + raise ValueError(e.message) + + +def normalize_time(timestamp): + """Normalize time in arbitrary timezone to UTC""" + offset = timestamp.utcoffset() + return timestamp.replace(tzinfo=None) - offset if offset else timestamp + + +def parse_mailmap(mailmap='.mailmap'): + mapping = {} + if os.path.exists(mailmap): + fp = open(mailmap, 'r') + for l in fp: + l = l.strip() + if not l.startswith('#') and ' ' in l: + canonical_email, alias = l.split(' ') + mapping[alias.lower()] = canonical_email.lower() + return mapping + + +def str_dict_replace(s, mapping): + for s1, s2 in mapping.iteritems(): + s = s.replace(s1, s2) + return s + + +class LazyPluggable(object): + """A pluggable backend loaded lazily based on some value.""" + + def __init__(self, pivot, **backends): + self.__backends = backends + self.__pivot = pivot + self.__backend = None + + def __get_backend(self): + if not self.__backend: + backend_name = FLAGS[self.__pivot] + if backend_name not in self.__backends: + raise exception.Error(_('Invalid backend: %s') % backend_name) + + backend = self.__backends[backend_name] + if isinstance(backend, tuple): + name = backend[0] + fromlist = backend[1] + else: + name = backend + fromlist = backend + + self.__backend = __import__(name, None, None, fromlist) + LOG.debug(_('backend %s'), self.__backend) + return self.__backend + + def __getattr__(self, key): + backend = self.__get_backend() + return getattr(backend, key) + + +class LoopingCallDone(Exception): + """Exception to break out and stop a LoopingCall. + + The poll-function passed to LoopingCall 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() + + """ + + def __init__(self, retvalue=True): + """:param retvalue: Value that LoopingCall.wait() should return.""" + self.retvalue = retvalue + + +class LoopingCall(object): + def __init__(self, f=None, *args, **kw): + self.args = args + self.kw = kw + self.f = f + self._running = False + + def start(self, interval, initial_delay=None): + self._running = True + done = event.Event() + + def _inner(): + if initial_delay: + greenthread.sleep(initial_delay) + + try: + while self._running: + self.f(*self.args, **self.kw) + if not self._running: + break + greenthread.sleep(interval) + except LoopingCallDone, e: + self.stop() + done.send(e.retvalue) + except Exception: + LOG.exception(_('in looping call')) + done.send_exception(*sys.exc_info()) + return + else: + done.send(True) + + self.done = done + + greenthread.spawn(_inner) + return self.done + + def stop(self): + self._running = False + + def wait(self): + return self.done.wait() + + +def xhtml_escape(value): + """Escapes a string so it is valid within XML or XHTML. + + """ + return saxutils.escape(value, {'"': '"', "'": '''}) + + +def utf8(value): + """Try to turn a string into utf-8 if possible. + + Code is directly from the utf8 function in + http://github.com/facebook/tornado/blob/master/tornado/escape.py + + """ + if isinstance(value, unicode): + return value.encode('utf-8') + assert isinstance(value, str) + return value + + +def to_primitive(value, convert_instances=False, level=0): + """Convert a complex object into primitives. + + Handy for JSON serialization. We can optionally handle instances, + but since this is a recursive function, we could have cyclical + data structures. + + To handle cyclical data structures we could track the actual objects + visited in a set, but not all objects are hashable. Instead we just + track the depth of the object inspections and don't go too deep. + + Therefore, convert_instances=True is lossy ... be aware. + + """ + nasty = [inspect.ismodule, inspect.isclass, inspect.ismethod, + inspect.isfunction, inspect.isgeneratorfunction, + inspect.isgenerator, inspect.istraceback, inspect.isframe, + inspect.iscode, inspect.isbuiltin, inspect.isroutine, + inspect.isabstract] + for test in nasty: + if test(value): + return unicode(value) + + # value of itertools.count doesn't get caught by inspects + # above and results in infinite loop when list(value) is called. + if type(value) == itertools.count: + return unicode(value) + + # FIXME(vish): Workaround for LP bug 852095. Without this workaround, + # tests that raise an exception in a mocked method that + # has a @wrap_exception with a notifier will fail. If + # we up the dependency to 0.5.4 (when it is released) we + # can remove this workaround. + if getattr(value, '__module__', None) == 'mox': + return 'mock' + + if level > 3: + return '?' + + # The try block may not be necessary after the class check above, + # but just in case ... + try: + if isinstance(value, (list, tuple)): + o = [] + for v in value: + o.append(to_primitive(v, convert_instances=convert_instances, + level=level)) + return o + elif isinstance(value, dict): + o = {} + for k, v in value.iteritems(): + o[k] = to_primitive(v, convert_instances=convert_instances, + level=level) + return o + elif isinstance(value, datetime.datetime): + return str(value) + elif hasattr(value, 'iteritems'): + return to_primitive(dict(value.iteritems()), + convert_instances=convert_instances, + level=level) + elif hasattr(value, '__iter__'): + return to_primitive(list(value), level) + elif convert_instances and hasattr(value, '__dict__'): + # Likely an instance of something. Watch for cycles. + # Ignore class member vars. + return to_primitive(value.__dict__, + convert_instances=convert_instances, + level=level + 1) + else: + return value + except TypeError, e: + # Class objects are tricky since they may define something like + # __iter__ defined but it isn't callable as list(). + return unicode(value) + + +def dumps(value): + try: + return json.dumps(value) + except TypeError: + pass + return json.dumps(to_primitive(value)) + + +def loads(s): + return json.loads(s) + + +try: + import anyjson +except ImportError: + pass +else: + anyjson._modules.append(("cinder.utils", "dumps", TypeError, + "loads", ValueError)) + anyjson.force_implementation("cinder.utils") + + +class GreenLockFile(lockfile.FileLock): + """Implementation of lockfile that allows for a lock per greenthread. + + Simply implements lockfile:LockBase init with an addiontall suffix + on the unique name of the greenthread identifier + """ + def __init__(self, path, threaded=True): + self.path = path + self.lock_file = os.path.abspath(path) + ".lock" + self.hostname = socket.gethostname() + self.pid = os.getpid() + if threaded: + t = threading.current_thread() + # Thread objects in Python 2.4 and earlier do not have ident + # attrs. Worm around that. + ident = getattr(t, "ident", hash(t)) or hash(t) + gident = corolocal.get_ident() + self.tname = "-%x-%x" % (ident & 0xffffffff, gident & 0xffffffff) + else: + self.tname = "" + dirname = os.path.dirname(self.lock_file) + self.unique_name = os.path.join(dirname, + "%s%s.%s" % (self.hostname, + self.tname, + self.pid)) + + +_semaphores = {} + + +def synchronized(name, external=False): + """Synchronization decorator. + + Decorating a method like so:: + + @synchronized('mylock') + def foo(self, *args): + ... + + ensures that only one thread will execute the bar method at a time. + + Different methods can share the same lock:: + + @synchronized('mylock') + def foo(self, *args): + ... + + @synchronized('mylock') + def bar(self, *args): + ... + + This way only one of either foo or bar can be executing at a time. + + The external keyword argument denotes whether this lock should work across + multiple processes. This means that if two different workers both run a + a method decorated with @synchronized('mylock', external=True), only one + of them will execute at a time. + + Important limitation: you can only have one external lock running per + thread at a time. For example the following will fail: + + @utils.synchronized('testlock1', external=True) + def outer_lock(): + + @utils.synchronized('testlock2', external=True) + def inner_lock(): + pass + inner_lock() + + outer_lock() + + """ + + def wrap(f): + @functools.wraps(f) + def inner(*args, **kwargs): + # NOTE(soren): If we ever go natively threaded, this will be racy. + # See http://stackoverflow.com/questions/5390569/dyn + # amically-allocating-and-destroying-mutexes + if name not in _semaphores: + _semaphores[name] = semaphore.Semaphore() + sem = _semaphores[name] + LOG.debug(_('Attempting to grab semaphore "%(lock)s" for method ' + '"%(method)s"...'), {'lock': name, + 'method': f.__name__}) + with sem: + LOG.debug(_('Got semaphore "%(lock)s" for method ' + '"%(method)s"...'), {'lock': name, + 'method': f.__name__}) + if external and not FLAGS.disable_process_locking: + LOG.debug(_('Attempting to grab file lock "%(lock)s" for ' + 'method "%(method)s"...'), + {'lock': name, 'method': f.__name__}) + lock_file_path = os.path.join(FLAGS.lock_path, + 'cinder-%s' % name) + lock = GreenLockFile(lock_file_path) + with lock: + LOG.debug(_('Got file lock "%(lock)s" for ' + 'method "%(method)s"...'), + {'lock': name, 'method': f.__name__}) + retval = f(*args, **kwargs) + else: + retval = f(*args, **kwargs) + + # If no-one else is waiting for it, delete it. + # See note about possible raciness above. + if not sem.balance < 1: + del _semaphores[name] + + return retval + return inner + return wrap + + +def cleanup_file_locks(): + """clean up stale locks left behind by process failures + + The lockfile module, used by @synchronized, can leave stale lockfiles + behind after process failure. These locks can cause process hangs + at startup, when a process deadlocks on a lock which will never + be unlocked. + + Intended to be called at service startup. + + """ + + # NOTE(mikeyp) this routine incorporates some internal knowledge + # from the lockfile module, and this logic really + # should be part of that module. + # + # cleanup logic: + # 1) look for the lockfile modules's 'sentinel' files, of the form + # hostname.[thread-.*]-pid, extract the pid. + # if pid doesn't match a running process, delete the file since + # it's from a dead process. + # 2) check for the actual lockfiles. if lockfile exists with linkcount + # of 1, it's bogus, so delete it. A link count >= 2 indicates that + # there are probably sentinels still linked to it from active + # processes. This check isn't perfect, but there is no way to + # reliably tell which sentinels refer to which lock in the + # lockfile implementation. + + if FLAGS.disable_process_locking: + return + + hostname = socket.gethostname() + sentinel_re = hostname + r'\..*-(\d+$)' + lockfile_re = r'cinder-.*\.lock' + files = os.listdir(FLAGS.lock_path) + + # cleanup sentinels + for filename in files: + match = re.match(sentinel_re, filename) + if match is None: + continue + pid = match.group(1) + LOG.debug(_('Found sentinel %(filename)s for pid %(pid)s'), + {'filename': filename, 'pid': pid}) + try: + os.kill(int(pid), 0) + except OSError, e: + # PID wasn't found + delete_if_exists(os.path.join(FLAGS.lock_path, filename)) + LOG.debug(_('Cleaned sentinel %(filename)s for pid %(pid)s'), + {'filename': filename, 'pid': pid}) + + # cleanup lock files + for filename in files: + match = re.match(lockfile_re, filename) + if match is None: + continue + try: + stat_info = os.stat(os.path.join(FLAGS.lock_path, filename)) + except OSError as e: + if e.errno == errno.ENOENT: + continue + else: + raise + LOG.debug(_('Found lockfile %(file)s with link count %(count)d'), + {'file': filename, 'count': stat_info.st_nlink}) + if stat_info.st_nlink == 1: + delete_if_exists(os.path.join(FLAGS.lock_path, filename)) + LOG.debug(_('Cleaned lockfile %(file)s with link count %(count)d'), + {'file': filename, 'count': stat_info.st_nlink}) + + +def delete_if_exists(pathname): + """delete a file, but ignore file not found error""" + + try: + os.unlink(pathname) + except OSError as e: + if e.errno == errno.ENOENT: + return + else: + raise + + +def get_from_path(items, path): + """Returns a list of items matching the specified path. + + Takes an XPath-like expression e.g. prop1/prop2/prop3, and for each item + in items, looks up items[prop1][prop2][prop3]. Like XPath, if any of the + intermediate results are lists it will treat each list item individually. + A 'None' in items or any child expressions will be ignored, this function + will not throw because of None (anywhere) in items. The returned list + will contain no None values. + + """ + if path is None: + raise exception.Error('Invalid mini_xpath') + + (first_token, sep, remainder) = path.partition('/') + + if first_token == '': + raise exception.Error('Invalid mini_xpath') + + results = [] + + if items is None: + return results + + if not isinstance(items, list): + # Wrap single objects in a list + items = [items] + + for item in items: + if item is None: + continue + get_method = getattr(item, 'get', None) + if get_method is None: + continue + child = get_method(first_token) + if child is None: + continue + if isinstance(child, list): + # Flatten intermediate lists + for x in child: + results.append(x) + else: + results.append(child) + + if not sep: + # No more tokens + return results + else: + return get_from_path(results, remainder) + + +def flatten_dict(dict_, flattened=None): + """Recursively flatten a nested dictionary.""" + flattened = flattened or {} + for key, value in dict_.iteritems(): + if hasattr(value, 'iteritems'): + flatten_dict(value, flattened) + else: + flattened[key] = value + return flattened + + +def partition_dict(dict_, keys): + """Return two dicts, one with `keys` the other with everything else.""" + intersection = {} + difference = {} + for key, value in dict_.iteritems(): + if key in keys: + intersection[key] = value + else: + difference[key] = value + return intersection, difference + + +def map_dict_keys(dict_, key_map): + """Return a dict in which the dictionaries keys are mapped to new keys.""" + mapped = {} + for key, value in dict_.iteritems(): + mapped_key = key_map[key] if key in key_map else key + mapped[mapped_key] = value + return mapped + + +def subset_dict(dict_, keys): + """Return a dict that only contains a subset of keys.""" + subset = partition_dict(dict_, keys)[0] + return subset + + +def check_isinstance(obj, cls): + """Checks that obj is of type cls, and lets PyLint infer types.""" + if isinstance(obj, cls): + return obj + raise Exception(_('Expected object of type: %s') % (str(cls))) + # TODO(justinsb): Can we make this better?? + return cls() # Ugly PyLint hack + + +def parse_server_string(server_str): + """ + Parses the given server_string and returns a list of host and port. + If it's not a combination of host part and port, the port element + is a null string. If the input is invalid expression, return a null + list. + """ + try: + # First of all, exclude pure IPv6 address (w/o port). + if netaddr.valid_ipv6(server_str): + return (server_str, '') + + # Next, check if this is IPv6 address with a port number combination. + if server_str.find("]:") != -1: + (address, port) = server_str.replace('[', '', 1).split(']:') + return (address, port) + + # Third, check if this is a combination of an address and a port + if server_str.find(':') == -1: + return (server_str, '') + + # This must be a combination of an address and a port + (address, port) = server_str.split(':') + return (address, port) + + except Exception: + LOG.debug(_('Invalid server_string: %s'), server_str) + return ('', '') + + +def gen_uuid(): + return uuid.uuid4() + + +def is_uuid_like(val): + """For our purposes, a UUID is a string in canonical form: + + aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa + """ + try: + uuid.UUID(val) + return True + except (TypeError, ValueError, AttributeError): + return False + + +def bool_from_str(val): + """Convert a string representation of a bool into a bool value""" + + if not val: + return False + try: + return True if int(val) else False + except ValueError: + return val.lower() == 'true' + + +def is_valid_ipv4(address): + """valid the address strictly as per format xxx.xxx.xxx.xxx. + where xxx is a value between 0 and 255. + """ + parts = address.split(".") + if len(parts) != 4: + return False + for item in parts: + try: + if not 0 <= int(item) <= 255: + return False + except ValueError: + return False + return True + + +def is_valid_cidr(address): + """Check if the provided ipv4 or ipv6 address is a valid + CIDR address or not""" + try: + # Validate the correct CIDR Address + netaddr.IPNetwork(address) + except netaddr.core.AddrFormatError: + return False + except UnboundLocalError: + # NOTE(MotoKen): work around bug in netaddr 0.7.5 (see detail in + # https://github.com/drkjam/netaddr/issues/2) + return False + + # Prior validation partially verify /xx part + # Verify it here + ip_segment = address.split('/') + + if (len(ip_segment) <= 1 or + ip_segment[1] == ''): + return False + + return True + + +def monkey_patch(): + """ If the Flags.monkey_patch set as True, + this function patches a decorator + for all functions in specified modules. + You can set decorators for each modules + using FLAGS.monkey_patch_modules. + The format is "Module path:Decorator function". + Example: 'cinder.api.ec2.cloud:cinder.notifier.api.notify_decorator' + + Parameters of the decorator is as follows. + (See cinder.notifier.api.notify_decorator) + + name - name of the function + function - object of the function + """ + # If FLAGS.monkey_patch is not True, this function do nothing. + if not FLAGS.monkey_patch: + return + # Get list of modules and decorators + for module_and_decorator in FLAGS.monkey_patch_modules: + module, decorator_name = module_and_decorator.split(':') + # import decorator function + decorator = importutils.import_class(decorator_name) + __import__(module) + # Retrieve module information using pyclbr + module_data = pyclbr.readmodule_ex(module) + for key in module_data.keys(): + # set the decorator for the class methods + if isinstance(module_data[key], pyclbr.Class): + clz = importutils.import_class("%s.%s" % (module, key)) + for method, func in inspect.getmembers(clz, inspect.ismethod): + setattr(clz, method, + decorator("%s.%s.%s" % (module, key, method), func)) + # set the decorator for the function + if isinstance(module_data[key], pyclbr.Function): + func = importutils.import_class("%s.%s" % (module, key)) + setattr(sys.modules[module], key, + decorator("%s.%s" % (module, key), func)) + + +def convert_to_list_dict(lst, label): + """Convert a value or list into a list of dicts""" + if not lst: + return None + if not isinstance(lst, list): + lst = [lst] + return [{label: x} for x in lst] + + +def timefunc(func): + """Decorator that logs how long a particular function took to execute""" + @functools.wraps(func) + def inner(*args, **kwargs): + start_time = time.time() + try: + return func(*args, **kwargs) + finally: + total_time = time.time() - start_time + LOG.debug(_("timefunc: '%(name)s' took %(total_time).2f secs") % + dict(name=func.__name__, total_time=total_time)) + return inner + + +def generate_glance_url(): + """Generate the URL to glance.""" + # TODO(jk0): This will eventually need to take SSL into consideration + # when supported in glance. + return "http://%s:%d" % (FLAGS.glance_host, FLAGS.glance_port) + + +@contextlib.contextmanager +def save_and_reraise_exception(): + """Save current exception, run some code and then re-raise. + + In some cases the exception context can be cleared, resulting in None + being attempted to be reraised after an exception handler is run. This + can happen when eventlet switches greenthreads or when running an + exception handler, code raises and catches an exception. In both + cases the exception context will be cleared. + + To work around this, we save the exception state, run handler code, and + then re-raise the original exception. If another exception occurs, the + saved exception is logged and the new exception is reraised. + """ + type_, value, traceback = sys.exc_info() + try: + yield + except Exception: + # NOTE(jkoelker): Using LOG.error here since it accepts exc_info + # as a kwargs. + LOG.error(_('Original exception being dropped'), + exc_info=(type_, value, traceback)) + raise + raise type_, value, traceback + + +@contextlib.contextmanager +def logging_error(message): + """Catches exception, write message to the log, re-raise. + This is a common refinement of save_and_reraise that writes a specific + message to the log. + """ + try: + yield + except Exception as error: + with save_and_reraise_exception(): + LOG.exception(message) + + +@contextlib.contextmanager +def remove_path_on_error(path): + """Protect code that wants to operate on PATH atomically. + Any exception will cause PATH to be removed. + """ + try: + yield + except Exception: + with save_and_reraise_exception(): + delete_if_exists(path) + + +def make_dev_path(dev, partition=None, base='/dev'): + """Return a path to a particular device. + + >>> make_dev_path('xvdc') + /dev/xvdc + + >>> make_dev_path('xvdc', 1) + /dev/xvdc1 + """ + path = os.path.join(base, dev) + if partition: + path += str(partition) + return path + + +def total_seconds(td): + """Local total_seconds implementation for compatibility with python 2.6""" + if hasattr(td, 'total_seconds'): + return td.total_seconds() + else: + return ((td.days * 86400 + td.seconds) * 10 ** 6 + + td.microseconds) / 10.0 ** 6 + + +def sanitize_hostname(hostname): + """Return a hostname which conforms to RFC-952 and RFC-1123 specs.""" + if isinstance(hostname, unicode): + hostname = hostname.encode('latin-1', 'ignore') + + hostname = re.sub('[ _]', '-', hostname) + hostname = re.sub('[^\w.-]+', '', hostname) + hostname = hostname.lower() + hostname = hostname.strip('.-') + + return hostname + + +def read_cached_file(filename, cache_info, reload_func=None): + """Read from a file if it has been modified. + + :param cache_info: dictionary to hold opaque cache. + :param reload_func: optional function to be called with data when + file is reloaded due to a modification. + + :returns: data from file + + """ + mtime = os.path.getmtime(filename) + if not cache_info or mtime != cache_info.get('mtime'): + with open(filename) as fap: + cache_info['data'] = fap.read() + cache_info['mtime'] = mtime + if reload_func: + reload_func(cache_info['data']) + return cache_info['data'] + + +def hash_file(file_like_object): + """Generate a hash for the contents of a file.""" + checksum = hashlib.sha1() + any(map(checksum.update, iter(lambda: file_like_object.read(32768), ''))) + return checksum.hexdigest() + + +@contextlib.contextmanager +def temporary_mutation(obj, **kwargs): + """Temporarily set the attr on a particular object to a given value then + revert when finished. + + One use of this is to temporarily set the read_deleted flag on a context + object: + + with temporary_mutation(context, read_deleted="yes"): + do_something_that_needed_deleted_objects() + """ + NOT_PRESENT = object() + + old_values = {} + for attr, new_value in kwargs.items(): + old_values[attr] = getattr(obj, attr, NOT_PRESENT) + setattr(obj, attr, new_value) + + try: + yield + finally: + for attr, old_value in old_values.items(): + if old_value is NOT_PRESENT: + del obj[attr] + else: + setattr(obj, attr, old_value) + + +def warn_deprecated_class(cls, msg): + """ + Issues a warning to indicate that the given class is deprecated. + If a message is given, it is appended to the deprecation warning. + """ + + fullname = '%s.%s' % (cls.__module__, cls.__name__) + if msg: + fullmsg = _("Class %(fullname)s is deprecated: %(msg)s") + else: + fullmsg = _("Class %(fullname)s is deprecated") + + # Issue the warning + warnings.warn(fullmsg % locals(), DeprecationWarning, stacklevel=3) + + +def warn_deprecated_function(func, msg): + """ + Issues a warning to indicate that the given function is + deprecated. If a message is given, it is appended to the + deprecation warning. + """ + + name = func.__name__ + + # Find the function's definition + sourcefile = inspect.getsourcefile(func) + + # Find the line number, if possible + if inspect.ismethod(func): + code = func.im_func.func_code + else: + code = func.func_code + lineno = getattr(code, 'co_firstlineno', None) + + if lineno is None: + location = sourcefile + else: + location = "%s:%d" % (sourcefile, lineno) + + # Build up the message + if msg: + fullmsg = _("Function %(name)s in %(location)s is deprecated: %(msg)s") + else: + fullmsg = _("Function %(name)s in %(location)s is deprecated") + + # Issue the warning + warnings.warn(fullmsg % locals(), DeprecationWarning, stacklevel=3) + + +def _stubout(klass, message): + """ + Scans a class and generates wrapping stubs for __new__() and every + class and static method. Returns a dictionary which can be passed + to type() to generate a wrapping class. + """ + + overrides = {} + + def makestub_class(name, func): + """ + Create a stub for wrapping class methods. + """ + + def stub(cls, *args, **kwargs): + warn_deprecated_class(klass, message) + return func(*args, **kwargs) + + # Overwrite the stub's name + stub.__name__ = name + stub.func_name = name + + return classmethod(stub) + + def makestub_static(name, func): + """ + Create a stub for wrapping static methods. + """ + + def stub(*args, **kwargs): + warn_deprecated_class(klass, message) + return func(*args, **kwargs) + + # Overwrite the stub's name + stub.__name__ = name + stub.func_name = name + + return staticmethod(stub) + + for name, kind, _klass, _obj in inspect.classify_class_attrs(klass): + # We're only interested in __new__(), class methods, and + # static methods... + if (name != '__new__' and + kind not in ('class method', 'static method')): + continue + + # Get the function... + func = getattr(klass, name) + + # Override it in the class + if kind == 'class method': + stub = makestub_class(name, func) + elif kind == 'static method' or name == '__new__': + stub = makestub_static(name, func) + + # Save it in the overrides dictionary... + overrides[name] = stub + + # Apply the overrides + for name, stub in overrides.items(): + setattr(klass, name, stub) + + +def deprecated(message=''): + """ + Marks a function, class, or method as being deprecated. For + functions and methods, emits a warning each time the function or + method is called. For classes, generates a new subclass which + will emit a warning each time the class is instantiated, or each + time any class or static method is called. + + If a message is passed to the decorator, that message will be + appended to the emitted warning. This may be used to suggest an + alternate way of achieving the desired effect, or to explain why + the function, class, or method is deprecated. + """ + + def decorator(f_or_c): + # Make sure we can deprecate it... + if not callable(f_or_c) or isinstance(f_or_c, types.ClassType): + warnings.warn("Cannot mark object %r as deprecated" % f_or_c, + DeprecationWarning, stacklevel=2) + return f_or_c + + # If we're deprecating a class, create a subclass of it and + # stub out all the class and static methods + if inspect.isclass(f_or_c): + klass = f_or_c + _stubout(klass, message) + return klass + + # OK, it's a function; use a traditional wrapper... + func = f_or_c + + @functools.wraps(func) + def wrapper(*args, **kwargs): + warn_deprecated_function(func, message) + + return func(*args, **kwargs) + + return wrapper + return decorator + + +def _showwarning(message, category, filename, lineno, file=None, line=None): + """ + Redirect warnings into logging. + """ + + fmtmsg = warnings.formatwarning(message, category, filename, lineno, line) + LOG.warning(fmtmsg) + + +# Install our warnings handler +warnings.showwarning = _showwarning + + +def service_is_up(service): + """Check whether a service is up based on last heartbeat.""" + last_heartbeat = service['updated_at'] or service['created_at'] + # Timestamps in DB are UTC. + elapsed = total_seconds(utcnow() - last_heartbeat) + return abs(elapsed) <= FLAGS.service_down_time + + +def generate_mac_address(): + """Generate an Ethernet MAC address.""" + # NOTE(vish): We would prefer to use 0xfe here to ensure that linux + # bridge mac addresses don't change, but it appears to + # conflict with libvirt, so we use the next highest octet + # that has the unicast and locally administered bits set + # properly: 0xfa. + # Discussion: https://bugs.launchpad.net/cinder/+bug/921838 + mac = [0xfa, 0x16, 0x3e, + random.randint(0x00, 0x7f), + random.randint(0x00, 0xff), + random.randint(0x00, 0xff)] + return ':'.join(map(lambda x: "%02x" % x, mac)) + + +def read_file_as_root(file_path): + """Secure helper to read file as root.""" + try: + out, _err = execute('cat', file_path, run_as_root=True) + return out + except exception.ProcessExecutionError: + raise exception.FileNotFound(file_path=file_path) + + +@contextlib.contextmanager +def temporary_chown(path, owner_uid=None): + """Temporarily chown a path. + + :params owner_uid: UID of temporary owner (defaults to current user) + """ + if owner_uid is None: + owner_uid = os.getuid() + + orig_uid = os.stat(path).st_uid + + if orig_uid != owner_uid: + execute('chown', owner_uid, path, run_as_root=True) + try: + yield + finally: + if orig_uid != owner_uid: + execute('chown', orig_uid, path, run_as_root=True) + + +@contextlib.contextmanager +def tempdir(**kwargs): + tmpdir = tempfile.mkdtemp(**kwargs) + try: + yield tmpdir + finally: + try: + shutil.rmtree(tmpdir) + except OSError, e: + LOG.debug(_('Could not remove tmpdir: %s'), str(e)) + + +def strcmp_const_time(s1, s2): + """Constant-time string comparison. + + :params s1: the first string + :params s2: the second string + + :return: True if the strings are equal. + + This function takes two strings and compares them. It is intended to be + used when doing a comparison for authentication purposes to help guard + against timing attacks. + """ + if len(s1) != len(s2): + return False + result = 0 + for (a, b) in zip(s1, s2): + result |= ord(a) ^ ord(b) + return result == 0 + + +class UndoManager(object): + """Provides a mechanism to facilitate rolling back a series of actions + when an exception is raised. + """ + def __init__(self): + self.undo_stack = [] + + def undo_with(self, undo_func): + self.undo_stack.append(undo_func) + + def _rollback(self): + for undo_func in reversed(self.undo_stack): + undo_func() + + def rollback_and_reraise(self, msg=None, **kwargs): + """Rollback a series of actions then re-raise the exception. + + .. note:: (sirp) This should only be called within an + exception handler. + """ + with save_and_reraise_exception(): + if msg: + LOG.exception(msg, **kwargs) + + self._rollback() diff --git a/cinder/version.py b/cinder/version.py new file mode 100644 index 000000000..45b85c5e8 --- /dev/null +++ b/cinder/version.py @@ -0,0 +1,38 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +CINDER_VERSION = ['2012', '2', None] +YEAR, COUNT, REVISION = CINDER_VERSION +FINAL = False # This becomes true at Release Candidate time + + +def canonical_version_string(): + return '.'.join(filter(None, CINDER_VERSION)) + + +def version_string(): + if FINAL: + return canonical_version_string() + else: + return '%s-dev' % (canonical_version_string(),) + + +def vcs_version_string(): + return 'LOCALBRANCH:LOCALREVISION' + + +def version_string_with_vcs(): + return '%s-%s' % (canonical_version_string(), vcs_version_string()) diff --git a/cinder/volume/__init__.py b/cinder/volume/__init__.py new file mode 100644 index 000000000..e810a93d4 --- /dev/null +++ b/cinder/volume/__init__.py @@ -0,0 +1,25 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +# Importing full names to not pollute the namespace and cause possible +# collisions with use of 'from cinder.volume import <foo>' elsewhere. +import cinder.flags +import cinder.openstack.common.importutils + +API = cinder.openstack.common.importutils.import_class( + cinder.flags.FLAGS.volume_api_class) diff --git a/cinder/volume/api.py b/cinder/volume/api.py new file mode 100644 index 000000000..9c816e95b --- /dev/null +++ b/cinder/volume/api.py @@ -0,0 +1,371 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. + +""" +Handles all requests relating to volumes. +""" + +import functools + +from eventlet import greenthread + +from cinder import exception +from cinder import flags +from cinder import log as logging +import cinder.policy +from cinder import quota +from cinder import rpc +from cinder import utils +from cinder.db import base + +FLAGS = flags.FLAGS +flags.DECLARE('storage_availability_zone', 'cinder.volume.manager') + +LOG = logging.getLogger(__name__) + + +def wrap_check_policy(func): + """Check policy corresponding to the wrapped methods prior to execution + + This decorator requires the first 3 args of the wrapped function + to be (self, context, volume) + """ + @functools.wraps(func) + def wrapped(self, context, target_obj, *args, **kwargs): + check_policy(context, func.__name__, target_obj) + return func(self, context, target_obj, *args, **kwargs) + + return wrapped + + +def check_policy(context, action, target_obj=None): + target = { + 'project_id': context.project_id, + 'user_id': context.user_id, + } + target.update(target_obj or {}) + _action = 'volume:%s' % action + cinder.policy.enforce(context, _action, target) + + +class API(base.Base): + """API for interacting with the volume manager.""" + + def create(self, context, size, name, description, snapshot=None, + volume_type=None, metadata=None, availability_zone=None): + check_policy(context, 'create') + if snapshot is not None: + if snapshot['status'] != "available": + msg = _("status must be available") + raise exception.InvalidSnapshot(reason=msg) + if not size: + size = snapshot['volume_size'] + + snapshot_id = snapshot['id'] + else: + snapshot_id = None + + if quota.allowed_volumes(context, 1, size) < 1: + pid = context.project_id + LOG.warn(_("Quota exceeded for %(pid)s, tried to create" + " %(size)sG volume") % locals()) + raise exception.QuotaError(code="VolumeSizeTooLarge") + + if availability_zone is None: + availability_zone = FLAGS.storage_availability_zone + + if volume_type is None: + volume_type_id = None + else: + volume_type_id = volume_type.get('id', None) + + options = { + 'size': size, + 'user_id': context.user_id, + 'project_id': context.project_id, + 'snapshot_id': snapshot_id, + 'availability_zone': availability_zone, + 'status': "creating", + 'attach_status': "detached", + 'display_name': name, + 'display_description': description, + 'volume_type_id': volume_type_id, + 'metadata': metadata, + } + + volume = self.db.volume_create(context, options) + rpc.cast(context, + FLAGS.scheduler_topic, + {"method": "create_volume", + "args": {"topic": FLAGS.volume_topic, + "volume_id": volume['id'], + "snapshot_id": snapshot_id}}) + return volume + + # TODO(yamahata): eliminate dumb polling + def wait_creation(self, context, volume): + volume_id = volume['id'] + while True: + volume = self.get(context, volume_id) + if volume['status'] != 'creating': + return + greenthread.sleep(1) + + @wrap_check_policy + def delete(self, context, volume): + volume_id = volume['id'] + if not volume['host']: + # NOTE(vish): scheduling failed, so delete it + self.db.volume_destroy(context, volume_id) + return + if volume['status'] not in ["available", "error"]: + msg = _("Volume status must be available or error") + raise exception.InvalidVolume(reason=msg) + + snapshots = self.db.snapshot_get_all_for_volume(context, volume_id) + if len(snapshots): + msg = _("Volume still has %d dependent snapshots") % len(snapshots) + raise exception.InvalidVolume(reason=msg) + + now = utils.utcnow() + self.db.volume_update(context, volume_id, {'status': 'deleting', + 'terminated_at': now}) + host = volume['host'] + rpc.cast(context, + self.db.queue_get_for(context, FLAGS.volume_topic, host), + {"method": "delete_volume", + "args": {"volume_id": volume_id}}) + + @wrap_check_policy + def update(self, context, volume, fields): + self.db.volume_update(context, volume['id'], fields) + + def get(self, context, volume_id): + rv = self.db.volume_get(context, volume_id) + volume = dict(rv.iteritems()) + check_policy(context, 'get', volume) + return volume + + def get_all(self, context, search_opts={}): + check_policy(context, 'get_all') + if context.is_admin: + volumes = self.db.volume_get_all(context) + else: + volumes = self.db.volume_get_all_by_project(context, + context.project_id) + + if search_opts: + LOG.debug(_("Searching by: %s") % str(search_opts)) + + def _check_metadata_match(volume, searchdict): + volume_metadata = {} + for i in volume.get('volume_metadata'): + volume_metadata[i['key']] = i['value'] + + for k, v in searchdict.iteritems(): + if (k not in volume_metadata.keys() or + volume_metadata[k] != v): + return False + return True + + # search_option to filter_name mapping. + filter_mapping = {'metadata': _check_metadata_match} + + result = [] + for volume in volumes: + # go over all filters in the list + for opt, values in search_opts.iteritems(): + try: + filter_func = filter_mapping[opt] + except KeyError: + # no such filter - ignore it, go to next filter + continue + else: + if filter_func(volume, values): + result.append(volume) + break + volumes = result + return volumes + + def get_snapshot(self, context, snapshot_id): + check_policy(context, 'get_snapshot') + rv = self.db.snapshot_get(context, snapshot_id) + return dict(rv.iteritems()) + + def get_all_snapshots(self, context): + check_policy(context, 'get_all_snapshots') + if context.is_admin: + return self.db.snapshot_get_all(context) + return self.db.snapshot_get_all_by_project(context, context.project_id) + + @wrap_check_policy + def check_attach(self, context, volume): + # TODO(vish): abstract status checking? + if volume['status'] != "available": + msg = _("status must be available") + raise exception.InvalidVolume(reason=msg) + if volume['attach_status'] == "attached": + msg = _("already attached") + raise exception.InvalidVolume(reason=msg) + + @wrap_check_policy + def check_detach(self, context, volume): + # TODO(vish): abstract status checking? + if volume['status'] == "available": + msg = _("already detached") + raise exception.InvalidVolume(reason=msg) + + def remove_from_compute(self, context, volume, instance_id, host): + """Remove volume from specified compute host.""" + rpc.call(context, + self.db.queue_get_for(context, FLAGS.compute_topic, host), + {"method": "remove_volume_connection", + "args": {'instance_id': instance_id, + 'volume_id': volume['id']}}) + + @wrap_check_policy + def reserve_volume(self, context, volume): + self.update(context, volume, {"status": "attaching"}) + + @wrap_check_policy + def unreserve_volume(self, context, volume): + if volume['status'] == "attaching": + self.update(context, volume, {"status": "available"}) + + @wrap_check_policy + def attach(self, context, volume, instance_id, mountpoint): + host = volume['host'] + queue = self.db.queue_get_for(context, FLAGS.volume_topic, host) + return rpc.call(context, queue, + {"method": "attach_volume", + "args": {"volume_id": volume['id'], + "instance_id": instance_id, + "mountpoint": mountpoint}}) + + @wrap_check_policy + def detach(self, context, volume): + host = volume['host'] + queue = self.db.queue_get_for(context, FLAGS.volume_topic, host) + return rpc.call(context, queue, + {"method": "detach_volume", + "args": {"volume_id": volume['id']}}) + + @wrap_check_policy + def initialize_connection(self, context, volume, connector): + host = volume['host'] + queue = self.db.queue_get_for(context, FLAGS.volume_topic, host) + return rpc.call(context, queue, + {"method": "initialize_connection", + "args": {"volume_id": volume['id'], + "connector": connector}}) + + @wrap_check_policy + def terminate_connection(self, context, volume, connector): + self.unreserve_volume(context, volume) + host = volume['host'] + queue = self.db.queue_get_for(context, FLAGS.volume_topic, host) + return rpc.call(context, queue, + {"method": "terminate_connection", + "args": {"volume_id": volume['id'], + "connector": connector}}) + + def _create_snapshot(self, context, volume, name, description, + force=False): + check_policy(context, 'create_snapshot', volume) + + if ((not force) and (volume['status'] != "available")): + msg = _("must be available") + raise exception.InvalidVolume(reason=msg) + + options = { + 'volume_id': volume['id'], + 'user_id': context.user_id, + 'project_id': context.project_id, + 'status': "creating", + 'progress': '0%', + 'volume_size': volume['size'], + 'display_name': name, + 'display_description': description} + + snapshot = self.db.snapshot_create(context, options) + host = volume['host'] + rpc.cast(context, + self.db.queue_get_for(context, FLAGS.volume_topic, host), + {"method": "create_snapshot", + "args": {"volume_id": volume['id'], + "snapshot_id": snapshot['id']}}) + return snapshot + + def create_snapshot(self, context, volume, name, description): + return self._create_snapshot(context, volume, name, description, + False) + + def create_snapshot_force(self, context, volume, name, description): + return self._create_snapshot(context, volume, name, description, + True) + + @wrap_check_policy + def delete_snapshot(self, context, snapshot): + if snapshot['status'] not in ["available", "error"]: + msg = _("Volume Snapshot status must be available or error") + raise exception.InvalidVolume(reason=msg) + self.db.snapshot_update(context, snapshot['id'], + {'status': 'deleting'}) + volume = self.db.volume_get(context, snapshot['volume_id']) + host = volume['host'] + rpc.cast(context, + self.db.queue_get_for(context, FLAGS.volume_topic, host), + {"method": "delete_snapshot", + "args": {"snapshot_id": snapshot['id']}}) + + @wrap_check_policy + def get_volume_metadata(self, context, volume): + """Get all metadata associated with a volume.""" + rv = self.db.volume_metadata_get(context, volume['id']) + return dict(rv.iteritems()) + + @wrap_check_policy + def delete_volume_metadata(self, context, volume, key): + """Delete the given metadata item from an volume.""" + self.db.volume_metadata_delete(context, volume['id'], key) + + @wrap_check_policy + def update_volume_metadata(self, context, volume, metadata, delete=False): + """Updates or creates volume metadata. + + If delete is True, metadata items that are not specified in the + `metadata` argument will be deleted. + + """ + if delete: + _metadata = metadata + else: + _metadata = self.get_volume_metadata(context, volume['id']) + _metadata.update(metadata) + + self.db.volume_metadata_update(context, volume['id'], _metadata, True) + return _metadata + + def get_volume_metadata_value(self, volume, key): + """Get value of particular metadata key.""" + metadata = volume.get('volume_metadata') + if metadata: + for i in volume['volume_metadata']: + if i['key'] == key: + return i['value'] + return None diff --git a/cinder/volume/driver.py b/cinder/volume/driver.py new file mode 100644 index 000000000..5e640bd8b --- /dev/null +++ b/cinder/volume/driver.py @@ -0,0 +1,709 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. +""" +Drivers for volumes. + +""" + +import time + +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder import utils +from cinder.volume import iscsi + + +LOG = logging.getLogger(__name__) + +volume_opts = [ + cfg.StrOpt('volume_group', + default='cinder-volumes', + help='Name for the VG that will contain exported volumes'), + cfg.StrOpt('num_shell_tries', + default=3, + help='number of times to attempt to run flakey shell commands'), + cfg.StrOpt('num_iscsi_scan_tries', + default=3, + help='number of times to rescan iSCSI target to find volume'), + cfg.IntOpt('iscsi_num_targets', + default=100, + help='Number of iscsi target ids per host'), + cfg.StrOpt('iscsi_target_prefix', + default='iqn.2010-10.org.openstack:', + help='prefix for iscsi volumes'), + cfg.StrOpt('iscsi_ip_address', + default='$my_ip', + help='use this ip for iscsi'), + cfg.IntOpt('iscsi_port', + default=3260, + help='The port that the iSCSI daemon is listening on'), + cfg.StrOpt('rbd_pool', + default='rbd', + help='the RADOS pool in which rbd volumes are stored'), + cfg.StrOpt('rbd_user', + default=None, + help='the RADOS client name for accessing rbd volumes'), + cfg.StrOpt('rbd_secret_uuid', + default=None, + help='the libvirt uuid of the secret for the rbd_user' + 'volumes'), + ] + +FLAGS = flags.FLAGS +FLAGS.register_opts(volume_opts) + + +class VolumeDriver(object): + """Executes commands relating to Volumes.""" + def __init__(self, execute=utils.execute, *args, **kwargs): + # NOTE(vish): db is set by Manager + self.db = None + self.set_execute(execute) + + def set_execute(self, execute): + self._execute = execute + + def _try_execute(self, *command, **kwargs): + # NOTE(vish): Volume commands can partially fail due to timing, but + # running them a second time on failure will usually + # recover nicely. + tries = 0 + while True: + try: + self._execute(*command, **kwargs) + return True + except exception.ProcessExecutionError: + tries = tries + 1 + if tries >= FLAGS.num_shell_tries: + raise + LOG.exception(_("Recovering from a failed execute. " + "Try number %s"), tries) + time.sleep(tries ** 2) + + def check_for_setup_error(self): + """Returns an error if prerequisites aren't met""" + out, err = self._execute('vgs', '--noheadings', '-o', 'name', + run_as_root=True) + volume_groups = out.split() + if not FLAGS.volume_group in volume_groups: + raise exception.Error(_("volume group %s doesn't exist") + % FLAGS.volume_group) + + def _create_volume(self, volume_name, sizestr): + self._try_execute('lvcreate', '-L', sizestr, '-n', + volume_name, FLAGS.volume_group, run_as_root=True) + + def _copy_volume(self, srcstr, deststr, size_in_g): + self._execute('dd', 'if=%s' % srcstr, 'of=%s' % deststr, + 'count=%d' % (size_in_g * 1024), 'bs=1M', + run_as_root=True) + + def _volume_not_present(self, volume_name): + path_name = '%s/%s' % (FLAGS.volume_group, volume_name) + try: + self._try_execute('lvdisplay', path_name, run_as_root=True) + except Exception as e: + # If the volume isn't present + return True + return False + + def _delete_volume(self, volume, size_in_g): + """Deletes a logical volume.""" + # zero out old volumes to prevent data leaking between users + # TODO(ja): reclaiming space should be done lazy and low priority + self._copy_volume('/dev/zero', self.local_path(volume), size_in_g) + self._try_execute('lvremove', '-f', "%s/%s" % + (FLAGS.volume_group, + self._escape_snapshot(volume['name'])), + run_as_root=True) + + def _sizestr(self, size_in_g): + if int(size_in_g) == 0: + return '100M' + return '%sG' % size_in_g + + # Linux LVM reserves name that starts with snapshot, so that + # such volume name can't be created. Mangle it. + def _escape_snapshot(self, snapshot_name): + if not snapshot_name.startswith('snapshot'): + return snapshot_name + return '_' + snapshot_name + + def create_volume(self, volume): + """Creates a logical volume. Can optionally return a Dictionary of + changes to the volume object to be persisted.""" + self._create_volume(volume['name'], self._sizestr(volume['size'])) + + def create_volume_from_snapshot(self, volume, snapshot): + """Creates a volume from a snapshot.""" + self._create_volume(volume['name'], self._sizestr(volume['size'])) + self._copy_volume(self.local_path(snapshot), self.local_path(volume), + snapshot['volume_size']) + + def delete_volume(self, volume): + """Deletes a logical volume.""" + if self._volume_not_present(volume['name']): + # If the volume isn't present, then don't attempt to delete + return True + + # TODO(yamahata): lvm can't delete origin volume only without + # deleting derived snapshots. Can we do something fancy? + out, err = self._execute('lvdisplay', '--noheading', + '-C', '-o', 'Attr', + '%s/%s' % (FLAGS.volume_group, + volume['name']), + run_as_root=True) + # fake_execute returns None resulting unit test error + if out: + out = out.strip() + if (out[0] == 'o') or (out[0] == 'O'): + raise exception.VolumeIsBusy(volume_name=volume['name']) + + self._delete_volume(volume, volume['size']) + + def create_snapshot(self, snapshot): + """Creates a snapshot.""" + orig_lv_name = "%s/%s" % (FLAGS.volume_group, snapshot['volume_name']) + self._try_execute('lvcreate', '-L', + self._sizestr(snapshot['volume_size']), + '--name', self._escape_snapshot(snapshot['name']), + '--snapshot', orig_lv_name, run_as_root=True) + + def delete_snapshot(self, snapshot): + """Deletes a snapshot.""" + if self._volume_not_present(self._escape_snapshot(snapshot['name'])): + # If the snapshot isn't present, then don't attempt to delete + return True + + # TODO(yamahata): zeroing out the whole snapshot triggers COW. + # it's quite slow. + self._delete_volume(snapshot, snapshot['volume_size']) + + def local_path(self, volume): + # NOTE(vish): stops deprecation warning + escaped_group = FLAGS.volume_group.replace('-', '--') + escaped_name = self._escape_snapshot(volume['name']).replace('-', '--') + return "/dev/mapper/%s-%s" % (escaped_group, escaped_name) + + def ensure_export(self, context, volume): + """Synchronously recreates an export for a logical volume.""" + raise NotImplementedError() + + def create_export(self, context, volume): + """Exports the volume. Can optionally return a Dictionary of changes + to the volume object to be persisted.""" + raise NotImplementedError() + + def remove_export(self, context, volume): + """Removes an export for a logical volume.""" + raise NotImplementedError() + + def check_for_export(self, context, volume_id): + """Make sure volume is exported.""" + raise NotImplementedError() + + def initialize_connection(self, volume, connector): + """Allow connection to connector and return connection info.""" + raise NotImplementedError() + + def terminate_connection(self, volume, connector): + """Disallow connection from connector""" + raise NotImplementedError() + + def get_volume_stats(self, refresh=False): + """Return the current state of the volume service. If 'refresh' is + True, run the update first.""" + return None + + def do_setup(self, context): + """Any initialization the volume driver does while starting""" + pass + + +class ISCSIDriver(VolumeDriver): + """Executes commands relating to ISCSI volumes. + + We make use of model provider properties as follows: + + ``provider_location`` + if present, contains the iSCSI target information in the same + format as an ietadm discovery + i.e. '<ip>:<port>,<portal> <target IQN>' + + ``provider_auth`` + if present, contains a space-separated triple: + '<auth method> <auth username> <auth password>'. + `CHAP` is the only auth_method in use at the moment. + """ + + def __init__(self, *args, **kwargs): + self.tgtadm = iscsi.get_target_admin() + super(ISCSIDriver, self).__init__(*args, **kwargs) + + def set_execute(self, execute): + super(ISCSIDriver, self).set_execute(execute) + self.tgtadm.set_execute(execute) + + def ensure_export(self, context, volume): + """Synchronously recreates an export for a logical volume.""" + try: + iscsi_target = self.db.volume_get_iscsi_target_num(context, + volume['id']) + except exception.NotFound: + LOG.info(_("Skipping ensure_export. No iscsi_target " + "provisioned for volume: %d"), volume['id']) + return + + iscsi_name = "%s%s" % (FLAGS.iscsi_target_prefix, volume['name']) + volume_path = "/dev/%s/%s" % (FLAGS.volume_group, volume['name']) + + self.tgtadm.new_target(iscsi_name, iscsi_target, check_exit_code=False) + self.tgtadm.new_logicalunit(iscsi_target, 0, volume_path, + check_exit_code=False) + + def _ensure_iscsi_targets(self, context, host): + """Ensure that target ids have been created in datastore.""" + host_iscsi_targets = self.db.iscsi_target_count_by_host(context, host) + if host_iscsi_targets >= FLAGS.iscsi_num_targets: + return + # NOTE(vish): Target ids start at 1, not 0. + for target_num in xrange(1, FLAGS.iscsi_num_targets + 1): + target = {'host': host, 'target_num': target_num} + self.db.iscsi_target_create_safe(context, target) + + def create_export(self, context, volume): + """Creates an export for a logical volume.""" + self._ensure_iscsi_targets(context, volume['host']) + iscsi_target = self.db.volume_allocate_iscsi_target(context, + volume['id'], + volume['host']) + iscsi_name = "%s%s" % (FLAGS.iscsi_target_prefix, volume['name']) + volume_path = "/dev/%s/%s" % (FLAGS.volume_group, volume['name']) + + self.tgtadm.new_target(iscsi_name, iscsi_target) + self.tgtadm.new_logicalunit(iscsi_target, 0, volume_path) + + model_update = {} + if FLAGS.iscsi_helper == 'tgtadm': + lun = 1 + else: + lun = 0 + model_update['provider_location'] = _iscsi_location( + FLAGS.iscsi_ip_address, iscsi_target, iscsi_name, lun) + return model_update + + def remove_export(self, context, volume): + """Removes an export for a logical volume.""" + try: + iscsi_target = self.db.volume_get_iscsi_target_num(context, + volume['id']) + except exception.NotFound: + LOG.info(_("Skipping remove_export. No iscsi_target " + "provisioned for volume: %d"), volume['id']) + return + + try: + # ietadm show will exit with an error + # this export has already been removed + self.tgtadm.show_target(iscsi_target) + except Exception as e: + LOG.info(_("Skipping remove_export. No iscsi_target " + "is presently exported for volume: %d"), volume['id']) + return + + self.tgtadm.delete_logicalunit(iscsi_target, 0) + self.tgtadm.delete_target(iscsi_target) + + def _do_iscsi_discovery(self, volume): + #TODO(justinsb): Deprecate discovery and use stored info + #NOTE(justinsb): Discovery won't work with CHAP-secured targets (?) + LOG.warn(_("ISCSI provider_location not stored, using discovery")) + + volume_name = volume['name'] + + (out, _err) = self._execute('iscsiadm', '-m', 'discovery', + '-t', 'sendtargets', '-p', volume['host'], + run_as_root=True) + for target in out.splitlines(): + if FLAGS.iscsi_ip_address in target and volume_name in target: + return target + return None + + def _get_iscsi_properties(self, volume): + """Gets iscsi configuration + + We ideally get saved information in the volume entity, but fall back + to discovery if need be. Discovery may be completely removed in future + The properties are: + + :target_discovered: boolean indicating whether discovery was used + + :target_iqn: the IQN of the iSCSI target + + :target_portal: the portal of the iSCSI target + + :target_lun: the lun of the iSCSI target + + :volume_id: the id of the volume (currently used by xen) + + :auth_method:, :auth_username:, :auth_password: + + the authentication details. Right now, either auth_method is not + present meaning no authentication, or auth_method == `CHAP` + meaning use CHAP with the specified credentials. + """ + + properties = {} + + location = volume['provider_location'] + + if location: + # provider_location is the same format as iSCSI discovery output + properties['target_discovered'] = False + else: + location = self._do_iscsi_discovery(volume) + + if not location: + raise exception.Error(_("Could not find iSCSI export " + " for volume %s") % + (volume['name'])) + + LOG.debug(_("ISCSI Discovery: Found %s") % (location)) + properties['target_discovered'] = True + + results = location.split(" ") + properties['target_portal'] = results[0].split(",")[0] + properties['target_iqn'] = results[1] + try: + properties['target_lun'] = int(results[2]) + except (IndexError, ValueError): + if FLAGS.iscsi_helper == 'tgtadm': + properties['target_lun'] = 1 + else: + properties['target_lun'] = 0 + + properties['volume_id'] = volume['id'] + + auth = volume['provider_auth'] + if auth: + (auth_method, auth_username, auth_secret) = auth.split() + + properties['auth_method'] = auth_method + properties['auth_username'] = auth_username + properties['auth_password'] = auth_secret + + return properties + + def _run_iscsiadm(self, iscsi_properties, iscsi_command): + (out, err) = self._execute('iscsiadm', '-m', 'node', '-T', + iscsi_properties['target_iqn'], + '-p', iscsi_properties['target_portal'], + *iscsi_command, run_as_root=True) + LOG.debug("iscsiadm %s: stdout=%s stderr=%s" % + (iscsi_command, out, err)) + return (out, err) + + def _iscsiadm_update(self, iscsi_properties, property_key, property_value): + iscsi_command = ('--op', 'update', '-n', property_key, + '-v', property_value) + return self._run_iscsiadm(iscsi_properties, iscsi_command) + + def initialize_connection(self, volume, connector): + """Initializes the connection and returns connection info. + + The iscsi driver returns a driver_volume_type of 'iscsi'. + The format of the driver data is defined in _get_iscsi_properties. + Example return value:: + + { + 'driver_volume_type': 'iscsi' + 'data': { + 'target_discovered': True, + 'target_iqn': 'iqn.2010-10.org.openstack:volume-00000001', + 'target_portal': '127.0.0.0.1:3260', + 'volume_id': 1, + } + } + + """ + + iscsi_properties = self._get_iscsi_properties(volume) + return { + 'driver_volume_type': 'iscsi', + 'data': iscsi_properties + } + + def terminate_connection(self, volume, connector): + pass + + def check_for_export(self, context, volume_id): + """Make sure volume is exported.""" + + tid = self.db.volume_get_iscsi_target_num(context, volume_id) + try: + self.tgtadm.show_target(tid) + except exception.ProcessExecutionError, e: + # Instances remount read-only in this case. + # /etc/init.d/iscsitarget restart and rebooting cinder-volume + # is better since ensure_export() works at boot time. + LOG.error(_("Cannot confirm exported volume " + "id:%(volume_id)s.") % locals()) + raise + + +class FakeISCSIDriver(ISCSIDriver): + """Logs calls instead of executing.""" + def __init__(self, *args, **kwargs): + super(FakeISCSIDriver, self).__init__(execute=self.fake_execute, + *args, **kwargs) + + def check_for_setup_error(self): + """No setup necessary in fake mode.""" + pass + + def initialize_connection(self, volume, connector): + return { + 'driver_volume_type': 'iscsi', + 'data': {} + } + + def terminate_connection(self, volume, connector): + pass + + @staticmethod + def fake_execute(cmd, *_args, **_kwargs): + """Execute that simply logs the command.""" + LOG.debug(_("FAKE ISCSI: %s"), cmd) + return (None, None) + + +class RBDDriver(VolumeDriver): + """Implements RADOS block device (RBD) volume commands""" + + def check_for_setup_error(self): + """Returns an error if prerequisites aren't met""" + (stdout, stderr) = self._execute('rados', 'lspools') + pools = stdout.split("\n") + if not FLAGS.rbd_pool in pools: + raise exception.Error(_("rbd has no pool %s") % + FLAGS.rbd_pool) + + def create_volume(self, volume): + """Creates a logical volume.""" + if int(volume['size']) == 0: + size = 100 + else: + size = int(volume['size']) * 1024 + self._try_execute('rbd', '--pool', FLAGS.rbd_pool, + '--size', size, 'create', volume['name']) + + def delete_volume(self, volume): + """Deletes a logical volume.""" + self._try_execute('rbd', '--pool', FLAGS.rbd_pool, + 'rm', volume['name']) + + def create_snapshot(self, snapshot): + """Creates an rbd snapshot""" + self._try_execute('rbd', '--pool', FLAGS.rbd_pool, + 'snap', 'create', '--snap', snapshot['name'], + snapshot['volume_name']) + + def delete_snapshot(self, snapshot): + """Deletes an rbd snapshot""" + self._try_execute('rbd', '--pool', FLAGS.rbd_pool, + 'snap', 'rm', '--snap', snapshot['name'], + snapshot['volume_name']) + + def local_path(self, volume): + """Returns the path of the rbd volume.""" + # This is the same as the remote path + # since qemu accesses it directly. + return "rbd:%s/%s" % (FLAGS.rbd_pool, volume['name']) + + def ensure_export(self, context, volume): + """Synchronously recreates an export for a logical volume.""" + pass + + def create_export(self, context, volume): + """Exports the volume""" + pass + + def remove_export(self, context, volume): + """Removes an export for a logical volume""" + pass + + def initialize_connection(self, volume, connector): + return { + 'driver_volume_type': 'rbd', + 'data': { + 'name': '%s/%s' % (FLAGS.rbd_pool, volume['name']), + 'auth_enabled': FLAGS.rbd_secret_uuid is not None, + 'auth_username': FLAGS.rbd_user, + 'secret_type': 'ceph', + 'secret_uuid': FLAGS.rbd_secret_uuid, + } + } + + def terminate_connection(self, volume, connector): + pass + + +class SheepdogDriver(VolumeDriver): + """Executes commands relating to Sheepdog Volumes""" + + def check_for_setup_error(self): + """Returns an error if prerequisites aren't met""" + try: + #NOTE(francois-charlier) Since 0.24 'collie cluster info -r' + # gives short output, but for compatibility reason we won't + # use it and just check if 'running' is in the output. + (out, err) = self._execute('collie', 'cluster', 'info') + if not 'running' in out.split(): + raise exception.Error(_("Sheepdog is not working: %s") % out) + except exception.ProcessExecutionError: + raise exception.Error(_("Sheepdog is not working")) + + def create_volume(self, volume): + """Creates a sheepdog volume""" + self._try_execute('qemu-img', 'create', + "sheepdog:%s" % volume['name'], + self._sizestr(volume['size'])) + + def create_volume_from_snapshot(self, volume, snapshot): + """Creates a sheepdog volume from a snapshot.""" + self._try_execute('qemu-img', 'create', '-b', + "sheepdog:%s:%s" % (snapshot['volume_name'], + snapshot['name']), + "sheepdog:%s" % volume['name']) + + def delete_volume(self, volume): + """Deletes a logical volume""" + self._try_execute('collie', 'vdi', 'delete', volume['name']) + + def create_snapshot(self, snapshot): + """Creates a sheepdog snapshot""" + self._try_execute('qemu-img', 'snapshot', '-c', snapshot['name'], + "sheepdog:%s" % snapshot['volume_name']) + + def delete_snapshot(self, snapshot): + """Deletes a sheepdog snapshot""" + self._try_execute('collie', 'vdi', 'delete', snapshot['volume_name'], + '-s', snapshot['name']) + + def local_path(self, volume): + return "sheepdog:%s" % volume['name'] + + def ensure_export(self, context, volume): + """Safely and synchronously recreates an export for a logical volume""" + pass + + def create_export(self, context, volume): + """Exports the volume""" + pass + + def remove_export(self, context, volume): + """Removes an export for a logical volume""" + pass + + def initialize_connection(self, volume, connector): + return { + 'driver_volume_type': 'sheepdog', + 'data': { + 'name': volume['name'] + } + } + + def terminate_connection(self, volume, connector): + pass + + +class LoggingVolumeDriver(VolumeDriver): + """Logs and records calls, for unit tests.""" + + def check_for_setup_error(self): + pass + + def create_volume(self, volume): + self.log_action('create_volume', volume) + + def delete_volume(self, volume): + self.log_action('delete_volume', volume) + + def local_path(self, volume): + print "local_path not implemented" + raise NotImplementedError() + + def ensure_export(self, context, volume): + self.log_action('ensure_export', volume) + + def create_export(self, context, volume): + self.log_action('create_export', volume) + + def remove_export(self, context, volume): + self.log_action('remove_export', volume) + + def initialize_connection(self, volume, connector): + self.log_action('initialize_connection', volume) + + def terminate_connection(self, volume, connector): + self.log_action('terminate_connection', volume) + + def check_for_export(self, context, volume_id): + self.log_action('check_for_export', volume_id) + + _LOGS = [] + + @staticmethod + def clear_logs(): + LoggingVolumeDriver._LOGS = [] + + @staticmethod + def log_action(action, parameters): + """Logs the command.""" + LOG.debug(_("LoggingVolumeDriver: %s") % (action)) + log_dictionary = {} + if parameters: + log_dictionary = dict(parameters) + log_dictionary['action'] = action + LOG.debug(_("LoggingVolumeDriver: %s") % (log_dictionary)) + LoggingVolumeDriver._LOGS.append(log_dictionary) + + @staticmethod + def all_logs(): + return LoggingVolumeDriver._LOGS + + @staticmethod + def logs_like(action, **kwargs): + matches = [] + for entry in LoggingVolumeDriver._LOGS: + if entry['action'] != action: + continue + match = True + for k, v in kwargs.iteritems(): + if entry.get(k) != v: + match = False + break + if match: + matches.append(entry) + return matches + + +def _iscsi_location(ip, target, iqn, lun=None): + return "%s:%s,%s %s %s" % (ip, FLAGS.iscsi_port, target, iqn, lun) diff --git a/cinder/volume/iscsi.py b/cinder/volume/iscsi.py new file mode 100644 index 000000000..f79205971 --- /dev/null +++ b/cinder/volume/iscsi.py @@ -0,0 +1,160 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. +""" +Helper code for the iSCSI volume driver. + +""" + +from cinder import flags +from cinder.openstack.common import cfg +from cinder import utils + + +iscsi_helper_opt = cfg.StrOpt('iscsi_helper', + default='ietadm', + help='iscsi target user-land tool to use') + +FLAGS = flags.FLAGS +FLAGS.register_opt(iscsi_helper_opt) + + +class TargetAdmin(object): + """iSCSI target administration. + + Base class for iSCSI target admin helpers. + """ + + def __init__(self, cmd, execute): + self._cmd = cmd + self.set_execute(execute) + + def set_execute(self, execute): + """Set the function to be used to execute commands.""" + self._execute = execute + + def _run(self, *args, **kwargs): + self._execute(self._cmd, *args, run_as_root=True, **kwargs) + + def new_target(self, name, tid, **kwargs): + """Create a new iSCSI target.""" + raise NotImplementedError() + + def delete_target(self, tid, **kwargs): + """Delete a target.""" + raise NotImplementedError() + + def show_target(self, tid, **kwargs): + """Query the given target ID.""" + raise NotImplementedError() + + def new_logicalunit(self, tid, lun, path, **kwargs): + """Create a new LUN on a target using the supplied path.""" + raise NotImplementedError() + + def delete_logicalunit(self, tid, lun, **kwargs): + """Delete a logical unit from a target.""" + raise NotImplementedError() + + +class TgtAdm(TargetAdmin): + """iSCSI target administration using tgtadm.""" + + def __init__(self, execute=utils.execute): + super(TgtAdm, self).__init__('tgtadm', execute) + + def new_target(self, name, tid, **kwargs): + self._run('--op', 'new', + '--lld=iscsi', '--mode=target', + '--tid=%s' % tid, + '--targetname=%s' % name, + **kwargs) + self._run('--op', 'bind', + '--lld=iscsi', '--mode=target', + '--initiator-address=ALL', + '--tid=%s' % tid, + **kwargs) + + def delete_target(self, tid, **kwargs): + self._run('--op', 'delete', + '--lld=iscsi', '--mode=target', + '--tid=%s' % tid, + **kwargs) + + def show_target(self, tid, **kwargs): + self._run('--op', 'show', + '--lld=iscsi', '--mode=target', + '--tid=%s' % tid, + **kwargs) + + def new_logicalunit(self, tid, lun, path, **kwargs): + self._run('--op', 'new', + '--lld=iscsi', '--mode=logicalunit', + '--tid=%s' % tid, + '--lun=%d' % (lun + 1), # lun0 is reserved + '--backing-store=%s' % path, + **kwargs) + + def delete_logicalunit(self, tid, lun, **kwargs): + self._run('--op', 'delete', + '--lld=iscsi', '--mode=logicalunit', + '--tid=%s' % tid, + '--lun=%d' % (lun + 1), + **kwargs) + + +class IetAdm(TargetAdmin): + """iSCSI target administration using ietadm.""" + + def __init__(self, execute=utils.execute): + super(IetAdm, self).__init__('ietadm', execute) + + def new_target(self, name, tid, **kwargs): + self._run('--op', 'new', + '--tid=%s' % tid, + '--params', 'Name=%s' % name, + **kwargs) + + def delete_target(self, tid, **kwargs): + self._run('--op', 'delete', + '--tid=%s' % tid, + **kwargs) + + def show_target(self, tid, **kwargs): + self._run('--op', 'show', + '--tid=%s' % tid, + **kwargs) + + def new_logicalunit(self, tid, lun, path, **kwargs): + self._run('--op', 'new', + '--tid=%s' % tid, + '--lun=%d' % lun, + '--params', 'Path=%s,Type=fileio' % path, + **kwargs) + + def delete_logicalunit(self, tid, lun, **kwargs): + self._run('--op', 'delete', + '--tid=%s' % tid, + '--lun=%d' % lun, + **kwargs) + + +def get_target_admin(): + if FLAGS.iscsi_helper == 'tgtadm': + return TgtAdm() + else: + return IetAdm() diff --git a/cinder/volume/manager.py b/cinder/volume/manager.py new file mode 100644 index 000000000..efb2eabf4 --- /dev/null +++ b/cinder/volume/manager.py @@ -0,0 +1,331 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# 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. +""" +Volume manager manages creating, attaching, detaching, and persistent storage. + +Persistant storage volumes keep their state independent of instances. You can +attach to an instance, terminate the instance, spawn a new instance (even +one from a different image) and re-attach the volume with the same data +intact. + +**Related Flags** + +:volume_topic: What :mod:`rpc` topic to listen to (default: `volume`). +:volume_manager: The module name of a class derived from + :class:`manager.Manager` (default: + :class:`cinder.volume.manager.Manager`). +:storage_availability_zone: Defaults to `cinder`. +:volume_driver: Used by :class:`Manager`. Defaults to + :class:`cinder.volume.driver.ISCSIDriver`. +:volume_group: Name of the group that will contain exported volumes (default: + `cinder-volumes`) +:num_shell_tries: Number of times to attempt to run commands (default: 3) + +""" + +from cinder import context +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder import manager +from cinder.openstack.common import cfg +from cinder.openstack.common import importutils +from cinder import rpc +from cinder import utils +from cinder.volume import volume_types + + +LOG = logging.getLogger(__name__) + +volume_manager_opts = [ + cfg.StrOpt('storage_availability_zone', + default='cinder', + help='availability zone of this service'), + cfg.StrOpt('volume_driver', + default='cinder.volume.driver.ISCSIDriver', + help='Driver to use for volume creation'), + cfg.BoolOpt('use_local_volumes', + default=True, + help='if True, will not discover local volumes'), + cfg.BoolOpt('volume_force_update_capabilities', + default=False, + help='if True will force update capabilities on each check'), + ] + +FLAGS = flags.FLAGS +FLAGS.register_opts(volume_manager_opts) + + +class VolumeManager(manager.SchedulerDependentManager): + """Manages attachable block storage devices.""" + def __init__(self, volume_driver=None, *args, **kwargs): + """Load the driver from the one specified in args, or from flags.""" + if not volume_driver: + volume_driver = FLAGS.volume_driver + self.driver = importutils.import_object(volume_driver) + super(VolumeManager, self).__init__(service_name='volume', + *args, **kwargs) + # NOTE(vish): Implementation specific db handling is done + # by the driver. + self.driver.db = self.db + self._last_volume_stats = [] + + def init_host(self): + """Do any initialization that needs to be run if this is a + standalone service.""" + + ctxt = context.get_admin_context() + self.driver.do_setup(ctxt) + self.driver.check_for_setup_error() + + volumes = self.db.volume_get_all_by_host(ctxt, self.host) + LOG.debug(_("Re-exporting %s volumes"), len(volumes)) + for volume in volumes: + if volume['status'] in ['available', 'in-use']: + self.driver.ensure_export(ctxt, volume) + else: + LOG.info(_("volume %s: skipping export"), volume['name']) + + def create_volume(self, context, volume_id, snapshot_id=None): + """Creates and exports the volume.""" + context = context.elevated() + volume_ref = self.db.volume_get(context, volume_id) + LOG.info(_("volume %s: creating"), volume_ref['name']) + + self.db.volume_update(context, + volume_id, + {'host': self.host}) + # NOTE(vish): so we don't have to get volume from db again + # before passing it to the driver. + volume_ref['host'] = self.host + + try: + vol_name = volume_ref['name'] + vol_size = volume_ref['size'] + LOG.debug(_("volume %(vol_name)s: creating lv of" + " size %(vol_size)sG") % locals()) + if snapshot_id is None: + model_update = self.driver.create_volume(volume_ref) + else: + snapshot_ref = self.db.snapshot_get(context, snapshot_id) + model_update = self.driver.create_volume_from_snapshot( + volume_ref, + snapshot_ref) + if model_update: + self.db.volume_update(context, volume_ref['id'], model_update) + + LOG.debug(_("volume %s: creating export"), volume_ref['name']) + model_update = self.driver.create_export(context, volume_ref) + if model_update: + self.db.volume_update(context, volume_ref['id'], model_update) + except Exception: + with utils.save_and_reraise_exception(): + self.db.volume_update(context, + volume_ref['id'], {'status': 'error'}) + + now = utils.utcnow() + self.db.volume_update(context, + volume_ref['id'], {'status': 'available', + 'launched_at': now}) + LOG.debug(_("volume %s: created successfully"), volume_ref['name']) + self._reset_stats() + return volume_id + + def delete_volume(self, context, volume_id): + """Deletes and unexports volume.""" + context = context.elevated() + volume_ref = self.db.volume_get(context, volume_id) + if volume_ref['attach_status'] == "attached": + raise exception.Error(_("Volume is still attached")) + if volume_ref['host'] != self.host: + raise exception.Error(_("Volume is not local to this node")) + + self._reset_stats() + try: + LOG.debug(_("volume %s: removing export"), volume_ref['name']) + self.driver.remove_export(context, volume_ref) + LOG.debug(_("volume %s: deleting"), volume_ref['name']) + self.driver.delete_volume(volume_ref) + except exception.VolumeIsBusy, e: + LOG.debug(_("volume %s: volume is busy"), volume_ref['name']) + self.driver.ensure_export(context, volume_ref) + self.db.volume_update(context, volume_ref['id'], + {'status': 'available'}) + return True + except Exception: + with utils.save_and_reraise_exception(): + self.db.volume_update(context, + volume_ref['id'], + {'status': 'error_deleting'}) + + self.db.volume_destroy(context, volume_id) + LOG.debug(_("volume %s: deleted successfully"), volume_ref['name']) + return True + + def create_snapshot(self, context, volume_id, snapshot_id): + """Creates and exports the snapshot.""" + context = context.elevated() + snapshot_ref = self.db.snapshot_get(context, snapshot_id) + LOG.info(_("snapshot %s: creating"), snapshot_ref['name']) + + try: + snap_name = snapshot_ref['name'] + LOG.debug(_("snapshot %(snap_name)s: creating") % locals()) + model_update = self.driver.create_snapshot(snapshot_ref) + if model_update: + self.db.snapshot_update(context, snapshot_ref['id'], + model_update) + + except Exception: + with utils.save_and_reraise_exception(): + self.db.snapshot_update(context, + snapshot_ref['id'], + {'status': 'error'}) + + self.db.snapshot_update(context, + snapshot_ref['id'], {'status': 'available', + 'progress': '100%'}) + LOG.debug(_("snapshot %s: created successfully"), snapshot_ref['name']) + return snapshot_id + + def delete_snapshot(self, context, snapshot_id): + """Deletes and unexports snapshot.""" + context = context.elevated() + snapshot_ref = self.db.snapshot_get(context, snapshot_id) + + try: + LOG.debug(_("snapshot %s: deleting"), snapshot_ref['name']) + self.driver.delete_snapshot(snapshot_ref) + except exception.SnapshotIsBusy: + LOG.debug(_("snapshot %s: snapshot is busy"), snapshot_ref['name']) + self.db.snapshot_update(context, + snapshot_ref['id'], + {'status': 'available'}) + return True + except Exception: + with utils.save_and_reraise_exception(): + self.db.snapshot_update(context, + snapshot_ref['id'], + {'status': 'error_deleting'}) + + self.db.snapshot_destroy(context, snapshot_id) + LOG.debug(_("snapshot %s: deleted successfully"), snapshot_ref['name']) + return True + + def attach_volume(self, context, volume_id, instance_id, mountpoint): + """Updates db to show volume is attached""" + # TODO(vish): refactor this into a more general "reserve" + self.db.volume_attached(context, + volume_id, + instance_id, + mountpoint) + + def detach_volume(self, context, volume_id): + """Updates db to show volume is detached""" + # TODO(vish): refactor this into a more general "unreserve" + self.db.volume_detached(context, volume_id) + + def initialize_connection(self, context, volume_id, connector): + """Prepare volume for connection from host represented by connector. + + This method calls the driver initialize_connection and returns + it to the caller. The connector parameter is a dictionary with + information about the host that will connect to the volume in the + following format:: + + { + 'ip': ip, + 'initiator': initiator, + } + + ip: the ip address of the connecting machine + + initiator: the iscsi initiator name of the connecting machine. + This can be None if the connecting machine does not support iscsi + connections. + + driver is responsible for doing any necessary security setup and + returning a connection_info dictionary in the following format:: + + { + 'driver_volume_type': driver_volume_type, + 'data': data, + } + + driver_volume_type: a string to identify the type of volume. This + can be used by the calling code to determine the + strategy for connecting to the volume. This could + be 'iscsi', 'rbd', 'sheepdog', etc. + + data: this is the data that the calling code will use to connect + to the volume. Keep in mind that this will be serialized to + json in various places, so it should not contain any non-json + data types. + """ + volume_ref = self.db.volume_get(context, volume_id) + return self.driver.initialize_connection(volume_ref, connector) + + def terminate_connection(self, context, volume_id, connector): + """Cleanup connection from host represented by connector. + + The format of connector is the same as for initialize_connection. + """ + volume_ref = self.db.volume_get(context, volume_id) + self.driver.terminate_connection(volume_ref, connector) + + def check_for_export(self, context, instance_id): + """Make sure whether volume is exported.""" + volumes = self.db.volume_get_all_by_instance(context, instance_id) + for volume in volumes: + self.driver.check_for_export(context, volume['id']) + + def _volume_stats_changed(self, stat1, stat2): + if FLAGS.volume_force_update_capabilities: + return True + if len(stat1) != len(stat2): + return True + for (k, v) in stat1.iteritems(): + if (k, v) not in stat2.iteritems(): + return True + return False + + @manager.periodic_task + def _report_driver_status(self, context): + volume_stats = self.driver.get_volume_stats(refresh=True) + if volume_stats: + LOG.info(_("Checking volume capabilities")) + + if self._volume_stats_changed(self._last_volume_stats, + volume_stats): + LOG.info(_("New capabilities found: %s"), volume_stats) + self._last_volume_stats = volume_stats + + # This will grab info about the host and queue it + # to be sent to the Schedulers. + self.update_service_capabilities(self._last_volume_stats) + else: + # avoid repeating fanouts + self.update_service_capabilities(None) + + def _reset_stats(self): + LOG.info(_("Clear capabilities")) + self._last_volume_stats = [] + + def notification(self, context, event): + LOG.info(_("Notification {%s} received"), event) + self._reset_stats() diff --git a/cinder/volume/netapp.py b/cinder/volume/netapp.py new file mode 100644 index 000000000..17f2f24f2 --- /dev/null +++ b/cinder/volume/netapp.py @@ -0,0 +1,676 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2012 NetApp, Inc. +# Copyright (c) 2012 OpenStack LLC. +# 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. +""" +Volume driver for NetApp storage systems. + +This driver requires NetApp OnCommand 5.0 and one or more Data +ONTAP 7-mode storage systems with installed iSCSI licenses. + +""" + +import time +import string + +import suds +from suds import client +from suds.sax import text + +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder.volume import driver + +LOG = logging.getLogger("cinder.volume.driver") + +netapp_opts = [ + cfg.StrOpt('netapp_wsdl_url', + default=None, + help='URL of the WSDL file for the DFM server'), + cfg.StrOpt('netapp_login', + default=None, + help='User name for the DFM server'), + cfg.StrOpt('netapp_password', + default=None, + help='Password for the DFM server'), + cfg.StrOpt('netapp_server_hostname', + default=None, + help='Hostname for the DFM server'), + cfg.IntOpt('netapp_server_port', + default=8088, + help='Port number for the DFM server'), + cfg.StrOpt('netapp_storage_service', + default=None, + help='Storage service to use for provisioning'), + cfg.StrOpt('netapp_vfiler', + default=None, + help='Vfiler to use for provisioning'), + ] + +FLAGS = flags.FLAGS +FLAGS.register_opts(netapp_opts) + + +class NetAppISCSIDriver(driver.ISCSIDriver): + """NetApp iSCSI volume driver.""" + + def __init__(self, *args, **kwargs): + super(NetAppISCSIDriver, self).__init__(*args, **kwargs) + + def _check_fail(self, request, response): + if 'failed' == response.Status: + name = request.Name + reason = response.Reason + msg = _('API %(name)sfailed: %(reason)s') + raise exception.Error(msg % locals()) + + def _create_client(self, wsdl_url, login, password, hostname, port): + """ + Instantiate a "suds" client to make web services calls to the + DFM server. Note that the WSDL file is quite large and may take + a few seconds to parse. + """ + self.client = client.Client(wsdl_url, + username=login, + password=password) + soap_url = 'http://%s:%s/apis/soap/v1' % (hostname, port) + self.client.set_options(location=soap_url) + + def _set_storage_service(self, storage_service): + """Set the storage service to use for provisioning""" + self.storage_service = storage_service + + def _set_vfiler(self, vfiler): + """Set the vfiler to use for provisioning""" + self.vfiler = vfiler + + def _check_flags(self): + """Ensure that the flags we care about are set.""" + required_flags = ['netapp_wsdl_url', 'netapp_login', 'netapp_password', + 'netapp_server_hostname', 'netapp_server_port', + 'netapp_storage_service'] + for flag in required_flags: + if not getattr(FLAGS, flag, None): + raise exception.Error(_('%s is not set') % flag) + + def do_setup(self, context): + """ + Called one time by the manager after the driver is loaded. + Validate the flags we care about and setup the suds (web services) + client. + """ + self._check_flags() + self._create_client(FLAGS.netapp_wsdl_url, FLAGS.netapp_login, + FLAGS.netapp_password, FLAGS.netapp_server_hostname, + FLAGS.netapp_server_port) + self._set_storage_service(FLAGS.netapp_storage_service) + if FLAGS.netapp_vfiler: + self._set_vfiler(FLAGS.netapp_vfiler) + + def check_for_setup_error(self): + """Invoke a web services API to make sure we can talk to the server.""" + res = self.client.service.DfmAbout() + LOG.debug(_("Connected to DFM server")) + + def _get_job_progress(self, job_id): + """ + Obtain the latest progress report for the job and return the + list of progress events. + """ + server = self.client.service + res = server.DpJobProgressEventListIterStart(JobId=job_id) + tag = res.Tag + event_list = [] + try: + while True: + res = server.DpJobProgressEventListIterNext(Tag=tag, + Maximum=100) + if not hasattr(res, 'ProgressEvents'): + break + event_list += res.ProgressEvents.DpJobProgressEventInfo + finally: + server.DpJobProgressEventListIterEnd(Tag=tag) + return event_list + + def _wait_for_job(self, job_id): + """ + Poll the job until it completes or an error is detected. Return the + final list of progress events if it completes successfully. + """ + while True: + events = self._get_job_progress(job_id) + for event in events: + if event.EventStatus == 'error': + raise exception.Error(_('Job failed: %s') % + (event.ErrorMessage)) + if event.EventType == 'job-end': + return events + time.sleep(5) + + def _dataset_name(self, project): + """Return the dataset name for a given project """ + _project = string.replace(string.replace(project, ' ', '_'), '-', '_') + return 'OpenStack_' + _project + + def _does_dataset_exist(self, dataset_name): + """Check if a dataset already exists""" + server = self.client.service + try: + res = server.DatasetListInfoIterStart(ObjectNameOrId=dataset_name) + tag = res.Tag + except suds.WebFault: + return False + try: + res = server.DatasetListInfoIterNext(Tag=tag, Maximum=1) + if hasattr(res, 'Datasets') and res.Datasets.DatasetInfo: + return True + finally: + server.DatasetListInfoIterEnd(Tag=tag) + return False + + def _create_dataset(self, dataset_name): + """ + Create a new dataset using the storage service. The export settings are + set to create iSCSI LUNs aligned for Linux. + """ + server = self.client.service + + lunmap = self.client.factory.create('DatasetLunMappingInfo') + lunmap.IgroupOsType = 'linux' + export = self.client.factory.create('DatasetExportInfo') + export.DatasetExportProtocol = 'iscsi' + export.DatasetLunMappingInfo = lunmap + detail = self.client.factory.create('StorageSetInfo') + detail.DpNodeName = 'Primary data' + detail.DatasetExportInfo = export + if hasattr(self, 'vfiler'): + detail.ServerNameOrId = self.vfiler + details = self.client.factory.create('ArrayOfStorageSetInfo') + details.StorageSetInfo = [detail] + + server.StorageServiceDatasetProvision( + StorageServiceNameOrId=self.storage_service, + DatasetName=dataset_name, + AssumeConfirmation=True, + StorageSetDetails=details) + + def _provision(self, name, description, project, size): + """ + Provision a LUN through provisioning manager. The LUN will be created + inside a dataset associated with the project. If the dataset doesn't + already exist, we create it using the storage service specified in the + cinder conf. + """ + + dataset_name = self._dataset_name(project) + if not self._does_dataset_exist(dataset_name): + self._create_dataset(dataset_name) + + info = self.client.factory.create('ProvisionMemberRequestInfo') + info.Name = name + if description: + info.Description = description + info.Size = size + info.MaximumSnapshotSpace = 2 * long(size) + + server = self.client.service + lock_id = server.DatasetEditBegin(DatasetNameOrId=dataset_name) + try: + server.DatasetProvisionMember(EditLockId=lock_id, + ProvisionMemberRequestInfo=info) + res = server.DatasetEditCommit(EditLockId=lock_id, + AssumeConfirmation=True) + except (suds.WebFault, Exception): + server.DatasetEditRollback(EditLockId=lock_id) + raise exception.Error(_('Failed to provision dataset member')) + + lun_id = None + + for info in res.JobIds.JobInfo: + events = self._wait_for_job(info.JobId) + for event in events: + if event.EventType != 'lun-create': + continue + lun_id = event.ProgressLunInfo.LunPathId + + if not lun_id: + raise exception.Error(_('No LUN was created by the provision job')) + + def _remove_destroy(self, name, project): + """ + Remove the LUN from the dataset and destroy the actual LUN on the + storage system. + """ + lun_id = self._get_lun_id(name, project) + if not lun_id: + raise exception.Error(_("Failed to find LUN ID for volume %s") % + (name)) + + member = self.client.factory.create('DatasetMemberParameter') + member.ObjectNameOrId = lun_id + members = self.client.factory.create('ArrayOfDatasetMemberParameter') + members.DatasetMemberParameter = [member] + + dataset_name = self._dataset_name(project) + + server = self.client.service + lock_id = server.DatasetEditBegin(DatasetNameOrId=dataset_name) + try: + server.DatasetRemoveMember(EditLockId=lock_id, Destroy=True, + DatasetMemberParameters=members) + server.DatasetEditCommit(EditLockId=lock_id, + AssumeConfirmation=True) + except (suds.WebFault, Exception): + server.DatasetEditRollback(EditLockId=lock_id) + msg = _('Failed to remove and delete dataset member') + raise exception.Error(msg) + + def create_volume(self, volume): + """Driver entry point for creating a new volume""" + default_size = '104857600' # 100 MB + gigabytes = 1073741824L # 2^30 + name = volume['name'] + project = volume['project_id'] + display_name = volume['display_name'] + display_description = volume['display_description'] + if display_name: + if display_description: + description = display_name + "\n" + display_description + else: + description = display_name + elif display_description: + description = display_description + if int(volume['size']) == 0: + size = default_size + else: + size = str(int(volume['size']) * gigabytes) + self._provision(name, description, project, size) + + def delete_volume(self, volume): + """Driver entry point for destroying existing volumes""" + name = volume['name'] + project = volume['project_id'] + self._remove_destroy(name, project) + + def _get_lun_id(self, name, project): + """ + Given the name of a volume, find the DFM (OnCommand) ID of the LUN + corresponding to that volume. Currently we do this by enumerating + all of the LUNs in the dataset and matching the names against the + OpenStack volume name. + + This could become a performance bottleneck in very large installations + in which case possible options for mitigating the problem are: + 1) Store the LUN ID alongside the volume in the cinder DB (if possible) + 2) Cache the list of LUNs in the dataset in driver memory + 3) Store the volume to LUN ID mappings in a local file + """ + dataset_name = self._dataset_name(project) + + server = self.client.service + res = server.DatasetMemberListInfoIterStart( + DatasetNameOrId=dataset_name, + IncludeExportsInfo=True, + IncludeIndirect=True, + MemberType='lun_path') + tag = res.Tag + suffix = '/' + name + try: + while True: + res = server.DatasetMemberListInfoIterNext(Tag=tag, + Maximum=100) + if (not hasattr(res, 'DatasetMembers') or + not res.DatasetMembers): + break + for member in res.DatasetMembers.DatasetMemberInfo: + if member.MemberName.endswith(suffix): + return member.MemberId + finally: + server.DatasetMemberListInfoIterEnd(Tag=tag) + + def _get_lun_details(self, lun_id): + """Given the ID of a LUN, get the details about that LUN""" + server = self.client.service + res = server.LunListInfoIterStart(ObjectNameOrId=lun_id) + tag = res.Tag + try: + res = server.LunListInfoIterNext(Tag=tag, Maximum=1) + if hasattr(res, 'Luns') and res.Luns.LunInfo: + return res.Luns.LunInfo[0] + finally: + server.LunListInfoIterEnd(Tag=tag) + + def _get_host_details(self, host_id): + """ + Given the ID of a host (storage system), get the details about that + host. + """ + server = self.client.service + res = server.HostListInfoIterStart(ObjectNameOrId=host_id) + tag = res.Tag + try: + res = server.HostListInfoIterNext(Tag=tag, Maximum=1) + if hasattr(res, 'Hosts') and res.Hosts.HostInfo: + return res.Hosts.HostInfo[0] + finally: + server.HostListInfoIterEnd(Tag=tag) + + def _get_iqn_for_host(self, host_id): + """Get the iSCSI Target Name for a storage system""" + request = self.client.factory.create('Request') + request.Name = 'iscsi-node-get-name' + response = self.client.service.ApiProxy(Target=host_id, + Request=request) + self._check_fail(request, response) + return response.Results['node-name'][0] + + def _api_elem_is_empty(self, elem): + """ + Helper routine to figure out if a list returned from a proxy API + is empty. This is necessary because the API proxy produces nasty + looking XML. + """ + if not type(elem) is list: + return True + if 0 == len(elem): + return True + child = elem[0] + if isinstance(child, text.Text): + return True + if type(child) is str: + return True + return False + + def _get_target_portal_for_host(self, host_id, host_address): + """ + Get the iSCSI Target Portal details for a particular IP address + on a storage system. + """ + request = self.client.factory.create('Request') + request.Name = 'iscsi-portal-list-info' + response = self.client.service.ApiProxy(Target=host_id, + Request=request) + self._check_fail(request, response) + portal = {} + portals = response.Results['iscsi-portal-list-entries'] + if self._api_elem_is_empty(portals): + return portal + portal_infos = portals[0]['iscsi-portal-list-entry-info'] + for portal_info in portal_infos: + portal['address'] = portal_info['ip-address'][0] + portal['port'] = portal_info['ip-port'][0] + portal['portal'] = portal_info['tpgroup-tag'][0] + if host_address == portal['address']: + break + return portal + + def _get_export(self, volume): + """ + Looks up the LUN in DFM based on the volume and project name, then get + the LUN's ID. We store that value in the database instead of the iSCSI + details because we will not have the true iSCSI details until masking + time (when initialize_connection() is called). + """ + name = volume['name'] + project = volume['project_id'] + lun_id = self._get_lun_id(name, project) + if not lun_id: + msg = _("Failed to find LUN ID for volume %s") + raise exception.Error(msg % name) + return {'provider_location': lun_id} + + def ensure_export(self, context, volume): + """ + Driver entry point to get the iSCSI details about an existing volume + """ + return self._get_export(volume) + + def create_export(self, context, volume): + """ + Driver entry point to get the iSCSI details about a new volume + """ + return self._get_export(volume) + + def remove_export(self, context, volume): + """ + Since exporting is idempotent in this driver, we have nothing + to do for unexporting. + """ + pass + + def _find_igroup_for_initiator(self, host_id, initiator_name): + """ + Look for an existing igroup (initiator group) on the storage system + containing a given iSCSI initiator and return the name of the igroup. + """ + request = self.client.factory.create('Request') + request.Name = 'igroup-list-info' + response = self.client.service.ApiProxy(Target=host_id, + Request=request) + self._check_fail(request, response) + igroups = response.Results['initiator-groups'] + if self._api_elem_is_empty(igroups): + return None + igroup_infos = igroups[0]['initiator-group-info'] + for igroup_info in igroup_infos: + if ('iscsi' != igroup_info['initiator-group-type'][0] or + 'linux' != igroup_info['initiator-group-os-type'][0]): + continue + igroup_name = igroup_info['initiator-group-name'][0] + if not igroup_name.startswith('openstack-'): + continue + initiators = igroup_info['initiators'][0]['initiator-info'] + for initiator in initiators: + if initiator_name == initiator['initiator-name'][0]: + return igroup_name + return None + + def _create_igroup(self, host_id, initiator_name): + """ + Create a new igroup (initiator group) on the storage system to hold + the given iSCSI initiator. The group will only have 1 member and will + be named "openstack-${initiator_name}". + """ + igroup_name = 'openstack-' + initiator_name + request = self.client.factory.create('Request') + request.Name = 'igroup-create' + igroup_create_xml = ( + '<initiator-group-name>%s</initiator-group-name>' + '<initiator-group-type>iscsi</initiator-group-type>' + '<os-type>linux</os-type><ostype>linux</ostype>') + request.Args = text.Raw(igroup_create_xml % igroup_name) + response = self.client.service.ApiProxy(Target=host_id, + Request=request) + self._check_fail(request, response) + request = self.client.factory.create('Request') + request.Name = 'igroup-add' + igroup_add_xml = ( + '<initiator-group-name>%s</initiator-group-name>' + '<initiator>%s</initiator>') + request.Args = text.Raw(igroup_add_xml % (igroup_name, initiator_name)) + response = self.client.service.ApiProxy(Target=host_id, + Request=request) + self._check_fail(request, response) + return igroup_name + + def _get_lun_mappping(self, host_id, lunpath, igroup_name): + """ + Check if a given LUN is already mapped to the given igroup (initiator + group). If the LUN is mapped, also return the LUN number for the + mapping. + """ + request = self.client.factory.create('Request') + request.Name = 'lun-map-list-info' + request.Args = text.Raw('<path>%s</path>' % (lunpath)) + response = self.client.service.ApiProxy(Target=host_id, + Request=request) + self._check_fail(request, response) + igroups = response.Results['initiator-groups'] + if self._api_elem_is_empty(igroups): + return {'mapped': False} + igroup_infos = igroups[0]['initiator-group-info'] + for igroup_info in igroup_infos: + if igroup_name == igroup_info['initiator-group-name'][0]: + return {'mapped': True, 'lun_num': igroup_info['lun-id'][0]} + return {'mapped': False} + + def _map_initiator(self, host_id, lunpath, igroup_name): + """ + Map the given LUN to the given igroup (initiator group). Return the LUN + number that the LUN was mapped to (the filer will choose the lowest + available number). + """ + request = self.client.factory.create('Request') + request.Name = 'lun-map' + lun_map_xml = ('<initiator-group>%s</initiator-group>' + '<path>%s</path>') + request.Args = text.Raw(lun_map_xml % (igroup_name, lunpath)) + response = self.client.service.ApiProxy(Target=host_id, + Request=request) + self._check_fail(request, response) + return response.Results['lun-id-assigned'][0] + + def _unmap_initiator(self, host_id, lunpath, igroup_name): + """Unmap the given LUN from the given igroup (initiator group).""" + request = self.client.factory.create('Request') + request.Name = 'lun-unmap' + lun_unmap_xml = ('<initiator-group>%s</initiator-group>' + '<path>%s</path>') + request.Args = text.Raw(lun_unmap_xml % (igroup_name, lunpath)) + response = self.client.service.ApiProxy(Target=host_id, + Request=request) + self._check_fail(request, response) + + def _ensure_initiator_mapped(self, host_id, lunpath, initiator_name): + """ + Check if a LUN is mapped to a given initiator already and create + the mapping if it is not. A new igroup will be created if needed. + Returns the LUN number for the mapping between the LUN and initiator + in both cases. + """ + lunpath = '/vol/' + lunpath + igroup_name = self._find_igroup_for_initiator(host_id, initiator_name) + if not igroup_name: + igroup_name = self._create_igroup(host_id, initiator_name) + + mapping = self._get_lun_mappping(host_id, lunpath, igroup_name) + if mapping['mapped']: + return mapping['lun_num'] + return self._map_initiator(host_id, lunpath, igroup_name) + + def _ensure_initiator_unmapped(self, host_id, lunpath, initiator_name): + """ + Check if a LUN is mapped to a given initiator and remove the + mapping if it is. This does not destroy the igroup. + """ + lunpath = '/vol/' + lunpath + igroup_name = self._find_igroup_for_initiator(host_id, initiator_name) + if not igroup_name: + return + + mapping = self._get_lun_mappping(host_id, lunpath, igroup_name) + if mapping['mapped']: + self._unmap_initiator(host_id, lunpath, igroup_name) + + def initialize_connection(self, volume, connector): + """ + Do the LUN masking on the storage system so the initiator can access + the LUN on the target. Also return the iSCSI properties so the + initiator can find the LUN. This implementation does not call + _get_iscsi_properties() to get the properties because cannot store the + LUN number in the database. We only find out what the LUN number will + be during this method call so we construct the properties dictionary + ourselves. + """ + initiator_name = connector['initiator'] + lun_id = volume['provider_location'] + if not lun_id: + msg = _("No LUN ID for volume %s") + raise exception.Error(msg % volume['name']) + lun = self._get_lun_details(lun_id) + if not lun: + msg = _('Failed to get LUN details for LUN ID %s') + raise exception.Error(msg % lun_id) + lun_num = self._ensure_initiator_mapped(lun.HostId, lun.LunPath, + initiator_name) + + host = self._get_host_details(lun.HostId) + if not host: + msg = _('Failed to get host details for host ID %s') + raise exception.Error(msg % lun.HostId) + + portal = self._get_target_portal_for_host(host.HostId, + host.HostAddress) + if not portal: + msg = _('Failed to get target portal for filer: %s') + raise exception.Error(msg % host.HostName) + + iqn = self._get_iqn_for_host(host.HostId) + if not iqn: + msg = _('Failed to get target IQN for filer: %s') + raise exception.Error(msg % host.HostName) + + properties = {} + properties['target_discovered'] = False + (address, port) = (portal['address'], portal['port']) + properties['target_portal'] = '%s:%s' % (address, port) + properties['target_iqn'] = iqn + properties['target_lun'] = lun_num + properties['volume_id'] = volume['id'] + + auth = volume['provider_auth'] + if auth: + (auth_method, auth_username, auth_secret) = auth.split() + + properties['auth_method'] = auth_method + properties['auth_username'] = auth_username + properties['auth_password'] = auth_secret + + return { + 'driver_volume_type': 'iscsi', + 'data': properties, + } + + def terminate_connection(self, volume, connector): + """ + Unmask the LUN on the storage system so the given intiator can no + longer access it. + """ + initiator_name = connector['initiator'] + lun_id = volume['provider_location'] + if not lun_id: + msg = _('No LUN ID for volume %s') + raise exception.Error(msg % (volume['name'])) + lun = self._get_lun_details(lun_id) + if not lun: + msg = _('Failed to get LUN details for LUN ID %s') + raise exception.Error(msg % (lun_id)) + self._ensure_initiator_unmapped(lun.HostId, lun.LunPath, + initiator_name) + + def create_volume_from_snapshot(self, volume, snapshot): + raise NotImplementedError() + + def create_snapshot(self, snapshot): + raise NotImplementedError() + + def delete_snapshot(self, snapshot): + raise NotImplementedError() + + def check_for_export(self, context, volume_id): + raise NotImplementedError() diff --git a/cinder/volume/nexenta/__init__.py b/cinder/volume/nexenta/__init__.py new file mode 100644 index 000000000..3050df8f6 --- /dev/null +++ b/cinder/volume/nexenta/__init__.py @@ -0,0 +1,33 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 +# +# Copyright 2011 Nexenta 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. +""" +:mod:`nexenta` -- Package contains Nexenta-specific modules +===================================================================== + +.. automodule:: nexenta +.. moduleauthor:: Yuriy Taraday <yorik.sar@gmail.com> +""" + + +class NexentaException(Exception): + MESSAGE = _('Nexenta SA returned the error') + + def __init__(self, error=None): + super(NexentaException, self).__init__(self.message, error) + + def __str__(self): + return '%s: %s' % self.args diff --git a/cinder/volume/nexenta/jsonrpc.py b/cinder/volume/nexenta/jsonrpc.py new file mode 100644 index 000000000..7a696f840 --- /dev/null +++ b/cinder/volume/nexenta/jsonrpc.py @@ -0,0 +1,84 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 +# +# Copyright 2011 Nexenta 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. +""" +:mod:`nexenta.jsonrpc` -- Nexenta-specific JSON RPC client +===================================================================== + +.. automodule:: nexenta.jsonrpc +.. moduleauthor:: Yuriy Taraday <yorik.sar@gmail.com> +""" + +import json +import urllib2 + +from cinder.volume import nexenta +from cinder import log as logging + +LOG = logging.getLogger("cinder.volume.nexenta.jsonrpc") + + +class NexentaJSONException(nexenta.NexentaException): + pass + + +class NexentaJSONProxy(object): + def __init__(self, url, user, password, auto=False, obj=None, method=None): + self.url = url + self.user = user + self.password = password + self.auto = auto + self.obj = obj + self.method = method + + def __getattr__(self, name): + if not self.obj: + obj, method = name, None + elif not self.method: + obj, method = self.obj, name + else: + obj, method = '%s.%s' % (self.obj, self.method), name + return NexentaJSONProxy(self.url, self.user, self.password, self.auto, + obj, method) + + def __call__(self, *args): + data = json.dumps({'object': self.obj, + 'method': self.method, + 'params': args}) + auth = ('%s:%s' % (self.user, self.password)).encode('base64')[:-1] + headers = {'Content-Type': 'application/json', + 'Authorization': 'Basic %s' % (auth,)} + LOG.debug(_('Sending JSON data: %s'), data) + request = urllib2.Request(self.url, data, headers) + response_obj = urllib2.urlopen(request) + if response_obj.info().status == 'EOF in headers': + if self.auto and self.url.startswith('http://'): + LOG.info(_('Auto switching to HTTPS connection to %s'), + self.url) + self.url = 'https' + self.url[4:] + request = urllib2.Request(self.url, data, headers) + response_obj = urllib2.urlopen(request) + else: + LOG.error(_('No headers in server response')) + raise NexentaJSONException(_('Bad response from server')) + + response_data = response_obj.read() + LOG.debug(_('Got response: %s'), response_data) + response = json.loads(response_data) + if response.get('error') is not None: + raise NexentaJSONException(response['error'].get('message', '')) + else: + return response.get('result') diff --git a/cinder/volume/nexenta/volume.py b/cinder/volume/nexenta/volume.py new file mode 100644 index 000000000..ad3b4e3c1 --- /dev/null +++ b/cinder/volume/nexenta/volume.py @@ -0,0 +1,282 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 +# +# Copyright 2011 Nexenta 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. +""" +:mod:`nexenta.volume` -- Driver to store volumes on Nexenta Appliance +===================================================================== + +.. automodule:: nexenta.volume +.. moduleauthor:: Yuriy Taraday <yorik.sar@gmail.com> +""" + +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder.volume import driver +from cinder.volume import nexenta +from cinder.volume.nexenta import jsonrpc + +LOG = logging.getLogger("cinder.volume.nexenta.volume") +FLAGS = flags.FLAGS + +nexenta_opts = [ + cfg.StrOpt('nexenta_host', + default='', + help='IP address of Nexenta SA'), + cfg.IntOpt('nexenta_rest_port', + default=2000, + help='HTTP port to connect to Nexenta REST API server'), + cfg.StrOpt('nexenta_rest_protocol', + default='auto', + help='Use http or https for REST connection (default auto)'), + cfg.StrOpt('nexenta_user', + default='admin', + help='User name to connect to Nexenta SA'), + cfg.StrOpt('nexenta_password', + default='nexenta', + help='Password to connect to Nexenta SA'), + cfg.IntOpt('nexenta_iscsi_target_portal_port', + default=3260, + help='Nexenta target portal port'), + cfg.StrOpt('nexenta_volume', + default='cinder', + help='pool on SA that will hold all volumes'), + cfg.StrOpt('nexenta_target_prefix', + default='iqn.1986-03.com.sun:02:cinder-', + help='IQN prefix for iSCSI targets'), + cfg.StrOpt('nexenta_target_group_prefix', + default='cinder/', + help='prefix for iSCSI target groups on SA'), + cfg.StrOpt('nexenta_blocksize', + default='', + help='block size for volumes (blank=default,8KB)'), + cfg.BoolOpt('nexenta_sparse', + default=False, + help='flag to create sparse volumes'), +] +FLAGS.register_opts(nexenta_opts) + + +class NexentaDriver(driver.ISCSIDriver): # pylint: disable=R0921 + """Executes volume driver commands on Nexenta Appliance.""" + + def __init__(self): + super(NexentaDriver, self).__init__() + + def do_setup(self, context): + protocol = FLAGS.nexenta_rest_protocol + auto = protocol == 'auto' + if auto: + protocol = 'http' + self.nms = jsonrpc.NexentaJSONProxy( + '%s://%s:%s/rest/nms/' % (protocol, FLAGS.nexenta_host, + FLAGS.nexenta_rest_port), + FLAGS.nexenta_user, FLAGS.nexenta_password, auto=auto) + + def check_for_setup_error(self): + """Verify that the volume for our zvols exists. + + :raise: :py:exc:`LookupError` + """ + if not self.nms.volume.object_exists(FLAGS.nexenta_volume): + raise LookupError(_("Volume %s does not exist in Nexenta SA"), + FLAGS.nexenta_volume) + + @staticmethod + def _get_zvol_name(volume_name): + """Return zvol name that corresponds given volume name.""" + return '%s/%s' % (FLAGS.nexenta_volume, volume_name) + + @staticmethod + def _get_target_name(volume_name): + """Return iSCSI target name to access volume.""" + return '%s%s' % (FLAGS.nexenta_target_prefix, volume_name) + + @staticmethod + def _get_target_group_name(volume_name): + """Return Nexenta iSCSI target group name for volume.""" + return '%s%s' % (FLAGS.nexenta_target_group_prefix, volume_name) + + def create_volume(self, volume): + """Create a zvol on appliance. + + :param volume: volume reference + """ + self.nms.zvol.create( + self._get_zvol_name(volume['name']), + '%sG' % (volume['size'],), + FLAGS.nexenta_blocksize, FLAGS.nexenta_sparse) + + def delete_volume(self, volume): + """Destroy a zvol on appliance. + + :param volume: volume reference + """ + try: + self.nms.zvol.destroy(self._get_zvol_name(volume['name']), '') + except nexenta.NexentaException as exc: + if "zvol has children" in exc.args[1]: + raise exception.VolumeIsBusy + else: + raise + + def create_snapshot(self, snapshot): + """Create snapshot of existing zvol on appliance. + + :param snapshot: shapshot reference + """ + self.nms.zvol.create_snapshot( + self._get_zvol_name(snapshot['volume_name']), + snapshot['name'], '') + + def create_volume_from_snapshot(self, volume, snapshot): + """Create new volume from other's snapshot on appliance. + + :param volume: reference of volume to be created + :param snapshot: reference of source snapshot + """ + self.nms.zvol.clone( + '%s@%s' % (self._get_zvol_name(snapshot['volume_name']), + snapshot['name']), + self._get_zvol_name(volume['name'])) + + def delete_snapshot(self, snapshot): + """Delete volume's snapshot on appliance. + + :param snapshot: shapshot reference + """ + try: + self.nms.snapshot.destroy( + '%s@%s' % (self._get_zvol_name(snapshot['volume_name']), + snapshot['name']), + '') + except nexenta.NexentaException as exc: + if "snapshot has dependent clones" in exc.args[1]: + raise exception.SnapshotIsBusy + else: + raise + + def local_path(self, volume): + """Return local path to existing local volume. + + We never have local volumes, so it raises NotImplementedError. + + :raise: :py:exc:`NotImplementedError` + """ + LOG.error(_("Call to local_path should not happen." + " Verify that use_local_volumes flag is turned off.")) + raise NotImplementedError + + def _do_export(self, _ctx, volume, ensure=False): + """Do all steps to get zvol exported as LUN 0 at separate target. + + :param volume: reference of volume to be exported + :param ensure: if True, ignore errors caused by already existing + resources + :return: iscsiadm-formatted provider location string + """ + zvol_name = self._get_zvol_name(volume['name']) + target_name = self._get_target_name(volume['name']) + target_group_name = self._get_target_group_name(volume['name']) + + try: + self.nms.iscsitarget.create_target({'target_name': target_name}) + except nexenta.NexentaException as exc: + if not ensure or 'already configured' not in exc.args[1]: + raise + else: + LOG.info(_('Ignored target creation error "%s"' + ' while ensuring export'), exc) + try: + self.nms.stmf.create_targetgroup(target_group_name) + except nexenta.NexentaException as exc: + if not ensure or 'already exists' not in exc.args[1]: + raise + else: + LOG.info(_('Ignored target group creation error "%s"' + ' while ensuring export'), exc) + try: + self.nms.stmf.add_targetgroup_member(target_group_name, + target_name) + except nexenta.NexentaException as exc: + if not ensure or 'already exists' not in exc.args[1]: + raise + else: + LOG.info(_('Ignored target group member addition error "%s"' + ' while ensuring export'), exc) + try: + self.nms.scsidisk.create_lu(zvol_name, {}) + except nexenta.NexentaException as exc: + if not ensure or 'in use' not in exc.args[1]: + raise + else: + LOG.info(_('Ignored LU creation error "%s"' + ' while ensuring export'), exc) + try: + self.nms.scsidisk.add_lun_mapping_entry(zvol_name, { + 'target_group': target_group_name, + 'lun': '0'}) + except nexenta.NexentaException as exc: + if not ensure or 'view entry exists' not in exc.args[1]: + raise + else: + LOG.info(_('Ignored LUN mapping entry addition error "%s"' + ' while ensuring export'), exc) + return '%s:%s,1 %s' % (FLAGS.nexenta_host, + FLAGS.nexenta_iscsi_target_portal_port, + target_name) + + def create_export(self, _ctx, volume): + """Create new export for zvol. + + :param volume: reference of volume to be exported + :return: iscsiadm-formatted provider location string + """ + loc = self._do_export(_ctx, volume, ensure=False) + return {'provider_location': loc} + + def ensure_export(self, _ctx, volume): + """Recreate parts of export if necessary. + + :param volume: reference of volume to be exported + """ + self._do_export(_ctx, volume, ensure=True) + + def remove_export(self, _ctx, volume): + """Destroy all resources created to export zvol. + + :param volume: reference of volume to be unexported + """ + zvol_name = self._get_zvol_name(volume['name']) + target_name = self._get_target_name(volume['name']) + target_group_name = self._get_target_group_name(volume['name']) + self.nms.scsidisk.delete_lu(zvol_name) + + try: + self.nms.stmf.destroy_targetgroup(target_group_name) + except nexenta.NexentaException as exc: + # We assume that target group is already gone + LOG.warn(_('Got error trying to destroy target group' + ' %(target_group)s, assuming it is already gone: %(exc)s'), + {'target_group': target_group_name, 'exc': exc}) + try: + self.nms.iscsitarget.delete_target(target_name) + except nexenta.NexentaException as exc: + # We assume that target is gone as well + LOG.warn(_('Got error trying to delete target %(target)s,' + ' assuming it is already gone: %(exc)s'), + {'target': target_name, 'exc': exc}) diff --git a/cinder/volume/san.py b/cinder/volume/san.py new file mode 100644 index 000000000..4edc81add --- /dev/null +++ b/cinder/volume/san.py @@ -0,0 +1,897 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 Justin Santa Barbara +# 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. +""" +Drivers for san-stored volumes. + +The unique thing about a SAN is that we don't expect that we can run the volume +controller on the SAN hardware. We expect to access it over SSH or some API. +""" + +import base64 +import httplib +import json +import os +import paramiko +import random +import socket +import string +import uuid + +from lxml import etree + +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder.openstack.common import cfg +from cinder import utils +import cinder.volume.driver + + +LOG = logging.getLogger(__name__) + +san_opts = [ + cfg.BoolOpt('san_thin_provision', + default='true', + help='Use thin provisioning for SAN volumes?'), + cfg.StrOpt('san_ip', + default='', + help='IP address of SAN controller'), + cfg.StrOpt('san_login', + default='admin', + help='Username for SAN controller'), + cfg.StrOpt('san_password', + default='', + help='Password for SAN controller'), + cfg.StrOpt('san_private_key', + default='', + help='Filename of private key to use for SSH authentication'), + cfg.StrOpt('san_clustername', + default='', + help='Cluster name to use for creating volumes'), + cfg.IntOpt('san_ssh_port', + default=22, + help='SSH port to use with SAN'), + cfg.BoolOpt('san_is_local', + default='false', + help='Execute commands locally instead of over SSH; ' + 'use if the volume service is running on the SAN device'), + cfg.StrOpt('san_zfs_volume_base', + default='rpool/', + help='The ZFS path under which to create zvols for volumes.'), + ] + +FLAGS = flags.FLAGS +FLAGS.register_opts(san_opts) + + +class SanISCSIDriver(cinder.volume.driver.ISCSIDriver): + """Base class for SAN-style storage volumes + + A SAN-style storage value is 'different' because the volume controller + probably won't run on it, so we need to access is over SSH or another + remote protocol. + """ + + def __init__(self): + super(SanISCSIDriver, self).__init__() + self.run_local = FLAGS.san_is_local + + def _build_iscsi_target_name(self, volume): + return "%s%s" % (FLAGS.iscsi_target_prefix, volume['name']) + + def _connect_to_ssh(self): + ssh = paramiko.SSHClient() + #TODO(justinsb): We need a better SSH key policy + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + if FLAGS.san_password: + ssh.connect(FLAGS.san_ip, + port=FLAGS.san_ssh_port, + username=FLAGS.san_login, + password=FLAGS.san_password) + elif FLAGS.san_private_key: + privatekeyfile = os.path.expanduser(FLAGS.san_private_key) + # It sucks that paramiko doesn't support DSA keys + privatekey = paramiko.RSAKey.from_private_key_file(privatekeyfile) + ssh.connect(FLAGS.san_ip, + port=FLAGS.san_ssh_port, + username=FLAGS.san_login, + pkey=privatekey) + else: + raise exception.Error(_("Specify san_password or san_private_key")) + return ssh + + def _execute(self, *cmd, **kwargs): + if self.run_local: + return utils.execute(*cmd, **kwargs) + else: + check_exit_code = kwargs.pop('check_exit_code', None) + command = ' '.join(*cmd) + return self._run_ssh(command, check_exit_code) + + def _run_ssh(self, command, check_exit_code=True): + #TODO(justinsb): SSH connection caching (?) + ssh = self._connect_to_ssh() + + #TODO(justinsb): Reintroduce the retry hack + ret = utils.ssh_execute(ssh, command, check_exit_code=check_exit_code) + + ssh.close() + + return ret + + def ensure_export(self, context, volume): + """Synchronously recreates an export for a logical volume.""" + pass + + def create_export(self, context, volume): + """Exports the volume.""" + pass + + def remove_export(self, context, volume): + """Removes an export for a logical volume.""" + pass + + def check_for_setup_error(self): + """Returns an error if prerequisites aren't met.""" + if not self.run_local: + if not (FLAGS.san_password or FLAGS.san_private_key): + raise exception.Error(_('Specify san_password or ' + 'san_private_key')) + + # The san_ip must always be set, because we use it for the target + if not (FLAGS.san_ip): + raise exception.Error(_("san_ip must be set")) + + +def _collect_lines(data): + """Split lines from data into an array, trimming them """ + matches = [] + for line in data.splitlines(): + match = line.strip() + matches.append(match) + + return matches + + +def _get_prefixed_values(data, prefix): + """Collect lines which start with prefix; with trimming""" + matches = [] + for line in data.splitlines(): + line = line.strip() + if line.startswith(prefix): + match = line[len(prefix):] + match = match.strip() + matches.append(match) + + return matches + + +class SolarisISCSIDriver(SanISCSIDriver): + """Executes commands relating to Solaris-hosted ISCSI volumes. + + Basic setup for a Solaris iSCSI server: + + pkg install storage-server SUNWiscsit + + svcadm enable stmf + + svcadm enable -r svc:/network/iscsi/target:default + + pfexec itadm create-tpg e1000g0 ${MYIP} + + pfexec itadm create-target -t e1000g0 + + + Then grant the user that will be logging on lots of permissions. + I'm not sure exactly which though: + + zfs allow justinsb create,mount,destroy rpool + + usermod -P'File System Management' justinsb + + usermod -P'Primary Administrator' justinsb + + Also make sure you can login using san_login & san_password/san_private_key + """ + + def _execute(self, *cmd, **kwargs): + new_cmd = ['pfexec'] + new_cmd.extend(*cmd) + return super(SolarisISCSIDriver, self)._execute(self, + *new_cmd, + **kwargs) + + def _view_exists(self, luid): + (out, _err) = self._execute('/usr/sbin/stmfadm', + 'list-view', '-l', luid, + check_exit_code=False) + if "no views found" in out: + return False + + if "View Entry:" in out: + return True + + raise exception.Error("Cannot parse list-view output: %s" % (out)) + + def _get_target_groups(self): + """Gets list of target groups from host.""" + (out, _err) = self._execute('/usr/sbin/stmfadm', 'list-tg') + matches = _get_prefixed_values(out, 'Target group: ') + LOG.debug("target_groups=%s" % matches) + return matches + + def _target_group_exists(self, target_group_name): + return target_group_name not in self._get_target_groups() + + def _get_target_group_members(self, target_group_name): + (out, _err) = self._execute('/usr/sbin/stmfadm', + 'list-tg', '-v', target_group_name) + matches = _get_prefixed_values(out, 'Member: ') + LOG.debug("members of %s=%s" % (target_group_name, matches)) + return matches + + def _is_target_group_member(self, target_group_name, iscsi_target_name): + return iscsi_target_name in ( + self._get_target_group_members(target_group_name)) + + def _get_iscsi_targets(self): + (out, _err) = self._execute('/usr/sbin/itadm', 'list-target') + matches = _collect_lines(out) + + # Skip header + if len(matches) != 0: + assert 'TARGET NAME' in matches[0] + matches = matches[1:] + + targets = [] + for line in matches: + items = line.split() + assert len(items) == 3 + targets.append(items[0]) + + LOG.debug("_get_iscsi_targets=%s" % (targets)) + return targets + + def _iscsi_target_exists(self, iscsi_target_name): + return iscsi_target_name in self._get_iscsi_targets() + + def _build_zfs_poolname(self, volume): + zfs_poolname = '%s%s' % (FLAGS.san_zfs_volume_base, volume['name']) + return zfs_poolname + + def create_volume(self, volume): + """Creates a volume.""" + if int(volume['size']) == 0: + sizestr = '100M' + else: + sizestr = '%sG' % volume['size'] + + zfs_poolname = self._build_zfs_poolname(volume) + + # Create a zfs volume + cmd = ['/usr/sbin/zfs', 'create'] + if FLAGS.san_thin_provision: + cmd.append('-s') + cmd.extend(['-V', sizestr]) + cmd.append(zfs_poolname) + self._execute(*cmd) + + def _get_luid(self, volume): + zfs_poolname = self._build_zfs_poolname(volume) + zvol_name = '/dev/zvol/rdsk/%s' % zfs_poolname + + (out, _err) = self._execute('/usr/sbin/sbdadm', 'list-lu') + + lines = _collect_lines(out) + + # Strip headers + if len(lines) >= 1: + if lines[0] == '': + lines = lines[1:] + + if len(lines) >= 4: + assert 'Found' in lines[0] + assert '' == lines[1] + assert 'GUID' in lines[2] + assert '------------------' in lines[3] + + lines = lines[4:] + + for line in lines: + items = line.split() + assert len(items) == 3 + if items[2] == zvol_name: + luid = items[0].strip() + return luid + + raise Exception(_('LUID not found for %(zfs_poolname)s. ' + 'Output=%(out)s') % locals()) + + def _is_lu_created(self, volume): + luid = self._get_luid(volume) + return luid + + def delete_volume(self, volume): + """Deletes a volume.""" + zfs_poolname = self._build_zfs_poolname(volume) + self._execute('/usr/sbin/zfs', 'destroy', zfs_poolname) + + def local_path(self, volume): + # TODO(justinsb): Is this needed here? + escaped_group = FLAGS.volume_group.replace('-', '--') + escaped_name = volume['name'].replace('-', '--') + return "/dev/mapper/%s-%s" % (escaped_group, escaped_name) + + def ensure_export(self, context, volume): + """Synchronously recreates an export for a logical volume.""" + #TODO(justinsb): On bootup, this is called for every volume. + # It then runs ~5 SSH commands for each volume, + # most of which fetch the same info each time + # This makes initial start stupid-slow + return self._do_export(volume, force_create=False) + + def create_export(self, context, volume): + return self._do_export(volume, force_create=True) + + def _do_export(self, volume, force_create): + # Create a Logical Unit (LU) backed by the zfs volume + zfs_poolname = self._build_zfs_poolname(volume) + + if force_create or not self._is_lu_created(volume): + zvol_name = '/dev/zvol/rdsk/%s' % zfs_poolname + self._execute('/usr/sbin/sbdadm', 'create-lu', zvol_name) + + luid = self._get_luid(volume) + iscsi_name = self._build_iscsi_target_name(volume) + target_group_name = 'tg-%s' % volume['name'] + + # Create a iSCSI target, mapped to just this volume + if force_create or not self._target_group_exists(target_group_name): + self._execute('/usr/sbin/stmfadm', 'create-tg', target_group_name) + + # Yes, we add the initiatior before we create it! + # Otherwise, it complains that the target is already active + if force_create or not self._is_target_group_member(target_group_name, + iscsi_name): + self._execute('/usr/sbin/stmfadm', + 'add-tg-member', '-g', target_group_name, iscsi_name) + + if force_create or not self._iscsi_target_exists(iscsi_name): + self._execute('/usr/sbin/itadm', 'create-target', '-n', iscsi_name) + + if force_create or not self._view_exists(luid): + self._execute('/usr/sbin/stmfadm', + 'add-view', '-t', target_group_name, luid) + + #TODO(justinsb): Is this always 1? Does it matter? + iscsi_portal_interface = '1' + iscsi_portal = FLAGS.san_ip + ":3260," + iscsi_portal_interface + + db_update = {} + db_update['provider_location'] = ("%s %s" % + (iscsi_portal, + iscsi_name)) + + return db_update + + def remove_export(self, context, volume): + """Removes an export for a logical volume.""" + + # This is the reverse of _do_export + luid = self._get_luid(volume) + iscsi_name = self._build_iscsi_target_name(volume) + target_group_name = 'tg-%s' % volume['name'] + + if self._view_exists(luid): + self._execute('/usr/sbin/stmfadm', 'remove-view', '-l', luid, '-a') + + if self._iscsi_target_exists(iscsi_name): + self._execute('/usr/sbin/stmfadm', 'offline-target', iscsi_name) + self._execute('/usr/sbin/itadm', 'delete-target', iscsi_name) + + # We don't delete the tg-member; we delete the whole tg! + + if self._target_group_exists(target_group_name): + self._execute('/usr/sbin/stmfadm', 'delete-tg', target_group_name) + + if self._is_lu_created(volume): + self._execute('/usr/sbin/sbdadm', 'delete-lu', luid) + + +class HpSanISCSIDriver(SanISCSIDriver): + """Executes commands relating to HP/Lefthand SAN ISCSI volumes. + + We use the CLIQ interface, over SSH. + + Rough overview of CLIQ commands used: + + :createVolume: (creates the volume) + + :getVolumeInfo: (to discover the IQN etc) + + :getClusterInfo: (to discover the iSCSI target IP address) + + :assignVolumeChap: (exports it with CHAP security) + + The 'trick' here is that the HP SAN enforces security by default, so + normally a volume mount would need both to configure the SAN in the volume + layer and do the mount on the compute layer. Multi-layer operations are + not catered for at the moment in the cinder architecture, so instead we + share the volume using CHAP at volume creation time. Then the mount need + only use those CHAP credentials, so can take place exclusively in the + compute layer. + """ + + def _cliq_run(self, verb, cliq_args): + """Runs a CLIQ command over SSH, without doing any result parsing""" + cliq_arg_strings = [] + for k, v in cliq_args.items(): + cliq_arg_strings.append(" %s=%s" % (k, v)) + cmd = verb + ''.join(cliq_arg_strings) + + return self._run_ssh(cmd) + + def _cliq_run_xml(self, verb, cliq_args, check_cliq_result=True): + """Runs a CLIQ command over SSH, parsing and checking the output""" + cliq_args['output'] = 'XML' + (out, _err) = self._cliq_run(verb, cliq_args) + + LOG.debug(_("CLIQ command returned %s"), out) + + result_xml = etree.fromstring(out) + if check_cliq_result: + response_node = result_xml.find("response") + if response_node is None: + msg = (_("Malformed response to CLIQ command " + "%(verb)s %(cliq_args)s. Result=%(out)s") % + locals()) + raise exception.Error(msg) + + result_code = response_node.attrib.get("result") + + if result_code != "0": + msg = (_("Error running CLIQ command %(verb)s %(cliq_args)s. " + " Result=%(out)s") % + locals()) + raise exception.Error(msg) + + return result_xml + + def _cliq_get_cluster_info(self, cluster_name): + """Queries for info about the cluster (including IP)""" + cliq_args = {} + cliq_args['clusterName'] = cluster_name + cliq_args['searchDepth'] = '1' + cliq_args['verbose'] = '0' + + result_xml = self._cliq_run_xml("getClusterInfo", cliq_args) + + return result_xml + + def _cliq_get_cluster_vip(self, cluster_name): + """Gets the IP on which a cluster shares iSCSI volumes""" + cluster_xml = self._cliq_get_cluster_info(cluster_name) + + vips = [] + for vip in cluster_xml.findall("response/cluster/vip"): + vips.append(vip.attrib.get('ipAddress')) + + if len(vips) == 1: + return vips[0] + + _xml = etree.tostring(cluster_xml) + msg = (_("Unexpected number of virtual ips for cluster " + " %(cluster_name)s. Result=%(_xml)s") % + locals()) + raise exception.Error(msg) + + def _cliq_get_volume_info(self, volume_name): + """Gets the volume info, including IQN""" + cliq_args = {} + cliq_args['volumeName'] = volume_name + result_xml = self._cliq_run_xml("getVolumeInfo", cliq_args) + + # Result looks like this: + #<gauche version="1.0"> + # <response description="Operation succeeded." name="CliqSuccess" + # processingTime="87" result="0"> + # <volume autogrowPages="4" availability="online" blockSize="1024" + # bytesWritten="0" checkSum="false" clusterName="Cluster01" + # created="2011-02-08T19:56:53Z" deleting="false" description="" + # groupName="Group01" initialQuota="536870912" isPrimary="true" + # iscsiIqn="iqn.2003-10.com.lefthandnetworks:group01:25366:vol-b" + # maxSize="6865387257856" md5="9fa5c8b2cca54b2948a63d833097e1ca" + # minReplication="1" name="vol-b" parity="0" replication="2" + # reserveQuota="536870912" scratchQuota="4194304" + # serialNumber="9fa5c8b2cca54b2948a63d833097e1ca0000000000006316" + # size="1073741824" stridePages="32" thinProvision="true"> + # <status description="OK" value="2"/> + # <permission access="rw" + # authGroup="api-34281B815713B78-(trimmed)51ADD4B7030853AA7" + # chapName="chapusername" chapRequired="true" id="25369" + # initiatorSecret="" iqn="" iscsiEnabled="true" + # loadBalance="true" targetSecret="supersecret"/> + # </volume> + # </response> + #</gauche> + + # Flatten the nodes into a dictionary; use prefixes to avoid collisions + volume_attributes = {} + + volume_node = result_xml.find("response/volume") + for k, v in volume_node.attrib.items(): + volume_attributes["volume." + k] = v + + status_node = volume_node.find("status") + if not status_node is None: + for k, v in status_node.attrib.items(): + volume_attributes["status." + k] = v + + # We only consider the first permission node + permission_node = volume_node.find("permission") + if not permission_node is None: + for k, v in status_node.attrib.items(): + volume_attributes["permission." + k] = v + + LOG.debug(_("Volume info: %(volume_name)s => %(volume_attributes)s") % + locals()) + return volume_attributes + + def create_volume(self, volume): + """Creates a volume.""" + cliq_args = {} + cliq_args['clusterName'] = FLAGS.san_clustername + #TODO(justinsb): Should we default to inheriting thinProvision? + cliq_args['thinProvision'] = '1' if FLAGS.san_thin_provision else '0' + cliq_args['volumeName'] = volume['name'] + if int(volume['size']) == 0: + cliq_args['size'] = '100MB' + else: + cliq_args['size'] = '%sGB' % volume['size'] + + self._cliq_run_xml("createVolume", cliq_args) + + volume_info = self._cliq_get_volume_info(volume['name']) + cluster_name = volume_info['volume.clusterName'] + iscsi_iqn = volume_info['volume.iscsiIqn'] + + #TODO(justinsb): Is this always 1? Does it matter? + cluster_interface = '1' + + cluster_vip = self._cliq_get_cluster_vip(cluster_name) + iscsi_portal = cluster_vip + ":3260," + cluster_interface + + model_update = {} + model_update['provider_location'] = ("%s %s" % + (iscsi_portal, + iscsi_iqn)) + + return model_update + + def delete_volume(self, volume): + """Deletes a volume.""" + cliq_args = {} + cliq_args['volumeName'] = volume['name'] + cliq_args['prompt'] = 'false' # Don't confirm + + self._cliq_run_xml("deleteVolume", cliq_args) + + def local_path(self, volume): + # TODO(justinsb): Is this needed here? + raise exception.Error(_("local_path not supported")) + + def ensure_export(self, context, volume): + """Synchronously recreates an export for a logical volume.""" + return self._do_export(context, volume, force_create=False) + + def create_export(self, context, volume): + return self._do_export(context, volume, force_create=True) + + def _do_export(self, context, volume, force_create): + """Supports ensure_export and create_export""" + volume_info = self._cliq_get_volume_info(volume['name']) + + is_shared = 'permission.authGroup' in volume_info + + model_update = {} + + should_export = False + + if force_create or not is_shared: + should_export = True + # Check that we have a project_id + project_id = volume['project_id'] + if not project_id: + project_id = context.project_id + + if project_id: + #TODO(justinsb): Use a real per-project password here + chap_username = 'proj_' + project_id + # HP/Lefthand requires that the password be >= 12 characters + chap_password = 'project_secret_' + project_id + else: + msg = (_("Could not determine project for volume %s, " + "can't export") % + (volume['name'])) + if force_create: + raise exception.Error(msg) + else: + LOG.warn(msg) + should_export = False + + if should_export: + cliq_args = {} + cliq_args['volumeName'] = volume['name'] + cliq_args['chapName'] = chap_username + cliq_args['targetSecret'] = chap_password + + self._cliq_run_xml("assignVolumeChap", cliq_args) + + model_update['provider_auth'] = ("CHAP %s %s" % + (chap_username, chap_password)) + + return model_update + + def remove_export(self, context, volume): + """Removes an export for a logical volume.""" + cliq_args = {} + cliq_args['volumeName'] = volume['name'] + + self._cliq_run_xml("unassignVolume", cliq_args) + + +class SolidFireSanISCSIDriver(SanISCSIDriver): + + def _issue_api_request(self, method_name, params): + """All API requests to SolidFire device go through this method + + Simple json-rpc web based API calls. + each call takes a set of paramaters (dict) + and returns results in a dict as well. + """ + + host = FLAGS.san_ip + # For now 443 is the only port our server accepts requests on + port = 443 + + # NOTE(john-griffith): Probably don't need this, but the idea is + # we provide a request_id so we can correlate + # responses with requests + request_id = int(uuid.uuid4()) # just generate a random number + + cluster_admin = FLAGS.san_login + cluster_password = FLAGS.san_password + + command = {'method': method_name, + 'id': request_id} + + if params is not None: + command['params'] = params + + payload = json.dumps(command, ensure_ascii=False) + payload.encode('utf-8') + # we use json-rpc, webserver needs to see json-rpc in header + header = {'Content-Type': 'application/json-rpc; charset=utf-8'} + + if cluster_password is not None: + # base64.encodestring includes a newline character + # in the result, make sure we strip it off + auth_key = base64.encodestring('%s:%s' % (cluster_admin, + cluster_password))[:-1] + header['Authorization'] = 'Basic %s' % auth_key + + LOG.debug(_("Payload for SolidFire API call: %s"), payload) + connection = httplib.HTTPSConnection(host, port) + connection.request('POST', '/json-rpc/1.0', payload, header) + response = connection.getresponse() + data = {} + + if response.status != 200: + connection.close() + raise exception.SolidFireAPIException(status=response.status) + + else: + data = response.read() + try: + data = json.loads(data) + + except (TypeError, ValueError), exc: + connection.close() + msg = _("Call to json.loads() raised an exception: %s") % exc + raise exception.SfJsonEncodeFailure(msg) + + connection.close() + + LOG.debug(_("Results of SolidFire API call: %s"), data) + return data + + def _get_volumes_by_sfaccount(self, account_id): + params = {'accountID': account_id} + data = self._issue_api_request('ListVolumesForAccount', params) + if 'result' in data: + return data['result']['volumes'] + + def _get_sfaccount_by_name(self, sf_account_name): + sfaccount = None + params = {'username': sf_account_name} + data = self._issue_api_request('GetAccountByName', params) + if 'result' in data and 'account' in data['result']: + LOG.debug(_('Found solidfire account: %s'), sf_account_name) + sfaccount = data['result']['account'] + return sfaccount + + def _create_sfaccount(self, cinder_project_id): + """Create account on SolidFire device if it doesn't already exist. + + We're first going to check if the account already exits, if it does + just return it. If not, then create it. + """ + + sf_account_name = socket.gethostname() + '-' + cinder_project_id + sfaccount = self._get_sfaccount_by_name(sf_account_name) + if sfaccount is None: + LOG.debug(_('solidfire account: %s does not exist, create it...'), + sf_account_name) + chap_secret = self._generate_random_string(12) + params = {'username': sf_account_name, + 'initiatorSecret': chap_secret, + 'targetSecret': chap_secret, + 'attributes': {}} + data = self._issue_api_request('AddAccount', params) + if 'result' in data: + sfaccount = self._get_sfaccount_by_name(sf_account_name) + + return sfaccount + + def _get_cluster_info(self): + params = {} + data = self._issue_api_request('GetClusterInfo', params) + if 'result' not in data: + raise exception.SolidFireAPIDataException(data=data) + + return data['result'] + + def _do_export(self, volume): + """Gets the associated account, retrieves CHAP info and updates.""" + + sfaccount_name = '%s-%s' % (socket.gethostname(), volume['project_id']) + sfaccount = self._get_sfaccount_by_name(sfaccount_name) + + model_update = {} + model_update['provider_auth'] = ('CHAP %s %s' + % (sfaccount['username'], sfaccount['targetSecret'])) + + return model_update + + def _generate_random_string(self, length): + """Generates random_string to use for CHAP password.""" + + char_set = string.ascii_uppercase + string.digits + return ''.join(random.sample(char_set, length)) + + def create_volume(self, volume): + """Create volume on SolidFire device. + + The account is where CHAP settings are derived from, volume is + created and exported. Note that the new volume is immediately ready + for use. + + One caveat here is that an existing user account must be specified + in the API call to create a new volume. We use a set algorithm to + determine account info based on passed in cinder volume object. First + we check to see if the account already exists (and use it), or if it + does not already exist, we'll go ahead and create it. + + For now, we're just using very basic settings, QOS is + turned off, 512 byte emulation is off etc. Will be + looking at extensions for these things later, or + this module can be hacked to suit needs. + """ + + LOG.debug(_("Enter SolidFire create_volume...")) + GB = 1048576 * 1024 + slice_count = 1 + enable_emulation = False + attributes = {} + + cluster_info = self._get_cluster_info() + iscsi_portal = cluster_info['clusterInfo']['svip'] + ':3260' + sfaccount = self._create_sfaccount(volume['project_id']) + account_id = sfaccount['accountID'] + account_name = sfaccount['username'] + chap_secret = sfaccount['targetSecret'] + + params = {'name': volume['name'], + 'accountID': account_id, + 'sliceCount': slice_count, + 'totalSize': volume['size'] * GB, + 'enable512e': enable_emulation, + 'attributes': attributes} + + data = self._issue_api_request('CreateVolume', params) + + if 'result' not in data or 'volumeID' not in data['result']: + raise exception.SolidFireAPIDataException(data=data) + + volume_id = data['result']['volumeID'] + + volume_list = self._get_volumes_by_sfaccount(account_id) + iqn = None + for v in volume_list: + if v['volumeID'] == volume_id: + iqn = 'iqn.2010-01.com.solidfire:' + v['iqn'] + break + + model_update = {} + + # NOTE(john-griffith): SF volumes are always at lun 0 + model_update['provider_location'] = ('%s %s %s' + % (iscsi_portal, iqn, 0)) + model_update['provider_auth'] = ('CHAP %s %s' + % (account_name, chap_secret)) + + LOG.debug(_("Leaving SolidFire create_volume")) + return model_update + + def delete_volume(self, volume): + """Delete SolidFire Volume from device. + + SolidFire allows multipe volumes with same name, + volumeID is what's guaranteed unique. + + What we'll do here is check volumes based on account. this + should work because cinder will increment its volume_id + so we should always get the correct volume. This assumes + that cinder does not assign duplicate ID's. + """ + + LOG.debug(_("Enter SolidFire delete_volume...")) + sf_account_name = socket.gethostname() + '-' + volume['project_id'] + sfaccount = self._get_sfaccount_by_name(sf_account_name) + if sfaccount is None: + raise exception.SfAccountNotFound(account_name=sf_account_name) + + params = {'accountID': sfaccount['accountID']} + data = self._issue_api_request('ListVolumesForAccount', params) + if 'result' not in data: + raise exception.SolidFireAPIDataException(data=data) + + found_count = 0 + volid = -1 + for v in data['result']['volumes']: + if v['name'] == volume['name']: + found_count += 1 + volid = v['volumeID'] + + if found_count != 1: + LOG.debug(_("Deleting volumeID: %s"), volid) + raise exception.DuplicateSfVolumeNames(vol_name=volume['name']) + + params = {'volumeID': volid} + data = self._issue_api_request('DeleteVolume', params) + if 'result' not in data: + raise exception.SolidFireAPIDataException(data=data) + + LOG.debug(_("Leaving SolidFire delete_volume")) + + def ensure_export(self, context, volume): + LOG.debug(_("Executing SolidFire ensure_export...")) + return self._do_export(volume) + + def create_export(self, context, volume): + LOG.debug(_("Executing SolidFire create_export...")) + return self._do_export(volume) diff --git a/cinder/volume/volume_types.py b/cinder/volume/volume_types.py new file mode 100644 index 000000000..5df9e6e60 --- /dev/null +++ b/cinder/volume/volume_types.py @@ -0,0 +1,125 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2011 Zadara Storage Inc. +# Copyright (c) 2011 OpenStack LLC. +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# Copyright (c) 2010 Citrix Systems, Inc. +# Copyright 2011 Ken Pepple +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Built-in volume type properties.""" + +from cinder import context +from cinder import db +from cinder import exception +from cinder import flags +from cinder import log as logging + +FLAGS = flags.FLAGS +LOG = logging.getLogger(__name__) + + +def create(context, name, extra_specs={}): + """Creates volume types.""" + try: + db.volume_type_create(context, + dict(name=name, + extra_specs=extra_specs)) + except exception.DBError, e: + LOG.exception(_('DB error: %s') % e) + raise exception.VolumeTypeCreateFailed(name=name, + extra_specs=extra_specs) + + +def destroy(context, name): + """Marks volume types as deleted.""" + if name is None: + msg = _("name cannot be None") + raise exception.InvalidVolumeType(reason=msg) + else: + db.volume_type_destroy(context, name) + + +def get_all_types(context, inactive=0, search_opts={}): + """Get all non-deleted volume_types. + + Pass true as argument if you want deleted volume types returned also. + + """ + vol_types = db.volume_type_get_all(context, inactive) + + if search_opts: + LOG.debug(_("Searching by: %s") % str(search_opts)) + + def _check_extra_specs_match(vol_type, searchdict): + for k, v in searchdict.iteritems(): + if (k not in vol_type['extra_specs'].keys() + or vol_type['extra_specs'][k] != v): + return False + return True + + # search_option to filter_name mapping. + filter_mapping = {'extra_specs': _check_extra_specs_match} + + result = {} + for type_name, type_args in vol_types.iteritems(): + # go over all filters in the list + for opt, values in search_opts.iteritems(): + try: + filter_func = filter_mapping[opt] + except KeyError: + # no such filter - ignore it, go to next filter + continue + else: + if filter_func(type_args, values): + result[type_name] = type_args + break + vol_types = result + return vol_types + + +def get_volume_type(ctxt, id): + """Retrieves single volume type by id.""" + if id is None: + msg = _("id cannot be None") + raise exception.InvalidVolumeType(reason=msg) + + if ctxt is None: + ctxt = context.get_admin_context() + + return db.volume_type_get(ctxt, id) + + +def get_volume_type_by_name(context, name): + """Retrieves single volume type by name.""" + if name is None: + msg = _("name cannot be None") + raise exception.InvalidVolumeType(reason=msg) + + return db.volume_type_get_by_name(context, name) + + +def is_key_value_present(volume_type_id, key, value, volume_type=None): + if volume_type_id is None: + return False + + if volume_type is None: + volume_type = get_volume_type(context.get_admin_context(), + volume_type_id) + if (volume_type.get('extra_specs') is None or + volume_type['extra_specs'].get(key) != value): + return False + else: + return True diff --git a/cinder/volume/xensm.py b/cinder/volume/xensm.py new file mode 100644 index 000000000..ad21afe0e --- /dev/null +++ b/cinder/volume/xensm.py @@ -0,0 +1,237 @@ +# Copyright (c) 2011 Citrix 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. + +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder import utils +from cinder.virt.xenapi import connection as xenapi_conn +from cinder.virt.xenapi import volumeops +import cinder.volume.driver + +LOG = logging.getLogger(__name__) +FLAGS = flags.FLAGS + + +class XenSMDriver(cinder.volume.driver.VolumeDriver): + + def _convert_config_params(self, conf_str): + params = dict([item.split("=") for item in conf_str.split()]) + return params + + def _get_introduce_sr_keys(self, params): + if 'name_label' in params: + del params['name_label'] + keys = params.keys() + keys.append('sr_type') + return keys + + def _create_storage_repo(self, context, backend_ref): + """Either creates or introduces SR on host + depending on whether it exists in xapi db.""" + params = self._convert_config_params(backend_ref['config_params']) + if 'name_label' in params: + label = params['name_label'] + del params['name_label'] + else: + label = 'SR-' + str(backend_ref['id']) + + params['sr_type'] = backend_ref['sr_type'] + + if backend_ref['sr_uuid'] is None: + # run the sr create command + try: + LOG.debug(_('SR name = %s') % label) + LOG.debug(_('Params: %s') % str(params)) + sr_uuid = self._volumeops.create_sr(label, params) + # update sr_uuid and created in db + except Exception as ex: + LOG.debug(_("Failed to create sr %s...continuing") % + str(backend_ref['id'])) + raise exception.Error(_('Create failed')) + + LOG.debug(_('SR UUID of new SR is: %s') % sr_uuid) + try: + self.db.sm_backend_conf_update(context, + backend_ref['id'], + dict(sr_uuid=sr_uuid)) + except Exception as ex: + LOG.exception(ex) + raise exception.Error(_("Failed to update db")) + + else: + # sr introduce, if not already done + try: + self._volumeops.introduce_sr(backend_ref['sr_uuid'], label, + params) + except Exception as ex: + LOG.exception(ex) + LOG.debug(_("Failed to introduce sr %s...continuing") + % str(backend_ref['id'])) + + def _create_storage_repos(self, context): + """Create/Introduce storage repositories at start.""" + backends = self.db.sm_backend_conf_get_all(context) + for backend in backends: + try: + self._create_storage_repo(context, backend) + except Exception as ex: + LOG.exception(ex) + raise exception.Error(_('Failed to reach backend %d') + % backend['id']) + + def __init__(self, *args, **kwargs): + """Connect to the hypervisor.""" + + # This driver leverages Xen storage manager, and hence requires + # hypervisor to be Xen + if FLAGS.connection_type != 'xenapi': + raise exception.Error(_('XenSMDriver requires xenapi connection')) + + url = FLAGS.xenapi_connection_url + username = FLAGS.xenapi_connection_username + password = FLAGS.xenapi_connection_password + try: + session = xenapi_conn.XenAPISession(url, username, password) + self._volumeops = volumeops.VolumeOps(session) + except Exception as ex: + LOG.exception(ex) + raise exception.Error(_("Failed to initiate session")) + + super(XenSMDriver, self).__init__(execute=utils.execute, + sync_exec=utils.execute, + *args, **kwargs) + + def do_setup(self, ctxt): + """Setup includes creating or introducing storage repos + existing in the database and destroying deleted ones.""" + + # TODO(renukaapte) purge storage repos + self.ctxt = ctxt + self._create_storage_repos(ctxt) + + def create_volume(self, volume): + """Creates a logical volume. Can optionally return a Dictionary of + changes to the volume object to be persisted.""" + + # For now the scheduling logic will be to try to fit the volume in + # the first available backend. + # TODO(renukaapte) better scheduling once APIs are in place + sm_vol_rec = None + backends = self.db.sm_backend_conf_get_all(self.ctxt) + for backend in backends: + # Ensure that storage repo exists, if not create. + # This needs to be done because if cinder compute and + # volume are both running on this host, then, as a + # part of detach_volume, compute could potentially forget SR + self._create_storage_repo(self.ctxt, backend) + sm_vol_rec = self._volumeops.create_volume_for_sm(volume, + backend['sr_uuid']) + if sm_vol_rec: + LOG.debug(_('Volume will be created in backend - %d') + % backend['id']) + break + + if sm_vol_rec: + # Update db + sm_vol_rec['id'] = volume['id'] + sm_vol_rec['backend_id'] = backend['id'] + try: + self.db.sm_volume_create(self.ctxt, sm_vol_rec) + except Exception as ex: + LOG.exception(ex) + raise exception.Error(_("Failed to update volume in db")) + + else: + raise exception.Error(_('Unable to create volume')) + + def delete_volume(self, volume): + + vol_rec = self.db.sm_volume_get(self.ctxt, volume['id']) + + try: + # If compute runs on this node, detach could have disconnected SR + backend_ref = self.db.sm_backend_conf_get(self.ctxt, + vol_rec['backend_id']) + self._create_storage_repo(self.ctxt, backend_ref) + self._volumeops.delete_volume_for_sm(vol_rec['vdi_uuid']) + except Exception as ex: + LOG.exception(ex) + raise exception.Error(_("Failed to delete vdi")) + + try: + self.db.sm_volume_delete(self.ctxt, volume['id']) + except Exception as ex: + LOG.exception(ex) + raise exception.Error(_("Failed to delete volume in db")) + + def local_path(self, volume): + return str(volume['id']) + + def undiscover_volume(self, volume): + """Undiscover volume on a remote host.""" + pass + + def discover_volume(self, context, volume): + return str(volume['id']) + + def check_for_setup_error(self): + pass + + def create_export(self, context, volume): + """Exports the volume.""" + pass + + def remove_export(self, context, volume): + """Removes an export for a logical volume.""" + pass + + def ensure_export(self, context, volume): + """Safely, synchronously recreates an export for a logical volume.""" + pass + + def initialize_connection(self, volume, connector): + try: + xensm_properties = dict(self.db.sm_volume_get(self.ctxt, + volume['id'])) + except Exception as ex: + LOG.exception(ex) + raise exception.Error(_("Failed to find volume in db")) + + # Keep the volume id key consistent with what ISCSI driver calls it + xensm_properties['volume_id'] = xensm_properties['id'] + del xensm_properties['id'] + + try: + backend_conf = self.db.sm_backend_conf_get(self.ctxt, + xensm_properties['backend_id']) + except Exception as ex: + LOG.exception(ex) + raise exception.Error(_("Failed to find backend in db")) + + params = self._convert_config_params(backend_conf['config_params']) + + xensm_properties['flavor_id'] = backend_conf['flavor_id'] + xensm_properties['sr_uuid'] = backend_conf['sr_uuid'] + xensm_properties['sr_type'] = backend_conf['sr_type'] + xensm_properties.update(params) + _introduce_sr_keys = self._get_introduce_sr_keys(params) + xensm_properties['introduce_sr_keys'] = _introduce_sr_keys + return { + 'driver_volume_type': 'xensm', + 'data': xensm_properties + } + + def terminate_connection(self, volume, connector): + pass diff --git a/cinder/wsgi.py b/cinder/wsgi.py new file mode 100644 index 000000000..0bf63f9ee --- /dev/null +++ b/cinder/wsgi.py @@ -0,0 +1,374 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# Copyright 2010 OpenStack LLC. +# 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. + +"""Utility methods for working with WSGI servers.""" + +import sys + +import eventlet +import eventlet.wsgi +import greenlet +from paste import deploy +import routes.middleware +import webob.dec +import webob.exc + +from cinder import exception +from cinder import flags +from cinder import log as logging +from cinder import utils + + +FLAGS = flags.FLAGS +LOG = logging.getLogger(__name__) + + +class Server(object): + """Server class to manage a WSGI server, serving a WSGI application.""" + + default_pool_size = 1000 + + def __init__(self, name, app, host=None, port=None, pool_size=None, + protocol=eventlet.wsgi.HttpProtocol): + """Initialize, but do not start, a WSGI server. + + :param name: Pretty name for logging. + :param app: The WSGI application to serve. + :param host: IP address to serve the application. + :param port: Port number to server the application. + :param pool_size: Maximum number of eventlets to spawn concurrently. + :returns: None + + """ + self.name = name + self.app = app + self.host = host or "0.0.0.0" + self.port = port or 0 + self._server = None + self._socket = None + self._protocol = protocol + self._pool = eventlet.GreenPool(pool_size or self.default_pool_size) + self._logger = logging.getLogger("eventlet.wsgi.server") + self._wsgi_logger = logging.WritableLogger(self._logger) + + def _start(self): + """Run the blocking eventlet WSGI server. + + :returns: None + + """ + eventlet.wsgi.server(self._socket, + self.app, + protocol=self._protocol, + custom_pool=self._pool, + log=self._wsgi_logger) + + def start(self, backlog=128): + """Start serving a WSGI application. + + :param backlog: Maximum number of queued connections. + :returns: None + :raises: cinder.exception.InvalidInput + + """ + if backlog < 1: + raise exception.InvalidInput( + reason='The backlog must be more than 1') + self._socket = eventlet.listen((self.host, self.port), backlog=backlog) + self._server = eventlet.spawn(self._start) + (self.host, self.port) = self._socket.getsockname() + LOG.info(_("Started %(name)s on %(host)s:%(port)s") % self.__dict__) + + def stop(self): + """Stop this server. + + This is not a very nice action, as currently the method by which a + server is stopped is by killing its eventlet. + + :returns: None + + """ + LOG.info(_("Stopping WSGI server.")) + self._server.kill() + + def wait(self): + """Block, until the server has stopped. + + Waits on the server's eventlet to finish, then returns. + + :returns: None + + """ + try: + self._server.wait() + except greenlet.GreenletExit: + LOG.info(_("WSGI server has stopped.")) + + +class Request(webob.Request): + pass + + +class Application(object): + """Base WSGI application wrapper. Subclasses need to implement __call__.""" + + @classmethod + def factory(cls, global_config, **local_config): + """Used for paste app factories in paste.deploy config files. + + Any local configuration (that is, values under the [app:APPNAME] + section of the paste config) will be passed into the `__init__` method + as kwargs. + + A hypothetical configuration would look like: + + [app:wadl] + latest_version = 1.3 + paste.app_factory = cinder.api.fancy_api:Wadl.factory + + which would result in a call to the `Wadl` class as + + import cinder.api.fancy_api + fancy_api.Wadl(latest_version='1.3') + + You could of course re-implement the `factory` method in subclasses, + but using the kwarg passing it shouldn't be necessary. + + """ + return cls(**local_config) + + def __call__(self, environ, start_response): + r"""Subclasses will probably want to implement __call__ like this: + + @webob.dec.wsgify(RequestClass=Request) + def __call__(self, req): + # Any of the following objects work as responses: + + # Option 1: simple string + res = 'message\n' + + # Option 2: a nicely formatted HTTP exception page + res = exc.HTTPForbidden(detail='Nice try') + + # Option 3: a webob Response object (in case you need to play with + # headers, or you want to be treated like an iterable, or or or) + res = Response(); + res.app_iter = open('somefile') + + # Option 4: any wsgi app to be run next + res = self.application + + # Option 5: you can get a Response object for a wsgi app, too, to + # play with headers etc + res = req.get_response(self.application) + + # You can then just return your response... + return res + # ... or set req.response and return None. + req.response = res + + See the end of http://pythonpaste.org/webob/modules/dec.html + for more info. + + """ + raise NotImplementedError(_('You must implement __call__')) + + +class Middleware(Application): + """Base WSGI middleware. + + These classes require an application to be + initialized that will be called next. By default the middleware will + simply call its wrapped app, or you can override __call__ to customize its + behavior. + + """ + + @classmethod + def factory(cls, global_config, **local_config): + """Used for paste app factories in paste.deploy config files. + + Any local configuration (that is, values under the [filter:APPNAME] + section of the paste config) will be passed into the `__init__` method + as kwargs. + + A hypothetical configuration would look like: + + [filter:analytics] + redis_host = 127.0.0.1 + paste.filter_factory = cinder.api.analytics:Analytics.factory + + which would result in a call to the `Analytics` class as + + import cinder.api.analytics + analytics.Analytics(app_from_paste, redis_host='127.0.0.1') + + You could of course re-implement the `factory` method in subclasses, + but using the kwarg passing it shouldn't be necessary. + + """ + def _factory(app): + return cls(app, **local_config) + return _factory + + def __init__(self, application): + self.application = application + + def process_request(self, req): + """Called on each request. + + If this returns None, the next application down the stack will be + executed. If it returns a response then that response will be returned + and execution will stop here. + + """ + return None + + def process_response(self, response): + """Do whatever you'd like to the response.""" + return response + + @webob.dec.wsgify(RequestClass=Request) + def __call__(self, req): + response = self.process_request(req) + if response: + return response + response = req.get_response(self.application) + return self.process_response(response) + + +class Debug(Middleware): + """Helper class for debugging a WSGI application. + + Can be inserted into any WSGI application chain to get information + about the request and response. + + """ + + @webob.dec.wsgify(RequestClass=Request) + def __call__(self, req): + print ('*' * 40) + ' REQUEST ENVIRON' + for key, value in req.environ.items(): + print key, '=', value + print + resp = req.get_response(self.application) + + print ('*' * 40) + ' RESPONSE HEADERS' + for (key, value) in resp.headers.iteritems(): + print key, '=', value + print + + resp.app_iter = self.print_generator(resp.app_iter) + + return resp + + @staticmethod + def print_generator(app_iter): + """Iterator that prints the contents of a wrapper string.""" + print ('*' * 40) + ' BODY' + for part in app_iter: + sys.stdout.write(part) + sys.stdout.flush() + yield part + print + + +class Router(object): + """WSGI middleware that maps incoming requests to WSGI apps.""" + + def __init__(self, mapper): + """Create a router for the given routes.Mapper. + + Each route in `mapper` must specify a 'controller', which is a + WSGI app to call. You'll probably want to specify an 'action' as + well and have your controller be an object that can route + the request to the action-specific method. + + Examples: + mapper = routes.Mapper() + sc = ServerController() + + # Explicit mapping of one route to a controller+action + mapper.connect(None, '/svrlist', controller=sc, action='list') + + # Actions are all implicitly defined + mapper.resource('server', 'servers', controller=sc) + + # Pointing to an arbitrary WSGI app. You can specify the + # {path_info:.*} parameter so the target app can be handed just that + # section of the URL. + mapper.connect(None, '/v1.0/{path_info:.*}', controller=BlogApp()) + + """ + self.map = mapper + self._router = routes.middleware.RoutesMiddleware(self._dispatch, + self.map) + + @webob.dec.wsgify(RequestClass=Request) + def __call__(self, req): + """Route the incoming request to a controller based on self.map. + + If no match, return a 404. + + """ + return self._router + + @staticmethod + @webob.dec.wsgify(RequestClass=Request) + def _dispatch(req): + """Dispatch the request to the appropriate controller. + + Called by self._router after matching the incoming request to a route + and putting the information into req.environ. Either returns 404 + or the routed WSGI app's response. + + """ + match = req.environ['wsgiorg.routing_args'][1] + if not match: + return webob.exc.HTTPNotFound() + app = match['controller'] + return app + + +class Loader(object): + """Used to load WSGI applications from paste configurations.""" + + def __init__(self, config_path=None): + """Initialize the loader, and attempt to find the config. + + :param config_path: Full or relative path to the paste config. + :returns: None + + """ + config_path = config_path or FLAGS.api_paste_config + self.config_path = utils.find_config(config_path) + + def load_app(self, name): + """Return the paste URLMap wrapped WSGI application. + + :param name: Name of the application to load. + :returns: Paste URLMap object wrapping the requested application. + :raises: `cinder.exception.PasteAppNotFound` + + """ + try: + return deploy.loadapp("config:%s" % self.config_path, name=name) + except LookupError as err: + LOG.error(err) + raise exception.PasteAppNotFound(name=name, path=self.config_path) diff --git a/contrib/openstack-config b/contrib/openstack-config new file mode 100755 index 000000000..d7979f7ff --- /dev/null +++ b/contrib/openstack-config @@ -0,0 +1,65 @@ +#!/bin/sh -e +### BEGIN INIT INFO +# Provides: openstack +# Required-Start: mountkernfs $local_fs +# Required-Stop: $local_fs +# X-Start-Before: networking +# Should-Start: +# Default-Start: S +# Default-Stop: +# Short-Description: Apply configuration from OpenStack Config Drive +### END INIT INFO + +PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" + +. /lib/lsb/init-functions + +copy_cloud_config() { + LABEL="config" + if [ ! -e /dev/disk/by-label/${LABEL} ]; then + log_warning_msg "OpenStack Cloud Config drive not found" + return 1 + fi + + MNT=/tmp/config + mkdir -p ${MNT} + mount /dev/disk/by-label/${LABEL} ${MNT} + if [ -e ${MNT}/root/.ssh/authorized_keys ]; then + mkdir -m 700 -p /root/.ssh/ + cp ${MNT}/root/.ssh/authorized_keys /root/.ssh/ + chmod 600 ${MNT}/root/.ssh/authorized_keys + fi + if [ -e ${MNT}/etc/network/interfaces ]; then + cp ${MNT}/etc/network/interfaces /etc/network/ + chmod 644 /etc/network/interfaces + fi + umount ${MNT} + return 0 +} + +case "$1" in + start|"") + log_action_begin_msg "Applying OpenStack Cloud Config" + if copy_cloud_config; then + log_action_end_msg $? + else + log_action_end_msg $? + fi + ;; + + restart|reload|force-reload|status) + echo "Error: argument '$1' not supported" >&2 + exit 3 + ;; + + stop) + # No-op + ;; + + *) + echo "Usage: openstack.sh [start|stop]" >&2 + exit 3 + ;; +esac + +: diff --git a/contrib/redhat-eventlet.patch b/contrib/redhat-eventlet.patch new file mode 100644 index 000000000..0b77e6f72 --- /dev/null +++ b/contrib/redhat-eventlet.patch @@ -0,0 +1,16 @@ +--- .cinder-venv/lib/python2.6/site-packages/eventlet/green/subprocess.py.orig +2011-05-25 +23:31:34.597271402 +0000 ++++ .cinder-venv/lib/python2.6/site-packages/eventlet/green/subprocess.py +2011-05-25 +23:33:24.055602468 +0000 +@@ -32,7 +32,7 @@ + setattr(self, attr, wrapped_pipe) + __init__.__doc__ = subprocess_orig.Popen.__init__.__doc__ + +- def wait(self, check_interval=0.01): ++ def wait(self, check_interval=0.01, timeout=None): + # Instead of a blocking OS call, this version of wait() uses logic + # borrowed from the eventlet 0.2 processes.Process.wait() method. + try: + diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 000000000..291b04e45 --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1,3 @@ +_build/* +source/api/* +.autogenerated diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 000000000..ba789b5df --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,97 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SPHINXSOURCE = source +PAPER = +BUILDDIR = build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(SPHINXSOURCE) + +.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest + +.DEFAULT_GOAL = html + +help: + @echo "Please use \`make <target>' where <target> is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + -rm -rf cinder.sqlite + if [ -f .autogenerated ] ; then \ + cat .autogenerated | xargs rm ; \ + rm .autogenerated ; \ + fi + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/cinder.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/cinder.qhc" + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ + "run these through (pdf)latex." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/doc/README.rst b/doc/README.rst new file mode 100644 index 000000000..835dbc5d9 --- /dev/null +++ b/doc/README.rst @@ -0,0 +1,55 @@ +================= +Building the docs +================= + +Dependencies +============ + +Sphinx_ + You'll need sphinx (the python one) and if you are + using the virtualenv you'll need to install it in the virtualenv + specifically so that it can load the cinder modules. + + :: + + pip install Sphinx + +Graphviz_ + Some of the diagrams are generated using the ``dot`` language + from Graphviz. + + :: + + sudo apt-get install graphviz + +.. _Sphinx: http://sphinx.pocoo.org + +.. _Graphviz: http://www.graphviz.org/ + + +Use `make` +========== + +Just type make:: + + % make + +Look in the Makefile for more targets. + + +Manually +======== + + 1. Generate the code.rst file so that Sphinx will pull in our docstrings:: + + % ./generate_autodoc_index.sh > source/code.rst + + 2. Run `sphinx_build`:: + + % sphinx-build -b html source build/html + + +The docs have been built +======================== + +Check out the `build` directory to find them. Yay! diff --git a/doc/ext/__init__.py b/doc/ext/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/doc/ext/nova_autodoc.py b/doc/ext/nova_autodoc.py new file mode 100644 index 000000000..a778f4a52 --- /dev/null +++ b/doc/ext/nova_autodoc.py @@ -0,0 +1,12 @@ +import gettext +import os + +gettext.install('cinder') + +from cinder import utils + + +def setup(app): + print "**Autodocumenting from %s" % os.path.abspath(os.curdir) + rv = utils.execute('./doc/generate_autodoc_index.sh') + print rv[0] diff --git a/doc/ext/nova_todo.py b/doc/ext/nova_todo.py new file mode 100644 index 000000000..2bd652071 --- /dev/null +++ b/doc/ext/nova_todo.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +# This is a hack of the builtin todo extension, to make the todo_list more user friendly + +from sphinx.ext.todo import * +import re + +def _(s): + return s + + +def process_todo_nodes(app, doctree, fromdocname): + if not app.config['todo_include_todos']: + for node in doctree.traverse(todo_node): + node.parent.remove(node) + + # Replace all todolist nodes with a list of the collected todos. + # Augment each todo with a backlink to the original location. + env = app.builder.env + + if not hasattr(env, 'todo_all_todos'): + env.todo_all_todos = [] + + + # remove the item that was added in the constructor, since I'm tired of + # reading through docutils for the proper way to construct an empty list + lists = [] + for i in xrange(5): + lists.append(nodes.bullet_list("", nodes.Text('',''))) + lists[i].remove(lists[i][0]) + lists[i]['classes'].append('todo_list') + + for node in doctree.traverse(todolist): + if not app.config['todo_include_todos']: + node.replace_self([]) + continue + + for todo_info in env.todo_all_todos: + para = nodes.paragraph() + filename = env.doc2path(todo_info['docname'], base=None) + + # Create a reference + newnode = nodes.reference('', '') + + line_info = todo_info['lineno'] + link = _('%(filename)s, line %(line_info)d') % locals() + innernode = nodes.emphasis(link, link) + newnode['refdocname'] = todo_info['docname'] + + try: + newnode['refuri'] = app.builder.get_relative_uri( + fromdocname, todo_info['docname']) + newnode['refuri'] += '#' + todo_info['target']['refid'] + except NoUri: + # ignore if no URI can be determined, e.g. for LaTeX output + pass + + newnode.append(innernode) + para += newnode + para['classes'].append('todo_link') + + todo_entry = todo_info['todo'] + + env.resolve_references(todo_entry, todo_info['docname'], app.builder) + + item = nodes.list_item('', para) + todo_entry[1]['classes'].append('details') + + comment = todo_entry[1] + + m = re.match(r"^P(\d)", comment.astext()) + priority = 5 + if m: + priority = int(m.group(1)) + if (priority < 0): priority = 1 + if (priority > 5): priority = 5 + + item['classes'].append('todo_p' + str(priority)) + todo_entry['classes'].append('todo_p' + str(priority)) + + item.append(comment) + + lists[priority-1].insert(0, item) + + + node.replace_self(lists) + +def setup(app): + app.add_config_value('todo_include_todos', False, False) + + app.add_node(todolist) + app.add_node(todo_node, + html=(visit_todo_node, depart_todo_node), + latex=(visit_todo_node, depart_todo_node), + text=(visit_todo_node, depart_todo_node)) + + app.add_directive('todo', Todo) + app.add_directive('todolist', TodoList) + app.connect('doctree-read', process_todos) + app.connect('doctree-resolved', process_todo_nodes) + app.connect('env-purge-doc', purge_todos) + diff --git a/doc/find_autodoc_modules.sh b/doc/find_autodoc_modules.sh new file mode 100755 index 000000000..fb7e451a0 --- /dev/null +++ b/doc/find_autodoc_modules.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +CINDER_DIR='cinder/' # include trailing slash +DOCS_DIR='source' + +modules='' +for x in `find ${CINDER_DIR} -name '*.py' | grep -v cinder/tests`; do + if [ `basename ${x} .py` == "__init__" ] ; then + continue + fi + relative=cinder.`echo ${x} | sed -e 's$^'${CINDER_DIR}'$$' -e 's/.py$//' -e 's$/$.$g'` + modules="${modules} ${relative}" +done + +for mod in ${modules} ; do + if [ ! -f "${DOCS_DIR}/${mod}.rst" ]; + then + echo ${mod} + fi +done diff --git a/doc/generate_autodoc_index.sh b/doc/generate_autodoc_index.sh new file mode 100755 index 000000000..bdfa73a49 --- /dev/null +++ b/doc/generate_autodoc_index.sh @@ -0,0 +1,46 @@ +#!/bin/sh + +SOURCEDIR=doc/source/api + +if [ ! -d ${SOURCEDIR} ] ; then + mkdir -p ${SOURCEDIR} +fi + +for x in `./doc/find_autodoc_modules.sh`; +do + echo "Generating ${SOURCEDIR}/${x}.rst" + echo "${SOURCEDIR}/${x}.rst" >> .autogenerated + heading="The :mod:\`${x}\` Module" + # Figure out how long the heading is + # and make sure to emit that many '=' under + # it to avoid heading format errors + # in Sphinx. + heading_len=$(echo "$heading" | wc -c) + underline=$(head -c $heading_len < /dev/zero | tr '\0' '=') + ( cat <<EOF +${heading} +${underline} + +.. automodule:: ${x} + :members: + :undoc-members: + :show-inheritance: +EOF +) > ${SOURCEDIR}/${x}.rst + +done + +if [ ! -f ${SOURCEDIR}/autoindex.rst ] ; then + + cat > ${SOURCEDIR}/autoindex.rst <<EOF +.. toctree:: + :maxdepth: 1 + +EOF + for f in `cat .autogenerated | sort` ; do + relative=`echo ${f} | sed -e 's$^'${SOURCEDIR}'/$$'` + echo " ${relative}" >> ${SOURCEDIR}/autoindex.rst + done + + echo ${SOURCEDIR}/autoindex.rst >> .autogenerated +fi diff --git a/doc/source/_ga/layout.html b/doc/source/_ga/layout.html new file mode 100644 index 000000000..f29e90968 --- /dev/null +++ b/doc/source/_ga/layout.html @@ -0,0 +1,17 @@ +{% extends "!layout.html" %} + +{% block footer %} +{{ super() }} +<script type="text/javascript"> +var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); +document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); +</script> +<script type="text/javascript"> +try { +var pageTracker = _gat._getTracker("UA-17511903-3"); +pageTracker._setDomainName("none"); +pageTracker._setAllowLinker(true); +pageTracker._trackPageview(); +} catch(err) {}</script> +{% endblock %} + diff --git a/doc/source/_static/.gitignore b/doc/source/_static/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/doc/source/_static/.placeholder b/doc/source/_static/.placeholder new file mode 100644 index 000000000..e69de29bb diff --git a/doc/source/_static/basic.css b/doc/source/_static/basic.css new file mode 100644 index 000000000..d909ce37c --- /dev/null +++ b/doc/source/_static/basic.css @@ -0,0 +1,416 @@ +/** + * Sphinx stylesheet -- basic theme + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +img { + border: 0; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable dl, table.indextable dd { + margin-top: 0; + margin-bottom: 0; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +/* -- general body styles --------------------------------------------------- */ + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.field-list ul { + padding-left: 1em; +} + +.first { +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 0; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.field-list td, table.field-list th { + border: 0 !important; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +/* -- other body styles ----------------------------------------------------- */ + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, .highlight { + background-color: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.refcount { + color: #060; +} + +.optional { + font-size: 1.3em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +tt.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +tt.descclassname { + background-color: transparent; +} + +tt.xref, a tt { + background-color: transparent; + font-weight: bold; +} + +h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { + background-color: transparent; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} diff --git a/doc/source/_static/default.css b/doc/source/_static/default.css new file mode 100644 index 000000000..c8091ecb4 --- /dev/null +++ b/doc/source/_static/default.css @@ -0,0 +1,230 @@ +/** + * Sphinx stylesheet -- default theme + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: sans-serif; + font-size: 100%; + background-color: #11303d; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + background-color: #1c4e63; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: #ffffff; + color: #000000; + padding: 0 20px 30px 20px; +} + +div.footer { + color: #ffffff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #ffffff; + text-decoration: underline; +} + +div.related { + background-color: #133f52; + line-height: 30px; + color: #ffffff; +} + +div.related a { + color: #ffffff; +} + +div.sphinxsidebar { +} + +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: #ffffff; +} + +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: #ffffff; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: #ffffff; +} + +div.sphinxsidebar a { + color: #98dbcc; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #355f7c; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +div.body p, div.body dd, div.body li { + text-align: left; + line-height: 130%; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Trebuchet MS', sans-serif; + background-color: #f2f2f2; + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + text-align: left; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 5px; + background-color: #eeffcc; + color: #333333; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; +} + +tt { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +.warning tt { + background: #efc2c2; +} + +.note tt { + background: #d6d6d6; +} diff --git a/doc/source/_static/jquery.tweet.js b/doc/source/_static/jquery.tweet.js new file mode 100644 index 000000000..79bf0bdb4 --- /dev/null +++ b/doc/source/_static/jquery.tweet.js @@ -0,0 +1,154 @@ +(function($) { + + $.fn.tweet = function(o){ + var s = { + username: ["seaofclouds"], // [string] required, unless you want to display our tweets. :) it can be an array, just do ["username1","username2","etc"] + list: null, //[string] optional name of list belonging to username + avatar_size: null, // [integer] height and width of avatar if displayed (48px max) + count: 3, // [integer] how many tweets to display? + intro_text: null, // [string] do you want text BEFORE your your tweets? + outro_text: null, // [string] do you want text AFTER your tweets? + join_text: null, // [string] optional text in between date and tweet, try setting to "auto" + auto_join_text_default: "i said,", // [string] auto text for non verb: "i said" bullocks + auto_join_text_ed: "i", // [string] auto text for past tense: "i" surfed + auto_join_text_ing: "i am", // [string] auto tense for present tense: "i was" surfing + auto_join_text_reply: "i replied to", // [string] auto tense for replies: "i replied to" @someone "with" + auto_join_text_url: "i was looking at", // [string] auto tense for urls: "i was looking at" http:... + loading_text: null, // [string] optional loading text, displayed while tweets load + query: null // [string] optional search query + }; + + if(o) $.extend(s, o); + + $.fn.extend({ + linkUrl: function() { + var returning = []; + var regexp = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi; + this.each(function() { + returning.push(this.replace(regexp,"<a href=\"$1\">$1</a>")); + }); + return $(returning); + }, + linkUser: function() { + var returning = []; + var regexp = /[\@]+([A-Za-z0-9-_]+)/gi; + this.each(function() { + returning.push(this.replace(regexp,"<a href=\"http://twitter.com/$1\">@$1</a>")); + }); + return $(returning); + }, + linkHash: function() { + var returning = []; + var regexp = / [\#]+([A-Za-z0-9-_]+)/gi; + this.each(function() { + returning.push(this.replace(regexp, ' <a href="http://search.twitter.com/search?q=&tag=$1&lang=all&from='+s.username.join("%2BOR%2B")+'">#$1</a>')); + }); + return $(returning); + }, + capAwesome: function() { + var returning = []; + this.each(function() { + returning.push(this.replace(/\b(awesome)\b/gi, '<span class="awesome">$1</span>')); + }); + return $(returning); + }, + capEpic: function() { + var returning = []; + this.each(function() { + returning.push(this.replace(/\b(epic)\b/gi, '<span class="epic">$1</span>')); + }); + return $(returning); + }, + makeHeart: function() { + var returning = []; + this.each(function() { + returning.push(this.replace(/(<)+[3]/gi, "<tt class='heart'>♥</tt>")); + }); + return $(returning); + } + }); + + function relative_time(time_value) { + var parsed_date = Date.parse(time_value); + var relative_to = (arguments.length > 1) ? arguments[1] : new Date(); + var delta = parseInt((relative_to.getTime() - parsed_date) / 1000); + var pluralize = function (singular, n) { + return '' + n + ' ' + singular + (n == 1 ? '' : 's'); + }; + if(delta < 60) { + return 'less than a minute ago'; + } else if(delta < (45*60)) { + return 'about ' + pluralize("minute", parseInt(delta / 60)) + ' ago'; + } else if(delta < (24*60*60)) { + return 'about ' + pluralize("hour", parseInt(delta / 3600)) + ' ago'; + } else { + return 'about ' + pluralize("day", parseInt(delta / 86400)) + ' ago'; + } + } + + function build_url() { + var proto = ('https:' == document.location.protocol ? 'https:' : 'http:'); + if (s.list) { + return proto+"//api.twitter.com/1/"+s.username[0]+"/lists/"+s.list+"/statuses.json?per_page="+s.count+"&callback=?"; + } else if (s.query == null && s.username.length == 1) { + return proto+'//twitter.com/status/user_timeline/'+s.username[0]+'.json?count='+s.count+'&callback=?'; + } else { + var query = (s.query || 'from:'+s.username.join('%20OR%20from:')); + return proto+'//search.twitter.com/search.json?&q='+query+'&rpp='+s.count+'&callback=?'; + } + } + + return this.each(function(){ + var list = $('<ul class="tweet_list">').appendTo(this); + var intro = '<p class="tweet_intro">'+s.intro_text+'</p>'; + var outro = '<p class="tweet_outro">'+s.outro_text+'</p>'; + var loading = $('<p class="loading">'+s.loading_text+'</p>'); + + if(typeof(s.username) == "string"){ + s.username = [s.username]; + } + + if (s.loading_text) $(this).append(loading); + $.getJSON(build_url(), function(data){ + if (s.loading_text) loading.remove(); + if (s.intro_text) list.before(intro); + $.each((data.results || data), function(i,item){ + // auto join text based on verb tense and content + if (s.join_text == "auto") { + if (item.text.match(/^(@([A-Za-z0-9-_]+)) .*/i)) { + var join_text = s.auto_join_text_reply; + } else if (item.text.match(/(^\w+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+) .*/i)) { + var join_text = s.auto_join_text_url; + } else if (item.text.match(/^((\w+ed)|just) .*/im)) { + var join_text = s.auto_join_text_ed; + } else if (item.text.match(/^(\w*ing) .*/i)) { + var join_text = s.auto_join_text_ing; + } else { + var join_text = s.auto_join_text_default; + } + } else { + var join_text = s.join_text; + }; + + var from_user = item.from_user || item.user.screen_name; + var profile_image_url = item.profile_image_url || item.user.profile_image_url; + var join_template = '<span class="tweet_join"> '+join_text+' </span>'; + var join = ((s.join_text) ? join_template : ' '); + var avatar_template = '<a class="tweet_avatar" href="http://twitter.com/'+from_user+'"><img src="'+profile_image_url+'" height="'+s.avatar_size+'" width="'+s.avatar_size+'" alt="'+from_user+'\'s avatar" title="'+from_user+'\'s avatar" border="0"/></a>'; + var avatar = (s.avatar_size ? avatar_template : ''); + var date = '<a href="http://twitter.com/'+from_user+'/statuses/'+item.id+'" title="view tweet on twitter">'+relative_time(item.created_at)+'</a>'; + var text = '<span class="tweet_text">' +$([item.text]).linkUrl().linkUser().linkHash().makeHeart().capAwesome().capEpic()[0]+ '</span>'; + + // until we create a template option, arrange the items below to alter a tweet's display. + list.append('<li>' + avatar + date + join + text + '</li>'); + + list.children('li:first').addClass('tweet_first'); + list.children('li:odd').addClass('tweet_even'); + list.children('li:even').addClass('tweet_odd'); + }); + if (s.outro_text) list.after(outro); + }); + + }); + }; +})(jQuery); \ No newline at end of file diff --git a/doc/source/_static/tweaks.css b/doc/source/_static/tweaks.css new file mode 100644 index 000000000..046ead840 --- /dev/null +++ b/doc/source/_static/tweaks.css @@ -0,0 +1,218 @@ +ul.todo_list { + list-style-type: none; + margin: 0; + padding: 0; +} + +ul.todo_list li { + display: block; + margin: 0; + padding: 7px 0; + border-top: 1px solid #eee; +} + +ul.todo_list li p { + display: inline; +} + +ul.todo_list li p.link { + font-weight: bold; +} + +ul.todo_list li p.details { + font-style: italic; +} + +ul.todo_list li { +} + +div.admonition { + border: 1px solid #8F1000; +} + +div.admonition p.admonition-title { + background-color: #8F1000; + border-bottom: 1px solid #8E8E8E; +} + +a { + color: #CF2F19; +} + +div.related ul li a { + color: #CF2F19; +} + +div.sphinxsidebar h4 { + background-color:#8E8E8E; + border:1px solid #255E6E; + color:white; + font-size:1em; + margin:1em 0 0.5em; + padding:0.1em 0 0.1em 0.5em; +} + +em { + font-style: normal; +} + +table.docutils { + font-size: 11px; +} + +.tweet_list li { + font-size: 0.9em; + border-bottom: 1px solid #eee; + padding: 5px 0; +} + +.tweet_list li .tweet_avatar { + float: left; +} + +/* ------------------------------------------ +PURE CSS SPEECH BUBBLES +by Nicolas Gallagher +- http://nicolasgallagher.com/pure-css-speech-bubbles/ + +http://nicolasgallagher.com +http://twitter.com/necolas + +Created: 02 March 2010 +Version: 1.1 (21 October 2010) + +Dual licensed under MIT and GNU GPLv2 © Nicolas Gallagher +------------------------------------------ */ +/* THE SPEECH BUBBLE +------------------------------------------------------------------------------------------------------------------------------- */ + +/* THE SPEECH BUBBLE +------------------------------------------------------------------------------------------------------------------------------- */ + +.triangle-border { + position:relative; + padding:15px; + margin:1em 0 3em; + border:5px solid #BC1518; + color:#333; + background:#fff; + + /* css3 */ + -moz-border-radius:10px; + -webkit-border-radius:10px; + border-radius:10px; +} + +/* Variant : for left positioned triangle +------------------------------------------ */ + +.triangle-border.left { + margin-left:30px; +} + +/* Variant : for right positioned triangle +------------------------------------------ */ + +.triangle-border.right { + margin-right:30px; +} + +/* THE TRIANGLE +------------------------------------------------------------------------------------------------------------------------------- */ + +.triangle-border:before { + content:""; + display:block; /* reduce the damage in FF3.0 */ + position:absolute; + bottom:-40px; /* value = - border-top-width - border-bottom-width */ + left:40px; /* controls horizontal position */ + width:0; + height:0; + border:20px solid transparent; + border-top-color:#BC1518; +} + +/* creates the smaller triangle */ +.triangle-border:after { + content:""; + display:block; /* reduce the damage in FF3.0 */ + position:absolute; + bottom:-26px; /* value = - border-top-width - border-bottom-width */ + left:47px; /* value = (:before left) + (:before border-left) - (:after border-left) */ + width:0; + height:0; + border:13px solid transparent; + border-top-color:#fff; +} + +/* Variant : top +------------------------------------------ */ + +/* creates the larger triangle */ +.triangle-border.top:before { + top:-40px; /* value = - border-top-width - border-bottom-width */ + right:40px; /* controls horizontal position */ + bottom:auto; + left:auto; + border:20px solid transparent; + border-bottom-color:#BC1518; +} + +/* creates the smaller triangle */ +.triangle-border.top:after { + top:-26px; /* value = - border-top-width - border-bottom-width */ + right:47px; /* value = (:before right) + (:before border-right) - (:after border-right) */ + bottom:auto; + left:auto; + border:13px solid transparent; + border-bottom-color:#fff; +} + +/* Variant : left +------------------------------------------ */ + +/* creates the larger triangle */ +.triangle-border.left:before { + top:10px; /* controls vertical position */ + left:-30px; /* value = - border-left-width - border-right-width */ + bottom:auto; + border-width:15px 30px 15px 0; + border-style:solid; + border-color:transparent #BC1518; +} + +/* creates the smaller triangle */ +.triangle-border.left:after { + top:16px; /* value = (:before top) + (:before border-top) - (:after border-top) */ + left:-21px; /* value = - border-left-width - border-right-width */ + bottom:auto; + border-width:9px 21px 9px 0; + border-style:solid; + border-color:transparent #fff; +} + +/* Variant : right +------------------------------------------ */ + +/* creates the larger triangle */ +.triangle-border.right:before { + top:10px; /* controls vertical position */ + right:-30px; /* value = - border-left-width - border-right-width */ + bottom:auto; + left:auto; + border-width:15px 0 15px 30px; + border-style:solid; + border-color:transparent #BC1518; +} + +/* creates the smaller triangle */ +.triangle-border.right:after { + top:16px; /* value = (:before top) + (:before border-top) - (:after border-top) */ + right:-21px; /* value = - border-left-width - border-right-width */ + bottom:auto; + left:auto; + border-width:9px 0 9px 21px; + border-style:solid; + border-color:transparent #fff; +} + diff --git a/doc/source/_templates/.gitignore b/doc/source/_templates/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/doc/source/_templates/.placeholder b/doc/source/_templates/.placeholder new file mode 100644 index 000000000..e69de29bb diff --git a/doc/source/_theme/layout.html b/doc/source/_theme/layout.html new file mode 100644 index 000000000..1e0e69e98 --- /dev/null +++ b/doc/source/_theme/layout.html @@ -0,0 +1,95 @@ +{% extends "sphinxdoc/layout.html" %} +{% set css_files = css_files + ['_static/tweaks.css'] %} +{% set script_files = script_files + ['_static/jquery.tweet.js'] %} +{% block extrahead %} + <script type='text/javascript'> + $(document).ready(function(){ + $("#twitter_feed").tweet({ + username: "openstack", + query: "from:openstack", + avatar_size: 32, + count: 10, + loading_text: "loading tweets..." + }); + }); + </script> +{% endblock %} + +{%- macro sidebar() %} + {%- if not embedded %}{% if not theme_nosidebar|tobool %} + <div class="sphinxsidebar"> + <div class="sphinxsidebarwrapper"> + {%- block sidebarlogo %} + {%- if logo %} + <p class="logo"><a href="{{ pathto(master_doc) }}"> + <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/> + </a></p> + {%- endif %} + {%- endblock %} + {%- block sidebartoc %} + {%- if display_toc %} + <h3><a href="{{ pathto(master_doc) }}">{{ _('Table Of Contents') }}</a></h3> + {{ toc }} + {%- endif %} + {%- endblock %} + {%- block sidebarrel %} + {%- if prev %} + <h4>{{ _('Previous topic') }}</h4> + <p class="topless"><a href="{{ prev.link|e }}" + title="{{ _('previous chapter') }}">{{ prev.title }}</a></p> + {%- endif %} + {%- if next %} + <h4>{{ _('Next topic') }}</h4> + <p class="topless"><a href="{{ next.link|e }}" + title="{{ _('next chapter') }}">{{ next.title }}</a></p> + {%- endif %} + {%- endblock %} + {%- block sidebarsourcelink %} + {%- if show_source and has_source and sourcename %} + <h3>{{ _('This Page') }}</h3> + <ul class="this-page-menu"> + <li><a href="{{ pathto('_sources/' + sourcename, true)|e }}" + rel="nofollow">{{ _('Show Source') }}</a></li> + </ul> + {%- endif %} + {%- endblock %} + {%- if customsidebar %} + {% include customsidebar %} + {%- endif %} + {%- block sidebarsearch %} + {%- if pagename != "search" %} + <div id="searchbox" style="display: none"> + <h3>{{ _('Quick search') }}</h3> + <form class="search" action="{{ pathto('search') }}" method="get"> + <input type="text" name="q" size="18" /> + <input type="submit" value="{{ _('Go') }}" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + {{ _('Enter search terms or a module, class or function name.') }} + </p> + </div> + <script type="text/javascript">$('#searchbox').show(0);</script> + + <p class="triangle-border right"> + Psst... hey. You're reading the latest content, but it might be out of sync with code. You can read <a href="http://cinder.openstack.org/2011.2">Cinder 2011.2 docs</a> or <a href="http://docs.openstack.org">all OpenStack docs</a> too. + </p> + + {%- endif %} + + {%- if pagename == "index" %} + + + <h3>{{ _('Twitter Feed') }}</h3> + <div id="twitter_feed" class='twitter_feed'></div> + {%- endif %} + + + + + {%- endblock %} + </div> + </div> + {%- endif %}{% endif %} +{%- endmacro %} diff --git a/doc/source/_theme/theme.conf b/doc/source/_theme/theme.conf new file mode 100644 index 000000000..e039fe01f --- /dev/null +++ b/doc/source/_theme/theme.conf @@ -0,0 +1,5 @@ +[theme] +inherit = sphinxdoc +stylesheet = sphinxdoc.css +pygments_style = friendly + diff --git a/doc/source/conf.py b/doc/source/conf.py new file mode 100644 index 000000000..6d55ed5e5 --- /dev/null +++ b/doc/source/conf.py @@ -0,0 +1,234 @@ +# -*- coding: utf-8 -*- +# +# cinder documentation build configuration file, created by +# sphinx-quickstart on Sat May 1 15:17:47 2010. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +sys.path.insert(0, os.path.abspath('../../')) +sys.path.insert(0, os.path.abspath('../')) +sys.path.insert(0, os.path.abspath('./')) + +# -- General configuration ----------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. + +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'ext.cinder_todo', 'sphinx.ext.coverage', 'sphinx.ext.pngmath', 'sphinx.ext.ifconfig','sphinx.ext.graphviz'] + +# autodoc generation is a bit aggressive and a nuisance when doing heavy text edit cycles. +# execute "export SPHINX_DEBUG=1" in your terminal to disable +if not os.getenv('SPHINX_DEBUG'): + extensions += ['ext.cinder_autodoc'] + +todo_include_todos = True + +# Add any paths that contain templates here, relative to this directory. +# Changing the path so that the Hudson build output contains GA code and the source +# docs do not contain the code so local, offline sphinx builds are "clean." +templates_path = [] +if os.getenv('HUDSON_PUBLISH_DOCS'): + templates_path = ['_ga', '_templates'] +else: + templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'cinder' +copyright = u'2010-present, OpenStack, LLC' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +from cinder import version as cinder_version +#import cinder.version +# The full version, including alpha/beta/rc tags. +release = cinder_version.version_string() +# The short X.Y version. +version = cinder_version.canonical_version_string() + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of documents that shouldn't be included in the build. +unused_docs = [ + 'api_ext/rst_extension_template', + 'vmwareapi_readme', + 'installer', + ] + +# List of directories, relative to source directory, that shouldn't be searched +# for source files. +exclude_trees = [] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +add_module_names = False + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +modindex_common_prefix = ['cinder.'] + +# -- Options for man page output ----------------------------------------------- + +# Grouping the document tree for man pages. +# List of tuples 'sourcefile', 'target', u'title', u'Authors name', 'manual' + +man_pages = [ + ('man/cinder-manage', 'cinder-manage', u'Cloud controller fabric', + [u'OpenStack'], 1) + ] + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. Major themes that come with +# Sphinx are currently 'default' and 'sphinxdoc'. +html_theme_path = ["."] +html_theme = '_theme' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# "<project> v<release> documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' +git_cmd = "git log --pretty=format:'%ad, commit %h' --date=local -n1" +html_last_updated_fmt = os.popen(git_cmd).read() + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_use_modindex = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a <link> tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = '' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'cinderdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'Cinder.tex', u'Cinder Documentation', + u'Anso Labs, LLC', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_use_modindex = True + + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = {'python': ('http://docs.python.org/', None), + 'swift': ('http://swift.openstack.org', None)} + diff --git a/doc/source/devref/addmethod.openstackapi.rst b/doc/source/devref/addmethod.openstackapi.rst new file mode 100644 index 000000000..579b295a0 --- /dev/null +++ b/doc/source/devref/addmethod.openstackapi.rst @@ -0,0 +1,56 @@ +.. + Copyright 2010-2011 OpenStack LLC + 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. + +Adding a Method to the OpenStack API +==================================== + +The interface is a mostly RESTful API. REST stands for Representational State Transfer and provides an architecture "style" for distributed systems using HTTP for transport. Figure out a way to express your request and response in terms of resources that are being created, modified, read, or destroyed. + +Routing +------- + +To map URLs to controllers+actions, OpenStack uses the Routes package, a clone of Rails routes for Python implementations. See http://routes.groovie.org/ for more information. + +URLs are mapped to "action" methods on "controller" classes in ``cinder/api/openstack/__init__/ApiRouter.__init__`` . + +See http://routes.groovie.org/manual.html for all syntax, but you'll probably just need these two: + - mapper.connect() lets you map a single URL to a single action on a controller. + - mapper.resource() connects many standard URLs to actions on a controller. + +Controllers and actions +----------------------- + +Controllers live in ``cinder/api/openstack``, and inherit from cinder.wsgi.Controller. + +See ``cinder/api/openstack/servers.py`` for an example. + +Action methods take parameters that are sucked out of the URL by mapper.connect() or .resource(). The first two parameters are self and the WebOb request, from which you can get the req.environ, req.body, req.headers, etc. + +Serialization +------------- + +Actions return a dictionary, and wsgi.Controller serializes that to JSON or XML based on the request's content-type. + +If you define a new controller, you'll need to define a ``_serialization_metadata`` attribute on the class, to tell wsgi.Controller how to convert your dictionary to XML. It needs to know the singular form of any list tag (e.g. ``<servers>`` list contains ``<server>`` tags) and which dictionary keys are to be XML attributes as opposed to subtags (e.g. ``<server id="4"/>`` instead of ``<server><id>4</id></server>``). + +See `cinder/api/openstack/servers.py` for an example. + +Faults +------ + +If you need to return a non-200, you should +return faults.Fault(webob.exc.HTTPNotFound()) +replacing the exception as appropriate. diff --git a/doc/source/devref/aggregates.rst b/doc/source/devref/aggregates.rst new file mode 100644 index 000000000..616ff9826 --- /dev/null +++ b/doc/source/devref/aggregates.rst @@ -0,0 +1,65 @@ +.. + Copyright 2012 OpenStack, LLC + Copyright 2012 Citrix 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. + +Host Aggregates +=============== + +This extension introduces the concept of aggregate into Cinder. Host aggregates are different from zones and availability zones: while the former allows the partition of Cinder deployments into logical groups for load balancing and instance distribution, the latter are for providing some form of physical isolation and redundancy from other availability zones (e.g. by using separate power supply and network gears). Availability zones do not necessarily mean geographic distribution whereas zones usually do. Host aggregates can be regarded as a mechanism to further partitioning an availability zone, i.e. into multiple groups of hosts that share common resources like storage and network. This enables a finer level of granularity in which to structure an entire OpenStack deployment. Aggregates allows higher availability of a single guest instance within an availability zone, it enables advanced VM placement strategies, and more importantly it enables hosts' zero-downtime upgrades (for example, via VM live migration across members of the aggregate, thus causing no disruption to guest instances). + +You can use this extension when you have multiple Compute nodes installed (only XenServer/XCP via xenapi driver is currently supported), and you want to leverage the capabilities of the underlying hypervisor resource pools. For example, you want to enable VM live migration (i.e. VM migration within the pool) or enable host maintenance with zero-downtime for guest instances. Please, note that VM migration across pools (i.e. storage migration) is not yet supported in XenServer/XCP, but will be added when available. Bear in mind that the two migration techniques are not mutually exclusive and can be used in combination for a higher level of flexibility in your cloud management. + +Design +======= + +The OSAPI Admin API will be extended to support the following operations: + + * Aggregates + + * list aggregates: returns a list of all the host-aggregates (optionally filtered by availability zone) + * create aggregate: creates an aggregate, takes a friendly name, etc. returns an id + * show aggregate: shows the details of an aggregate (id, name, availability_zone, hosts and metadata) + * update aggregate: updates the name and availability zone of an aggregate + * set metadata: sets the metadata on an aggregate to the values supplied + * delete aggregate: deletes an aggregate, it fails if the aggregate is not empty + * add host: adds a host to the aggregate + * remove host: removes a host from the aggregate, it fails if the host is not disabled or + + * Hosts + + * start host maintenance (or evacuate-host): disallow a host to serve API requests and migrate instances to other hosts of the aggregate + * stop host maintenance: (or rebalance-host): put the host back into operational mode, migrating instances back onto that host + +Using the Cinder CLI +================== + +Using the cinder command you can create, delete and manage aggregates. The following section outlines the list of available commands. + +Usage +----- + +:: + + * aggregate-list Print a list of all aggregates. + * aggregate-create <name> <availability_zone> Create a new aggregate with the specified details. + * aggregate-delete <id> Delete the aggregate by its id. + * aggregate-details <id> Show details of the specified aggregate. + * aggregate-add-host <id> <host> Add the host to the specified aggregate. + * aggregate-remove-host <id> <host> Remove the specified host from the specfied aggregate. + * aggregate-set-metadata <id> <key=value> [<key=value> ...] Update the metadata associated with the aggregate. + * aggregate-update <id> <name> [<availability_zone>] Update the aggregate's name and optionally availablity zone. + + * host-update --maintenance [enable | disable] Put/resume host into/from maintenance. diff --git a/doc/source/devref/api.rst b/doc/source/devref/api.rst new file mode 100644 index 000000000..f6edde88d --- /dev/null +++ b/doc/source/devref/api.rst @@ -0,0 +1,270 @@ +.. + Copyright 2010-2011 United States Government as represented by the + Administrator of the National Aeronautics and Space Administration. + 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. + +API Endpoint +============ + +Cinder has a system for managing multiple APIs on different subdomains. +Currently there is support for the OpenStack API, as well as the Amazon EC2 +API. + +Common Components +----------------- + +The :mod:`cinder.api` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: cinder.api + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`cinder.api.cloud` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.api.cloud + :noindex: + :members: + :undoc-members: + :show-inheritance: + +OpenStack API +------------- + +The :mod:`openstack` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: cinder.api.openstack + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`auth` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: cinder.api.openstack.auth + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`backup_schedules` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: cinder.api.openstack.backup_schedules + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`faults` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: cinder.api.openstack.faults + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`flavors` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: cinder.api.openstack.flavors + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`images` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: cinder.api.openstack.images + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`servers` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: cinder.api.openstack.servers + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`sharedipgroups` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: cinder.api.openstack.sharedipgroups + :noindex: + :members: + :undoc-members: + :show-inheritance: + +EC2 API +------- + +The :mod:`cinder.api.ec2` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.api.ec2 + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`apirequest` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.api.ec2.apirequest + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`cloud` Module +~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.api.ec2.cloud + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`images` Module +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.api.ec2.images + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`metadatarequesthandler` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.api.ec2.metadatarequesthandler + :noindex: + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +The :mod:`api_unittest` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.api_unittest + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`api_integration` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.api_integration + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`cloud_unittest` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.cloud_unittest + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`api.fakes` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.api.fakes + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`api.test_wsgi` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.api.test_wsgi + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`test_api` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.api.openstack.test_api + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`test_auth` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.api.openstack.test_auth + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`test_faults` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.api.openstack.test_faults + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`test_flavors` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.api.openstack.test_flavors + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`test_images` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.api.openstack.test_images + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`test_servers` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.api.openstack.test_servers + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`test_sharedipgroups` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.api.openstack.test_sharedipgroups + :noindex: + :members: + :undoc-members: + :show-inheritance: + diff --git a/doc/source/devref/architecture.rst b/doc/source/devref/architecture.rst new file mode 100644 index 000000000..5715ee0ad --- /dev/null +++ b/doc/source/devref/architecture.rst @@ -0,0 +1,52 @@ +.. + Copyright 2010-2011 United States Government as represented by the + Administrator of the National Aeronautics and Space Administration. + 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. + +Cinder System Architecture +======================== + +Cinder is built on a shared-nothing, messaging-based architecture. All of the major cinder components can be run on multiple servers. This means that most component to component communication must go via message queue. In order to avoid blocking each component while waiting for a response, we use deferred objects, with a callback that gets triggered when a response is received. + +Cinder recently moved to using a sql-based central database that is shared by all components in the system. The amount and depth of the data fits into a sql database quite well. For small deployments this seems like an optimal solution. For larger deployments, and especially if security is a concern, cinder will be moving towards multiple data stores with some kind of aggregation system. + +Components +---------- + +Below you will find a helpful explanation of the different components. + +:: + + /- ( LDAP ) + [ Auth Manager ] --- + | \- ( DB ) + | + | [ scheduler ] - [ volume ] - ( ATAoE/iSCSI ) + | / + [ Web Dashboard ] -> [ api ] -- < AMQP > ------ [ network ] - ( Flat/Vlan ) + | \ + < HTTP > [ scheduler ] - [ compute ] - ( libvirt/xen ) + | | + [ objectstore ] < - retrieves images + +* DB: sql database for data storage. Used by all components (LINKS NOT SHOWN) +* Web Dashboard: potential external component that talks to the api +* api: component that receives http requests, converts commands and communicates with other components via the queue or http (in the case of objectstore) +* Auth Manager: component responsible for users/projects/and roles. Can backend to DB or LDAP. This is not a separate binary, but rather a python class that is used by most components in the system. +* objectstore: http server that replicates s3 api and allows storage and retrieval of images +* scheduler: decides which host gets each vm and volume +* volume: manages dynamically attachable block devices. +* network: manages ip forwarding, bridges, and vlans +* compute: manages communication with hypervisor and virtual machines. diff --git a/doc/source/devref/auth.rst b/doc/source/devref/auth.rst new file mode 100644 index 000000000..625760929 --- /dev/null +++ b/doc/source/devref/auth.rst @@ -0,0 +1,276 @@ +.. + Copyright 2010-2011 United States Government as represented by the + Administrator of the National Aeronautics and Space Administration. + 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. + +.. _auth: + +Authentication and Authorization +================================ + +The :mod:`cinder.quota` Module +---------------------------- + +.. automodule:: cinder.quota + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.auth.signer` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.auth.signer + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +Auth Manager +------------ + +The :mod:`cinder.auth.manager` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.auth.manager + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.auth.ldapdriver` Driver +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.auth.ldapdriver + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`cinder.auth.dbdriver` Driver +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.auth.dbdriver + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +Tests +----- + + +The :mod:`auth_unittest` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.auth_unittest + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`access_unittest` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.access_unittest + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`quota_unittest` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.quota_unittest + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +Legacy Docs +----------- + +Cinder provides RBAC (Role-based access control) of the AWS-type APIs. We define the following roles: + +Roles-Based Access Control of AWS-style APIs using SAML Assertions +âAchieving FIPS 199 Moderate certification of a hybrid cloud environment using CloudAudit and declarative C.I.A. classificationsâ + + +Introduction +------------ + +We will investigate one method for integrating an AWS-style API with US eAuthentication-compatible federated authentication systems, to achieve access controls and limits based on traditional operational roles. +Additionally, we will look at how combining this approach, with an implementation of the CloudAudit APIs, will allow us to achieve a certification under FIPS 199 Moderate classification for a hybrid cloud environment. + + +Relationship of US eAuth to RBAC +-------------------------------- + +Typical implementations of US eAuth authentication systems are structured as follows:: + + [ MS Active Directory or other federated LDAP user store ] + --> backends to⦠+ [ SUN Identity Manager or other SAML Policy Controller ] + --> maps URLs to groups⦠+ [ Apache Policy Agent in front of eAuth-secured Web Application ] + +In more ideal implementations, the remainder of the application-specific account information is stored either in extended schema on the LDAP server itself, via the use of a translucent LDAP proxy, or in an independent datastore keyed off of the UID provided via SAML assertion. + +.. _auth_roles: + + +Roles +----- + +AWS API calls are traditionally secured via Access and Secret Keys, which are used to sign API calls, along with traditional timestamps to prevent replay attacks. The APIs can be logically grouped into sets that align with five typical roles: + +* Base User +* System Administrator/Developer (currently have the same permissions) +* Network Administrator +* Project Manager +* Cloud Administrator/IT-Security (currently have the same permissions) + +There is an additional, conceptual end-user that may or may not have API access: + +* (EXTERNAL) End-user / Third-party User + +Basic operations are available to any : + +* Describe Instances +* Describe Images +* Describe Volumes +* Describe Keypairs +* Create Keypair +* Delete Keypair +* Create, Upload, Delete: Buckets and Keys (Object Store) + +System Administrators/Developers/Project Manager: + +* Create, Attach, Delete Volume (Block Store) +* Launch, Reboot, Terminate Instance +* Register/Unregister Machine Image (project-wide) +* Request / Review CloudAudit Scans + +Project Manager: + +* Add and remove other users (currently no api) +* Set roles (currently no api) + +Network Administrator: + +* Change Machine Image properties (public / private) +* Change Firewall Rules, define Security Groups +* Allocate, Associate, Deassociate Public IP addresses + +Cloud Administrator/IT-Security: + +* All permissions + + +Enhancements +------------ + +* SAML Token passing +* REST interfaces +* SOAP interfaces + +Wrapping the SAML token into the API calls. +Then store the UID (fetched via backchannel) into the instance metadata, providing end-to-end auditability of ownership and responsibility, without PII. + + +CloudAudit APIs +--------------- + +* Request formats +* Response formats +* Stateless asynchronous queries + +CloudAudit queries may spawn long-running processes (similar to launching instances, etc.) They need to return a ReservationId in the same fashion, which can be returned in further queries for updates. +RBAC of CloudAudit API calls is critical, since detailed system information is a system vulnerability. + + +Type declarations +----------------- +* Data declarations â Volumes and Objects +* System declarations â Instances + +Existing API calls to launch instances specific a single, combined âtypeâ flag. We propose to extend this with three additional type declarations, mapping to the âConfidentiality, Integrity, Availabilityâ classifications of FIPS 199. An example API call would look like:: + + RunInstances type=m1.large number=1 secgroup=default key=mykey confidentiality=low integrity=low availability=low + +These additional parameters would also apply to creation of block storage volumes (along with the existing parameter of âsizeâ), and creation of object storage âbucketsâ. (C.I.A. classifications on a bucket would be inherited by the keys within this bucket.) + + +Request Brokering +----------------- + +* Cloud Interop +* IMF Registration / PubSub +* Digital C&A + +Establishing declarative semantics for individual API calls will allow the cloud environment to seamlessly proxy these API calls to external, third-party vendors â when the requested CIA levels match. + +See related work within the Infrastructure 2.0 working group for more information on how the IMF Metadata specification could be utilized to manage registration of these vendors and their C&A credentials. + + +Dirty Cloud â Hybrid Data Centers +--------------------------------- + +* CloudAudit bridge interfaces +* Anything in the ARP table + +A hybrid cloud environment provides dedicated, potentially co-located physical hardware with a network interconnect to the project or usersâ cloud virtual network. + +This interconnect is typically a bridged VPN connection. Any machines that can be bridged into a hybrid environment in this fashion (at Layer 2) must implement a minimum version of the CloudAudit spec, such that they can be queried to provide a complete picture of the IT-sec runtime environment. + +Network discovery protocols (ARP, CDP) can be applied in this case, and existing protocols (SNMP location data, DNS LOC records) overloaded to provide CloudAudit information. + + +The Details +----------- + +* Preliminary Roles Definitions +* Categorization of available API calls +* SAML assertion vocabulary + + +System limits +------------- + +The following limits need to be defined and enforced: + +* Total number of instances allowed (user / project) +* Total number of instances, per instance type (user / project) +* Total number of volumes (user / project) +* Maximum size of volume +* Cumulative size of all volumes +* Total use of object storage (GB) +* Total number of Public IPs + + +Further Challenges +------------------ + +* Prioritization of users / jobs in shared computing environments +* Incident response planning +* Limit launch of instances to specific security groups based on AMI +* Store AMIs in LDAP for added property control diff --git a/doc/source/devref/cloudpipe.rst b/doc/source/devref/cloudpipe.rst new file mode 100644 index 000000000..770807fbb --- /dev/null +++ b/doc/source/devref/cloudpipe.rst @@ -0,0 +1,166 @@ +.. + Copyright 2010-2011 United States Government as represented by the + Administrator of the National Aeronautics and Space Administration. + 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. + + +.. _cloudpipe: + +Cloudpipe -- Per Project Vpns +============================= + +Cloudpipe is a method for connecting end users to their project instances in vlan mode. + + +Overview +-------- + +The support code for cloudpipe implements admin commands (via cinder-manage) to automatically create a vm for a project that allows users to vpn into the private network of their project. Access to this vpn is provided through a public port on the network host for the project. This allows users to have free access to the virtual machines in their project without exposing those machines to the public internet. + + +Cloudpipe Image +--------------- + +The cloudpipe image is basically just a linux instance with openvpn installed. It needs a simple script to grab user data from the metadata server, b64 decode it into a zip file, and run the autorun.sh script from inside the zip. The autorun script will configure and run openvpn to run using the data from cinder. + +It is also useful to have a cron script that will periodically redownload the metadata and copy the new crl. This will keep revoked users from connecting and will disconnect any users that are connected with revoked certificates when their connection is renegotiated (every hour). + + +Creating a Cloudpipe Image +-------------------------- + +Making a cloudpipe image is relatively easy. + +# install openvpn on a base ubuntu image. +# set up a server.conf.template in /etc/openvpn/ + +.. literalinclude:: server.conf.template + :language: bash + :linenos: + +# set up.sh in /etc/openvpn/ + +.. literalinclude:: up.sh + :language: bash + :linenos: + +# set down.sh in /etc/openvpn/ + +.. literalinclude:: down.sh + :language: bash + :linenos: + +# download and run the payload on boot from /etc/rc.local + +.. literalinclude:: rc.local + :language: bash + :linenos: + +# setup /etc/network/interfaces + +.. literalinclude:: interfaces + :language: bash + :linenos: + +# register the image and set the image id in your flagfile:: + + --vpn_image_id=ami-xxxxxxxx + +# you should set a few other flags to make vpns work properly:: + + --use_project_ca + --cnt_vpn_clients=5 + + +Cloudpipe Launch +---------------- + +When you use cinder-manage to launch a cloudpipe for a user, it goes through the following process: + +#. creates a keypair called <project_id>-vpn and saves it in the keys directory +#. creates a security group <project_id>-vpn and opens up 1194 and icmp +#. creates a cert and private key for the vpn instance and saves it in the CA/projects/<project_id>/ directory +#. zips up the info and puts it b64 encoded as user data +#. launches an m1.tiny instance with the above settings using the flag-specified vpn image + + +Vpn Access +---------- + +In vlan networking mode, the second ip in each private network is reserved for the cloudpipe instance. This gives a consistent ip to the instance so that cinder-network can create forwarding rules for access from the outside world. The network for each project is given a specific high-numbered port on the public ip of the network host. This port is automatically forwarded to 1194 on the vpn instance. + +If specific high numbered ports do not work for your users, you can always allocate and associate a public ip to the instance, and then change the vpn_public_ip and vpn_public_port in the database. This will be turned into a cinder-manage command or a flag soon. + + +Certificates and Revocation +--------------------------- + +If the use_project_ca flag is set (required to for cloudpipes to work securely), then each project has its own ca. This ca is used to sign the certificate for the vpn, and is also passed to the user for bundling images. When a certificate is revoked using cinder-manage, a new Certificate Revocation List (crl) is generated. As long as cloudpipe has an updated crl, it will block revoked users from connecting to the vpn. + +The userdata for cloudpipe isn't currently updated when certs are revoked, so it is necessary to restart the cloudpipe instance if a user's credentials are revoked. + + +Restarting Cloudpipe VPN +------------------------ + +You can reboot a cloudpipe vpn through the api if something goes wrong (using euca-reboot-instances for example), but if you generate a new crl, you will have to terminate it and start it again using cinder-manage vpn run. The cloudpipe instance always gets the first ip in the subnet and it can take up to 10 minutes for the ip to be recovered. If you try to start the new vpn instance too soon, the instance will fail to start because of a NoMoreAddresses error. If you can't wait 10 minutes, you can manually update the ip with something like the following (use the right ip for the project):: + + euca-terminate-instances <instance_id> + mysql cinder -e "update fixed_ips set allocated=0, leased=0, instance_id=NULL where fixed_ip='10.0.0.2'" + +You also will need to terminate the dnsmasq running for the user (make sure you use the right pid file):: + + sudo kill `cat /var/lib/cinder/br100.pid` + +Now you should be able to re-run the vpn:: + + cinder-manage vpn run <project_id> + + +Logging into Cloudpipe VPN +-------------------------- + +The keypair that was used to launch the cloudpipe instance should be in the keys/<project_id> folder. You can use this key to log into the cloudpipe instance for debugging purposes. + + +The :mod:`cinder.cloudpipe.pipelib` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.cloudpipe.pipelib + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.api.cloudpipe` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.api.cloudpipe + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.crypto` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.crypto + :noindex: + :members: + :undoc-members: + :show-inheritance: + diff --git a/doc/source/devref/database.rst b/doc/source/devref/database.rst new file mode 100644 index 000000000..e723658ef --- /dev/null +++ b/doc/source/devref/database.rst @@ -0,0 +1,63 @@ +.. + Copyright 2010-2011 United States Government as represented by the + Administrator of the National Aeronautics and Space Administration. + 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. + +The Database Layer +================== + +The :mod:`cinder.db.api` Module +----------------------------- + +.. automodule:: cinder.db.api + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The Sqlalchemy Driver +--------------------- + +The :mod:`cinder.db.sqlalchemy.api` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.db.sqlalchemy.api + :noindex: + +The :mod:`cinder.db.sqlalchemy.models` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.db.sqlalchemy.models + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`cinder.db.sqlalchemy.session` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.db.sqlalchemy.session + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +Tests +----- + +Tests are lacking for the db api layer and for the sqlalchemy driver. +Failures in the drivers would be detected in other test cases, though. diff --git a/doc/source/devref/development.environment.rst b/doc/source/devref/development.environment.rst new file mode 100644 index 000000000..739035a13 --- /dev/null +++ b/doc/source/devref/development.environment.rst @@ -0,0 +1,152 @@ +.. + Copyright 2010-2011 United States Government as represented by the + Administrator of the National Aeronautics and Space Administration. + 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. + +Setting Up a Development Environment +==================================== + +This page describes how to setup a working Python development +environment that can be used in developing cinder on Ubuntu, Fedora or +Mac OS X. These instructions assume you're already familiar with +git. Refer to GettingTheCode_ for additional information. + +.. _GettingTheCode: http://wiki.openstack.org/GettingTheCode + +Following these instructions will allow you to run the cinder unit +tests. If you want to be able to run cinder (i.e., launch VM instances), +you will also need to install libvirt and at least one of the +`supported hypervisors`_. Running cinder is currently only supported on +Linux, although you can run the unit tests on Mac OS X. See +:doc:`../quickstart` for how to get a working version of OpenStack +Compute running as quickly as possible. + +.. _supported hypervisors: http://wiki.openstack.org/HypervisorSupportMatrix + +Virtual environments +-------------------- + +Cinder development uses `virtualenv <http://pypi.python.org/pypi/virtualenv>`__ to track and manage Python +dependencies while in development and testing. This allows you to +install all of the Python package dependencies in a virtual +environment or "virtualenv" (a special subdirectory of your cinder +directory), instead of installing the packages at the system level. + +.. note:: + + Virtualenv is useful for running the unit tests, but is not + typically used for full integration testing or production usage. + +Linux Systems +------------- + +.. note:: + + This section is tested for Cinder on Ubuntu (10.10-64) and + Fedora-based (RHEL 6.1) distributions. Feel free to add notes and + change according to your experiences or operating system. + +Install the prerequisite packages. + +On Ubuntu:: + + sudo apt-get install python-dev libssl-dev python-pip git-core + +On Fedora-based distributions (e.g., Fedora/RHEL/CentOS/Scientific Linux):: + + sudo yum install python-devel openssl-devel python-pip git + + +Mac OS X Systems +---------------- + +Install virtualenv:: + + sudo easy_install virtualenv + +Check the version of OpenSSL you have installed:: + + openssl version + +If you have installed OpenSSL 1.0.0a, which can happen when installing a +MacPorts package for OpenSSL, you will see an error when running +``cinder.tests.auth_unittest.AuthTestCase.test_209_can_generate_x509``. + +The stock version of OpenSSL that ships with Mac OS X 10.6 (OpenSSL 0.9.8l) +or Mac OS X 10.7 (OpenSSL 0.9.8r) works fine with cinder. + + +Getting the code +---------------- +Grab the code from GitHub:: + + git clone https://github.com/openstack/cinder.git + cd cinder + + +Running unit tests +------------------ +The unit tests will run by default inside a virtualenv in the ``.venv`` +directory. Run the unit tests by doing:: + + ./run_tests.sh + +The first time you run them, you will be asked if you want to create a virtual +environment (hit "y"):: + + No virtual environment found...create one? (Y/n) + +See :doc:`unit_tests` for more details. + +.. _virtualenv: + +Manually installing and using the virtualenv +-------------------------------------------- + +You can manually install the virtual environment instead of having +``run_tests.sh`` do it for you:: + + python tools/install_venv.py + +This will install all of the Python packages listed in the +``tools/pip-requires`` file into your virtualenv. There will also be some +additional packages (pip, distribute, greenlet) that are installed +by the ``tools/install_venv.py`` file into the virutalenv. + +If all goes well, you should get a message something like this:: + + Cinder development environment setup is complete. + +To activate the Cinder virtualenv for the extent of your current shell session +you can run:: + + $ source .venv/bin/activate + +Or, if you prefer, you can run commands in the virtualenv on a case by case +basis by running:: + + $ tools/with_venv.sh <your command> + +Contributing Your Work +---------------------- + +Once your work is complete you may wish to contribute it to the project. Add +your name and email address to the ``Authors`` file, and also to the ``.mailmap`` +file if you use multiple email addresses. Your contributions can not be merged +into trunk unless you are listed in the Authors file. Cinder uses the Gerrit +code review system. For information on how to submit your branch to Gerrit, +see GerritWorkflow_. + +.. _GerritWorkflow: http://wiki.openstack.org/GerritWorkflow diff --git a/doc/source/devref/down.sh b/doc/source/devref/down.sh new file mode 100644 index 000000000..5c1888870 --- /dev/null +++ b/doc/source/devref/down.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +BR=$1 +DEV=$2 + +/usr/sbin/brctl delif $BR $DEV +/sbin/ifconfig $DEV down diff --git a/doc/source/devref/fakes.rst b/doc/source/devref/fakes.rst new file mode 100644 index 000000000..ecc3ce277 --- /dev/null +++ b/doc/source/devref/fakes.rst @@ -0,0 +1,85 @@ +.. + Copyright 2010-2011 United States Government as represented by the + Administrator of the National Aeronautics and Space Administration. + 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. + +Fake Drivers +============ + +.. todo:: document general info about fakes + +When the real thing isn't available and you have some development to do these +fake implementations of various drivers let you get on with your day. + + +The :mod:`cinder.virt.fake` Module +-------------------------------- + +.. automodule:: cinder.virt.fake + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.auth.fakeldap` Module +------------------------------------ + +.. automodule:: cinder.auth.fakeldap + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.testing.fake.rabbit` Module +------------------------------------------ + +.. automodule:: cinder.testing.fake.rabbit + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :class:`cinder.volume.driver.FakeAOEDriver` Class +--------------------------------------------------- + +.. autoclass:: cinder.volume.driver.FakeAOEDriver + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :class:`cinder.tests.service_unittest.FakeManager` Class +---------------------------------------------------------- + +.. autoclass:: cinder.tests.service_unittest.FakeManager + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.tests.api.openstack.fakes` Module +------------------------------------------------ + +.. automodule:: cinder.tests.api.openstack.fakes + :noindex: + :members: + :undoc-members: + :show-inheritance: + diff --git a/doc/source/devref/filter_scheduler.rst b/doc/source/devref/filter_scheduler.rst new file mode 100644 index 000000000..ef98e3b3b --- /dev/null +++ b/doc/source/devref/filter_scheduler.rst @@ -0,0 +1,258 @@ +Filter Scheduler +================ + +The **Filter Scheduler** supports `filtering` and `weighting` to make informed +decisions on where a new instance should be created. This Scheduler supports +only working with Compute Nodes. + +Filtering +--------- + +.. image:: /images/filteringWorkflow1.png + +During its work Filter Scheduler firstly makes dictionary of unfiltered hosts, +then filters them using filter properties and finally chooses hosts for the +requested number of instances (each time it chooses the least costed host and +appends it to the list of selected costs). + +If it turns up, that it can't find candidates for the next instance, it means +that there are no more appropriate instances locally. + +If we speak about `filtering` and `weighting`, their work is quite flexible +in the Filter Scheduler. There are a lot of filtering strategies for the +Scheduler to support. Also you can even implement `your own algorithm of +filtering`. + +There are some standard filter classes to use (:mod:`cinder.scheduler.filters`): + +* |AllHostsFilter| - frankly speaking, this filter does no operation. It + returns all the available hosts after its work. +* |AvailabilityZoneFilter| - filters hosts by availability zone. It returns + hosts with the same availability zone as the requested instance has in its + properties. +* |ComputeFilter| - checks that the capabilities provided by the compute + service satisfy the extra specifications, associated with the instance type. + It returns a list of hosts that can create instance type. +* |CoreFilter| - filters based on CPU core utilization. It will approve host if + it has sufficient number of CPU cores. +* |IsolatedHostsFilter| - filter based on "image_isolated" and "host_isolated" + flags. +* |JsonFilter| - allows simple JSON-based grammar for selecting hosts. +* |RamFilter| - filters hosts by their RAM. So, it returns only the hosts with + enough available RAM. +* |SimpleCIDRAffinityFilter| - allows to put a new instance on a host within + the same IP block. +* |DifferentHostFilter| - allows to put the instance on a different host from a + set of instances. +* |SameHostFilter| - puts the instance on the same host as another instance in + a set of of instances. + +Now we can focus on these standard filter classes in details. I will pass the +simplest ones, such as |AllHostsFilter|, |CoreFilter| and |RamFilter| are, +because their functionality is quite simple and can be understood just from the +code. For example class |RamFilter| has the next realization: + +:: + + class RamFilter(filters.BaseHostFilter): + """Ram Filter with over subscription flag""" + + def host_passes(self, host_state, filter_properties): + """Only return hosts with sufficient available RAM.""" + instance_type = filter_properties.get('instance_type') + requested_ram = instance_type['memory_mb'] + free_ram_mb = host_state.free_ram_mb + return free_ram_mb * FLAGS.ram_allocation_ratio >= requested_ram + +Here `ram_allocation_ratio` means the virtual RAM to physical RAM allocation +ratio (it is 1.5 by default). Really, nice and simple. + +Next standard filter to describe is |AvailabilityZoneFilter| and it isn't +difficult too. This filter just looks at the availability zone of compute node +and availability zone from the properties of the request. Each compute service +has its own availability zone. So deployment engineers have an option to run +scheduler with availability zones support and can configure availability zones +on each compute host. This classes method `host_passes` returns `True` if +availability zone mentioned in request is the same on the current compute host. + +|ComputeFilter| checks if host can create `instance_type`. Let's note that +instance types describe the compute, memory and storage capacity of cinder +compute nodes, it is the list of characteristics such as number of vCPUs, +amount RAM and so on. So |ComputeFilter| looks at hosts' capabilities (host +without requested specifications can't be chosen for the creating of the +instance), checks if the hosts service is up based on last heartbeat. Finally, +this Scheduler can verify if host satisfies some `extra specifications` +associated with the instance type (of course if there are no such extra +specifications, every host suits them). + +Now we are going to |IsolatedHostsFilter|. There can be some special hosts +reserved for specific images. These hosts are called **isolated**. So the +images to run on the isolated hosts are also called isolated. This Scheduler +checks if `image_isolated` flag named in instance specifications is the same +that the host has. + +|DifferentHostFilter| - its method `host_passes` returns `True` if host to +place instance on is different from all the hosts used by set of instances. + +|SameHostFilter| does the opposite to what |DifferentHostFilter| does. So its +`host_passes` returns `True` if the host we want to place instance on is one +of the set of instances uses. + +|SimpleCIDRAffinityFilter| looks at the subnet mask and investigates if +the network address of the current host is in the same sub network as it was +defined in the request. + +|JsonFilter| - this filter provides the opportunity to write complicated +queries for the hosts capabilities filtering, based on simple JSON-like syntax. +There can be used the following operations for the host states properties: +'=', '<', '>', 'in', '<=', '>=', that can be combined with the following +logical operations: 'not', 'or', 'and'. For example, there is the query you can +find in tests: + +:: + + ['and', + ['>=', '$free_ram_mb', 1024], + ['>=', '$free_disk_mb', 200 * 1024] + ] + +This query will filter all hosts with free RAM greater or equal than 1024 MB +and at the same time with free disk space greater or equal than 200 GB. + +Many filters use data from `scheduler_hints`, that is defined in the moment of +creation of the new server for the user. The only exeption for this rule is +|JsonFilter|, that takes data in some strange difficult to understand way. + +To use filters you specify next two settings: + +* `scheduler_available_filters` - points available filters. +* `scheduler_default_filters` - points filters to be used by default from the + list of available ones. + +Host Manager sets up these flags in `cinder.conf` by default on the next values: + +:: + + --scheduler_available_filters=cinder.scheduler.filters.standard_filters + --scheduler_default_filters=RamFilter,ComputeFilter,AvailabilityZoneFilter + +These two lines mean, that all the filters in the `cinder.scheduler.filters` +would be available, and the default ones would be |RamFilter|, |ComputeFilter| +and |AvailabilityZoneFilter|. + +If you want to create **your own filter** you just need to inherit from +|BaseHostFilter| and implement one method: +`host_passes`. This method should return `True` if host passes the filter. It +takes `host_state` (describes host) and `filter_properties` dictionary as the +parameters. + +So in the end file cinder.conf should contain lines like these: + +:: + + --scheduler_driver=cinder.scheduler.distributed_scheduler.FilterScheduler + --scheduler_available_filters=cinder.scheduler.filters.standard_filters + --scheduler_available_filters=myfilter.MyFilter + --scheduler_default_filters=RamFilter,ComputeFilter,MyFilter + +As you see, flag `scheduler_driver` is set up for the `FilterSchedule`, +available filters can be specified more than once and description of the +default filters should not contain full paths with class names you need, only +class names. + +Costs and weights +----------------- + +Filter Scheduler uses so-called **weights** and **costs** during its work. + +`Costs` are the computed integers, expressing hosts measure of fitness to be +chosen as a result of the request. Of course, costs are computed due to hosts +characteristics compared with characteristics from the request. So trying to +put instance on a not appropriate host (for example, trying to put really +simple and plain instance on a high performance host) would have high cost, and +putting instance on an appropriate host would have low. + +So let's find out, how does all this computing work happen. + +Before weighting Filter Scheduler creates the list of tuples containing weights +and cost functions to use for weighing hosts. These functions can be got from +cache, if this operation had been done before (this cache depends on `topic` of +node, Filter Scheduler works with only the Compute Nodes, so the topic would be +"`compute`" here). If there is no cost functions in cache associated with +"compute", Filter Scheduler tries to get these cost functions from `cinder.conf`. +Weight in tuple means weight of cost function matching with it. It also can be +got from `cinder.conf`. After that Scheduler weights host, using selected cost +functions. It does this using `weighted_sum` method, which parameters are: + +* `weighted_fns` - list of cost functions created with their weights; +* `host_states` - hosts to be weighted; +* `weighing_properties` - dictionary of values that can influence weights. + +This method firstly creates a grid of function results (it just counts value of +each function using `host_state` and `weighing_properties`) - `scores`, where +it would be one row per host and one function per column. The next step is to +multiply value from the each cell of the grid by the weight of appropriate cost +function. And the final step is to sum values in the each row - it would be the +weight of host, described in this line. This method returns the host with the +lowest weight - the best one. + +If we concentrate on cost functions, it would be important to say that we use +`compute_fill_first_cost_fn` function by default, which simply returns hosts +free RAM: + +:: + + def compute_fill_first_cost_fn(host_state, weighing_properties): + """More free ram = higher weight. So servers will less free ram will be + preferred.""" + return host_state.free_ram_mb + +You can implement your own variant of cost function for the hosts capabilities +you would like to mention. Using different cost functions (as you understand, +there can be a lot of ones used in the same time) can make the chose of next +host for the creating of the new instance flexible. + +These cost functions should be set up in the `cinder.conf` with the flag +`least_cost_functions` (there can be more than one functions separated by +commas). By default this line would look like this: + +:: + + --least_cost_functions=cinder.scheduler.least_cost.compute_fill_first_cost_fn + +As for weights of cost functions, they also should be described in `cinder.conf`. +The line with this description looks the following way: +**function_name_weight**. + +As for default cost function, it would be: `compute_fill_first_cost_fn_weight`, +and by default it is 1.0. + +:: + + --compute_fill_first_cost_fn_weight=1.0 + +Filter Scheduler finds local list of acceptable hosts by repeated filtering and +weighing. Each time it chooses a host, it virtually consumes resources on it, +so subsequent selections can adjust accordingly. It is useful if the customer +asks for the some large amount of instances, because weight is computed for +each instance requested. + +.. image:: /images/filteringWorkflow2.png + +In the end Filter Scheduler sorts selected hosts by their weight and provisions +instances on them. + +P.S.: you can find more examples of using Filter Scheduler and standard filters +in :mod:`cinder.tests.scheduler`. + +.. |AllHostsFilter| replace:: :class:`AllHostsFilter <cinder.scheduler.filters.all_hosts_filter.AllHostsFilter>` +.. |AvailabilityZoneFilter| replace:: :class:`AvailabilityZoneFilter <cinder.scheduler.filters.availability_zone_filter.AvailabilityZoneFilter>` +.. |BaseHostFilter| replace:: :class:`BaseHostFilter <cinder.scheduler.filters.BaseHostFilter>` +.. |ComputeFilter| replace:: :class:`ComputeFilter <cinder.scheduler.filters.compute_filter.ComputeFilter>` +.. |CoreFilter| replace:: :class:`CoreFilter <cinder.scheduler.filters.core_filter.CoreFilter>` +.. |IsolatedHostsFilter| replace:: :class:`IsolatedHostsFilter <cinder.scheduler.filters.isolated_hosts_filter>` +.. |JsonFilter| replace:: :class:`JsonFilter <cinder.scheduler.filters.json_filter.JsonFilter>` +.. |RamFilter| replace:: :class:`RamFilter <cinder.scheduler.filters.ram_filter.RamFilter>` +.. |SimpleCIDRAffinityFilter| replace:: :class:`SimpleCIDRAffinityFilter <cinder.scheduler.filters.affinity_filter.SimpleCIDRAffinityFilter>` +.. |DifferentHostFilter| replace:: :class:`DifferentHostFilter <cinder.scheduler.filters.affinity_filter.DifferentHostFilter>` +.. |SameHostFilter| replace:: :class:`SameHostFilter <cinder.scheduler.filters.affinity_filter.SameHostFilter>` diff --git a/doc/source/devref/gerrit.rst b/doc/source/devref/gerrit.rst new file mode 100644 index 000000000..ea4ffe019 --- /dev/null +++ b/doc/source/devref/gerrit.rst @@ -0,0 +1,16 @@ +Code Reviews with Gerrit +======================== + +Cinder uses the `Gerrit`_ tool to review proposed code changes. The review site +is http://review.openstack.org. + +Gerrit is a complete replacement for Github pull requests. `All Github pull +requests to the Cinder repository will be ignored`. + +See `Gerrit Workflow Quick Reference`_ for information about how to get +started using Gerrit. See `Gerrit, Jenkins and Github`_ for more detailed +documentation on how to work with Gerrit. + +.. _Gerrit: http://code.google.com/p/gerrit +.. _Gerrit, Jenkins and Github: http://wiki.openstack.org/GerritJenkinsGithub +.. _Gerrit Workflow Quick Reference: http://wiki.openstack.org/GerritWorkflow diff --git a/doc/source/devref/glance.rst b/doc/source/devref/glance.rst new file mode 100644 index 000000000..8e7aa2b71 --- /dev/null +++ b/doc/source/devref/glance.rst @@ -0,0 +1,28 @@ +.. + Copyright 2010-2011 United States Government as represented by the + Administrator of the National Aeronautics and Space Administration. + 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. + +Glance Integration - The Future of File Storage +=============================================== + +The :mod:`cinder.image.service` Module +------------------------------------ + +.. automodule:: cinder.image.service + :noindex: + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/devref/il8n.rst b/doc/source/devref/il8n.rst new file mode 100644 index 000000000..fabd2ce49 --- /dev/null +++ b/doc/source/devref/il8n.rst @@ -0,0 +1,34 @@ +Internationalization +==================== +cinder uses `gettext <http://docs.python.org/library/gettext.html>`_ so that +user-facing strings such as log messages appear in the appropriate +language in different locales. + +To use gettext, make sure that the strings passed to the logger are wrapped +in a ``_()`` function call. For example:: + + LOG.debug(_("block_device_mapping %s"), block_device_mapping) + +If you have multiple arguments, the convention is to use named parameters. +It's common to use the ``locals()`` dict (which contains the names and values +of the local variables in the current scope) to do the string interpolation. +For example:: + + label = ... + sr_ref = ... + LOG.debug(_('Introduced %(label)s as %(sr_ref)s.') % locals()) + +If you do not follow the project conventions, your code may cause the +LocalizationTestCase.test_multiple_positional_format_placeholders test to fail +in cinder/tests/test_localization.py. + +The ``_()`` function is brought into the global scope by doing:: + + import gettext + gettext.install("cinder", unicode=1) + +In general, you shouldn't need to add these to any cinder files, since the lines +are present in ``cinder/__init__.py``. However, if this code is missing, it may +result in an error that looks like like:: + + NameError: name '_' is not defined diff --git a/doc/source/devref/index.rst b/doc/source/devref/index.rst new file mode 100644 index 000000000..1688b7e09 --- /dev/null +++ b/doc/source/devref/index.rst @@ -0,0 +1,86 @@ +.. + Copyright 2010-2011 United States Government as represented by the + Administrator of the National Aeronautics and Space Administration. + 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. + +Developer Guide +=============== + +In this section you will find information on Cinder's lower level programming APIs. + + +Programming HowTos and Tutorials +-------------------------------- +.. toctree:: + :maxdepth: 3 + + development.environment + unit_tests + addmethod.openstackapi + + +Background Concepts for Cinder +---------------------------- +.. toctree:: + :maxdepth: 3 + + architecture + threading + il8n + filter_scheduler + multinic + rpc + +Other Resources +--------------- +.. toctree:: + :maxdepth: 3 + + launchpad + gerrit + jenkins + +API Reference +------------- +.. toctree:: + :maxdepth: 3 + + ../api/autoindex + +Module Reference +---------------- +.. toctree:: + :maxdepth: 3 + + services + database + volume + xensmvolume + compute + network + auth + api + scheduler + fakes + cinder + + +Indices and tables +------------------ + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/doc/source/devref/interfaces b/doc/source/devref/interfaces new file mode 100644 index 000000000..b7116aeb7 --- /dev/null +++ b/doc/source/devref/interfaces @@ -0,0 +1,17 @@ +# This file describes the network interfaces available on your system +# and how to activate them. For more information, see interfaces(5). + +# The loopback network interface +auto lo +iface lo inet loopback + +# The primary network interface +auto eth0 +iface eth0 inet manual + up ifconfig $IFACE 0.0.0.0 up + down ifconfig $IFACE down + +auto br0 +iface br0 inet dhcp + bridge_ports eth0 + diff --git a/doc/source/devref/jenkins.rst b/doc/source/devref/jenkins.rst new file mode 100644 index 000000000..6e4a08c14 --- /dev/null +++ b/doc/source/devref/jenkins.rst @@ -0,0 +1,41 @@ +Continuous Integration with Jenkins +=================================== + +Cinder uses a `Jenkins`_ server to automate development tasks. The Jenkins +front-end is at http://jenkins.openstack.org. You must have an +account on `Launchpad`_ to be able to access the OpenStack Jenkins site. + +Jenkins performs tasks such as: + +`gate-cinder-unittests`_ + Run unit tests on proposed code changes that have been reviewed. + +`gate-cinder-pep8`_ + Run PEP8 checks on proposed code changes that have been reviewed. + +`gate-cinder-merge`_ + Merge reviewed code into the git repository. + +`cinder-coverage`_ + Calculate test coverage metrics. + +`cinder-docs`_ + Build this documentation and push it to http://cinder.openstack.org. + +`cinder-pylint`_ + Run `pylint <http://www.logilab.org/project/pylint>`_ on the cinder code and + report violations. + +`cinder-tarball`_ + Do ``python setup.py sdist`` to create a tarball of the cinder code and upload + it to http://cinder.openstack.org/tarballs + +.. _Jenkins: http://jenkins-ci.org +.. _Launchpad: http://launchpad.net +.. _gate-cinder-merge: https://jenkins.openstack.org/view/Cinder/job/gate-cinder-merge +.. _gate-cinder-pep8: https://jenkins.openstack.org/view/Cinder/job/gate-cinder-pep8 +.. _gate-cinder-unittests: https://jenkins.openstack.org/view/Cinder/job/gate-cinder-unittests +.. _cinder-coverage: https://jenkins.openstack.org/view/Cinder/job/cinder-coverage +.. _cinder-docs: https://jenkins.openstack.org/view/Cinder/job/cinder-docs +.. _cinder-pylint: https://jenkins.openstack.org/job/cinder-pylint +.. _cinder-tarball: https://jenkins.openstack.org/job/cinder-tarball diff --git a/doc/source/devref/launchpad.rst b/doc/source/devref/launchpad.rst new file mode 100644 index 000000000..a72ec35a9 --- /dev/null +++ b/doc/source/devref/launchpad.rst @@ -0,0 +1,54 @@ +Project hosting with Launchpad +============================== + +`Launchpad`_ hosts the Cinder project. The Cinder project homepage on Launchpad is +http://launchpad.net/cinder. + +Launchpad credentials +--------------------- + +Creating a login on Launchpad is important even if you don't use the Launchpad +site itself, since Launchpad credentials are used for logging in on several +OpenStack-related sites. These sites include: + + * `Wiki`_ + * Gerrit (see :doc:`gerrit`) + * Jenkins (see :doc:`jenkins`) + +Mailing list +------------ + +The mailing list email is ``openstack@lists.launchpad.net``. This is a common +mailing list across the OpenStack projects. To participate in the mailing list: + +#. Join the `Cinder Team`_ on Launchpad. +#. Subscribe to the list on the `OpenStack Team`_ page on Launchpad. + +The mailing list archives are at https://lists.launchpad.net/openstack. + + +Bug tracking +------------ + +Report Cinder bugs at https://bugs.launchpad.net/cinder + +Feature requests (Blueprints) +----------------------------- + +Cinder uses Launchpad Blueprints to track feature requests. Blueprints are at +https://blueprints.launchpad.net/cinder. + +Technical support (Answers) +--------------------------- + +Cinder uses Launchpad Answers to track Cinder technical support questions. The Cinder +Answers page is at https://answers.launchpad.net/cinder. + +Note that the `OpenStack Forums`_ (which are not hosted on Launchpad) can also +be used for technical support requests. + +.. _Launchpad: http://launchpad.net +.. _Wiki: http://wiki.openstack.org +.. _Cinder Team: https://launchpad.net/~cinder +.. _OpenStack Team: https://launchpad.net/~openstack +.. _OpenStack Forums: http://forums.openstack.org/ \ No newline at end of file diff --git a/doc/source/devref/multinic.rst b/doc/source/devref/multinic.rst new file mode 100644 index 000000000..8772c3080 --- /dev/null +++ b/doc/source/devref/multinic.rst @@ -0,0 +1,39 @@ +MultiNic +======== + +What is it +---------- + +Multinic allows an instance to have more than one vif connected to it. Each vif is representative of a separate network with its own IP block. + +Managers +-------- + +Each of the network managers are designed to run independently of the compute manager. They expose a common API for the compute manager to call to determine and configure the network(s) for an instance. Direct calls to either the network api or especially the DB should be avoided by the virt layers. + +On startup a manager looks in the networks table for networks it is assigned and configures itself to support that network. Using the periodic task, they will claim new networks that have no host set. Only one network per network-host will be claimed at a time. This allows for psuedo-loadbalancing if there are multiple network-hosts running. + +Flat Manager +------------ + + .. image:: /images/multinic_flat.png + +The Flat manager is most similar to a traditional switched network environment. It assumes that the IP routing, DNS, DHCP (possibly) and bridge creation is handled by something else. That is it makes no attempt to configure any of this. It does keep track of a range of IPs for the instances that are connected to the network to be allocated. + +Each instance will get a fixed IP from each network's pool. The guest operating system may be configured to gather this information through an agent or by the hypervisor injecting the files, or it may ignore it completely and come up with only a layer 2 connection. + +Flat manager requires at least one cinder-network process running that will listen to the API queue and respond to queries. It does not need to sit on any of the networks but it does keep track of the IPs it hands out to instances. + +FlatDHCP Manager +---------------- + + .. image:: /images/multinic_dhcp.png + +FlatDHCP manager builds on the the Flat manager adding dnsmask (DNS and DHCP) and radvd (Router Advertisement) servers on the bridge for that network. The services run on the host that is assigned to that network. The FlatDHCP manager will create its bridge as specified when the network was created on the network-host when the network host starts up or when a new network gets allocated to that host. Compute nodes will also create the bridges as necessary and connect instance VIFs to them. + +VLAN Manager +------------ + + .. image:: /images/multinic_vlan.png + +The VLAN manager sets up forwarding to/from a cloudpipe instance in addition to providing dnsmask (DNS and DHCP) and radvd (Router Advertisement) services for each network. The manager will create its bridge as specified when the network was created on the network-host when the network host starts up or when a new network gets allocated to that host. Compute nodes will also create the bridges as necessary and connect instance VIFs to them. diff --git a/doc/source/devref/network.rst b/doc/source/devref/network.rst new file mode 100644 index 000000000..e54049e55 --- /dev/null +++ b/doc/source/devref/network.rst @@ -0,0 +1,128 @@ +.. + Copyright 2010-2011 United States Government as represented by the + Administrator of the National Aeronautics and Space Administration. + 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. + +Networking +========== + +.. todo:: + + * document hardware specific commands (maybe in admin guide?) (todd) + * document a map between flags and managers/backends (todd) + + +The :mod:`cinder.network.manager` Module +-------------------------------------- + +.. automodule:: cinder.network.manager + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`cinder.network.linux_net` Driver +---------------------------------------- + +.. automodule:: cinder.network.linux_net + :noindex: + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +The :mod:`network_unittest` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.network_unittest + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +Legacy docs +----------- + +The cinder networking components manage private networks, public IP addressing, VPN connectivity, and firewall rules. + +Components +---------- +There are several key components: + +* NetworkController (Manages address and vlan allocation) +* RoutingNode (NATs public IPs to private IPs, and enforces firewall rules) +* AddressingNode (runs DHCP services for private networks) +* BridgingNode (a subclass of the basic cinder ComputeNode) +* TunnelingNode (provides VPN connectivity) + +Component Diagram +----------------- + +Overview:: + + (PUBLIC INTERNET) + | \ + / \ / \ + [RoutingNode] ... [RN] [TunnelingNode] ... [TN] + | \ / | | + | < AMQP > | | + [AddressingNode]-- (VLAN) ... | (VLAN)... (VLAN) --- [AddressingNode] + \ | \ / + / \ / \ / \ / \ + [BridgingNode] ... [BridgingNode] + + + [NetworkController] ... [NetworkController] + \ / + < AMQP > + | + / \ + [CloudController]...[CloudController] + +While this diagram may not make this entirely clear, nodes and controllers communicate exclusively across the message bus (AMQP, currently). + +State Model +----------- +Network State consists of the following facts: + +* VLAN assignment (to a project) +* Private Subnet assignment (to a security group) in a VLAN +* Private IP assignments (to running instances) +* Public IP allocations (to a project) +* Public IP associations (to a private IP / running instance) + +While copies of this state exist in many places (expressed in IPTables rule chains, DHCP hosts files, etc), the controllers rely only on the distributed "fact engine" for state, queried over RPC (currently AMQP). The NetworkController inserts most records into this datastore (allocating addresses, etc) - however, individual nodes update state e.g. when running instances crash. + +The Public Traffic Path +----------------------- + +Public Traffic:: + + (PUBLIC INTERNET) + | + <NAT> <-- [RoutingNode] + | + [AddressingNode] --> | + ( VLAN ) + | <-- [BridgingNode] + | + <RUNNING INSTANCE> + +The RoutingNode is currently implemented using IPTables rules, which implement both NATing of public IP addresses, and the appropriate firewall chains. We are also looking at using Netomata / Clusto to manage NATting within a switch or router, and/or to manage firewall rules within a hardware firewall appliance. + +Similarly, the AddressingNode currently manages running DNSMasq instances for DHCP services. However, we could run an internal DHCP server (using Scapy ala Clusto), or even switch to static addressing by inserting the private address into the disk image the same way we insert the SSH keys. (See compute for more details). diff --git a/doc/source/devref/nova.rst b/doc/source/devref/nova.rst new file mode 100644 index 000000000..57aba56be --- /dev/null +++ b/doc/source/devref/nova.rst @@ -0,0 +1,215 @@ +.. + Copyright 2010-2011 United States Government as represented by the + Administrator of the National Aeronautics and Space Administration. + All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may obtain + a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + License for the specific language governing permissions and limitations + under the License. + +Common and Misc Libraries +========================= + +Libraries common throughout Cinder or just ones that haven't been categorized +very well yet. + + +The :mod:`cinder.adminclient` Module +---------------------------------- + +.. automodule:: cinder.adminclient + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.context` Module +------------------------------ + +.. automodule:: cinder.context + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.exception` Module +-------------------------------- + +.. automodule:: cinder.exception + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.flags` Module +---------------------------- + +.. automodule:: cinder.flags + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.process` Module +------------------------------ + +.. automodule:: cinder.process + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.rpc` Module +-------------------------- + +.. automodule:: cinder.rpc + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.server` Module +----------------------------- + +.. automodule:: cinder.server + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.test` Module +--------------------------- + +.. automodule:: cinder.test + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.utils` Module +---------------------------- + +.. automodule:: cinder.utils + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.validate` Module +------------------------------- + +.. automodule:: cinder.validate + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.wsgi` Module +--------------------------- + +.. automodule:: cinder.wsgi + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +Tests +----- + +The :mod:`declare_flags` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.declare_flags + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`fake_flags` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.fake_flags + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`flags_unittest` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.flags_unittest + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`process_unittest` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.process_unittest + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`real_flags` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.real_flags + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`rpc_unittest` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.rpc_unittest + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`runtime_flags` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.runtime_flags + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`validator_unittest` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.validator_unittest + :noindex: + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/devref/rc.local b/doc/source/devref/rc.local new file mode 100644 index 000000000..d1ccf0cbc --- /dev/null +++ b/doc/source/devref/rc.local @@ -0,0 +1,36 @@ +#!/bin/sh -e +# +# rc.local +# +# This script is executed at the end of each multiuser runlevel. +# Make sure that the script will "exit 0" on success or any other +# value on error. +# +# In order to enable or disable this script just change the execution +# bits. +# +# By default this script does nothing. +####### These lines go at the end of /etc/rc.local ####### +. /lib/lsb/init-functions + +echo Downloading payload from userdata +wget http://169.254.169.254/latest/user-data -O /tmp/payload.b64 +echo Decrypting base64 payload +openssl enc -d -base64 -in /tmp/payload.b64 -out /tmp/payload.zip + +mkdir -p /tmp/payload +echo Unzipping payload file +unzip -o /tmp/payload.zip -d /tmp/payload/ + +# if the autorun.sh script exists, run it +if [ -e /tmp/payload/autorun.sh ]; then + echo Running autorun.sh + cd /tmp/payload + sh /tmp/payload/autorun.sh + +else + echo rc.local : No autorun script to run +fi + + +exit 0 diff --git a/doc/source/devref/rpc.rst b/doc/source/devref/rpc.rst new file mode 100644 index 000000000..f122ed3d3 --- /dev/null +++ b/doc/source/devref/rpc.rst @@ -0,0 +1,151 @@ +.. + Copyright (c) 2010 Citrix 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. + +AMQP and Cinder +============= + +AMQP is the messaging technology chosen by the OpenStack cloud. The AMQP broker, either RabbitMQ or Qpid, sits between any two Cinder components and allows them to communicate in a loosely coupled fashion. More precisely, Cinder components (the compute fabric of OpenStack) use Remote Procedure Calls (RPC hereinafter) to communicate to one another; however such a paradigm is built atop the publish/subscribe paradigm so that the following benefits can be achieved: + + * Decoupling between client and servant (such as the client does not need to know where the servant's reference is). + * Full a-synchronism between client and servant (such as the client does not need the servant to run at the same time of the remote call). + * Random balancing of remote calls (such as if more servants are up and running, one-way calls are transparently dispatched to the first available servant). + +Cinder uses direct, fanout, and topic-based exchanges. The architecture looks like the one depicted in the figure below: + +.. image:: /images/rpc/arch.png + :width: 60% + +.. + +Cinder implements RPC (both request+response, and one-way, respectively nicknamed 'rpc.call' and 'rpc.cast') over AMQP by providing an adapter class which take cares of marshaling and unmarshaling of messages into function calls. Each Cinder service (for example Compute, Volume, etc.) create two queues at the initialization time, one which accepts messages with routing keys 'NODE-TYPE.NODE-ID' (for example compute.hostname) and another, which accepts messages with routing keys as generic 'NODE-TYPE' (for example compute). The former is used specifically when Cinder-API needs to redirect commands to a specific node like 'euca-terminate instance'. In this case, only the compute node whose host's hypervisor is running the virtual machine can kill the instance. The API acts as a consumer when RPC calls are request/response, otherwise is acts as publisher only. + +Cinder RPC Mappings +----------------- + +The figure below shows the internals of a message broker node (referred to as a RabbitMQ node in the diagrams) when a single instance is deployed and shared in an OpenStack cloud. Every Cinder component connects to the message broker and, depending on its personality (for example a compute node or a network node), may use the queue either as an Invoker (such as API or Scheduler) or a Worker (such as Compute, Volume or Network). Invokers and Workers do not actually exist in the Cinder object model, but we are going to use them as an abstraction for sake of clarity. An Invoker is a component that sends messages in the queuing system via two operations: 1) rpc.call and ii) rpc.cast; a Worker is a component that receives messages from the queuing system and reply accordingly to rcp.call operations. + +Figure 2 shows the following internal elements: + + * Topic Publisher: a Topic Publisher comes to life when an rpc.call or an rpc.cast operation is executed; this object is instantiated and used to push a message to the queuing system. Every publisher connects always to the same topic-based exchange; its life-cycle is limited to the message delivery. + * Direct Consumer: a Direct Consumer comes to life if (an only if) a rpc.call operation is executed; this object is instantiated and used to receive a response message from the queuing system; Every consumer connects to a unique direct-based exchange via a unique exclusive queue; its life-cycle is limited to the message delivery; the exchange and queue identifiers are determined by a UUID generator, and are marshaled in the message sent by the Topic Publisher (only rpc.call operations). + * Topic Consumer: a Topic Consumer comes to life as soon as a Worker is instantiated and exists throughout its life-cycle; this object is used to receive messages from the queue and it invokes the appropriate action as defined by the Worker role. A Topic Consumer connects to the same topic-based exchange either via a shared queue or via a unique exclusive queue. Every Worker has two topic consumers, one that is addressed only during rpc.cast operations (and it connects to a shared queue whose exchange key is 'topic') and the other that is addressed only during rpc.call operations (and it connects to a unique queue whose exchange key is 'topic.host'). + * Direct Publisher: a Direct Publisher comes to life only during rpc.call operations and it is instantiated to return the message required by the request/response operation. The object connects to a direct-based exchange whose identity is dictated by the incoming message. + * Topic Exchange: The Exchange is a routing table that exists in the context of a virtual host (the multi-tenancy mechanism provided by Qpid or RabbitMQ); its type (such as topic vs. direct) determines the routing policy; a message broker node will have only one topic-based exchange for every topic in Cinder. + * Direct Exchange: this is a routing table that is created during rpc.call operations; there are many instances of this kind of exchange throughout the life-cycle of a message broker node, one for each rpc.call invoked. + * Queue Element: A Queue is a message bucket. Messages are kept in the queue until a Consumer (either Topic or Direct Consumer) connects to the queue and fetch it. Queues can be shared or can be exclusive. Queues whose routing key is 'topic' are shared amongst Workers of the same personality. + +.. image:: /images/rpc/rabt.png + :width: 60% + +.. + +RPC Calls +--------- + +The diagram below shows the message flow during an rp.call operation: + + 1. a Topic Publisher is instantiated to send the message request to the queuing system; immediately before the publishing operation, a Direct Consumer is instantiated to wait for the response message. + 2. once the message is dispatched by the exchange, it is fetched by the Topic Consumer dictated by the routing key (such as 'topic.host') and passed to the Worker in charge of the task. + 3. once the task is completed, a Direct Publisher is allocated to send the response message to the queuing system. + 4. once the message is dispatched by the exchange, it is fetched by the Direct Consumer dictated by the routing key (such as 'msg_id') and passed to the Invoker. + +.. image:: /images/rpc/flow1.png + :width: 60% + +.. + +RPC Casts +--------- + +The diagram below the message flow during an rp.cast operation: + + 1. A Topic Publisher is instantiated to send the message request to the queuing system. + 2. Once the message is dispatched by the exchange, it is fetched by the Topic Consumer dictated by the routing key (such as 'topic') and passed to the Worker in charge of the task. + +.. image:: /images/rpc/flow2.png + :width: 60% + +.. + +AMQP Broker Load +---------------- + +At any given time the load of a message broker node running either Qpid or RabbitMQ is function of the following parameters: + + * Throughput of API calls: the number of API calls (more precisely rpc.call ops) being served by the OpenStack cloud dictates the number of direct-based exchanges, related queues and direct consumers connected to them. + * Number of Workers: there is one queue shared amongst workers with the same personality; however there are as many exclusive queues as the number of workers; the number of workers dictates also the number of routing keys within the topic-based exchange, which is shared amongst all workers. + +The figure below shows the status of a RabbitMQ node after Cinder components' bootstrap in a test environment. Exchanges and queues being created by Cinder components are: + + * Exchanges + 1. cinder (topic exchange) + * Queues + 1. compute.phantom (phantom is hostname) + 2. compute + 3. network.phantom (phantom is hostname) + 4. network + 5. volume.phantom (phantom is hostname) + 6. volume + 7. scheduler.phantom (phantom is hostname) + 8. scheduler + +.. image:: /images/rpc/state.png + :width: 60% + +.. + +RabbitMQ Gotchas +---------------- + +Cinder uses Kombu to connect to the RabbitMQ environment. Kombu is a Python library that in turn uses AMQPLib, a library that implements the standard AMQP 0.8 at the time of writing. When using Kombu, Invokers and Workers need the following parameters in order to instantiate a Connection object that connects to the RabbitMQ server (please note that most of the following material can be also found in the Kombu documentation; it has been summarized and revised here for sake of clarity): + + * Hostname: The hostname to the AMQP server. + * Userid: A valid username used to authenticate to the server. + * Password: The password used to authenticate to the server. + * Virtual_host: The name of the virtual host to work with. This virtual host must exist on the server, and the user must have access to it. Default is "/". + * Port: The port of the AMQP server. Default is 5672 (amqp). + +The following parameters are default: + + * Insist: insist on connecting to a server. In a configuration with multiple load-sharing servers, the Insist option tells the server that the client is insisting on a connection to the specified server. Default is False. + * Connect_timeout: the timeout in seconds before the client gives up connecting to the server. The default is no timeout. + * SSL: use SSL to connect to the server. The default is False. + +More precisely Consumers need the following parameters: + + * Connection: the above mentioned Connection object. + * Queue: name of the queue. + * Exchange: name of the exchange the queue binds to. + * Routing_key: the interpretation of the routing key depends on the value of the exchange_type attribute. + + * Direct exchange: if the routing key property of the message and the routing_key attribute of the queue are identical, then the message is forwarded to the queue. + * Fanout exchange: messages are forwarded to the queues bound the exchange, even if the binding does not have a key. + * Topic exchange: if the routing key property of the message matches the routing key of the key according to a primitive pattern matching scheme, then the message is forwarded to the queue. The message routing key then consists of words separated by dots (".", like domain names), and two special characters are available; star ("") and hash ("#"). The star matches any word, and the hash matches zero or more words. For example ".stock.#" matches the routing keys "usd.stock" and "eur.stock.db" but not "stock.nasdaq". + + * Durable: this flag determines the durability of both exchanges and queues; durable exchanges and queues remain active when a RabbitMQ server restarts. Non-durable exchanges/queues (transient exchanges/queues) are purged when a server restarts. It is worth noting that AMQP specifies that durable queues cannot bind to transient exchanges. Default is True. + * Auto_delete: if set, the exchange is deleted when all queues have finished using it. Default is False. + * Exclusive: exclusive queues (such as non-shared) may only be consumed from by the current connection. When exclusive is on, this also implies auto_delete. Default is False. + * Exchange_type: AMQP defines several default exchange types (routing algorithms) that covers most of the common messaging use cases. + * Auto_ack: acknowledgement is handled automatically once messages are received. By default auto_ack is set to False, and the receiver is required to manually handle acknowledgment. + * No_ack: it disable acknowledgement on the server-side. This is different from auto_ack in that acknowledgement is turned off altogether. This functionality increases performance but at the cost of reliability. Messages can get lost if a client dies before it can deliver them to the application. + * Auto_declare: if this is True and the exchange name is set, the exchange will be automatically declared at instantiation. Auto declare is on by default. + Publishers specify most the parameters of Consumers (such as they do not specify a queue name), but they can also specify the following: + * Delivery_mode: the default delivery mode used for messages. The value is an integer. The following delivery modes are supported by RabbitMQ: + + * 1 or "transient": the message is transient. Which means it is stored in memory only, and is lost if the server dies or restarts. + * 2 or "persistent": the message is persistent. Which means the message is stored both in-memory, and on disk, and therefore preserved if the server dies or restarts. + +The default value is 2 (persistent). During a send operation, Publishers can override the delivery mode of messages so that, for example, transient messages can be sent over a durable queue. diff --git a/doc/source/devref/scheduler.rst b/doc/source/devref/scheduler.rst new file mode 100644 index 000000000..e63b7aeb4 --- /dev/null +++ b/doc/source/devref/scheduler.rst @@ -0,0 +1,71 @@ +.. + Copyright 2010-2011 United States Government as represented by the + Administrator of the National Aeronautics and Space Administration. + 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. + +Scheduler +========= + +The :mod:`cinder.scheduler.manager` Module +---------------------------------------- + +.. automodule:: cinder.scheduler.manager + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.scheduler.driver` Module +--------------------------------------- + +.. automodule:: cinder.scheduler.driver + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.scheduler.chance` Driver +--------------------------------------- + +.. automodule:: cinder.scheduler.chance + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.scheduler.simple` Driver +--------------------------------------- + +.. automodule:: cinder.scheduler.simple + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +Tests +----- + +The :mod:`scheduler_unittest` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.scheduler_unittest + :noindex: + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/devref/server.conf.template b/doc/source/devref/server.conf.template new file mode 100644 index 000000000..feee3185b --- /dev/null +++ b/doc/source/devref/server.conf.template @@ -0,0 +1,34 @@ +port 1194 +proto udp +dev tap0 +up "/etc/openvpn/up.sh br0" +down "/etc/openvpn/down.sh br0" + +persist-key +persist-tun + +ca ca.crt +cert server.crt +key server.key # This file should be kept secret + +dh dh1024.pem +ifconfig-pool-persist ipp.txt + +server-bridge VPN_IP DHCP_SUBNET DHCP_LOWER DHCP_UPPER + +client-to-client +keepalive 10 120 +comp-lzo + +max-clients 1 + +user nobody +group nogroup + +persist-key +persist-tun + +status openvpn-status.log + +verb 3 +mute 20 \ No newline at end of file diff --git a/doc/source/devref/services.rst b/doc/source/devref/services.rst new file mode 100644 index 000000000..801f7c7a7 --- /dev/null +++ b/doc/source/devref/services.rst @@ -0,0 +1,55 @@ +.. + Copyright 2010-2011 United States Government as represented by the + Administrator of the National Aeronautics and Space Administration. + 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. + +.. _service_manager_driver: + +Services, Managers and Drivers +============================== + +The responsibilities of Services, Managers, and Drivers, can be a bit confusing to people that are new to cinder. This document attempts to outline the division of responsibilities to make understanding the system a little bit easier. + +Currently, Managers and Drivers are specified by flags and loaded using utils.load_object(). This method allows for them to be implemented as singletons, classes, modules or objects. As long as the path specified by the flag leads to an object (or a callable that returns an object) that responds to getattr, it should work as a manager or driver. + + +The :mod:`cinder.service` Module +------------------------------ + +.. automodule:: cinder.service + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +The :mod:`cinder.manager` Module +------------------------------ + +.. automodule:: cinder.manager + :noindex: + :members: + :undoc-members: + :show-inheritance: + + +Implementation-Specific Drivers +------------------------------- + +A manager will generally load a driver for some of its tasks. The driver is responsible for specific implementation details. Anything running shell commands on a host, or dealing with other non-python code should probably be happening in a driver. + +Drivers should minimize touching the database, although it is currently acceptable for implementation specific data. This may be reconsidered at some point. + +It usually makes sense to define an Abstract Base Class for the specific driver (i.e. VolumeDriver), to define the methods that a different driver would need to implement. diff --git a/doc/source/devref/threading.rst b/doc/source/devref/threading.rst new file mode 100644 index 000000000..c48d353e0 --- /dev/null +++ b/doc/source/devref/threading.rst @@ -0,0 +1,51 @@ +Threading model +=============== + +All OpenStack services use *green thread* model of threading, implemented +through using the Python `eventlet <http://eventlet.net/>`_ and +`greenlet <http://packages.python.org/greenlet/>`_ libraries. + +Green threads use a cooperative model of threading: thread context +switches can only occur when specific eventlet or greenlet library calls are +made (e.g., sleep, certain I/O calls). From the operating system's point of +view, each OpenStack service runs in a single thread. + +The use of green threads reduces the likelihood of race conditions, but does +not completely eliminate them. In some cases, you may need to use the +``@utils.synchronized(...)`` decorator to avoid races. + +In addition, since there is only one operating system thread, a call that +blocks that main thread will block the entire process. + +Yielding the thread in long-running tasks +----------------------------------------- +If a code path takes a long time to execute and does not contain any methods +that trigger an eventlet context switch, the long-running thread will block +any pending threads. + +This scenario can be avoided by adding calls to the eventlet sleep method +in the long-running code path. The sleep call will trigger a context switch +if there are pending threads, and using an argument of 0 will avoid introducing +delays in the case that there is only a single green thread:: + + from eventlet import greenthread + ... + greenthread.sleep(0) + + +MySQL access and eventlet +------------------------- +Queries to the MySQL database will block the main thread of a service. This is +because OpenStack services use an external C library for accessing the MySQL +database. Since eventlet cannot use monkey-patching to intercept blocking +calls in a C library, the resulting database query blocks the thread. + +The Diablo release contained a thread-pooling implementation that did not +block, but this implementation resulted in a `bug`_ and was removed. + +See this `mailing list thread`_ for a discussion of this issue, including +a discussion of the `impact on performance`_. + +.. _bug: https://bugs.launchpad.net/cinder/+bug/838581 +.. _mailing list thread: https://lists.launchpad.net/openstack/msg08118.html +.. _impact on performance: https://lists.launchpad.net/openstack/msg08217.html diff --git a/doc/source/devref/unit_tests.rst b/doc/source/devref/unit_tests.rst new file mode 100644 index 000000000..b42386b0d --- /dev/null +++ b/doc/source/devref/unit_tests.rst @@ -0,0 +1,159 @@ +Unit Tests +========== + +Cinder contains a suite of unit tests, in the cinder/tests directory. + +Any proposed code change will be automatically rejected by the OpenStack +Jenkins server [#f1]_ if the change causes unit test failures. + +Running the tests +----------------- +Run the unit tests by doing:: + + ./run_tests.sh + +This script is a wrapper around the `nose`_ testrunner and the `pep8`_ checker. + +.. _nose: http://code.google.com/p/python-nose/ +.. _pep8: https://github.com/jcrocholl/pep8 + +Flags +----- + +The ``run_tests.sh`` script supports several flags. You can view a list of +flags by doing:: + + run_tests.sh -h + +This will show the following help information:: + + Usage: ./run_tests.sh [OPTION]... + Run Cinder's test suite(s) + + -V, --virtual-env Always use virtualenv. Install automatically if not present + -N, --no-virtual-env Don't use virtualenv. Run tests in local environment + -s, --no-site-packages Isolate the virtualenv from the global Python environment + -r, --recreate-db Recreate the test database (deprecated, as this is now the default). + -n, --no-recreate-db Don't recreate the test database. + -x, --stop Stop running tests after the first error or failure. + -f, --force Force a clean re-build of the virtual environment. Useful when dependencies have been added. + -p, --pep8 Just run pep8 + -P, --no-pep8 Don't run pep8 + -c, --coverage Generate coverage report + -h, --help Print this usage message + --hide-elapsed Don't print the elapsed time for each test along with slow test list + +Because ``run_tests.sh`` is a wrapper around nose, it also accepts the same +flags as nosetests. See the `nose options documentation`_ for details about +these additional flags. + +.. _nose options documentation: http://readthedocs.org/docs/nose/en/latest/usage.html#options + +Running a subset of tests +------------------------- + +Instead of running all tests, you can specify an individual directory, file, +class, or method that contains test code. + +To run the tests in the ``cinder/tests/scheduler`` directory:: + + ./run_tests.sh scheduler + +To run the tests in the ``cinder/tests/test_libvirt.py`` file:: + + ./run_tests.sh test_libvirt + +To run the tests in the `HostStateTestCase` class in +``cinder/tests/test_libvirt.py``:: + + ./run_tests.sh test_libvirt:HostStateTestCase + +To run the `ToPrimitiveTestCase.test_dict` test method in +``cinder/tests/test_utils.py``:: + + ./run_tests.sh test_utils:ToPrimitiveTestCase.test_dict + + +Suppressing logging output when tests fail +------------------------------------------ + +By default, when one or more unit test fails, all of the data sent to the +logger during the failed tests will appear on standard output, which typically +consists of many lines of texts. The logging output can make it difficult to +identify which specific tests have failed, unless your terminal has a large +scrollback buffer or you have redirected output to a file. + +You can suppress the logging output by calling ``run_tests.sh`` with the nose +flag:: + + --nologcapture + +Virtualenv +---------- + +By default, the tests use the Python packages installed inside a +virtualenv [#f2]_. (This is equivalent to using the ``-V, --virtualenv`` flag). +If the virtualenv does not exist, it will be created the first time the tests are run. + +If you wish to recreate the virtualenv, call ``run_tests.sh`` with the flag:: + + -f, --force + +Recreating the virtualenv is useful if the package dependencies have changed +since the virtualenv was last created. If the ``tools/pip-requires`` or +``tools/install_venv.py`` files have changed, it's a good idea to recreate the +virtualenv. + +By default, the unit tests will see both the packages in the virtualenv and +the packages that have been installed in the Python global environment. In +some cases, the packages in the Python global environment may cause a conflict +with the packages in the virtualenv. If this occurs, you can isolate the +virtualenv from the global environment by using the flag:: + + -s, --no-site packages + +If you do not wish to use a virtualenv at all, use the flag:: + + -N, --no-virtual-env + +Database +-------- + +Some of the unit tests make queries against an sqlite database [#f3]_. By +default, the test database (``tests.sqlite``) is deleted and recreated each +time ``run_tests.sh`` is invoked (This is equivalent to using the +``-r, --recreate-db`` flag). To reduce testing time if a database already +exists it can be reused by using the flag:: + + -n, --no-recreate-db + +Reusing an existing database may cause tests to fail if the schema has +changed. If any files in the ``cinder/db/sqlalchemy`` have changed, it's a good +idea to recreate the test database. + +Gotchas +------- + +**Running Tests from Shared Folders** + +If you are running the unit tests from a shared folder, you may see tests start +to fail or stop completely as a result of Python lockfile issues [#f4]_. You +can get around this by manually setting or updating the following line in +``cinder/tests/fake_flags.py``:: + + FLAGS['lock_path'].SetDefault('/tmp') + +Note that you may use any location (not just ``/tmp``!) as long as it is not +a shared folder. + +.. rubric:: Footnotes + +.. [#f1] See :doc:`jenkins`. + +.. [#f2] See :doc:`development.environment` for more details about the use of + virtualenv. + +.. [#f3] There is an effort underway to use a fake DB implementation for the + unit tests. See https://lists.launchpad.net/openstack/msg05604.html + +.. [#f4] See Vish's comment in this bug report: https://bugs.launchpad.net/cinder/+bug/882933 diff --git a/doc/source/devref/up.sh b/doc/source/devref/up.sh new file mode 100644 index 000000000..073a58e15 --- /dev/null +++ b/doc/source/devref/up.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +BR=$1 +DEV=$2 +MTU=$3 +/sbin/ifconfig $DEV mtu $MTU promisc up +/usr/sbin/brctl addif $BR $DEV diff --git a/doc/source/devref/volume.rst b/doc/source/devref/volume.rst new file mode 100644 index 000000000..09badeef7 --- /dev/null +++ b/doc/source/devref/volume.rst @@ -0,0 +1,66 @@ +.. + Copyright 2010-2011 United States Government as represented by the + Administrator of the National Aeronautics and Space Administration. + 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. + +Storage Volumes, Disks +====================== + +.. todo:: rework after iSCSI merge (see 'Old Docs') (todd or vish) + + +The :mod:`cinder.volume.manager` Module +------------------------------------- + +.. automodule:: cinder.volume.manager + :noindex: + :members: + :undoc-members: + :show-inheritance: + +The :mod:`cinder.volume.driver` Module +------------------------------------- + +.. automodule:: cinder.volume.driver + :noindex: + :members: + :undoc-members: + :show-inheritance: + :exclude-members: FakeAOEDriver + +Tests +----- + +The :mod:`volume_unittest` Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: cinder.tests.volume_unittest + :noindex: + :members: + :undoc-members: + :show-inheritance: + +Old Docs +-------- + +Cinder uses ata-over-ethernet (AoE) to export storage volumes from multiple storage nodes. These AoE exports are attached (using libvirt) directly to running instances. + +Cinder volumes are exported over the primary system VLAN (usually VLAN 1), and not over individual VLANs. + +AoE exports are numbered according to a "shelf and blade" syntax. In order to avoid collisions, we currently perform an AoE-discover of existing exports, and then grab the next unused number. (This obviously has race condition problems, and should be replaced by allocating a shelf-id to each storage node.) + +The underlying volumes are LVM logical volumes, created on demand within a single large volume group. + + diff --git a/doc/source/devref/xensmvolume.rst b/doc/source/devref/xensmvolume.rst new file mode 100644 index 000000000..4b736dcaf --- /dev/null +++ b/doc/source/devref/xensmvolume.rst @@ -0,0 +1,88 @@ +Xen Storage Manager Volume Driver +================================= + +The Xen Storage Manager (xensm) driver for Cinder-Volume is based on XenAPI Storage Manager. This will not only provide basic storage functionality (like volume creation, and destruction) on a number of different storage back-ends, such as Netapp, NFS, etc. but it will also enable the capability of using more sophisticated storage back-ends for operations like cloning/snapshotting etc. To have an idea of the benefits of using XenAPI SM to provide back-end storage services, the list below shows some of the storage plugins already supported in XenServer/XCP: + +- NFS VHD: SR plugin which stores disks as VHD files on a remote NFS filesystem +- Local VHD on LVM: SR plugin which represents disks as VHD disks on Logical Volumes within a locally-attached Volume Group +- HBA LUN-per-VDI driver: SR plugin which represents LUNs as VDIs sourced by hardware HBA adapters, e.g. hardware-based iSCSI or FC support +- NetApp: SR driver for mapping of LUNs to VDIs on a NETAPP server, providing use of fast snapshot and clone features on the filer +- LVHD over FC: SR plugin which represents disks as VHDs on Logical Volumes within a Volume Group created on an HBA LUN, e.g. hardware-based iSCSI or FC support +- iSCSI: Base ISCSI SR driver, provides a LUN-per-VDI. Does not support creation of VDIs but accesses existing LUNs on a target. +- LVHD over iSCSI: SR plugin which represents disks as Logical Volumes within a Volume Group created on an iSCSI LUN +- EqualLogic: SR driver for mapping of LUNs to VDIs on a EQUALLOGIC array group, providing use of fast snapshot and clone features on the array + +Glossary +========= + + XenServer: Commercial, supported product from Citrix + + Xen Cloud Platform (XCP): Open-source equivalent of XenServer (and the development project for the toolstack). Everything said about XenServer below applies equally to XCP + + XenAPI: The management API exposed by XenServer and XCP + + xapi: The primary daemon on XenServer and Xen Cloud Platform; the one that exposes the XenAPI + + +Design +======= + +Definitions +----------- + +Backend: A term for a particular storage backend. This could be iSCSI, NFS, Netapp etc. +Backend-config: All the parameters required to connect to a specific backend. For e.g. For NFS, this would be the server, path, etc. +Flavor: This term is equivalent to volume "types". A user friendly term to specify some notion of quality of service. For example, "gold" might mean that the volumes will use a backend where backups are possible. + +A flavor can be associated with multiple backends. The volume scheduler, with the help of the driver, will decide which backend will be used to create a volume of a particular flavor. Currently, the driver uses a simple "first-fit" policy, where the first backend that can successfully create this volume is the one that is used. + +Operation +---------- + +Using the cinder-manage command detailed in the implementation, an admin can add flavors and backends. + +One or more cinder-volume service instances will be deployed per availability zone. When an instance is started, it will create storage repositories (SRs) to connect to the backends available within that zone. All cinder-volume instances within a zone can see all the available backends. These instances are completely symmetric and hence should be able to service any create_volume request within the zone. + + +Commands +========= + +A category called "sm" has been added to cinder-manage in the class StorageManagerCommands. + +The following actions will be added: + +- flavor_list +- flavor_create +- flavor_delete +- backend_list +- backend_add +- backend_remove + +Usage: +------ + +cinder-manage sm flavor_create <label> <description> + +cinder-manage sm flavor_delete<label> + +cinder-manage sm backend_add <flavor label> <SR type> [config connection parameters] + +Note: SR type and config connection parameters are in keeping with the Xen Command Line Interface. http://support.citrix.com/article/CTX124887 + +cinder-manage sm backend_delete <backend-id> + +Examples: +--------- + +cinder-manage sm flavor_create gold "Not all that glitters" + +cinder-manage sm flavor_delete gold + +cinder-manage sm backend_add gold nfs name_label=toybox-renuka server=myserver serverpath=/local/scratch/myname + +cinder-manage sm backend_remove 1 + +API Changes +=========== + +No API changes have been introduced so far. The existing euca-create-volume and euca-delete-volume commands (or equivalent Openstack API commands) should be used. diff --git a/doc/source/image_src/multinic_1.odg b/doc/source/image_src/multinic_1.odg new file mode 100644 index 0000000000000000000000000000000000000000..bbd76b10eaa54987a6171a8ac827c0aee6376258 GIT binary patch literal 12363 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 literal 0 HcmV?d00001 diff --git a/doc/source/image_src/multinic_2.odg b/doc/source/image_src/multinic_2.odg new file mode 100644 index 0000000000000000000000000000000000000000..1f1e4251ad7d2c75879ceb9c0f2f984c1ceb975a GIT binary patch literal 13425 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 Z{$X-fmP16k6T`XvaNjO6KW4qV`aj|o#&ZAw literal 0 HcmV?d00001 diff --git a/doc/source/image_src/multinic_3.odg b/doc/source/image_src/multinic_3.odg new file mode 100644 index 0000000000000000000000000000000000000000..d29e163534f1f6a139734982c49413b4682f0bef GIT binary patch literal 13598 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 literal 0 HcmV?d00001 diff --git a/doc/source/images/NOVA_ARCH.png b/doc/source/images/NOVA_ARCH.png new file mode 100644 index 0000000000000000000000000000000000000000..617ec42110a04cf2f67dbbd0d1477488f1f14065 GIT binary patch literal 191332 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 XLLc&=jQ<n`{!>%YI+Cq)+UNfO=r|vV literal 0 HcmV?d00001 diff --git a/doc/source/images/NOVA_ARCH.svg b/doc/source/images/NOVA_ARCH.svg new file mode 100644 index 000000000..3175eeeb9 --- /dev/null +++ b/doc/source/images/NOVA_ARCH.svg @@ -0,0 +1,5854 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + inkscape:label="PozadÃ" + version="1.1" + inkscape:version="0.47 r22583" + sodipodi:docname="CINDER_ARCH.svg" + inkscape:export-filename="/home/t/work/lho/CINDER_ARCH.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200"> + <defs + id="defs3"> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow2Mstart" + style="overflow:visible"> + <path + id="path9345" + style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="scale(0.6) translate(0,0)" /> + </marker> + <linearGradient + id="linearGradient12067"> + <stop + id="stop12069" + style="stop-color:#ad96cc;stop-opacity:1;" + offset="0" /> + <stop + id="stop12071" + style="stop-color:#e9afaf;stop-opacity:1" + offset="1" /> + </linearGradient> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lend" + style="overflow:visible;"> + <path + id="path9324" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.8) rotate(180) translate(12.5,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path9321" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.8) translate(12.5,0)" /> + </marker> + <pattern + inkscape:collect="always" + xlink:href="#pattern5307" + id="pattern5310" + patternTransform="matrix(0,5.5342899,-6.6960605,3.3480303,466.66297,104.02755)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern118687-1" + id="pattern5307" + patternTransform="matrix(0,5.5342899,-7.4864232,0,521.74506,337.35904)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern5286" + id="pattern5289" + patternTransform="matrix(0,5.5342899,-6.6960605,3.3480303,466.66297,104.02755)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern118687-1" + id="pattern5286" + patternTransform="matrix(0,5.5342899,-7.4864232,0,521.74506,337.35904)" /> + <linearGradient + id="linearGradient2817"> + <stop + style="stop-color:#cccccc;stop-opacity:1;" + offset="0" + id="stop2819" /> + <stop + style="stop-color:#f6f6f1;stop-opacity:1;" + offset="1" + id="stop2821" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="627.46067 : 602.89763 : 1" + inkscape:vp_y="0 : 691.34383 : 0" + inkscape:vp_z="854.09747 : 666.1591 : 1" + inkscape:persp3d-origin="737.53684 : 544.90176 : 1" + id="perspective9" /> + <linearGradient + gradientTransform="matrix(0.56832948,0,0,0.57917444,-18.000341,286.5989)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69151-9-1-8" + id="linearGradient4204" + y2="300.91547" + x2="211.24152" + y1="-19.084036" + x1="355.55502" /> + <linearGradient + gradientTransform="matrix(0.56832948,0,0,0.57917444,-18.000341,286.5989)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69151-9-1-8" + id="linearGradient4191" + y2="300.91547" + x2="211.24152" + y1="-19.084036" + x1="355.55502" /> + <linearGradient + gradientTransform="matrix(0.98127514,0,0,1,3.1523805,5.2287503)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69151-9-1-8" + id="linearGradient4157" + y2="300.91547" + x2="211.24152" + y1="-19.084036" + x1="355.55502" /> + <linearGradient + id="linearGradient69151-9-1-8"> + <stop + offset="0" + style="stop-color:#f9f9f9;stop-opacity:1" + id="stop69153-4-0-5-6" /> + <stop + offset="1" + style="stop-color:#f9f9f9;stop-opacity:0" + id="stop69155-8-8-0" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(0.98127514,0,0,1,3.1523805,5.2287503)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69151-9-1-8" + id="linearGradient4102-7" + y2="300.91547" + x2="211.24152" + y1="-19.084036" + x1="355.55502" /> + <filter + id="filter69132-4-0-7" + color-interpolation-filters="sRGB"> + <feGaussianBlur + id="feGaussianBlur69134-0-3-4" + stdDeviation="4.3795246" /> + </filter> + <linearGradient + gradientTransform="matrix(0.98127514,0,0,1,3.1523805,5.2287503)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69151-9-1" + id="linearGradient4102" + y2="300.91547" + x2="211.24152" + y1="-19.084036" + x1="355.55502" /> + <linearGradient + id="linearGradient69151-9-1"> + <stop + offset="0" + style="stop-color:#f9f9f9;stop-opacity:1" + id="stop69153-4-0-5" /> + <stop + offset="1" + style="stop-color:#f9f9f9;stop-opacity:0" + id="stop69155-8-8" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(0.98127514,0,0,1,3.1523805,5.2287503)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69151-9-1" + id="linearGradient4047-3" + y2="300.91547" + x2="211.24152" + y1="-19.084036" + x1="355.55502" /> + <filter + id="filter69132-4-0" + color-interpolation-filters="sRGB"> + <feGaussianBlur + id="feGaussianBlur69134-0-3" + stdDeviation="4.3795246" /> + </filter> + <linearGradient + gradientTransform="matrix(0.98127514,0,0,1,3.1523805,5.2287503)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69151-9" + id="linearGradient4047" + y2="300.91547" + x2="211.24152" + y1="-19.084036" + x1="355.55502" /> + <linearGradient + id="linearGradient69151-9"> + <stop + offset="0" + style="stop-color:#f9f9f9;stop-opacity:1" + id="stop69153-4-0" /> + <stop + offset="1" + style="stop-color:#f9f9f9;stop-opacity:0" + id="stop69155-8" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(0.98127514,0,0,1,3.1523805,5.2287503)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69151-9" + id="linearGradient69168-2" + y2="300.91547" + x2="211.24152" + y1="-19.084036" + x1="355.55502" /> + <filter + id="filter69132-4" + color-interpolation-filters="sRGB"> + <feGaussianBlur + id="feGaussianBlur69134-0" + stdDeviation="4.3795246" /> + </filter> + <linearGradient + id="linearGradient69012-7"> + <stop + offset="0" + style="stop-color:#f9f9f9;stop-opacity:1" + id="stop69014-3" /> + <stop + offset="1" + style="stop-color:#f9f9f9;stop-opacity:0" + id="stop69016-4" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69012-7" + id="linearGradient69047-4" + y2="327.05923" + x2="558.43054" + y1="91.76548" + x1="614.901" /> + <linearGradient + id="linearGradient68896-7"> + <stop + offset="0" + style="stop-color:#f9f9f9;stop-opacity:1" + id="stop68898-9" /> + <stop + offset="1" + style="stop-color:#f9f9f9;stop-opacity:0" + id="stop68900-8" /> + </linearGradient> + <linearGradient + gradientTransform="translate(-69.019504,213.33301)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient68896-7" + id="linearGradient68931-9" + y2="311.37299" + x2="644.18201" + y1="30.066221" + x1="646.27356" /> + <linearGradient + id="linearGradient68881-9"> + <stop + offset="0" + style="stop-color:#000000;stop-opacity:1" + id="stop68883-3" /> + <stop + offset="1" + style="stop-color:#000000;stop-opacity:0" + id="stop68885-5" /> + </linearGradient> + <linearGradient + gradientTransform="translate(-69.019504,213.33301)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient68881-9" + id="linearGradient68929-1" + y2="222.48422" + x2="590.84882" + y1="349.01999" + x1="546.92725" /> + <linearGradient + id="linearGradient69151-4"> + <stop + offset="0" + style="stop-color:#f9f9f9;stop-opacity:1" + id="stop69153-4" /> + <stop + offset="1" + style="stop-color:#f9f9f9;stop-opacity:0" + id="stop69155-2" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(0.98127514,0,0,1,3.1523805,5.2287503)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69151-4" + id="linearGradient3539" + y2="300.91547" + x2="211.24152" + y1="-19.084036" + x1="355.55502" /> + <filter + id="filter69132-2" + color-interpolation-filters="sRGB"> + <feGaussianBlur + id="feGaussianBlur69134-4" + stdDeviation="4.3795246" /> + </filter> + <linearGradient + id="linearGradient69185-1"> + <stop + offset="0" + style="stop-color:#ffffff;stop-opacity:1" + id="stop69187-2" /> + <stop + offset="1" + style="stop-color:#ffffff;stop-opacity:0" + id="stop69189-5" /> + </linearGradient> + <linearGradient + gradientTransform="translate(644.80647,-1048.55)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69185-1" + id="linearGradient3594" + y2="223.52998" + x2="334.64001" + y1="-60.91404" + x1="403.65952" /> + <filter + id="filter69132-1" + color-interpolation-filters="sRGB"> + <feGaussianBlur + id="feGaussianBlur69134-7" + stdDeviation="4.3795246" /> + </filter> + <linearGradient + gradientTransform="translate(-69.019504,213.33301)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient68896" + id="linearGradient69890" + y2="311.37299" + x2="644.18201" + y1="30.066221" + x1="646.27356" /> + <linearGradient + gradientTransform="translate(-69.019504,213.33301)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient68881" + id="linearGradient69888" + y2="222.48422" + x2="590.84882" + y1="349.01999" + x1="546.92725" /> + <linearGradient + gradientTransform="translate(62.745003,105.62076)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69425" + id="linearGradient69874" + y2="273.72598" + x2="246.79701" + y1="183.79149" + x1="236.33952" /> + <linearGradient + gradientTransform="translate(130.71876,-5.2287503)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69425" + id="linearGradient69872" + y2="273.72598" + x2="246.79701" + y1="183.79149" + x1="236.33952" /> + <linearGradient + gradientTransform="translate(-3.2766244e-6,-2.0915001)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69425" + id="linearGradient69870" + y2="273.72598" + x2="246.79701" + y1="183.79149" + x1="236.33952" /> + <linearGradient + gradientTransform="translate(-3.2766244e-6,-2.0915001)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69406" + id="linearGradient69868" + y2="258.03973" + x2="392.15628" + y1="27.974716" + x1="260.39178" /> + <linearGradient + gradientTransform="translate(-336.73152,-126.53575)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69425" + id="linearGradient69828" + y2="273.72598" + x2="246.79701" + y1="183.79149" + x1="236.33952" /> + <linearGradient + gradientTransform="translate(-268.75776,-237.38526)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69425" + id="linearGradient69826" + y2="273.72598" + x2="246.79701" + y1="183.79149" + x1="236.33952" /> + <linearGradient + gradientTransform="translate(-399.47652,-234.24801)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69425" + id="linearGradient69824" + y2="273.72598" + x2="246.79701" + y1="183.79149" + x1="236.33952" /> + <linearGradient + gradientTransform="translate(-399.47652,-234.24801)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69406" + id="linearGradient69822" + y2="258.03973" + x2="392.15628" + y1="27.974716" + x1="260.39178" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69012" + id="linearGradient69780" + y2="327.05923" + x2="558.43054" + y1="91.76548" + x1="614.901" /> + <linearGradient + gradientTransform="matrix(0.98127514,0,0,1,3.1523805,5.2287503)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69151" + id="linearGradient69768" + y2="300.91547" + x2="211.24152" + y1="-19.084036" + x1="355.55502" /> + <linearGradient + gradientTransform="translate(81.5685,519.73778)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69425" + id="linearGradient69733" + y2="273.72598" + x2="246.79701" + y1="183.79149" + x1="236.33952" /> + <linearGradient + gradientTransform="translate(149.54225,408.88827)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69425" + id="linearGradient69731" + y2="273.72598" + x2="246.79701" + y1="183.79149" + x1="236.33952" /> + <linearGradient + gradientTransform="translate(18.823494,412.02552)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69425" + id="linearGradient69729" + y2="273.72598" + x2="246.79701" + y1="183.79149" + x1="236.33952" /> + <linearGradient + gradientTransform="translate(18.823494,412.02552)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69406" + id="linearGradient69727" + y2="258.03973" + x2="392.15628" + y1="27.974716" + x1="260.39178" /> + <linearGradient + gradientTransform="translate(62.745003,105.62076)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69425" + id="linearGradient69652" + y2="273.72598" + x2="246.79701" + y1="183.79149" + x1="236.33952" /> + <linearGradient + gradientTransform="translate(130.71876,-5.2287503)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69425" + id="linearGradient69650" + y2="273.72598" + x2="246.79701" + y1="183.79149" + x1="236.33952" /> + <linearGradient + gradientTransform="translate(-3.276625e-6,-2.0915001)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69425" + id="linearGradient69648" + y2="273.72598" + x2="246.79701" + y1="183.79149" + x1="236.33952" /> + <linearGradient + gradientTransform="translate(-3.276625e-6,-2.0915001)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69406" + id="linearGradient69646" + y2="258.03973" + x2="392.15628" + y1="27.974716" + x1="260.39178" /> + <linearGradient + gradientTransform="translate(-336.73152,-126.53575)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69425" + id="linearGradient69487" + y2="273.72598" + x2="246.79701" + y1="183.79149" + x1="236.33952" /> + <linearGradient + gradientTransform="translate(-268.75776,-237.38526)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69425" + id="linearGradient69485" + y2="273.72598" + x2="246.79701" + y1="183.79149" + x1="236.33952" /> + <linearGradient + gradientTransform="translate(-399.47652,-234.24801)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69425" + id="linearGradient69483" + y2="273.72598" + x2="246.79701" + y1="183.79149" + x1="236.33952" /> + <linearGradient + gradientTransform="translate(-399.47652,-234.24801)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69406" + id="linearGradient69481" + y2="258.03973" + x2="392.15628" + y1="27.974716" + x1="260.39178" /> + <filter + id="filter69400" + color-interpolation-filters="sRGB"> + <feGaussianBlur + id="feGaussianBlur69402" + stdDeviation="4.8539841" /> + </filter> + <linearGradient + gradientTransform="translate(644.80647,-1048.55)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69185" + id="linearGradient69203" + y2="223.52998" + x2="334.64001" + y1="-60.91404" + x1="403.65952" /> + <linearGradient + gradientTransform="matrix(0.98127514,0,0,1,3.1523805,5.2287503)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69151" + id="linearGradient69168" + y2="300.91547" + x2="211.24152" + y1="-19.084036" + x1="355.55502" /> + <filter + id="filter69132" + color-interpolation-filters="sRGB"> + <feGaussianBlur + id="feGaussianBlur69134" + stdDeviation="4.3795246" /> + </filter> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69012" + id="linearGradient69047" + y2="327.05923" + x2="558.43054" + y1="91.76548" + x1="614.901" /> + <linearGradient + gradientTransform="translate(238.43101,-292.81002)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient69012" + id="linearGradient69039" + y2="327.05923" + x2="558.43054" + y1="91.76548" + x1="614.901" /> + <linearGradient + gradientTransform="translate(-69.019504,213.33301)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient68896" + id="linearGradient68931" + y2="311.37299" + x2="644.18201" + y1="30.066221" + x1="646.27356" /> + <linearGradient + gradientTransform="translate(-69.019504,213.33301)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient68881" + id="linearGradient68929" + y2="222.48422" + x2="590.84882" + y1="349.01999" + x1="546.92725" /> + <linearGradient + gradientTransform="translate(-69.019504,213.33301)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient68896" + id="linearGradient68902" + y2="311.37299" + x2="644.18201" + y1="30.066221" + x1="646.27356" /> + <linearGradient + gradientTransform="translate(-69.019504,213.33301)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient68881" + id="linearGradient68889" + y2="222.48422" + x2="590.84882" + y1="349.01999" + x1="546.92725" /> + <linearGradient + gradientTransform="matrix(0.94766,0,0,0.93975812,-498.89341,-720.21802)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient63927" + id="linearGradient65727" + y2="661.03473" + x2="370.64758" + y1="280.84256" + x1="407.23511" /> + <linearGradient + id="linearGradient63927"> + <stop + offset="0" + style="stop-color:#e6e6e6;stop-opacity:1" + id="stop63929" /> + <stop + offset="1" + style="stop-color:#e6e6e6;stop-opacity:0" + id="stop63931" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient62493" + id="linearGradient63086" + y2="-23.348454" + x2="-928.76868" + y1="-135.02313" + x1="-963.9256" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient62493" + id="linearGradient62995" + y2="-23.348454" + x2="-928.76868" + y1="-135.02313" + x1="-963.9256" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient62493" + id="linearGradient62499" + y2="-23.348454" + x2="-928.76868" + y1="-135.02313" + x1="-963.9256" /> + <filter + id="filter25721" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology25723" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur25725" /> + <feComposite + id="feComposite25727" + in="SourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter25793" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology25795" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur25797" /> + <feComposite + id="feComposite25799" + in="SourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter25817" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology25819" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur25821" /> + <feComposite + id="feComposite25823" + in="SourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter25849" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology25851" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur25853" /> + <feComposite + id="feComposite25855" + in="SourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter25961" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology25963" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur25965" /> + <feComposite + id="feComposite25967" + in="SourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter45689" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology45691" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur45693" /> + <feComposite + id="feComposite45695" + result="fbSourceGraphic" + in="SourceGraphic" + operator="in" + in2="result91" /> + <feColorMatrix + id="feColorMatrix57073" + values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0" + in="fbSourceGraphic" + result="fbSourceGraphicAlpha" /> + <feMorphology + result="result0" + in="fbSourceGraphic" + radius="4" + id="feMorphology57075" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur57077" /> + <feComposite + id="feComposite57079" + in="fbSourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter46185" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology46187" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur46189" /> + <feComposite + id="feComposite46191" + result="fbSourceGraphic" + in="SourceGraphic" + operator="in" + in2="result91" /> + <feColorMatrix + id="feColorMatrix57569" + values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0" + in="fbSourceGraphic" + result="fbSourceGraphicAlpha" /> + <feMorphology + result="result0" + in="fbSourceGraphic" + radius="4" + id="feMorphology57571" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur57573" /> + <feComposite + id="feComposite57575" + in="fbSourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter46329" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology46331" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur46333" /> + <feComposite + id="feComposite46335" + result="fbSourceGraphic" + in="SourceGraphic" + operator="in" + in2="result91" /> + <feColorMatrix + id="feColorMatrix57713" + values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0" + in="fbSourceGraphic" + result="fbSourceGraphicAlpha" /> + <feMorphology + result="result0" + in="fbSourceGraphic" + radius="4" + id="feMorphology57715" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur57717" /> + <feComposite + id="feComposite57719" + in="fbSourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter46345" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology46347" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur46349" /> + <feComposite + id="feComposite46351" + result="fbSourceGraphic" + in="SourceGraphic" + operator="in" + in2="result91" /> + <feColorMatrix + id="feColorMatrix57729" + values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0" + in="fbSourceGraphic" + result="fbSourceGraphicAlpha" /> + <feMorphology + result="result0" + in="fbSourceGraphic" + radius="4" + id="feMorphology57731" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur57733" /> + <feComposite + id="feComposite57735" + in="fbSourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter46457" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology46459" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur46461" /> + <feComposite + id="feComposite46463" + result="fbSourceGraphic" + in="SourceGraphic" + operator="in" + in2="result91" /> + <feColorMatrix + id="feColorMatrix57841" + values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0" + in="fbSourceGraphic" + result="fbSourceGraphicAlpha" /> + <feMorphology + result="result0" + in="fbSourceGraphic" + radius="4" + id="feMorphology57843" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur57845" /> + <feComposite + id="feComposite57847" + in="fbSourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter28937" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology28939" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur28941" /> + <feComposite + id="feComposite28943" + result="fbSourceGraphic" + in="SourceGraphic" + operator="in" + in2="result91" /> + <feColorMatrix + id="feColorMatrix58409" + values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0" + in="fbSourceGraphic" + result="fbSourceGraphicAlpha" /> + <feMorphology + result="result0" + in="fbSourceGraphic" + radius="4" + id="feMorphology58411" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur58413" /> + <feComposite + id="feComposite58415" + in="fbSourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter28945" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology28947" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur28949" /> + <feComposite + id="feComposite28951" + result="fbSourceGraphic" + in="SourceGraphic" + operator="in" + in2="result91" /> + <feColorMatrix + id="feColorMatrix58417" + values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0" + in="fbSourceGraphic" + result="fbSourceGraphicAlpha" /> + <feMorphology + result="result0" + in="fbSourceGraphic" + radius="4" + id="feMorphology58419" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur58421" /> + <feComposite + id="feComposite58423" + in="fbSourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter28969" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology28971" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur28973" /> + <feComposite + id="feComposite28975" + result="fbSourceGraphic" + in="SourceGraphic" + operator="in" + in2="result91" /> + <feColorMatrix + id="feColorMatrix58441" + values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0" + in="fbSourceGraphic" + result="fbSourceGraphicAlpha" /> + <feMorphology + result="result0" + in="fbSourceGraphic" + radius="4" + id="feMorphology58443" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur58445" /> + <feComposite + id="feComposite58447" + in="fbSourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter28993" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology28995" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur28997" /> + <feComposite + id="feComposite28999" + result="fbSourceGraphic" + in="SourceGraphic" + operator="in" + in2="result91" /> + <feColorMatrix + id="feColorMatrix58465" + values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0" + in="fbSourceGraphic" + result="fbSourceGraphicAlpha" /> + <feMorphology + result="result0" + in="fbSourceGraphic" + radius="4" + id="feMorphology58467" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur58469" /> + <feComposite + id="feComposite58471" + in="fbSourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter29001" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology29003" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur29005" /> + <feComposite + id="feComposite29007" + result="fbSourceGraphic" + in="SourceGraphic" + operator="in" + in2="result91" /> + <feColorMatrix + id="feColorMatrix58473" + values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0" + in="fbSourceGraphic" + result="fbSourceGraphicAlpha" /> + <feMorphology + result="result0" + in="fbSourceGraphic" + radius="4" + id="feMorphology58475" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur58477" /> + <feComposite + id="feComposite58479" + in="fbSourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter58481" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology58483" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur58485" /> + <feComposite + id="feComposite58487" + in="SourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter58489" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology58491" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur58493" /> + <feComposite + id="feComposite58495" + in="SourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter58505" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology58507" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur58509" /> + <feComposite + id="feComposite58511" + in="SourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter29017" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology29019" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur29021" /> + <feComposite + id="feComposite29023" + result="fbSourceGraphic" + in="SourceGraphic" + operator="in" + in2="result91" /> + <feColorMatrix + id="feColorMatrix58513" + values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0" + in="fbSourceGraphic" + result="fbSourceGraphicAlpha" /> + <feMorphology + result="result0" + in="fbSourceGraphic" + radius="4" + id="feMorphology58515" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur58517" /> + <feComposite + id="feComposite58519" + in="fbSourceGraphic" + operator="in" + in2="result91" /> + </filter> + <filter + id="filter58545" + color-interpolation-filters="sRGB" + height="1" + width="1" + y="0" + x="0"> + <feMorphology + result="result0" + in="SourceGraphic" + radius="4" + id="feMorphology58547" /> + <feGaussianBlur + result="result91" + stdDeviation="8" + in="result0" + id="feGaussianBlur58549" /> + <feComposite + id="feComposite58551" + in="SourceGraphic" + operator="in" + in2="result91" /> + </filter> + <linearGradient + id="linearGradient62493"> + <stop + offset="0" + style="stop-color:#686762;stop-opacity:1" + id="stop62495" /> + <stop + offset="1" + style="stop-color:#686762;stop-opacity:0" + id="stop62497" /> + </linearGradient> + <linearGradient + id="linearGradient68881"> + <stop + offset="0" + style="stop-color:#000000;stop-opacity:1" + id="stop68883" /> + <stop + offset="1" + style="stop-color:#000000;stop-opacity:0" + id="stop68885" /> + </linearGradient> + <linearGradient + id="linearGradient68896"> + <stop + offset="0" + style="stop-color:#f9f9f9;stop-opacity:1" + id="stop68898" /> + <stop + offset="1" + style="stop-color:#f9f9f9;stop-opacity:0" + id="stop68900" /> + </linearGradient> + <linearGradient + id="linearGradient69012"> + <stop + offset="0" + style="stop-color:#f9f9f9;stop-opacity:1" + id="stop69014" /> + <stop + offset="1" + style="stop-color:#f9f9f9;stop-opacity:0" + id="stop69016" /> + </linearGradient> + <linearGradient + id="linearGradient69151"> + <stop + offset="0" + style="stop-color:#f9f9f9;stop-opacity:1" + id="stop69153" /> + <stop + offset="1" + style="stop-color:#f9f9f9;stop-opacity:0" + id="stop69155" /> + </linearGradient> + <linearGradient + id="linearGradient69185"> + <stop + offset="0" + style="stop-color:#ffffff;stop-opacity:1" + id="stop69187" /> + <stop + offset="1" + style="stop-color:#ffffff;stop-opacity:0" + id="stop69189" /> + </linearGradient> + <linearGradient + id="linearGradient69406"> + <stop + offset="0" + style="stop-color:#ffffff;stop-opacity:1" + id="stop69408" /> + <stop + offset="1" + style="stop-color:#ffffff;stop-opacity:0" + id="stop69410" /> + </linearGradient> + <linearGradient + id="linearGradient69425"> + <stop + offset="0" + style="stop-color:#f9f9f9;stop-opacity:1" + id="stop69427" /> + <stop + offset="1" + style="stop-color:#f9f9f9;stop-opacity:0" + id="stop69429" /> + </linearGradient> + <inkscape:perspective + id="perspective3330" + inkscape:persp3d-origin="400 : 200 : 1" + inkscape:vp_z="800 : 300 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 300 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + gradientTransform="translate(-479.99928,518.99082)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4716" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4260" + id="linearGradient4714" + y2="678.4082" + x2="159.7227" + y1="921.79523" + x1="160.99034" /> + <linearGradient + gradientTransform="translate(-0.44817674,684.36872)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4698" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4296" + id="linearGradient4696" + y2="1122.0824" + x2="467.75937" + y1="1307.158" + x1="475.3652" /> + <linearGradient + gradientTransform="translate(0.44818046,519.439)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4694" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4242" + id="linearGradient4692" + y2="698.69049" + x2="794.81061" + y1="929.40106" + x1="807.487" /> + <linearGradient + gradientTransform="translate(-0.44817674,341.96027)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4690" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4224" + id="linearGradient4688" + y2="481.92395" + x2="785.93713" + y1="724.04327" + x1="791.00769" /> + <linearGradient + gradientTransform="translate(-239.32737,342.40845)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4686" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4090" + id="linearGradient4684" + y2="749.39606" + x2="546.35303" + y1="1037.1505" + x1="557.76184" /> + <linearGradient + gradientTransform="translate(-239.77555,519.439)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4682" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4278" + id="linearGradient4680" + y2="684.74646" + x2="458.88586" + y1="839.39856" + x1="470.29462" /> + <linearGradient + gradientTransform="translate(-240.22373,684.8169)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4678" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4198" + id="linearGradient4676" + y2="892.63947" + x2="527.33844" + y1="1104.3354" + x1="540.01483" /> + <linearGradient + gradientTransform="translate(-479.5511,684.36872)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4674" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientTransform="translate(-46.902699,135.63753)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4180" + id="linearGradient4672" + y2="872.35724" + x2="215.49889" + y1="1106.8707" + x1="209.16068" /> + <linearGradient + gradientTransform="translate(-479.99928,518.99082)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4670" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4260" + id="linearGradient4668" + y2="678.4082" + x2="159.7227" + y1="921.79523" + x1="160.99034" /> + <linearGradient + gradientTransform="translate(-480.44746,342.85663)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4666" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4018" + id="linearGradient4664" + y2="771.80237" + x2="186.44229" + y1="1007.5443" + x1="187.33865" /> + <linearGradient + gradientTransform="translate(-479.10292,169.85969)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4662" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4074" + id="linearGradient4660" + y2="295.58078" + x2="536.21191" + y1="541.50305" + x1="537.47955" /> + <linearGradient + gradientTransform="translate(-480.44746,1.3445382)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4658" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientTransform="translate(145.20987,64.537718)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient3948" + id="linearGradient4656" + y2="140.76692" + x2="51.988716" + y1="0.93518841" + x1="57.366859" /> + <linearGradient + gradientTransform="translate(-239.77555,2.3885373e-6)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4654" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4066" + id="linearGradient4652" + y2="26.841015" + x2="547.62073" + y1="271.49564" + x1="543.81781" /> + <linearGradient + gradientTransform="translate(-239.32737,170.30787)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4650" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4000" + id="linearGradient4648" + y2="521.71875" + x2="220.50388" + y1="752.08252" + x1="228.57109" /> + <linearGradient + gradientTransform="translate(0,169.41151)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4646" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4082" + id="linearGradient4644" + y2="550.37653" + x2="538.74719" + y1="802.63702" + x1="548.88831" /> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371" + id="linearGradient4642" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + gradientTransform="matrix(0.77146086,0,0,0.77146086,473.62706,-225.83335)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient3982" + id="linearGradient4640" + y2="260.87878" + x2="198.9913" + y1="542.3349" + x1="199.88765" /> + <filter + id="filter3968" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="3.3747421" + id="feGaussianBlur3970" /> + </filter> + <linearGradient + id="linearGradient3948"> + <stop + offset="0" + style="stop-color:#ffffff;stop-opacity:1" + id="stop3950" /> + <stop + offset="1" + style="stop-color:#ffffff;stop-opacity:0" + id="stop3952" /> + </linearGradient> + <linearGradient + id="linearGradient3982"> + <stop + offset="0" + style="stop-color:#d40000;stop-opacity:1" + id="stop3984" /> + <stop + offset="1" + style="stop-color:#d40000;stop-opacity:0" + id="stop3986" /> + </linearGradient> + <linearGradient + id="linearGradient4000"> + <stop + offset="0" + style="stop-color:#ff6600;stop-opacity:1" + id="stop4002" /> + <stop + offset="1" + style="stop-color:#ff6600;stop-opacity:0" + id="stop4004" /> + </linearGradient> + <linearGradient + id="linearGradient4018"> + <stop + offset="0" + style="stop-color:#ffd42a;stop-opacity:1" + id="stop4020" /> + <stop + offset="1" + style="stop-color:#ffd42a;stop-opacity:0" + id="stop4022" /> + </linearGradient> + <linearGradient + id="linearGradient4066"> + <stop + offset="0" + style="stop-color:#333333;stop-opacity:1" + id="stop4068" /> + <stop + offset="1" + style="stop-color:#333333;stop-opacity:0" + id="stop4070" /> + </linearGradient> + <linearGradient + id="linearGradient4074"> + <stop + offset="0" + style="stop-color:#aad400;stop-opacity:1" + id="stop4076" /> + <stop + offset="1" + style="stop-color:#aad400;stop-opacity:0" + id="stop4078" /> + </linearGradient> + <linearGradient + id="linearGradient4082"> + <stop + offset="0" + style="stop-color:#0000d4;stop-opacity:1" + id="stop4084" /> + <stop + offset="1" + style="stop-color:#0000d4;stop-opacity:0" + id="stop4086" /> + </linearGradient> + <linearGradient + id="linearGradient4090"> + <stop + offset="0" + style="stop-color:#ff00cc;stop-opacity:1" + id="stop4092" /> + <stop + offset="1" + style="stop-color:#ff00cc;stop-opacity:0" + id="stop4094" /> + </linearGradient> + <linearGradient + id="linearGradient4180"> + <stop + offset="0" + style="stop-color:#d40055;stop-opacity:1" + id="stop4182" /> + <stop + offset="1" + style="stop-color:#d40055;stop-opacity:0" + id="stop4184" /> + </linearGradient> + <linearGradient + id="linearGradient4198"> + <stop + offset="0" + style="stop-color:#cc00ff;stop-opacity:1" + id="stop4200" /> + <stop + offset="1" + style="stop-color:#cc00ff;stop-opacity:0" + id="stop4202" /> + </linearGradient> + <linearGradient + id="linearGradient4224"> + <stop + offset="0" + style="stop-color:#00ffcc;stop-opacity:1" + id="stop4226" /> + <stop + offset="1" + style="stop-color:#00ffcc;stop-opacity:0" + id="stop4228" /> + </linearGradient> + <linearGradient + id="linearGradient4242"> + <stop + offset="0" + style="stop-color:#0066ff;stop-opacity:1" + id="stop4244" /> + <stop + offset="1" + style="stop-color:#0066ff;stop-opacity:0" + id="stop4246" /> + </linearGradient> + <linearGradient + id="linearGradient4260"> + <stop + offset="0" + style="stop-color:#00d400;stop-opacity:1" + id="stop4262" /> + <stop + offset="1" + style="stop-color:#00d400;stop-opacity:0" + id="stop4264" /> + </linearGradient> + <linearGradient + id="linearGradient4278"> + <stop + offset="0" + style="stop-color:#ad96cc;stop-opacity:0.5933333;" + id="stop4280" /> + <stop + offset="1" + style="stop-color:#ccff00;stop-opacity:0" + id="stop4282" /> + </linearGradient> + <linearGradient + id="linearGradient4296"> + <stop + offset="0" + style="stop-color:#a02c2c;stop-opacity:1" + id="stop4298" /> + <stop + offset="1" + style="stop-color:#a02c2c;stop-opacity:0" + id="stop4300" /> + </linearGradient> + <linearGradient + id="linearGradient4371"> + <stop + offset="0" + style="stop-color:#ffffff;stop-opacity:1" + id="stop4373" /> + <stop + offset="1" + style="stop-color:#ffffff;stop-opacity:0" + id="stop4375" /> + </linearGradient> + <inkscape:perspective + id="perspective3871" + inkscape:persp3d-origin="450 : 266.66667 : 1" + inkscape:vp_z="900 : 400 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 400 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2403" /> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2390" /> + <inkscape:perspective + id="perspective10" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective19261" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + r="3" + fy="265.86209" + fx="97.48214" + cy="265.86209" + cx="97.48214" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + gradientUnits="userSpaceOnUse" + id="radialGradient14784" + xlink:href="#linearGradient2202" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2202"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206" /> + </linearGradient> + <radialGradient + r="3" + fy="265.86209" + fx="97.48214" + cy="265.86209" + cx="97.48214" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + gradientUnits="userSpaceOnUse" + id="radialGradient4338" + xlink:href="#linearGradient2202" + inkscape:collect="always" /> + <radialGradient + r="3" + fy="265.86209" + fx="97.48214" + cy="265.86209" + cx="97.48214" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + gradientUnits="userSpaceOnUse" + id="radialGradient3297" + xlink:href="#linearGradient2202" + inkscape:collect="always" /> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + gradientUnits="userSpaceOnUse" + id="linearGradient4318" + xlink:href="#linearGradient2202" + inkscape:collect="always" /> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + gradientUnits="userSpaceOnUse" + id="radialGradient4320" + xlink:href="#linearGradient2202" + inkscape:collect="always" /> + <pattern + inkscape:collect="always" + xlink:href="#Strips1_1" + id="pattern118687" + patternTransform="matrix(0,5.5342899,-7.4864232,0,521.74506,337.35904)" /> + <pattern + inkscape:stockid="Stripes 1:1" + id="Strips1_1" + patternTransform="matrix(0,5.5342899,-7.4864229,0,31.668795,357.00572)" + height="1" + width="2" + patternUnits="userSpaceOnUse" + inkscape:collect="always"> + <rect + id="rect5260" + height="2" + width="1" + y="-0.5" + x="0" + style="fill:black;stroke:none" /> + </pattern> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + gradientUnits="userSpaceOnUse" + id="linearGradient4322" + xlink:href="#linearGradient2202" + inkscape:collect="always" /> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + gradientUnits="userSpaceOnUse" + id="radialGradient4324" + xlink:href="#linearGradient2202" + inkscape:collect="always" /> + <radialGradient + r="3" + fy="265.86209" + fx="97.48214" + cy="265.86209" + cx="97.48214" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + gradientUnits="userSpaceOnUse" + id="radialGradient3277" + xlink:href="#linearGradient2202" + inkscape:collect="always" /> + <linearGradient + y2="387.43924" + x2="332.02466" + y1="369.97995" + x1="314.56537" + gradientUnits="userSpaceOnUse" + id="linearGradient4330" + xlink:href="#linearGradient4886" + inkscape:collect="always" /> + <linearGradient + id="linearGradient4886"> + <stop + id="stop4888" + offset="0.0000000" + style="stop-color:#1c97e1;stop-opacity:1.0000000;" /> + <stop + id="stop4890" + offset="1.0000000" + style="stop-color:#006798;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + y2="390.78342" + x2="311.27377" + y1="377.9527" + x1="302.73621" + gradientTransform="matrix(1.9519,0,0,1.84182,-297.02235,74.95322)" + gradientUnits="userSpaceOnUse" + id="linearGradient4332" + xlink:href="#linearGradient4554" + inkscape:collect="always" /> + <linearGradient + id="linearGradient4554"> + <stop + id="stop4556" + offset="0.0000000" + style="stop-color:#ffffff;stop-opacity:1.0000000;" /> + <stop + id="stop4558" + offset="1.0000000" + style="stop-color:#ffffff;stop-opacity:0.0000000;" /> + </linearGradient> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4262" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + id="linearGradient4068"> + <stop + id="stop4070-3" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop4490" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop4492" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop4072" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4264" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4266" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4268" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4270" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4272" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4274" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4276" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4278-2" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4280" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4282" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4284" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4286" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4288" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4290" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4292" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4294" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4296-1" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4298" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4300" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4302" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4304" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4306" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4308" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient4310" + xlink:href="#linearGradient4068" + inkscape:collect="always" /> + <radialGradient + r="24.998358" + fy="571.95715" + fx="384.69696" + cy="571.95715" + cx="384.69696" + gradientUnits="userSpaceOnUse" + id="radialGradient4312" + xlink:href="#linearGradient5178" + inkscape:collect="always" /> + <linearGradient + id="linearGradient5178"> + <stop + id="stop5180" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + id="stop5186" + offset="0.89021850" + style="stop-color:#ffffff;stop-opacity:0.49803922;" /> + <stop + id="stop5188" + offset="0.95396262" + style="stop-color:#ffffff;stop-opacity:0.24705882;" /> + <stop + id="stop5182" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /> + </linearGradient> + <radialGradient + r="24.998358" + fy="571.95715" + fx="384.69696" + cy="571.95715" + cx="384.69696" + gradientUnits="userSpaceOnUse" + id="radialGradient7730" + xlink:href="#linearGradient5178-1" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7728" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7726" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7724" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7722" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7720" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7718" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7716" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7714" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7712" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7710" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7708" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7706" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7704" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7702" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7700" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7698" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7696" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7694" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7692" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7690" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7688" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7686" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7684" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7682" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7680" + xlink:href="#linearGradient4068-8" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + id="linearGradient114975"> + <stop + style="stop-color:#3465a4;stop-opacity:1" + offset="0" + id="stop114977" /> + <stop + style="stop-color:#3465a4;stop-opacity:0;" + offset="1" + id="stop114979" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient114953"> + <stop + style="stop-color:#191a19;stop-opacity:1;" + offset="0" + id="stop114955" /> + <stop + style="stop-color:#191a19;stop-opacity:0;" + offset="1" + id="stop114957" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient114931"> + <stop + style="stop-color:#2e3436;stop-opacity:1;" + offset="0" + id="stop114933" /> + <stop + style="stop-color:#2e3436;stop-opacity:0;" + offset="1" + id="stop114935" /> + </linearGradient> + <pattern + inkscape:collect="always" + xlink:href="#Strips1_1-9" + id="pattern118687-1" + patternTransform="matrix(0,5.5342899,-7.4864232,0,521.74506,337.35904)" /> + <pattern + inkscape:stockid="Stripes 1:1" + id="Strips1_1-9" + patternTransform="matrix(0,5.5342899,-7.4864229,0,31.668795,357.00572)" + height="1" + width="2" + patternUnits="userSpaceOnUse" + inkscape:collect="always"> + <rect + id="rect5260-2" + height="2" + width="1" + y="-0.5" + x="0" + style="fill:black;stroke:none" /> + </pattern> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + gradientUnits="userSpaceOnUse" + id="radialGradient117519" + xlink:href="#linearGradient2202-9" + inkscape:collect="always" /> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="translate(-153,-176.36218)" + gradientUnits="userSpaceOnUse" + id="linearGradient117517" + xlink:href="#linearGradient2202-9" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2202-9"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-9" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-1" /> + </linearGradient> + <linearGradient + id="linearGradient4886-9"> + <stop + id="stop4888-0" + offset="0.0000000" + style="stop-color:#1c97e1;stop-opacity:1.0000000;" /> + <stop + id="stop4890-0" + offset="1.0000000" + style="stop-color:#006798;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + id="linearGradient4554-4"> + <stop + id="stop4556-5" + offset="0.0000000" + style="stop-color:#ffffff;stop-opacity:1.0000000;" /> + <stop + id="stop4558-0" + offset="1.0000000" + style="stop-color:#ffffff;stop-opacity:0.0000000;" /> + </linearGradient> + <linearGradient + id="linearGradient4738"> + <stop + id="stop4740" + offset="0.0000000" + style="stop-color:#ffffff;stop-opacity:0.72656250;" /> + <stop + id="stop4742" + offset="1.0000000" + style="stop-color:#ffffff;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + y2="387.43924" + x2="332.02466" + y1="369.97995" + x1="314.56537" + gradientUnits="userSpaceOnUse" + id="linearGradient109180" + xlink:href="#linearGradient4568" + inkscape:collect="always" /> + <linearGradient + id="linearGradient4568"> + <stop + id="stop4570" + offset="0" + style="stop-color:#e12b1c;stop-opacity:1;" /> + <stop + id="stop4572" + offset="1.0000000" + style="stop-color:#980b00;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + y2="390.49332" + x2="414.38986" + y1="376.13748" + x1="401.93405" + gradientTransform="matrix(0.999946,0,0,1.000054,-175.79715,404.73102)" + gradientUnits="userSpaceOnUse" + id="linearGradient109182" + xlink:href="#linearGradient4738" + inkscape:collect="always" /> + <linearGradient + y2="390.78342" + x2="311.27377" + y1="377.9527" + x1="302.73621" + gradientTransform="matrix(1.9519,0,0,1.84182,-382.19925,74.95322)" + gradientUnits="userSpaceOnUse" + id="linearGradient109184" + xlink:href="#linearGradient4554-4" + inkscape:collect="always" /> + <linearGradient + id="linearGradient4068-8"> + <stop + id="stop4070-0" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop4490-3" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop4492-8" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop4072-3" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient5178-1"> + <stop + id="stop5180-3" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + id="stop5186-7" + offset="0.89021850" + style="stop-color:#ffffff;stop-opacity:0.49803922;" /> + <stop + id="stop5188-7" + offset="0.95396262" + style="stop-color:#ffffff;stop-opacity:0.24705882;" /> + <stop + id="stop5182-9" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /> + </linearGradient> + <inkscape:perspective + id="perspective838" + inkscape:persp3d-origin="750.79663 : 307.92326 : 1" + inkscape:vp_z="1501.5933 : 461.88489 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 461.88489 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective19535" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + y2="683.92651" + x2="482.37622" + y1="298.85724" + x1="332.67328" + gradientUnits="userSpaceOnUse" + id="linearGradient14778" + xlink:href="#linearGradient114931-9" + inkscape:collect="always" /> + <linearGradient + id="linearGradient114931-9" + inkscape:collect="always"> + <stop + id="stop114933-4" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + id="stop114935-5" + offset="1" + style="stop-color:#2e3436;stop-opacity:0;" /> + </linearGradient> + <linearGradient + y2="399.49088" + x2="335.66339" + y1="237.31267" + x1="218.73267" + gradientTransform="matrix(1.1048951,0,0,1.1048951,67.985466,73.286385)" + gradientUnits="userSpaceOnUse" + id="linearGradient14780" + xlink:href="#linearGradient114953-9" + inkscape:collect="always" /> + <linearGradient + id="linearGradient114953-9" + inkscape:collect="always"> + <stop + id="stop114955-4" + offset="0" + style="stop-color:#191a19;stop-opacity:1;" /> + <stop + id="stop114957-2" + offset="1" + style="stop-color:#191a19;stop-opacity:0;" /> + </linearGradient> + <linearGradient + y2="166.61961" + x2="236.19801" + y1="224.83743" + x1="273.62375" + gradientTransform="matrix(0.9983345,0,0,1.0398445,80.706264,173.27788)" + gradientUnits="userSpaceOnUse" + id="linearGradient14782" + xlink:href="#linearGradient114975-9" + inkscape:collect="always" /> + <linearGradient + id="linearGradient114975-9" + inkscape:collect="always"> + <stop + id="stop114977-3" + offset="0" + style="stop-color:#3465a4;stop-opacity:1" /> + <stop + id="stop114979-1" + offset="1" + style="stop-color:#3465a4;stop-opacity:0;" /> + </linearGradient> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="translate(-153,-176.36218)" + gradientUnits="userSpaceOnUse" + id="linearGradient14847" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2202-1"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-0" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-0" /> + </linearGradient> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + gradientUnits="userSpaceOnUse" + id="radialGradient14849" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="translate(-153,-176.36218)" + gradientUnits="userSpaceOnUse" + id="linearGradient14786" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + gradientUnits="userSpaceOnUse" + id="radialGradient14788" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <linearGradient + y2="-321.47269" + x2="909.21588" + y1="-320.49728" + x1="838.01013" + gradientTransform="translate(32.697924,534.73628)" + gradientUnits="userSpaceOnUse" + id="linearGradient14790" + xlink:href="#linearGradient4886-2" + inkscape:collect="always" /> + <linearGradient + id="linearGradient4886-2"> + <stop + id="stop4888-4" + offset="0.0000000" + style="stop-color:#1c97e1;stop-opacity:1.0000000;" /> + <stop + id="stop4890-5" + offset="1.0000000" + style="stop-color:#006798;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + y2="258.76886" + x2="1333.0073" + y1="237.96057" + x1="1313.4297" + gradientTransform="matrix(0.638597,0,0,1.565933,-355.04905,402.57752)" + gradientUnits="userSpaceOnUse" + id="linearGradient14792" + xlink:href="#linearGradient4738-8" + inkscape:collect="always" /> + <linearGradient + id="linearGradient4738-8"> + <stop + id="stop4740-4" + offset="0.0000000" + style="stop-color:#ffffff;stop-opacity:0.72656250;" /> + <stop + id="stop4742-8" + offset="1.0000000" + style="stop-color:#ffffff;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + y2="400.04047" + x2="832.68341" + y1="362.58139" + x1="808.12592" + gradientTransform="translate(-354.99455,401.23652)" + gradientUnits="userSpaceOnUse" + id="linearGradient14794" + xlink:href="#linearGradient4554-2" + inkscape:collect="always" /> + <linearGradient + id="linearGradient4554-2"> + <stop + id="stop4556-9" + offset="0.0000000" + style="stop-color:#ffffff;stop-opacity:1.0000000;" /> + <stop + id="stop4558-2" + offset="1.0000000" + style="stop-color:#ffffff;stop-opacity:0.0000000;" /> + </linearGradient> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="translate(-153,-176.36218)" + gradientUnits="userSpaceOnUse" + id="linearGradient14888" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + gradientUnits="userSpaceOnUse" + id="radialGradient14890" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1" + id="linearGradient4176" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1" + id="radialGradient4178" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1" + id="linearGradient3512" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1" + id="radialGradient3514" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1" + id="linearGradient3462" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1" + id="radialGradient3464" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="translate(-153,-176.36218)" + gradientUnits="userSpaceOnUse" + id="linearGradient3434" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + gradientUnits="userSpaceOnUse" + id="radialGradient3436" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <linearGradient + y2="487.91693" + x2="-124.93314" + y1="472.52106" + x1="-137.36061" + gradientTransform="matrix(0.5806141,-0.290307,0,0.8294487,1235.5061,-245.10175)" + gradientUnits="userSpaceOnUse" + id="linearGradient3438" + xlink:href="#linearGradient414" + inkscape:collect="always" /> + <linearGradient + id="linearGradient414"> + <stop + id="stop415" + offset="0.00000000" + style="stop-color:#ffd800;stop-opacity:1.0000000;" /> + <stop + id="stop416" + offset="1.0000000" + style="stop-color:#e77900;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="translate(-153,-176.36218)" + gradientUnits="userSpaceOnUse" + id="linearGradient3492" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + gradientUnits="userSpaceOnUse" + id="radialGradient3494" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="translate(-153,-176.36218)" + gradientUnits="userSpaceOnUse" + id="linearGradient3374" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + gradientUnits="userSpaceOnUse" + id="radialGradient3376" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="translate(-153,-176.36218)" + gradientUnits="userSpaceOnUse" + id="linearGradient4208" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + gradientUnits="userSpaceOnUse" + id="radialGradient4210" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <linearGradient + y2="387.43924" + x2="332.02466" + y1="369.97995" + x1="314.56537" + gradientUnits="userSpaceOnUse" + id="linearGradient4238" + xlink:href="#linearGradient4568-1" + inkscape:collect="always" /> + <linearGradient + id="linearGradient4568-1"> + <stop + id="stop4570-6" + offset="0" + style="stop-color:#e12b1c;stop-opacity:1;" /> + <stop + id="stop4572-5" + offset="1.0000000" + style="stop-color:#980b00;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + y2="390.49332" + x2="414.38986" + y1="376.13748" + x1="401.93405" + gradientTransform="matrix(0.999946,0,0,1.000054,-175.79715,404.73102)" + gradientUnits="userSpaceOnUse" + id="linearGradient4240" + xlink:href="#linearGradient4738-8" + inkscape:collect="always" /> + <linearGradient + y2="390.78342" + x2="311.27377" + y1="377.9527" + x1="302.73621" + gradientTransform="matrix(1.9519,0,0,1.84182,-382.19925,74.95322)" + gradientUnits="userSpaceOnUse" + id="linearGradient4242-6" + xlink:href="#linearGradient4554-2" + inkscape:collect="always" /> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="translate(-153,-176.36218)" + gradientUnits="userSpaceOnUse" + id="linearGradient3332" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + gradientUnits="userSpaceOnUse" + id="radialGradient3334" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <radialGradient + r="199.63403" + fy="1736.9607" + fx="127.83543" + cy="1736.9607" + cx="127.83543" + gradientTransform="matrix(1.105165,1.228066,-0.8683345,0.7814343,1473.1011,172.79095)" + gradientUnits="userSpaceOnUse" + id="radialGradient3336" + xlink:href="#linearGradient3175" + inkscape:collect="always" /> + <linearGradient + id="linearGradient3175"> + <stop + id="stop3177" + offset="0" + style="stop-color:#41a0ee;stop-opacity:1;" /> + <stop + style="stop-color:#378be4;stop-opacity:1;" + offset="0.64377683" + id="stop3191" /> + <stop + id="stop3179" + offset="1" + style="stop-color:#2d77db;stop-opacity:1;" /> + </linearGradient> + <radialGradient + r="195.94841" + fy="1808.0941" + fx="65.333183" + cy="1808.0941" + cx="65.333183" + gradientTransform="matrix(0.5002429,1.4674024,-1.2539857,0.4274882,2324.404,828.29789)" + gradientUnits="userSpaceOnUse" + id="radialGradient3338" + xlink:href="#linearGradient3159" + inkscape:collect="always" /> + <linearGradient + id="linearGradient3159"> + <stop + id="stop3161" + offset="0" + style="stop-color:#b0dc18;stop-opacity:1;" /> + <stop + style="stop-color:#3ea20c;stop-opacity:1;" + offset="0.56223178" + id="stop3187" /> + <stop + id="stop3163" + offset="1" + style="stop-color:#006900;stop-opacity:1;" /> + </linearGradient> + <radialGradient + r="199.13403" + fy="1679.6958" + fx="13.846332" + cy="1679.6958" + cx="13.846332" + gradientTransform="matrix(0.1992334,1.195744,-1.1829727,0.1971052,1996.7215,1257.5875)" + gradientUnits="userSpaceOnUse" + id="radialGradient3340" + xlink:href="#linearGradient3195" + inkscape:collect="always" /> + <linearGradient + id="linearGradient3195"> + <stop + id="stop3199" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3201" /> + </linearGradient> + <radialGradient + r="199.13403" + fy="1673.207" + fx="5.8389463" + cy="1673.207" + cx="5.8389463" + gradientTransform="matrix(-0.1087803,1.4752039,-1.9297648,-0.1423,3255.8728,1823.5882)" + gradientUnits="userSpaceOnUse" + id="radialGradient3342" + xlink:href="#linearGradient3273" + inkscape:collect="always" /> + <linearGradient + id="linearGradient3273"> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="0" + id="stop3275" /> + <stop + id="stop3289" + offset="0.5" + style="stop-color:#ffffff;stop-opacity:0;" /> + <stop + style="stop-color:#000000;stop-opacity:0.21602787;" + offset="1" + id="stop3283" /> + <stop + id="stop3277" + offset="1" + style="stop-color:#ffffff;stop-opacity:0.59233451;" /> + </linearGradient> + <radialGradient + r="199.13403" + fy="1676.9956" + fx="-90.184074" + cy="1676.9956" + cx="-90.184074" + gradientTransform="matrix(0.466646,1.4600162,-1.3948135,0.4458064,2272.5859,931.37623)" + gradientUnits="userSpaceOnUse" + id="radialGradient3344" + xlink:href="#linearGradient3180" + inkscape:collect="always" /> + <linearGradient + id="linearGradient3180"> + <stop + id="stop3186" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3188" /> + </linearGradient> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + gradientUnits="userSpaceOnUse" + id="linearGradient4216" + xlink:href="#linearGradient2202-1" + inkscape:collect="always" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024" + id="pattern6042" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy" + id="pattern6024" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + patternUnits="userSpaceOnUse" + width="30.066020" + height="5.1805778" + id="Wavy" + inkscape:stockid="Wavy"> + <path + style="fill:black;stroke:none;" + d="M 7.597,0.061 C 5.079,-0.187 2.656,0.302 -0.01,1.788 L -0.01,3.061 C 2.773,1.431 5.173,1.052 7.472,1.280 C 9.770,1.508 11.969,2.361 14.253,3.218 C 18.820,4.931 23.804,6.676 30.066,3.061 L 30.062,1.788 C 23.622,5.497 19.246,3.770 14.691,2.061 C 12.413,1.207 10.115,0.311 7.597,0.061 z " + id="path6343" /> + </pattern> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024" + id="pattern6040" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024" + id="pattern6038" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024" + id="pattern6036" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024" + id="pattern6034" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024" + id="pattern6032" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024" + id="pattern6030" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024" + id="pattern6028" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3982" + id="linearGradient8849" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.77146086,0,0,0.77146086,473.62706,-225.83335)" + x1="199.88765" + y1="542.3349" + x2="198.9913" + y2="260.87878" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4371" + id="linearGradient8851" + gradientUnits="userSpaceOnUse" + x1="645.82532" + y1="-33.126385" + x2="639.10272" + y2="118.80616" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4082" + id="linearGradient8853" + gradientUnits="userSpaceOnUse" + x1="548.88831" + y1="802.63702" + x2="538.74719" + y2="550.37653" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4371" + id="linearGradient8855" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,169.41151)" + x1="645.82532" + y1="-33.126385" + x2="639.10272" + y2="118.80616" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4000" + id="linearGradient8857" + gradientUnits="userSpaceOnUse" + x1="228.57109" + y1="752.08252" + x2="220.50388" + y2="521.71875" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4371" + id="linearGradient8859" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-239.32737,170.30787)" + x1="645.82532" + y1="-33.126385" + x2="639.10272" + y2="118.80616" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4066" + id="linearGradient8861" + gradientUnits="userSpaceOnUse" + x1="543.81781" + y1="271.49564" + x2="547.62073" + y2="26.841015" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4371" + id="linearGradient8863" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-239.77555,2.3885373e-6)" + x1="645.82532" + y1="-33.126385" + x2="639.10272" + y2="118.80616" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3948" + id="linearGradient8976" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(145.20987,64.537718)" + x1="57.366859" + y1="0.93518841" + x2="51.988716" + y2="140.76692" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4371" + id="linearGradient8978" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-480.44746,1.3445382)" + x1="645.82532" + y1="-33.126385" + x2="639.10272" + y2="118.80616" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="linearGradient5072" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5082" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="linearGradient5096" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5106" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="linearGradient5123" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5133" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="linearGradient5149" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5159" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5178" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5191" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.17998545,0,0,0.14918688,502.1893,-24.02897)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5194" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.28503107,0,0,0.19252569,407.7236,-73.15871)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5197" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.34178919,0,0,0.23086363,396.3144,-88.95173)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5200" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.25086058,0,0,0.16944441,406.7992,-32.10751)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5203" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.26134748,0,0,0.17652771,412.2819,-25.25605)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5206" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.10450367,-0.15138107,-0.14618876,0.07058814,668.335,91.43843)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5209" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.15523199,-0.22486363,-0.21715137,0.10485269,738.2325,88.88709)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5212" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.13850655,-0.20063507,-0.19375423,0.09355524,722.8067,97.77468)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5215" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.11821823,-0.17124787,-0.16537317,0.07985124,677.6847,122.0894)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5218" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.09649358,-0.13977614,-0.1349824,0.06517688,635.5166,142.1226)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5221" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.16528031,-0.23941723,0.23120639,-0.11163907,265.1906,314.0698)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5224" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.17347291,-0.25128512,0.24266582,-0.117172,239.7257,330.3731)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5227" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.17787482,-0.25766417,0.24882648,-0.12014721,225.1178,318.3329)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5230" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.16712798,-0.24209591,0.23379201,-0.11288754,227.7161,329.1711)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5233" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.11258989,-0.16309441,0.15750073,-0.07604949,314.1776,290.1886)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5236" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.11868893,0.17192833,0.16603178,0.0801691,311.5686,16.07786)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5239" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.09470054,0.13717975,0.1324755,0.06396614,331.8395,50.2111)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5242" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.1147788,0.16626286,0.16056063,0.07752752,322.2702,30.08746)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5245" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.14121233,0.20455424,0.19753851,0.09538236,286.7172,18.15027)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5248" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.16277324,0.23578711,0.22770011,0.10994621,259.9411,6.05945)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5251" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.16116543,0.23345669,-0.22545126,-0.10885916,748.0707,211.5833)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5254" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.12673802,0.18358546,-0.17729095,-0.08560556,697.8146,196.7379)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5257" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.13824761,0.20026072,-0.19339155,-0.09337933,714.1281,221.8225)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.12141779,0.17588262,-0.16984994,-0.08201292,662.6019,207.1803)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-8" + id="linearGradient5263" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.14486352,0.20984435,-0.20264797,-0.09784905,735.5011,232.5166)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5178-1" + id="radialGradient5266" + gradientUnits="userSpaceOnUse" + cx="384.69696" + cy="571.95715" + fx="384.69696" + fy="571.95715" + r="24.998358" + gradientTransform="matrix(1.155532,0,0,1.155532,26.16756,-503.197)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="linearGradient5275" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5278" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="linearGradient5296" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5299" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5323" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5337" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5356" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="linearGradient5369" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5379" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="linearGradient5402" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5412" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4886-9" + id="linearGradient5422" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7071068,0.7071068,-0.7071068,0.7071068,-354.99474,401.23658)" + x1="838.01013" + y1="-320.49728" + x2="909.21588" + y2="-321.47269" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4738" + id="linearGradient5425" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.638597,0,0,1.565933,-355.04905,402.57752)" + x1="1313.4297" + y1="237.96057" + x2="1333.0073" + y2="258.76886" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4554-4" + id="linearGradient5428" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-354.99455,401.23652)" + x1="808.12592" + y1="362.58139" + x2="832.68341" + y2="400.04047" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient114931" + id="linearGradient5448" + gradientUnits="userSpaceOnUse" + x1="332.67328" + y1="298.85724" + x2="482.37622" + y2="683.92651" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient114953" + id="linearGradient5451" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1048951,0,0,1.1048951,67.985466,73.286385)" + x1="218.73267" + y1="237.31267" + x2="335.66339" + y2="399.49088" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient114975" + id="linearGradient5454" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.9983345,0,0,1.0398445,80.706264,173.27788)" + x1="273.62375" + y1="224.83743" + x2="236.19801" + y2="166.61961" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5471" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="linearGradient5488" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5498" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="linearGradient5512" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5522" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="linearGradient5536" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-9" + id="radialGradient5546" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <inkscape:perspective + id="perspective8000" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4082" + id="linearGradient9152" + gradientUnits="userSpaceOnUse" + x1="525.26874" + y1="1174.7026" + x2="538.74719" + y2="550.37653" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4371" + id="linearGradient9154" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,169.41151)" + x1="645.82532" + y1="-33.126385" + x2="639.10272" + y2="118.80616" /> + <inkscape:perspective + id="perspective9182" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <filter + id="filter3968-6" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="3.3747421" + id="feGaussianBlur3970-7" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4082-4" + id="linearGradient9152-7" + gradientUnits="userSpaceOnUse" + x1="525.26874" + y1="1174.7026" + x2="538.74719" + y2="550.37653" /> + <linearGradient + id="linearGradient4082-4"> + <stop + offset="0" + style="stop-color:#0000d4;stop-opacity:1" + id="stop4084-0" /> + <stop + offset="1" + style="stop-color:#0000d4;stop-opacity:0" + id="stop4086-6" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4371-7" + id="linearGradient9154-4" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,169.41151)" + x1="645.82532" + y1="-33.126385" + x2="639.10272" + y2="118.80616" /> + <linearGradient + id="linearGradient4371-7"> + <stop + offset="0" + style="stop-color:#ffffff;stop-opacity:1" + id="stop4373-4" /> + <stop + offset="1" + style="stop-color:#ffffff;stop-opacity:0" + id="stop4375-8" /> + </linearGradient> + <inkscape:perspective + id="perspective10330" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart-5" + style="overflow:visible"> + <path + id="path9321-3" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-9" + style="overflow:visible"> + <path + id="path9324-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4066" + id="linearGradient10380" + gradientUnits="userSpaceOnUse" + x1="543.81781" + y1="271.49564" + x2="547.62073" + y2="26.841015" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4371" + id="linearGradient10382" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-239.77555,2.3885373e-6)" + x1="645.82532" + y1="-33.126385" + x2="639.10272" + y2="118.80616" /> + <inkscape:perspective + id="perspective10392" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <filter + id="filter3968-6-7" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="3.3747421" + id="feGaussianBlur3970-7-0" /> + </filter> + <linearGradient + id="linearGradient4082-4-8"> + <stop + offset="0" + style="stop-color:#0000d4;stop-opacity:1" + id="stop4084-0-4" /> + <stop + offset="1" + style="stop-color:#0000d4;stop-opacity:0" + id="stop4086-6-8" /> + </linearGradient> + <linearGradient + id="linearGradient4371-7-6"> + <stop + offset="0" + style="stop-color:#ffffff;stop-opacity:1" + id="stop4373-4-8" /> + <stop + offset="1" + style="stop-color:#ffffff;stop-opacity:0" + id="stop4375-8-5" /> + </linearGradient> + <inkscape:perspective + id="perspective12102" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + inkscape:collect="always" + id="linearGradient2817-2"> + <stop + style="stop-color:#cccccc;stop-opacity:1;" + offset="0" + id="stop2819-2" /> + <stop + style="stop-color:#cccccc;stop-opacity:0;" + offset="1" + id="stop2821-2" /> + </linearGradient> + <inkscape:perspective + id="perspective13556" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient12067-5"> + <stop + id="stop12069-4" + style="stop-color:#ad96cc;stop-opacity:0.5933333;" + offset="0" /> + <stop + id="stop12071-6" + style="stop-color:#e9afaf;stop-opacity:1" + offset="1" /> + </linearGradient> + <inkscape:perspective + id="perspective15770" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <filter + id="filter3968-7" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="3.3747421" + id="feGaussianBlur3970-0" /> + </filter> + <linearGradient + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4278-9" + id="linearGradient4680-4" + y2="684.74646" + x2="458.88586" + y1="839.39856" + x1="470.29462" /> + <linearGradient + id="linearGradient4278-9"> + <stop + offset="0" + style="stop-color:#ad96cc;stop-opacity:0.5933333;" + id="stop4280-6" /> + <stop + offset="1" + style="stop-color:#ccff00;stop-opacity:0" + id="stop4282-9" /> + </linearGradient> + <linearGradient + gradientTransform="translate(-239.77555,519.439)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient4371-1" + id="linearGradient4682-5" + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" /> + <linearGradient + id="linearGradient4371-1"> + <stop + offset="0" + style="stop-color:#ffffff;stop-opacity:1" + id="stop4373-6" /> + <stop + offset="1" + style="stop-color:#ffffff;stop-opacity:0" + id="stop4375-0" /> + </linearGradient> + <linearGradient + y2="118.80616" + x2="639.10272" + y1="-33.126385" + x1="645.82532" + gradientTransform="translate(-239.77555,519.439)" + gradientUnits="userSpaceOnUse" + id="linearGradient15791" + xlink:href="#linearGradient4371-1" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4371" + id="linearGradient15859" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.88885013,0,0,0.88885013,168.13259,220.68371)" + x1="645.82532" + y1="-33.126385" + x2="639.10272" + y2="118.80616" /> + <inkscape:perspective + id="perspective16199" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient12067-57"> + <stop + id="stop12069-0" + style="stop-color:#ad96cc;stop-opacity:0.5933333;" + offset="0" /> + <stop + id="stop12071-2" + style="stop-color:#e9afaf;stop-opacity:1" + offset="1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2817" + id="linearGradient16680" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.88408881,0,0,0.66263018,-70.400599,-249.7195)" + x1="247.14285" + y1="484.50504" + x2="213.57144" + y2="350.93359" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2817" + id="linearGradient16698" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.88408881,0,0,0.66263018,279.9044,-264.59654)" + x1="247.14285" + y1="484.50504" + x2="213.57144" + y2="350.93359" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2817-2" + id="linearGradient16739" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.88408881,0,0,0.66263018,-143.75719,176.83724)" + x1="247.14285" + y1="484.50504" + x2="213.57144" + y2="350.93359" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2817" + id="linearGradient16756" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.88408881,0,0,0.66263018,300.85528,217.70027)" + x1="247.14285" + y1="484.50504" + x2="213.57144" + y2="350.93359" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2817" + id="linearGradient16765" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.88408881,0,0,0.66263018,300.85528,375.65549)" + x1="247.14285" + y1="484.50504" + x2="213.57144" + y2="350.93359" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2817" + id="linearGradient16802" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.49114184,0,0,0.6629986,189.52223,210.60917)" + x1="247.14285" + y1="484.50504" + x2="213.57144" + y2="350.93359" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2817" + id="linearGradient16991" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.88408881,0,0,0.66263018,-0.708975,60.94437)" + x1="247.14285" + y1="484.50504" + x2="213.57144" + y2="350.93359" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2817" + id="linearGradient16993" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.88408881,0,0,0.66263018,-144.505,53.31895)" + x1="247.14285" + y1="484.50504" + x2="213.57144" + y2="350.93359" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2817" + id="linearGradient17005" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.88408881,0,0,0.66263018,150.5255,-4.52637)" + x1="247.14285" + y1="484.50504" + x2="213.57144" + y2="350.93359" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2817" + id="linearGradient17433" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.88408881,0,0,0.66263018,300.85528,375.65549)" + x1="247.14285" + y1="484.50504" + x2="213.57144" + y2="350.93359" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2817" + id="linearGradient20271" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.88408881,0,0,0.66263018,300.85528,217.70027)" + x1="247.14285" + y1="484.50504" + x2="213.57144" + y2="350.93359" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4082-4-8" + id="linearGradient20722" + gradientUnits="userSpaceOnUse" + x1="525.26874" + y1="1174.7026" + x2="538.74719" + y2="550.37653" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4082-4-8" + id="linearGradient21714" + gradientUnits="userSpaceOnUse" + x1="525.26874" + y1="1174.7026" + x2="538.74719" + y2="550.37653" + gradientTransform="matrix(0.7481581,0,0,0.9471927,233.23862,163.03297)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4066" + id="linearGradient21756" + gradientUnits="userSpaceOnUse" + x1="543.81781" + y1="271.49564" + x2="547.62073" + y2="26.841015" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4371" + id="linearGradient21758" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-239.77555,2.3885373e-6)" + x1="645.82532" + y1="-33.126385" + x2="639.10272" + y2="118.80616" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4371" + id="linearGradient21761" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.6893672,0,0,1.245506,-704.28431,73.380251)" + x1="645.82532" + y1="-33.126385" + x2="639.10272" + y2="118.80616" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4066" + id="linearGradient21768" + gradientUnits="userSpaceOnUse" + x1="543.81781" + y1="271.49564" + x2="547.62073" + y2="26.841015" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4066" + id="linearGradient21771" + gradientUnits="userSpaceOnUse" + x1="543.81781" + y1="271.49564" + x2="547.62073" + y2="26.841015" + gradientTransform="matrix(1.3032807,0,0,0.96085913,-346.6082,37.566254)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4066" + id="linearGradient21785" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.3032807,0,0,0.96085913,-346.6082,37.566254)" + x1="543.81781" + y1="271.49564" + x2="547.62073" + y2="26.841015" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4371" + id="linearGradient21787" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.6893672,0,0,1.245506,-704.28431,73.380251)" + x1="645.82532" + y1="-33.126385" + x2="639.10272" + y2="118.80616" /> + <filter + inkscape:collect="always" + id="filter21805" + x="-0.15145693" + width="1.3029139" + y="-0.014428231" + height="1.0288565"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.74912805" + id="feGaussianBlur21807" /> + </filter> + <filter + inkscape:collect="always" + id="filter21809" + x="-0.16034819" + width="1.3206964" + y="-0.015197877" + height="1.0303958"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.74912805" + id="feGaussianBlur21811" /> + </filter> + <filter + inkscape:collect="always" + id="filter21813" + x="-0.18043325" + width="1.3608665" + y="-0.016119204" + height="1.0322384"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.74912805" + id="feGaussianBlur21815" /> + </filter> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.6491111" + inkscape:cx="219.31218" + inkscape:cy="664.4532" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1145" + inkscape:window-height="934" + inkscape:window-x="34" + inkscape:window-y="39" + inkscape:window-maximized="0" + showguides="true" + inkscape:guide-bbox="true" /> + <metadata + id="metadata6"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="bg"> + <rect + style="opacity:0.29761903;fill:#ffffff;fill-opacity:1;stroke:none" + id="rect3885" + width="720.9859" + height="710.20197" + x="12.324539" + y="26.343679" + rx="0" + ry="0" /> + </g> + <g + inkscape:label="Vrstva 1" + inkscape:groupmode="layer" + id="layer1" + style="display:inline"> + <flowRoot + xml:space="preserve" + id="flowRoot2829" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><flowRegion + id="flowRegion2831"><rect + id="rect2833" + width="265.71429" + height="177.85715" + x="155.71428" + y="404.50504" /></flowRegion><flowPara + id="flowPara2835" /></flowRoot> <g + id="g16794" + transform="translate(-24.010968,-5.3372475)"> + <rect + ry="11.945394" + rx="8.8490124" + y="496.79114" + x="276.52448" + height="70.088417" + width="89.808792" + id="rect2815" + style="fill:url(#linearGradient16802);fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <text + id="text2825" + y="519.22876" + x="321.64371" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + style="font-size:16px;stroke:none" + y="519.22876" + x="321.64371" + id="tspan2827" + sodipodi:role="line">AMQP</tspan></text> + <text + id="text2837" + y="544.44421" + x="321.43179" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + y="544.44421" + x="321.43179" + id="tspan2839" + sodipodi:role="line" + style="font-size:12px;stroke:none">Messaging</tspan><tspan + y="559.44421" + x="321.43179" + sodipodi:role="line" + style="font-size:12px;stroke:none" + id="tspan9256">(RabbitMQ)</tspan></text> + </g> + <g + id="g16889" + transform="translate(0.50596409,-29.325539)"> + <rect + ry="11.938755" + rx="15.928825" + y="346.96732" + x="155.90103" + height="70.049469" + width="161.66194" + id="rect8725" + style="fill:url(#linearGradient16991);fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <text + id="text8727" + y="369.38547" + x="236.94684" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + style="font-size:16px;stroke:none" + y="369.38547" + x="236.94684" + id="tspan8729" + sodipodi:role="line">cinder-api</tspan></text> + <text + id="text8731" + y="398.95828" + x="236.73492" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + y="398.95828" + x="236.73492" + id="tspan8733" + sodipodi:role="line" + style="font-size:12px;stroke:none">(Public API server)</tspan></text> + </g> + <g + id="g16932" + transform="translate(3.4001987,4.4121277)"> + <rect + style="fill:url(#linearGradient16993);fill-opacity:1;stroke:#000000;stroke-opacity:1" + id="rect8648" + width="161.66194" + height="70.049469" + x="12.105004" + y="339.34192" + rx="15.928825" + ry="11.938755" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="93.15081" + y="361.76007" + id="text8650"><tspan + sodipodi:role="line" + id="tspan8652" + x="93.15081" + y="361.76007" + style="font-size:16px;stroke:none">cinder-api</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="92.938896" + y="391.33289" + id="text8654"><tspan + style="font-size:12px;stroke:none" + sodipodi:role="line" + id="tspan8656" + x="92.938896" + y="391.33289">(Public API server)</tspan></text> + </g> + <path + sodipodi:nodetypes="csc" + id="path16669" + d="m 512.9762,107.60868 c 0,0 -19.88364,73.77843 -19.14762,133.13834 0.74982,60.47338 73.49977,177.42206 73.49977,177.42206" + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow1Lend-9)" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow1Lend-9)" + d="m 512.87991,107.60868 c -4.71799,19.64225 -24.01824,85.99818 -24.05251,138.04039 -0.0398,60.47802 68.47123,180.49754 68.47123,180.49754" + id="path11656" + sodipodi:nodetypes="csc" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Lstart-5);marker-mid:none;marker-end:url(#Arrow1Lend-9)" + d="m 512.78363,107.60868 c -2.31085,9.24341 -17.6719,77.28342 -13.89346,135.31703 3.89289,60.35262 78.01669,167.97005 78.01669,167.97005" + id="path16671" + sodipodi:nodetypes="csc" /> + <g + id="g21776" + transform="translate(6.5360776,1.0893463)"> + <path + style="opacity:0.26984127;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter3968)" + id="path8232" + transform="matrix(1.3322638,0,0,1.0031175,88.993121,34.164002)" + d="m 222.51946,60.989827 c -26.62399,0 -48.63303,8.548333 -52.22594,19.65625 -6.69546,-1.106666 -13.97205,-1.71875 -21.60756,-1.71875 -32.53011,0 -58.907419,11.042529 -58.907419,24.656233 0,0.75473 0.08653,1.48131 0.245192,2.21875 -0.08202,-3.9e-4 -0.163046,0 -0.245192,0 -21.363059,0 -38.679067,13.25729 -38.679067,29.59375 0,9.68721 6.096934,18.26069 15.508406,23.65625 -0.365836,1.92843 -0.582332,3.88678 -0.582332,5.90625 0,19.80178 18.308926,35.875 40.885792,35.875 4.46135,0 8.76139,-0.65378 12.78065,-1.8125 0.48146,16.9154 14.64139,30.5 32.05888,30.5 6.3283,0 12.22292,-1.81426 17.1941,-4.90625 4.34571,4.21099 9.62161,6.6875 15.32451,6.6875 6.04314,0 11.63741,-2.78914 16.12138,-7.46875 10.6727,7.90405 25.89396,12.84375 42.78604,12.84375 32.28736,0 58.47834,-18.06675 58.47834,-40.34375 0,-1.24407 -0.0854,-2.47215 -0.24519,-3.6875 14.00459,-4.26594 23.96754,-15.2465 23.96754,-28.125 0,-11.93982 -8.55473,-22.25444 -20.96393,-27.09375 6.63334,-4.33556 10.42066,-9.30406 10.42066,-14.59375 0,-6.50703 -5.7256,-12.51858 -15.4471,-17.46875 1.99862,-2.68052 3.1262,-5.727807 3.1262,-8.968735 0,-10.643452 -12.19574,-19.281248 -27.24699,-19.281248 -0.7631,0 -1.52079,0.05025 -2.26802,0.09375 -6.57023,-9.381491 -26.683,-16.21875 -50.47895,-16.21875 z" /> + <path + style="opacity:0.29761903;fill:#cccccc;fill-opacity:1;stroke:none" + id="path8234" + d="m 386.15762,100.47525 c -34.69853,0 -63.38249,8.21374 -68.06506,18.88689 -8.72606,-1.06335 -18.2095,-1.65148 -28.16072,-1.65148 -42.39586,0 -76.7729,10.61032 -76.7729,23.69118 0,0.72519 0.11273,1.42333 0.31955,2.13191 -0.10687,-3.8e-4 -0.2125,0 -0.31955,0 -27.84206,0 -50.40968,12.73839 -50.40968,28.43542 0,9.30805 7.94601,17.54595 20.21181,22.73033 -0.4768,1.85295 -0.75896,3.73464 -0.75896,5.67507 0,19.02672 23.86168,34.47082 53.28568,34.47082 5.81439,0 11.41855,-0.62819 16.65677,-1.74155 0.62748,16.25331 19.08184,29.3062 41.78172,29.3062 8.24755,0 15.9299,-1.74325 22.40874,-4.71422 5.66368,4.04617 12.53966,6.42575 19.97214,6.42575 7.87591,0 15.16681,-2.67997 21.01068,-7.17642 13.90953,7.59468 33.7471,12.34104 55.76222,12.34104 42.0795,0 76.21369,-17.35961 76.21369,-38.76466 0,-1.19538 -0.1113,-2.37539 -0.31955,-3.54317 18.25192,-4.09897 31.23644,-14.64974 31.23644,-27.02416 0,-11.47249 -11.14922,-21.38339 -27.32189,-26.03328 8.6451,-4.16586 13.58105,-8.93989 13.58105,-14.02254 0,-6.25234 -7.46207,-12.02859 -20.13191,-16.78501 2.60476,-2.5756 4.07431,-5.50362 4.07431,-8.6177 0,-10.22686 -15.89447,-18.52657 -35.51047,-18.52657 -0.99454,0 -1.98202,0.0483 -2.95587,0.0901 -8.56285,-9.01429 -34.77544,-15.58393 -65.78824,-15.58393 z" /> + <path + style="opacity:0.5674603;fill:#cccccc;fill-opacity:1;stroke:none" + id="path8236" + d="m 375.20571,95.674419 c -20.30087,0.52671 -44.63816,2.336897 -56.73344,15.824151 -7.77932,5.45494 -18.72353,0.64029 -27.93908,1.35121 -26.25523,-0.81492 -55.2717,0.94667 -75.95684,14.02253 -4.21055,4.5643 1.05482,10.07046 7.08659,12.10083 -16.73873,-1.44814 -35.86195,-1.23819 -49.32103,7.17641 -9.49694,5.28455 -14.29217,15.64261 -7.20877,23.30084 4.11932,5.10929 10.95197,9.01215 18.69393,10.68955 -8.95226,15.99047 9.50229,33.99299 31.36019,36.60273 13.24633,1.81305 26.98139,0.52381 39.17989,-3.6933 -7.81013,13.84905 7.80651,29.16437 26.47289,31.88851 8.47083,1.74611 16.91892,-0.29015 24.11069,-3.51314 5.7717,-1.85581 11.63161,0.40738 15.39501,3.54317 9.34531,4.03619 21.41479,0.6773 28.59072,-4.53406 11.12891,-1.19569 18.16623,7.34084 28.87581,8.10725 32.01903,7.76142 72.12284,3.44795 94.48785,-16.09439 5.80294,-6.20705 7.78549,-14.47269 3.78766,-21.55927 19.12596,0.27067 39.26768,-14.40125 31.84892,-28.7357 -6.7557,-11.19695 -23.63984,-15.93279 -39.30206,-17.23541 8.95688,-4.93264 24.29301,-6.8814 26.59508,-16.2145 -2.30454,-8.78724 -16.55309,-10.99986 -25.53616,-15.22361 -5.72916,-1.87775 3.74245,-1.22421 5.33531,-3.30295 7.99435,-5.32026 2.50692,-15.38236 -7.20878,-17.11531 -10.01676,-2.92966 -22.58718,-0.81989 -30.50491,-7.17641 C 420.53639,95.503998 396.01115,95.671823 375.20571,95.674419 z" /> + <path + style="opacity:0.28968255;fill:url(#linearGradient21785);fill-opacity:1;stroke:none" + id="path8238" + d="m 375.20571,95.674419 c -20.30087,0.52671 -44.63816,2.336897 -56.73344,15.824151 -7.77932,5.45494 -18.72353,0.64029 -27.93908,1.35121 -26.25523,-0.81492 -55.2717,0.94667 -75.95684,14.02253 -4.21055,4.5643 1.05482,10.07046 7.08659,12.10083 -16.73873,-1.44814 -35.86195,-1.23819 -49.32103,7.17641 -9.49694,5.28455 -14.29217,15.64261 -7.20877,23.30084 4.11932,5.10929 10.95197,9.01215 18.69393,10.68955 -8.95226,15.99047 9.50229,33.99299 31.36019,36.60273 13.24633,1.81305 26.98139,0.52381 39.17989,-3.6933 -7.81013,13.84905 7.80651,29.16437 26.47289,31.88851 8.47083,1.74611 16.91892,-0.29015 24.11069,-3.51314 5.7717,-1.85581 11.63161,0.40738 15.39501,3.54317 9.34531,4.03619 21.41479,0.6773 28.59072,-4.53406 11.12891,-1.19569 18.16623,7.34084 28.87581,8.10725 32.01903,7.76142 72.12284,3.44795 94.48785,-16.09439 5.80294,-6.20705 7.78549,-14.47269 3.78766,-21.55927 19.12596,0.27067 39.26768,-14.40125 31.84892,-28.7357 -6.7557,-11.19695 -23.63984,-15.93279 -39.30206,-17.23541 8.95688,-4.93264 24.29301,-6.8814 26.59508,-16.2145 -2.30454,-8.78724 -16.55309,-10.99986 -25.53616,-15.22361 -5.72916,-1.87775 3.74245,-1.22421 5.33531,-3.30295 7.99435,-5.32026 2.50692,-15.38236 -7.20878,-17.11531 -10.01676,-2.92966 -22.58718,-0.81989 -30.50491,-7.17641 C 420.53639,95.503998 396.01115,95.671823 375.20571,95.674419 z" /> + <path + d="m 378.17772,97.978994 c -20.29884,-0.746257 -42.75508,2.187766 -56.85776,13.739486 -5.35143,5.37908 -15.90284,4.75331 -23.9273,4.0565 -25.83806,-2.50785 -54.16704,-0.82004 -76.06212,10.34467 -3.02319,1.4398 -7.31508,3.44621 -4.90973,6.42214 1.79656,3.23547 8.29522,3.85778 9.60828,7.16165 -1.48543,2.80361 -7.20246,0.99682 -10.28961,1.12089 -9.38434,-0.58805 -18.99005,-0.61648 -28.14349,1.21444 40.73064,19.45562 94.57638,19.96884 138.68649,6.49998 34.66458,-6.74734 71.855,-0.63812 102.52779,12.06107 9.6536,3.23527 48.99589,10.38806 58.77125,13.41587 1.13272,-1.711 -0.7863,-3.1314 -22.15369,-7.70656 -11.65832,-2.49626 20.54303,-8.26695 26.09587,-16.99194 -2.2742,-7.93582 -14.26212,-9.64595 -22.4369,-13.19457 -3.87129,-0.62833 -5.78892,-5.95644 -0.79189,-6.30538 5.35647,-0.95769 8.77398,-5.43924 6.17674,-9.26345 -2.89922,-5.8006 -12.12725,-7.04579 -19.59383,-6.90313 -11.55222,-1.21285 -21.20146,-6.0701 -30.66484,-10.76749 -14.22984,-5.030533 -30.53876,-5.021552 -46.03526,-4.904176 z" + id="path8240" + style="opacity:0.5674603;fill:url(#linearGradient21787);fill-opacity:1;stroke:none" /> + <text + xml:space="preserve" + style="font-size:22.42008591px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;opacity:0.76448729;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="342.94745" + y="142.13666" + id="text7423"><tspan + sodipodi:role="line" + id="tspan7425" + x="342.94745" + y="142.13666">Internet</tspan></text> + </g> + <g + id="g16682" + transform="translate(10.848402,-0.63264792)"> + <rect + style="fill:url(#linearGradient16680);fill-opacity:1;stroke:#000000;stroke-opacity:1" + id="rect9008" + width="161.66194" + height="70.049469" + x="86.209404" + y="36.303455" + rx="15.928825" + ry="11.938755" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="167.2552" + y="58.721607" + id="text9010"><tspan + sodipodi:role="line" + id="tspan9012" + x="167.2552" + y="58.721607" + style="font-size:16px;stroke:none">Cloud users</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="167.04329" + y="82.132156" + id="text9014"><tspan + style="font-size:12px;stroke:none" + sodipodi:role="line" + id="tspan9016" + x="167.04329" + y="82.132156">Using tools to manage</tspan><tspan + style="font-size:12px;stroke:none" + sodipodi:role="line" + x="167.04329" + y="97.132156" + id="tspan7018">virtual guests</tspan><tspan + style="font-size:12px;stroke:none" + sodipodi:role="line" + x="167.04329" + y="112.13216" + id="tspan7020" /></text> + </g> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="209.5202" + y="266.69235" + id="text8731-0"><tspan + style="font-size:12px" + sodipodi:role="line" + id="tspan8733-5" + x="209.5202" + y="266.69235" /></text> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart);marker-mid:none;marker-end:url(#Arrow1Lend)" + d="m 198.3248,107.59465 c 0,0 0.0334,61.30615 -12.67029,115.01394 -12.4729,52.73189 -77.81473,120.32191 -77.81473,120.32191" + id="path9316" + sodipodi:nodetypes="csc" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Lend);display:inline" + d="m 198.28949,107.52657 c 0,0 -0.91296,53.23484 4.06099,93.36586 5.74342,46.33928 44.61511,113.98877 44.61511,113.98877" + id="path9316-1" + sodipodi:nodetypes="csc" /> + <g + style="opacity:0.84126988;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;display:inline" + id="g9125" + transform="translate(-25.132382,-9.2981524)"> + <g + id="g8299" + transform="matrix(0.56548207,0,0,0.56548207,-104.34915,96.818268)" + style="stroke-width:1.7684027;stroke-miterlimit:4;stroke-dasharray:none"> + <g + id="g8301" + transform="matrix(0.77146086,0,0,0.77146086,210.15747,-250.94342)" + style="stroke-width:2.29227781;stroke-miterlimit:4;stroke-dasharray:none"> + <path + style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter3968)" + id="path8303" + transform="matrix(1.0222386,0,0,1.0439798,336.02717,504.69369)" + d="m 222.51946,60.989827 c -26.62399,0 -48.63303,8.548333 -52.22594,19.65625 -6.69546,-1.106666 -13.97205,-1.71875 -21.60756,-1.71875 -32.53011,0 -58.907419,11.042529 -58.907419,24.656233 0,0.75473 0.08653,1.48131 0.245192,2.21875 -0.08202,-3.9e-4 -0.163046,0 -0.245192,0 -21.363059,0 -38.679067,13.25729 -38.679067,29.59375 0,9.68721 6.096934,18.26069 15.508406,23.65625 -0.365836,1.92843 -0.582332,3.88678 -0.582332,5.90625 0,19.80178 18.308926,35.875 40.885792,35.875 4.46135,0 8.76139,-0.65378 12.78065,-1.8125 0.48146,16.9154 14.64139,30.5 32.05888,30.5 6.3283,0 12.22292,-1.81426 17.1941,-4.90625 4.34571,4.21099 9.62161,6.6875 15.32451,6.6875 6.04314,0 11.63741,-2.78914 16.12138,-7.46875 10.6727,7.90405 25.89396,12.84375 42.78604,12.84375 32.28736,0 58.47834,-18.06675 58.47834,-40.34375 0,-1.24407 -0.0854,-2.47215 -0.24519,-3.6875 14.00459,-4.26594 23.96754,-15.2465 23.96754,-28.125 0,-11.93982 -8.55473,-22.25444 -20.96393,-27.09375 6.63334,-4.33556 10.42066,-9.30406 10.42066,-14.59375 0,-6.50703 -5.7256,-12.51858 -15.4471,-17.46875 1.99862,-2.68052 3.1262,-5.727807 3.1262,-8.968735 0,-10.643452 -12.19574,-19.281248 -27.24699,-19.281248 -0.7631,0 -1.52079,0.05025 -2.26802,0.09375 -6.57023,-9.381491 -26.683,-16.21875 -50.47895,-16.21875 z" /> + <path + style="fill:#000055;fill-opacity:1;stroke:none" + id="path8305" + d="m 564.03984,573.70614 c -26.62399,0 -48.63303,8.54834 -52.22594,19.65625 -6.69546,-1.10666 -13.97205,-1.71875 -21.60756,-1.71875 -32.53011,0 -58.90743,11.04253 -58.90743,24.65625 0,0.75473 0.0865,1.48131 0.24519,2.21875 -0.082,-3.9e-4 -0.16304,0 -0.24519,0 -21.36306,0 -38.67907,13.25729 -38.67907,29.59375 0,9.68721 6.09694,18.26069 15.50841,23.65625 -0.36584,1.92843 -0.58233,3.88678 -0.58233,5.90625 0,19.80178 18.30892,35.875 40.88579,35.875 4.46136,0 8.7614,-0.65378 12.78066,-1.8125 0.48146,16.9154 14.64139,30.5 32.05888,30.5 6.3283,0 12.22292,-1.81426 17.1941,-4.90625 4.34571,4.21099 9.62161,6.6875 15.32451,6.6875 6.04314,0 11.63741,-2.78914 16.12138,-7.46875 10.6727,7.90405 25.89396,12.84375 42.78604,12.84375 32.28736,0 58.47834,-18.06675 58.47834,-40.34375 0,-1.24407 -0.0854,-2.47215 -0.24519,-3.6875 14.00459,-4.26594 23.96754,-15.2465 23.96754,-28.125 0,-11.93982 -8.55473,-22.25444 -20.96393,-27.09375 6.63334,-4.33556 10.42066,-9.30406 10.42066,-14.59375 0,-6.50703 -5.7256,-12.51858 -15.4471,-17.46875 1.99862,-2.68052 3.1262,-5.72781 3.1262,-8.96875 0,-10.64345 -12.19574,-19.28125 -27.24699,-19.28125 -0.7631,0 -1.52079,0.0503 -2.26802,0.0937 -6.57023,-9.38149 -26.683,-16.21875 -50.47895,-16.21875 z" /> + <path + style="fill:#cccccc;fill-opacity:1;stroke:none" + id="path8307" + d="m 555.6365,568.70975 c -15.57674,0.54816 -34.25061,2.43209 -43.53125,16.46875 -5.96903,5.67715 -14.36646,0.66637 -21.4375,1.40625 -20.14549,-0.84811 -42.40968,0.98524 -58.28126,14.59375 -3.23074,4.75022 0.80936,10.48068 5.4375,12.59375 -12.84354,-1.50713 -27.51668,-1.28862 -37.84375,7.46875 -7.28696,5.49982 -10.96631,16.27981 -5.53125,24.25 3.16073,5.31742 8.40339,9.37927 14.34375,11.125 -6.86902,16.64184 7.29104,35.3777 24.0625,38.09375 10.16382,1.8869 20.70267,0.54515 30.06251,-3.84375 -5.99267,14.4132 5.98989,30.35239 20.3125,33.1875 6.49962,1.81724 12.98179,-0.30197 18.5,-3.65625 4.42859,-1.93141 8.92487,0.42397 11.8125,3.6875 7.17061,4.20061 16.43145,0.70489 21.9375,-4.71875 8.53915,-1.2444 13.93885,7.63987 22.15625,8.4375 24.56802,8.07758 55.33945,3.5884 72.5,-16.75 4.45256,-6.4599 5.97376,-15.06224 2.90625,-22.4375 14.67524,0.2817 30.12987,-14.98788 24.4375,-29.90625 -5.18361,-11.65306 -18.13872,-16.58182 -30.15625,-17.9375 6.87256,-5.13357 18.63989,-7.16172 20.40625,-16.875 -1.76826,-9.1452 -12.70109,-11.44795 -19.59375,-15.84375 -4.39595,-1.95424 2.87156,-1.27408 4.09375,-3.4375 6.13402,-5.53698 1.92355,-16.00896 -5.53125,-17.8125 -7.68581,-3.049 -17.33102,-0.85329 -23.40625,-7.46875 -12.87427,-10.80236 -31.69235,-10.6277 -47.65625,-10.625 z" /> + <path + style="fill:url(#linearGradient9152);fill-opacity:1;stroke:none" + id="path8309" + d="m 555.6365,568.70975 c -15.57674,0.54816 -34.25061,2.43209 -43.53125,16.46875 -5.96903,5.67715 -14.36646,0.66637 -21.4375,1.40625 -20.14549,-0.84811 -42.40968,0.98524 -58.28126,14.59375 -3.23074,4.75022 0.80936,10.48068 5.4375,12.59375 -12.84354,-1.50713 -27.51668,-1.28862 -37.84375,7.46875 -7.28696,5.49982 -10.96631,16.27981 -5.53125,24.25 3.16073,5.31742 8.40339,9.37927 14.34375,11.125 -6.86902,16.64184 7.29104,35.3777 24.0625,38.09375 10.16382,1.8869 20.70267,0.54515 30.06251,-3.84375 -5.99267,14.4132 5.98989,30.35239 20.3125,33.1875 6.49962,1.81724 12.98179,-0.30197 18.5,-3.65625 4.42859,-1.93141 8.92487,0.42397 11.8125,3.6875 7.17061,4.20061 16.43145,0.70489 21.9375,-4.71875 8.53915,-1.2444 13.93885,7.63987 22.15625,8.4375 24.56802,8.07758 55.33945,3.5884 72.5,-16.75 4.45256,-6.4599 5.97376,-15.06224 2.90625,-22.4375 14.67524,0.2817 30.12987,-14.98788 24.4375,-29.90625 -5.18361,-11.65306 -18.13872,-16.58182 -30.15625,-17.9375 6.87256,-5.13357 18.63989,-7.16172 20.40625,-16.875 -1.76826,-9.1452 -12.70109,-11.44795 -19.59375,-15.84375 -4.39595,-1.95424 2.87156,-1.27408 4.09375,-3.4375 6.13402,-5.53698 1.92355,-16.00896 -5.53125,-17.8125 -7.68581,-3.049 -17.33102,-0.85329 -23.40625,-7.46875 -12.87427,-10.80236 -31.69235,-10.6277 -47.65625,-10.625 z" /> + </g> + <path + style="fill:url(#linearGradient9154);fill-opacity:1;stroke:none" + id="path8311" + d="m 640.75,189.16151 c -12.01565,-0.59916 -25.30834,1.75653 -33.65625,11.03125 -3.16771,4.31879 -9.41349,3.81637 -14.16347,3.25691 -15.29452,-2.01352 -32.06351,-0.6584 -45.02403,8.30559 -1.78954,1.156 -4.33007,2.76692 -2.90625,5.15625 1.06345,2.59772 4.91025,3.09736 5.6875,5.75 -0.87928,2.25098 -4.26341,0.80033 -6.09081,0.89994 -5.55494,-0.47213 -11.24092,-0.49496 -16.65919,0.97506 24.11,15.62066 55.98332,16.03271 82.09375,5.21875 20.51927,-5.41735 42.53368,-0.51234 60.69006,9.68367 5.71433,2.59755 29.00251,8.34043 34.78891,10.77142 0.6705,-1.37374 -0.46544,-2.51416 -13.1136,-6.18749 -6.901,-2.00422 12.16019,-6.63743 15.44713,-13.6426 -1.34619,-6.37157 -8.44229,-7.74461 -13.28125,-10.59375 -2.29156,-0.50447 -3.42668,-4.78234 -0.46875,-5.0625 3.1707,-0.76892 5.19365,-4.36709 3.65625,-7.4375 -1.71616,-4.65722 -7.17858,-5.65697 -11.59833,-5.54243 -6.83819,-0.97378 -12.54994,-4.8736 -18.15167,-8.64507 -8.42318,-4.03895 -18.07704,-4.03174 -27.25,-3.9375 z" /> + </g> + <text + id="text8317" + y="225.54834" + x="244.01357" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + style="font-size:16px" + y="225.54834" + x="246.56044" + id="tspan8319" + sodipodi:role="line">Admin </tspan><tspan + style="font-size:16px" + id="tspan8321" + y="245.54834" + x="244.01357" + sodipodi:role="line">network</tspan></text> + </g> + <g + id="g16700" + transform="translate(17.38448,14.244393)"> + <rect + ry="11.938755" + rx="15.928825" + y="21.426414" + x="436.5144" + height="70.049469" + width="161.66194" + id="rect9158" + style="fill:url(#linearGradient16698);fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <text + id="text9160" + y="43.844566" + x="517.56018" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + style="font-size:16px;stroke:none" + y="43.844566" + x="517.56018" + id="tspan9162" + sodipodi:role="line">Internet EndUsers</tspan></text> + <text + id="text9164" + y="67.255119" + x="517.34827" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + y="67.255119" + x="517.34827" + id="tspan9166" + sodipodi:role="line" + style="font-size:12px;stroke:none">Using services provided</tspan><tspan + id="tspan9168" + y="82.255119" + x="517.34827" + sodipodi:role="line" + style="font-size:12px;stroke:none">by virtual guests</tspan><tspan + id="tspan9170" + y="97.255119" + x="517.34827" + sodipodi:role="line" + style="font-size:12px;stroke:none" /></text> + </g> + <g + style="opacity:0.84126988;display:inline" + id="g9125-5" + transform="translate(261.58723,-9.2669558)"> + <g + id="g8299-8" + transform="matrix(0.56548207,0,0,0.56548207,-104.34915,96.818268)"> + <g + id="g8301-2" + transform="matrix(0.77146086,0,0,0.77146086,210.15747,-250.94342)"> + <path + style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter3968-6)" + id="path8303-6" + transform="matrix(1.0222386,0,0,1.0439798,336.02717,504.69369)" + d="m 222.51946,60.989827 c -26.62399,0 -48.63303,8.548333 -52.22594,19.65625 -6.69546,-1.106666 -13.97205,-1.71875 -21.60756,-1.71875 -32.53011,0 -58.907419,11.042529 -58.907419,24.656233 0,0.75473 0.08653,1.48131 0.245192,2.21875 -0.08202,-3.9e-4 -0.163046,0 -0.245192,0 -21.363059,0 -38.679067,13.25729 -38.679067,29.59375 0,9.68721 6.096934,18.26069 15.508406,23.65625 -0.365836,1.92843 -0.582332,3.88678 -0.582332,5.90625 0,19.80178 18.308926,35.875 40.885792,35.875 4.46135,0 8.76139,-0.65378 12.78065,-1.8125 0.48146,16.9154 14.64139,30.5 32.05888,30.5 6.3283,0 12.22292,-1.81426 17.1941,-4.90625 4.34571,4.21099 9.62161,6.6875 15.32451,6.6875 6.04314,0 11.63741,-2.78914 16.12138,-7.46875 10.6727,7.90405 25.89396,12.84375 42.78604,12.84375 32.28736,0 58.47834,-18.06675 58.47834,-40.34375 0,-1.24407 -0.0854,-2.47215 -0.24519,-3.6875 14.00459,-4.26594 23.96754,-15.2465 23.96754,-28.125 0,-11.93982 -8.55473,-22.25444 -20.96393,-27.09375 6.63334,-4.33556 10.42066,-9.30406 10.42066,-14.59375 0,-6.50703 -5.7256,-12.51858 -15.4471,-17.46875 1.99862,-2.68052 3.1262,-5.727807 3.1262,-8.968735 0,-10.643452 -12.19574,-19.281248 -27.24699,-19.281248 -0.7631,0 -1.52079,0.05025 -2.26802,0.09375 -6.57023,-9.381491 -26.683,-16.21875 -50.47895,-16.21875 z" /> + <path + style="fill:#000055;fill-opacity:1;stroke:none" + id="path8305-0" + d="m 564.03984,573.70614 c -26.62399,0 -48.63303,8.54834 -52.22594,19.65625 -6.69546,-1.10666 -13.97205,-1.71875 -21.60756,-1.71875 -32.53011,0 -58.90743,11.04253 -58.90743,24.65625 0,0.75473 0.0865,1.48131 0.24519,2.21875 -0.082,-3.9e-4 -0.16304,0 -0.24519,0 -21.36306,0 -38.67907,13.25729 -38.67907,29.59375 0,9.68721 6.09694,18.26069 15.50841,23.65625 -0.36584,1.92843 -0.58233,3.88678 -0.58233,5.90625 0,19.80178 18.30892,35.875 40.88579,35.875 4.46136,0 8.7614,-0.65378 12.78066,-1.8125 0.48146,16.9154 14.64139,30.5 32.05888,30.5 6.3283,0 12.22292,-1.81426 17.1941,-4.90625 4.34571,4.21099 9.62161,6.6875 15.32451,6.6875 6.04314,0 11.63741,-2.78914 16.12138,-7.46875 10.6727,7.90405 25.89396,12.84375 42.78604,12.84375 32.28736,0 58.47834,-18.06675 58.47834,-40.34375 0,-1.24407 -0.0854,-2.47215 -0.24519,-3.6875 14.00459,-4.26594 23.96754,-15.2465 23.96754,-28.125 0,-11.93982 -8.55473,-22.25444 -20.96393,-27.09375 6.63334,-4.33556 10.42066,-9.30406 10.42066,-14.59375 0,-6.50703 -5.7256,-12.51858 -15.4471,-17.46875 1.99862,-2.68052 3.1262,-5.72781 3.1262,-8.96875 0,-10.64345 -12.19574,-19.28125 -27.24699,-19.28125 -0.7631,0 -1.52079,0.0503 -2.26802,0.0937 -6.57023,-9.38149 -26.683,-16.21875 -50.47895,-16.21875 z" /> + <path + style="fill:#cccccc;fill-opacity:1;stroke:none" + id="path8307-6" + d="m 555.6365,568.70975 c -15.57674,0.54816 -34.25061,2.43209 -43.53125,16.46875 -5.96903,5.67715 -14.36646,0.66637 -21.4375,1.40625 -20.14549,-0.84811 -42.40968,0.98524 -58.28126,14.59375 -3.23074,4.75022 0.80936,10.48068 5.4375,12.59375 -12.84354,-1.50713 -27.51668,-1.28862 -37.84375,7.46875 -7.28696,5.49982 -10.96631,16.27981 -5.53125,24.25 3.16073,5.31742 8.40339,9.37927 14.34375,11.125 -6.86902,16.64184 7.29104,35.3777 24.0625,38.09375 10.16382,1.8869 20.70267,0.54515 30.06251,-3.84375 -5.99267,14.4132 5.98989,30.35239 20.3125,33.1875 6.49962,1.81724 12.98179,-0.30197 18.5,-3.65625 4.42859,-1.93141 8.92487,0.42397 11.8125,3.6875 7.17061,4.20061 16.43145,0.70489 21.9375,-4.71875 8.53915,-1.2444 13.93885,7.63987 22.15625,8.4375 24.56802,8.07758 55.33945,3.5884 72.5,-16.75 4.45256,-6.4599 5.97376,-15.06224 2.90625,-22.4375 14.67524,0.2817 30.12987,-14.98788 24.4375,-29.90625 -5.18361,-11.65306 -18.13872,-16.58182 -30.15625,-17.9375 6.87256,-5.13357 18.63989,-7.16172 20.40625,-16.875 -1.76826,-9.1452 -12.70109,-11.44795 -19.59375,-15.84375 -4.39595,-1.95424 2.87156,-1.27408 4.09375,-3.4375 6.13402,-5.53698 1.92355,-16.00896 -5.53125,-17.8125 -7.68581,-3.049 -17.33102,-0.85329 -23.40625,-7.46875 -12.87427,-10.80236 -31.69235,-10.6277 -47.65625,-10.625 z" /> + <path + style="fill:url(#linearGradient9152-7);fill-opacity:1;stroke:none" + id="path8309-6" + d="m 555.6365,568.70975 c -15.57674,0.54816 -34.25061,2.43209 -43.53125,16.46875 -5.96903,5.67715 -14.36646,0.66637 -21.4375,1.40625 -20.14549,-0.84811 -42.40968,0.98524 -58.28126,14.59375 -3.23074,4.75022 0.80936,10.48068 5.4375,12.59375 -12.84354,-1.50713 -27.51668,-1.28862 -37.84375,7.46875 -7.28696,5.49982 -10.96631,16.27981 -5.53125,24.25 3.16073,5.31742 8.40339,9.37927 14.34375,11.125 -6.86902,16.64184 7.29104,35.3777 24.0625,38.09375 10.16382,1.8869 20.70267,0.54515 30.06251,-3.84375 -5.99267,14.4132 5.98989,30.35239 20.3125,33.1875 6.49962,1.81724 12.98179,-0.30197 18.5,-3.65625 4.42859,-1.93141 8.92487,0.42397 11.8125,3.6875 7.17061,4.20061 16.43145,0.70489 21.9375,-4.71875 8.53915,-1.2444 13.93885,7.63987 22.15625,8.4375 24.56802,8.07758 55.33945,3.5884 72.5,-16.75 4.45256,-6.4599 5.97376,-15.06224 2.90625,-22.4375 14.67524,0.2817 30.12987,-14.98788 24.4375,-29.90625 -5.18361,-11.65306 -18.13872,-16.58182 -30.15625,-17.9375 6.87256,-5.13357 18.63989,-7.16172 20.40625,-16.875 -1.76826,-9.1452 -12.70109,-11.44795 -19.59375,-15.84375 -4.39595,-1.95424 2.87156,-1.27408 4.09375,-3.4375 6.13402,-5.53698 1.92355,-16.00896 -5.53125,-17.8125 -7.68581,-3.049 -17.33102,-0.85329 -23.40625,-7.46875 -12.87427,-10.80236 -31.69235,-10.6277 -47.65625,-10.625 z" /> + </g> + <path + style="fill:url(#linearGradient9154-4);fill-opacity:1;stroke:none" + id="path8311-4" + d="m 640.75,189.16151 c -12.01565,-0.59916 -25.30834,1.75653 -33.65625,11.03125 -3.16771,4.31879 -9.41349,3.81637 -14.16347,3.25691 -15.29452,-2.01352 -32.06351,-0.6584 -45.02403,8.30559 -1.78954,1.156 -4.33007,2.76692 -2.90625,5.15625 1.06345,2.59772 4.91025,3.09736 5.6875,5.75 -0.87928,2.25098 -4.26341,0.80033 -6.09081,0.89994 -5.55494,-0.47213 -11.24092,-0.49496 -16.65919,0.97506 24.11,15.62066 55.98332,16.03271 82.09375,5.21875 20.51927,-5.41735 42.53368,-0.51234 60.69006,9.68367 5.71433,2.59755 29.00251,8.34043 34.78891,10.77142 0.6705,-1.37374 -0.46544,-2.51416 -13.1136,-6.18749 -6.901,-2.00422 12.16019,-6.63743 15.44713,-13.6426 -1.34619,-6.37157 -8.44229,-7.74461 -13.28125,-10.59375 -2.29156,-0.50447 -3.42668,-4.78234 -0.46875,-5.0625 3.1707,-0.76892 5.19365,-4.36709 3.65625,-7.4375 -1.71616,-4.65722 -7.17858,-5.65697 -11.59833,-5.54243 -6.83819,-0.97378 -12.54994,-4.8736 -18.15167,-8.64507 -8.42318,-4.03895 -18.07704,-4.03174 -27.25,-3.9375 z" /> + </g> + <text + id="text8317-6" + y="225.54834" + x="244.01357" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + style="font-size:16px" + y="225.54834" + x="244.01357" + id="tspan8319-2" + sodipodi:role="line">Public</tspan><tspan + style="font-size:16px" + id="tspan8321-8" + y="245.54834" + x="244.01357" + sodipodi:role="line">network</tspan></text> + </g> + <text + id="text16517" + y="628.02972" + x="646.58423" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + style="font-size:16px;stroke:#000000;stroke-opacity:1" + y="628.02972" + x="646.58423" + id="tspan16519" + sodipodi:role="line" /></text> + <text + id="text16521" + y="651.44031" + x="646.37231" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + id="tspan16523" + y="651.44031" + x="646.37231" + sodipodi:role="line" + style="font-size:12px;stroke:#000000;stroke-opacity:1" /><tspan + id="tspan16525" + y="666.44031" + x="646.37231" + sodipodi:role="line" + style="font-size:12px;stroke:#000000;stroke-opacity:1" /></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="637.71069" + y="634.78632" + id="text16531"><tspan + sodipodi:role="line" + id="tspan16533" + x="637.71069" + y="634.78632" + style="font-size:16px;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="637.49878" + y="658.19684" + id="text16535"><tspan + style="font-size:12px;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:role="line" + x="637.49878" + y="658.19684" + id="tspan16537" /><tspan + style="font-size:12px;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:role="line" + x="637.49878" + y="673.19684" + id="tspan16539" /></text> + <rect + ry="11.938755" + rx="15.928825" + y="605.61157" + x="565.53839" + height="70.049469" + width="161.66194" + id="rect16515" + style="fill:#536c5d;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + style="fill:#6f917c;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect16529" + width="161.66194" + height="70.049469" + x="556.66486" + y="612.36816" + rx="15.928825" + ry="11.938755" /> + <rect + style="fill:#93ac9d;fill-opacity:1;stroke:#000000;stroke-opacity:1" + id="rect16543" + width="161.66194" + height="70.049469" + x="547.79132" + y="619.12476" + rx="15.928825" + ry="11.938755" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="628.83716" + y="641.54291" + id="text16545"><tspan + sodipodi:role="line" + id="tspan16547" + x="628.83716" + y="641.54291" + style="font-size:16px;stroke:none">Disk Images</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="628.62524" + y="664.95349" + id="text16549"><tspan + id="tspan16561" + style="font-size:12px;stroke:none" + sodipodi:role="line" + x="628.62524" + y="664.95349">for Virtual Guests</tspan><tspan + id="tspan20663" + style="font-size:12px;stroke:none" + sodipodi:role="line" + x="628.62524" + y="679.95349" /><tspan + style="font-size:12px;stroke:none" + sodipodi:role="line" + x="628.62524" + y="694.95349" + id="tspan16553" /></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="646.58423" + y="432.92889" + id="text15923"><tspan + sodipodi:role="line" + id="tspan15925" + x="646.58423" + y="432.92889" + style="font-size:16px;stroke:#000000;stroke-opacity:1" /></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="646.37231" + y="456.33945" + id="text15927"><tspan + style="font-size:12px;stroke:#000000;stroke-opacity:1" + sodipodi:role="line" + x="646.37231" + y="456.33945" + id="tspan15929" /><tspan + style="font-size:12px;stroke:#000000;stroke-opacity:1" + sodipodi:role="line" + x="646.37231" + y="471.33945" + id="tspan15931" /></text> + <text + id="text15988" + y="439.68546" + x="637.71069" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + style="font-size:16px;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + y="439.68546" + x="637.71069" + id="tspan15990" + sodipodi:role="line" /></text> + <text + id="text15992" + y="463.09601" + x="637.49878" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + id="tspan15994" + y="463.09601" + x="637.49878" + sodipodi:role="line" + style="font-size:12px;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><tspan + id="tspan15996" + y="478.09601" + x="637.49878" + sodipodi:role="line" + style="font-size:12px;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></text> + <g + id="g3865"> + <rect + ry="11.938755" + rx="15.928825" + y="410.51074" + x="565.53839" + height="70.049469" + width="161.66194" + id="rect15921" + style="fill:#806600;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + style="fill:#aa8800;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect15986" + width="161.66194" + height="70.049469" + x="556.66486" + y="417.2673" + rx="15.928825" + ry="11.938755" /> + <rect + style="fill:#d4aa00;fill-opacity:1;stroke:#000000;stroke-opacity:1" + id="rect10492" + width="161.66194" + height="70.049469" + x="547.79132" + y="424.02393" + rx="15.928825" + ry="11.938755" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="628.83716" + y="446.44208" + id="text10494"><tspan + sodipodi:role="line" + id="tspan10496" + x="628.83716" + y="446.44208" + style="font-size:16px;stroke:none">Virtual Guests</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="628.62524" + y="469.85263" + id="text10498"><tspan + style="font-size:12px;stroke:none" + sodipodi:role="line" + x="628.62524" + y="469.85263" + id="tspan10502">Runing in the cloud</tspan><tspan + style="font-size:12px;stroke:none" + sodipodi:role="line" + x="628.62524" + y="484.85263" + id="tspan10504" /></text> + </g> + <g + id="g16785" + transform="translate(-50.816079,-31.823295)"> + <rect + ry="11.938755" + rx="15.928825" + y="503.72324" + x="457.46527" + height="70.049469" + width="161.66194" + id="rect9298" + style="fill:url(#linearGradient16756);fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <text + id="text9300" + y="526.14136" + x="538.51111" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + style="font-size:16px;stroke:none" + y="526.14136" + x="538.51111" + id="tspan9302" + sodipodi:role="line">cinder-compute</tspan></text> + <text + id="text9304" + y="549.55194" + x="538.29919" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + id="tspan9308" + y="549.55194" + x="540.20935" + sodipodi:role="line" + style="font-size:12px;stroke:none">(uses libvirt or XenAPI </tspan><tspan + y="564.55194" + x="540.20935" + sodipodi:role="line" + style="font-size:12px;stroke:none" + id="tspan12073">to manage guests) </tspan><tspan + id="tspan9310" + y="579.55194" + x="538.29919" + sodipodi:role="line" + style="font-size:12px;stroke:none" /></text> + </g> + <g + id="g16939" + transform="translate(2.3108524,4.038323)"> + <rect + ry="11.938755" + rx="15.928825" + y="462.8602" + x="12.852811" + height="70.049469" + width="161.66194" + id="rect9298-7" + style="fill:url(#linearGradient16739);fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <text + id="text9300-9" + y="485.27835" + x="93.898621" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + style="font-size:16px;stroke:none" + y="485.27835" + x="93.898621" + id="tspan9302-8" + sodipodi:role="line">User authorisation</tspan></text> + <text + id="text9304-5" + y="508.6889" + x="93.686707" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + y="508.6889" + x="95.596863" + sodipodi:role="line" + style="font-size:12px;stroke:none" + id="tspan12159">(SQL, LDAP or </tspan><tspan + y="523.6889" + x="95.596863" + sodipodi:role="line" + style="font-size:12px;stroke:none" + id="tspan12163">fake LDAP using ReDIS) </tspan><tspan + id="tspan9310-8" + y="538.6889" + x="93.686707" + sodipodi:role="line" + style="font-size:12px;stroke:none" /></text> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Lstart-5);marker-end:url(#Arrow1Lend-9)" + d="m 96.239033,413.80352 -0.147258,53.095" + id="path17007" + inkscape:connector-type="polyline" + inkscape:connection-start="#g16932" + inkscape:connection-end="#g16939" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Lstart-5);marker-end:url(#Arrow1Lend-9)" + d="m 204.09367,387.69125 -74.95474,79.20727" + id="path17009" + inkscape:connector-type="polyline" + inkscape:connection-start="#g16889" + inkscape:connection-end="#g16939" /> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#Arrow1Lstart-5);marker-end:url(#Arrow1Lend-9)" + d="m 249.36342,387.69125 35.92229,103.76264" + id="path17011" + inkscape:connector-type="polyline" + inkscape:connection-start="#g16889" + inkscape:connection-end="#g16794" /> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#Arrow1Lstart-5);marker-end:url(#Arrow1Lend-9)" + d="M 254.88157,495.24992 144.01331,413.80352" + id="path17013" + inkscape:connector-type="polyline" + inkscape:connection-start="#g16794" + inkscape:connection-end="#g16932" /> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#Arrow1Lstart-5);marker-end:url(#Arrow1Lend-9)" + d="m 385.14058,375.96289 -67.30106,115.491" + id="path17015" + inkscape:connector-type="polyline" + inkscape:connection-end="#g16794" + inkscape:connection-start="#g16995" /> + <g + id="g16995" + transform="translate(17.584375,24.41684)"> + <g + id="g16982"> + <rect + ry="11.938755" + rx="15.928825" + y="281.49658" + x="307.1355" + height="70.049469" + width="161.66194" + id="rect15356" + style="fill:url(#linearGradient17005);fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <text + id="text15358" + y="303.91473" + x="388.1813" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + style="font-size:16px;stroke:none" + y="303.91473" + x="388.1813" + id="tspan15360" + sodipodi:role="line">cinder-network</tspan></text> + <text + id="text15362" + y="327.32529" + x="387.96939" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + id="tspan15374" + y="327.32529" + x="389.87955" + sodipodi:role="line" + style="font-size:12px;stroke:none">manages cloud networks, </tspan><tspan + y="342.32529" + x="387.96939" + sodipodi:role="line" + style="font-size:12px;stroke:none" + id="tspan21711">vlans and bridges</tspan><tspan + id="tspan15368" + y="357.32529" + x="387.96939" + sodipodi:role="line" + style="font-size:12px;stroke:none" /></text> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#Arrow1Lstart-5);marker-end:url(#Arrow1Lend-9)" + d="m 406.64919,515.24899 -64.32689,6.62466" + id="path17017" + inkscape:connector-type="polyline" + inkscape:connection-start="#g16785" + inkscape:connection-end="#g16794" /> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#Arrow1Lstart-5);marker-end:url(#Arrow1Lend-9)" + d="M 413.14924,577.4452 342.3223,546.26585" + id="path17023" + inkscape:connector-type="polyline" + inkscape:connection-start="#g16948" + inkscape:connection-end="#g16794" /> + <g + id="g16948" + transform="translate(-50.816078,-86.536142)"> + <rect + style="fill:url(#linearGradient16765);fill-opacity:1;stroke:#000000;stroke-opacity:1" + id="rect13528" + width="161.66194" + height="70.049469" + x="457.46527" + y="661.67847" + rx="15.928825" + ry="11.938755" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="538.51111" + y="684.09662" + id="text13530"><tspan + sodipodi:role="line" + id="tspan13532" + x="538.51111" + y="684.09662" + style="font-size:16px;stroke:none">cinder-volume</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="538.29919" + y="707.50714" + id="text13534"><tspan + style="font-size:12px;stroke:none" + sodipodi:role="line" + x="538.29919" + y="707.50714" + id="tspan21791">disk images for v. guests</tspan><tspan + style="font-size:12px;stroke:none" + sodipodi:role="line" + x="538.29919" + y="722.50714" + id="tspan21795">(filesystem or AoE)</tspan><tspan + style="font-size:12px;stroke:none" + sodipodi:role="line" + x="538.29919" + y="737.50714" + id="tspan13540" /></text> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;filter:url(#filter21809)" + d="m 633.9107,494.12013 -11.21252,118.2999" + id="path17029" + inkscape:connector-type="polyline" + sodipodi:nodetypes="cc" /> + <path + inkscape:connector-type="polyline" + id="path17033" + d="m 626.13785,494.39245 -9.96439,111.53822" + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;filter:url(#filter21813)" /> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;filter:url(#filter21805)" + d="M 641.38869,494.07338 629.51794,618.68376" + id="path17035" + inkscape:connector-type="polyline" + sodipodi:nodetypes="cc" /> + <g + transform="translate(-171.63342,-2.2561093)" + id="g17417"> + <rect + ry="11.938755" + rx="15.928825" + y="661.67847" + x="457.46527" + height="70.049469" + width="161.66194" + id="rect17419" + style="fill:url(#linearGradient17433);fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <text + id="text17421" + y="684.09662" + x="538.51111" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + style="font-size:16px;stroke:none" + y="684.09662" + x="538.51111" + id="tspan17423" + sodipodi:role="line">cinder-objectstore</tspan></text> + <text + id="text17425" + y="707.50714" + x="538.29919" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + y="707.50714" + x="538.29919" + sodipodi:role="line" + style="font-size:12px;stroke:none" + id="tspan17441">(implements S3-like api</tspan><tspan + y="722.50714" + x="538.29919" + sodipodi:role="line" + style="font-size:12px;stroke:none" + id="tspan17445">Using Files or (later) Swift</tspan><tspan + id="tspan17431" + y="737.50714" + x="538.29919" + sodipodi:role="line" + style="font-size:12px;stroke:none" /></text> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#Arrow1Lstart-5);marker-end:url(#Arrow1Lend-9)" + d="M 352.22222,659.42236 311.86654,561.54231" + id="path17447" + inkscape:connector-type="polyline" + inkscape:connection-start="#g17417" + inkscape:connection-end="#g16794" /> + <g + transform="translate(-393.56046,89.539858)" + id="g20255"> + <rect + style="fill:url(#linearGradient20271);fill-opacity:1;stroke:#000000;stroke-opacity:1" + id="rect20257" + width="161.66194" + height="70.049469" + x="457.46527" + y="503.72324" + rx="15.928825" + ry="11.938755" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="538.51111" + y="526.14136" + id="text20259"><tspan + sodipodi:role="line" + id="tspan20261" + x="538.51111" + y="526.14136" + style="font-size:16px;stroke:none">cinder-scheduler</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="538.29919" + y="549.55194" + id="text20263"><tspan + id="tspan20267" + style="font-size:12px;stroke:none" + sodipodi:role="line" + x="540.20935" + y="549.55194">Plans where to </tspan><tspan + style="font-size:12px;stroke:none" + sodipodi:role="line" + x="538.29919" + y="564.55194" + id="tspan20275">place new guests</tspan><tspan + style="font-size:12px;stroke:none" + sodipodi:role="line" + x="538.29919" + y="579.55194" + id="tspan20269" /></text> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#Arrow1Lstart-5);marker-end:url(#Arrow1Lend-9)" + d="m 197.27203,593.26309 56.4451,-37.63067" + id="path20277" + inkscape:connector-type="polyline" + inkscape:connection-start="#g20255" + inkscape:connection-end="#g16794" /> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 4;stroke-dashoffset:0;marker-start:url(#Arrow1Lstart-5);marker-end:url(#Arrow1Lend-9)" + d="m 477.13366,261.49678 -45.75253,42.48451" + id="path21306" + sodipodi:nodetypes="cc" /> + </g> +</svg> diff --git a/doc/source/images/NOVA_ARCH_200dpi.png b/doc/source/images/NOVA_ARCH_200dpi.png new file mode 100644 index 0000000000000000000000000000000000000000..9dde9aa92758650edccd1e39795b8a0ed0ac7de2 GIT binary patch literal 439024 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 RT%quzzWab`it-7M{{!%5L0SL+ literal 0 HcmV?d00001 diff --git a/doc/source/images/NOVA_ARCH_66dpi.png b/doc/source/images/NOVA_ARCH_66dpi.png new file mode 100644 index 0000000000000000000000000000000000000000..1ca7f3d3b1c0f6fbeee4c663efb464476da4c7b9 GIT binary patch literal 110890 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 CeLo8T literal 0 HcmV?d00001 diff --git a/doc/source/images/NOVA_clouds_A_B.png b/doc/source/images/NOVA_clouds_A_B.png new file mode 100644 index 0000000000000000000000000000000000000000..439967cb1d34b1bb4e0d8f5d6d4138e8b1e81f8b GIT binary patch literal 77007 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%0A13LixRWvL%9)5 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 btUomUdz6z454#;CZeLUFnCep%t1JHtnL-5! literal 0 HcmV?d00001 diff --git a/doc/source/images/NOVA_clouds_A_B.svg b/doc/source/images/NOVA_clouds_A_B.svg new file mode 100644 index 000000000..6e1c50456 --- /dev/null +++ b/doc/source/images/NOVA_clouds_A_B.svg @@ -0,0 +1,16342 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448" + height="1052.3622" + id="svg19253" + sodipodi:version="0.32" + inkscape:version="0.47 r22583" + version="1.0" + sodipodi:docname="CINDER_clouds_A_B.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/var/www/alekiba/cinder/CINDER_clouds_A_B.png" + inkscape:export-xdpi="100" + inkscape:export-ydpi="100"> + <defs + id="defs19255"> + <linearGradient + id="linearGradient5178"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop5180" /> + <stop + style="stop-color:#ffffff;stop-opacity:0.49803922;" + offset="0.89021850" + id="stop5186" /> + <stop + style="stop-color:#ffffff;stop-opacity:0.24705882;" + offset="0.95396262" + id="stop5188" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop5182" /> + </linearGradient> + <linearGradient + id="linearGradient4068"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop4070" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop4490" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop4492" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop4072" /> + </linearGradient> + <linearGradient + id="linearGradient4554"> + <stop + style="stop-color:#ffffff;stop-opacity:1.0000000;" + offset="0.0000000" + id="stop4556" /> + <stop + style="stop-color:#ffffff;stop-opacity:0.0000000;" + offset="1.0000000" + id="stop4558" /> + </linearGradient> + <linearGradient + id="linearGradient4886"> + <stop + style="stop-color:#1c97e1;stop-opacity:1.0000000;" + offset="0.0000000" + id="stop4888" /> + <stop + style="stop-color:#006798;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop4890" /> + </linearGradient> + <linearGradient + id="linearGradient2202"> + <stop + id="stop2204" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective19261" /> + <inkscape:perspective + id="perspective19535" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + y2="683.92651" + x2="482.37622" + y1="298.85724" + x1="332.67328" + gradientUnits="userSpaceOnUse" + id="linearGradient14778" + xlink:href="#linearGradient114931" + inkscape:collect="always" /> + <linearGradient + id="linearGradient114931" + inkscape:collect="always"> + <stop + id="stop114933" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + id="stop114935" + offset="1" + style="stop-color:#2e3436;stop-opacity:0;" /> + </linearGradient> + <linearGradient + y2="399.49088" + x2="335.66339" + y1="237.31267" + x1="218.73267" + gradientTransform="matrix(1.1048951,0,0,1.1048951,67.985466,73.286385)" + gradientUnits="userSpaceOnUse" + id="linearGradient14780" + xlink:href="#linearGradient114953" + inkscape:collect="always" /> + <linearGradient + id="linearGradient114953" + inkscape:collect="always"> + <stop + id="stop114955" + offset="0" + style="stop-color:#191a19;stop-opacity:1;" /> + <stop + id="stop114957" + offset="1" + style="stop-color:#191a19;stop-opacity:0;" /> + </linearGradient> + <linearGradient + y2="166.61961" + x2="236.19801" + y1="224.83743" + x1="273.62375" + gradientTransform="matrix(0.9983345,0,0,1.0398445,80.706264,173.27788)" + gradientUnits="userSpaceOnUse" + id="linearGradient14782" + xlink:href="#linearGradient114975" + inkscape:collect="always" /> + <linearGradient + id="linearGradient114975" + inkscape:collect="always"> + <stop + id="stop114977" + offset="0" + style="stop-color:#3465a4;stop-opacity:1" /> + <stop + id="stop114979" + offset="1" + style="stop-color:#3465a4;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2202-1"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5" /> + </linearGradient> + <linearGradient + id="linearGradient4886-1"> + <stop + id="stop4888-5" + offset="0.0000000" + style="stop-color:#1c97e1;stop-opacity:1.0000000;" /> + <stop + id="stop4890-4" + offset="1.0000000" + style="stop-color:#006798;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + id="linearGradient4738"> + <stop + id="stop4740" + offset="0.0000000" + style="stop-color:#ffffff;stop-opacity:0.72656250;" /> + <stop + id="stop4742" + offset="1.0000000" + style="stop-color:#ffffff;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + id="linearGradient4554-3"> + <stop + id="stop4556-9" + offset="0.0000000" + style="stop-color:#ffffff;stop-opacity:1.0000000;" /> + <stop + id="stop4558-4" + offset="1.0000000" + style="stop-color:#ffffff;stop-opacity:0.0000000;" /> + </linearGradient> + <linearGradient + id="linearGradient414"> + <stop + id="stop415" + offset="0.00000000" + style="stop-color:#ffd800;stop-opacity:1.0000000;" /> + <stop + id="stop416" + offset="1.0000000" + style="stop-color:#e77900;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + id="linearGradient4568"> + <stop + id="stop4570" + offset="0" + style="stop-color:#e12b1c;stop-opacity:1;" /> + <stop + id="stop4572" + offset="1.0000000" + style="stop-color:#980b00;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + id="linearGradient3175"> + <stop + id="stop3177" + offset="0" + style="stop-color:#41a0ee;stop-opacity:1;" /> + <stop + style="stop-color:#378be4;stop-opacity:1;" + offset="0.64377683" + id="stop3191" /> + <stop + id="stop3179" + offset="1" + style="stop-color:#2d77db;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3159"> + <stop + id="stop3161" + offset="0" + style="stop-color:#b0dc18;stop-opacity:1;" /> + <stop + style="stop-color:#3ea20c;stop-opacity:1;" + offset="0.56223178" + id="stop3187" /> + <stop + id="stop3163" + offset="1" + style="stop-color:#006900;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3195"> + <stop + id="stop3199" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3201" /> + </linearGradient> + <linearGradient + id="linearGradient3273"> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="0" + id="stop3275" /> + <stop + id="stop3289" + offset="0.5" + style="stop-color:#ffffff;stop-opacity:0;" /> + <stop + style="stop-color:#000000;stop-opacity:0.21602787;" + offset="1" + id="stop3283" /> + <stop + id="stop3277" + offset="1" + style="stop-color:#ffffff;stop-opacity:0.59233451;" /> + </linearGradient> + <linearGradient + id="linearGradient3180"> + <stop + id="stop3186" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3188" /> + </linearGradient> + <radialGradient + r="24.998358" + fy="571.95715" + fx="384.69696" + cy="571.95715" + cx="384.69696" + gradientUnits="userSpaceOnUse" + id="radialGradient7730" + xlink:href="#linearGradient5178-3" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7728" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7726" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7724" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7722" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7720" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7718" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7716" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7714" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7712" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7710" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7708" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7706" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7704" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7702" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7700" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7698" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7696" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7694" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7692" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7690" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7688" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7686" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7684" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7682" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <linearGradient + y2="1061.9722" + x2="191.89183" + y1="993.39124" + x1="145.52031" + spreadMethod="reflect" + gradientTransform="scale(1.003627,0.996386)" + gradientUnits="userSpaceOnUse" + id="linearGradient7680" + xlink:href="#linearGradient4068-4" + inkscape:collect="always" /> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + gradientUnits="userSpaceOnUse" + id="radialGradient117519" + xlink:href="#linearGradient2202-3" + inkscape:collect="always" /> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="translate(-153,-176.36218)" + gradientUnits="userSpaceOnUse" + id="linearGradient117517" + xlink:href="#linearGradient2202-3" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2202-3"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-4" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-2" /> + </linearGradient> + <linearGradient + id="linearGradient4886-3"> + <stop + id="stop4888-1" + offset="0.0000000" + style="stop-color:#1c97e1;stop-opacity:1.0000000;" /> + <stop + id="stop4890-8" + offset="1.0000000" + style="stop-color:#006798;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + id="linearGradient4554-9"> + <stop + id="stop4556-2" + offset="0.0000000" + style="stop-color:#ffffff;stop-opacity:1.0000000;" /> + <stop + id="stop4558-2" + offset="1.0000000" + style="stop-color:#ffffff;stop-opacity:0.0000000;" /> + </linearGradient> + <linearGradient + id="linearGradient4738-6"> + <stop + id="stop4740-0" + offset="0.0000000" + style="stop-color:#ffffff;stop-opacity:0.72656250;" /> + <stop + id="stop4742-8" + offset="1.0000000" + style="stop-color:#ffffff;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + y2="387.43924" + x2="332.02466" + y1="369.97995" + x1="314.56537" + gradientUnits="userSpaceOnUse" + id="linearGradient109180" + xlink:href="#linearGradient4568-4" + inkscape:collect="always" /> + <linearGradient + id="linearGradient4568-4"> + <stop + id="stop4570-3" + offset="0" + style="stop-color:#e12b1c;stop-opacity:1;" /> + <stop + id="stop4572-8" + offset="1.0000000" + style="stop-color:#980b00;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + y2="390.49332" + x2="414.38986" + y1="376.13748" + x1="401.93405" + gradientTransform="matrix(0.999946,0,0,1.000054,-175.79715,404.73102)" + gradientUnits="userSpaceOnUse" + id="linearGradient109182" + xlink:href="#linearGradient4738-6" + inkscape:collect="always" /> + <linearGradient + y2="390.78342" + x2="311.27377" + y1="377.9527" + x1="302.73621" + gradientTransform="matrix(1.9519,0,0,1.84182,-382.19925,74.95322)" + gradientUnits="userSpaceOnUse" + id="linearGradient109184" + xlink:href="#linearGradient4554-9" + inkscape:collect="always" /> + <linearGradient + id="linearGradient4068-4"> + <stop + id="stop4070-2" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop4490-5" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop4492-2" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop4072-4" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient5178-3"> + <stop + id="stop5180-4" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + id="stop5186-9" + offset="0.89021850" + style="stop-color:#ffffff;stop-opacity:0.49803922;" /> + <stop + id="stop5188-2" + offset="0.95396262" + style="stop-color:#ffffff;stop-opacity:0.24705882;" /> + <stop + id="stop5182-7" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /> + </linearGradient> + <inkscape:perspective + id="perspective838" + inkscape:persp3d-origin="750.79663 : 307.92326 : 1" + inkscape:vp_z="1501.5933 : 461.88489 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 461.88489 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1" + id="linearGradient12076" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1" + id="radialGradient12078" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <inkscape:perspective + id="perspective12088" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12182" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12184" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12186" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12188" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12190" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12192" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12194" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12196" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12198" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12200" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12202" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12204" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12206" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12208" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12210" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12212" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12214" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12216" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12218" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12220" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12222" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12224" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12226" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12228" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient12230" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5178-3" + id="radialGradient12232" + gradientUnits="userSpaceOnUse" + cx="384.69696" + cy="571.95715" + fx="384.69696" + fy="571.95715" + r="24.998358" /> + <inkscape:perspective + id="perspective12388" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-5"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-8" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-5" /> + </linearGradient> + <linearGradient + id="linearGradient12397"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop12399" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop12401" /> + </linearGradient> + <inkscape:perspective + id="perspective12388-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-8"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-1" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-2" /> + </linearGradient> + <linearGradient + id="linearGradient12397-7"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop12399-8" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop12401-6" /> + </linearGradient> + <inkscape:perspective + id="perspective12388-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-9"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-4" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-8" /> + </linearGradient> + <linearGradient + id="linearGradient12397-9"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop12399-2" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop12401-9" /> + </linearGradient> + <inkscape:perspective + id="perspective12388-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-93"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-6" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-21" /> + </linearGradient> + <linearGradient + id="linearGradient12397-5"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop12399-3" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop12401-91" /> + </linearGradient> + <inkscape:perspective + id="perspective12953" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective13067" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective13089" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective13893" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-2"> + <stop + id="stop2204-6" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-6" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202" + id="radialGradient14034" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <inkscape:perspective + id="perspective14079" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-2-4"> + <stop + id="stop2204-6-7" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-6-8" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + id="linearGradient2202-0"> + <stop + id="stop2204-0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-64" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + id="linearGradient2202-1-93-7"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-6-5" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-21-8" /> + </linearGradient> + <linearGradient + id="linearGradient14096"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop14098" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop14100" /> + </linearGradient> + <linearGradient + id="linearGradient2202-1-9-9"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-4-3" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-8-0" /> + </linearGradient> + <linearGradient + id="linearGradient14107"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop14109" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop14111" /> + </linearGradient> + <linearGradient + id="linearGradient2202-1-8-4"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-1-3" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-2-8" /> + </linearGradient> + <linearGradient + id="linearGradient14118"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop14120" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop14122" /> + </linearGradient> + <linearGradient + id="linearGradient2202-1-5-0"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-8-8" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-5-1" /> + </linearGradient> + <linearGradient + id="linearGradient14129"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop14131" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop14133" /> + </linearGradient> + <inkscape:perspective + id="perspective24883" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-2-1"> + <stop + id="stop2204-6-0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-6-0" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + id="linearGradient24892"> + <stop + id="stop24894" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop24896" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + id="linearGradient2202-1-93-3"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-6-1" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-21-0" /> + </linearGradient> + <linearGradient + id="linearGradient24903"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop24905" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop24907" /> + </linearGradient> + <linearGradient + id="linearGradient2202-1-9-8"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-4-0" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-8-1" /> + </linearGradient> + <linearGradient + id="linearGradient24914"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop24916" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop24918" /> + </linearGradient> + <linearGradient + id="linearGradient2202-1-8-3"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-1-4" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-2-7" /> + </linearGradient> + <linearGradient + id="linearGradient24925"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop24927" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop24929" /> + </linearGradient> + <linearGradient + id="linearGradient2202-1-5-4"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-8-4" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-5-2" /> + </linearGradient> + <linearGradient + id="linearGradient24936"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop24938" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop24940" /> + </linearGradient> + <inkscape:perspective + id="perspective25775" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient28127" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient28129" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient28131" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient28133" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient28135" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient28137" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient28139" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient28141" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient28143" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient28145" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <inkscape:perspective + id="perspective28939" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective29218" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective29250" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-19"> + <stop + id="stop2204-02" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-3" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <inkscape:perspective + id="perspective29250-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-7"> + <stop + id="stop2204-64" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-9" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <inkscape:perspective + id="perspective29416" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective29448" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-53"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-2" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-4" /> + </linearGradient> + <linearGradient + id="linearGradient29457"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop29459" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop29461" /> + </linearGradient> + <inkscape:perspective + id="perspective29448-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-51"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-42" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-82" /> + </linearGradient> + <linearGradient + id="linearGradient29457-9"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop29459-9" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop29461-9" /> + </linearGradient> + <inkscape:perspective + id="perspective29448-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-7"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-64" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-23" /> + </linearGradient> + <linearGradient + id="linearGradient29457-0"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop29459-0" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop29461-7" /> + </linearGradient> + <inkscape:perspective + id="perspective29448-94" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-87"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-5" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-40" /> + </linearGradient> + <linearGradient + id="linearGradient29457-2"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop29459-8" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop29461-0" /> + </linearGradient> + <inkscape:perspective + id="perspective29448-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-1"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-83" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-86" /> + </linearGradient> + <linearGradient + id="linearGradient29457-8"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop29459-07" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop29461-3" /> + </linearGradient> + <inkscape:perspective + id="perspective29448-8" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-2"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-3" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-1" /> + </linearGradient> + <linearGradient + id="linearGradient29457-91"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop29459-3" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop29461-6" /> + </linearGradient> + <inkscape:perspective + id="perspective29448-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-3"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-50" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-234" /> + </linearGradient> + <linearGradient + id="linearGradient29457-23"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop29459-2" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop29461-1" /> + </linearGradient> + <inkscape:perspective + id="perspective30318" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-59"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-33" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-0" /> + </linearGradient> + <pattern + inkscape:collect="always" + patternUnits="userSpaceOnUse" + width="30.066020" + height="5.1805778" + id="Wavy-5" + inkscape:stockid="Wavy"> + <path + style="fill:black;stroke:none;" + d="M 7.597,0.061 C 5.079,-0.187 2.656,0.302 -0.01,1.788 L -0.01,3.061 C 2.773,1.431 5.173,1.052 7.472,1.280 C 9.770,1.508 11.969,2.361 14.253,3.218 C 18.820,4.931 23.804,6.676 30.066,3.061 L 30.062,1.788 C 23.622,5.497 19.246,3.770 14.691,2.061 C 12.413,1.207 10.115,0.311 7.597,0.061 z " + id="path6343-6" /> + </pattern> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-5" + id="pattern30331" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-5" + id="pattern30338" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-5" + id="pattern30345" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-5" + id="pattern30352" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-5" + id="pattern30359" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-5" + id="pattern30366" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-5" + id="pattern30373" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <inkscape:perspective + id="perspective30318-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-32"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-47" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-85" /> + </linearGradient> + <pattern + inkscape:collect="always" + patternUnits="userSpaceOnUse" + width="30.066020" + height="5.1805778" + id="Wavy-9" + inkscape:stockid="Wavy"> + <path + style="fill:black;stroke:none;" + d="M 7.597,0.061 C 5.079,-0.187 2.656,0.302 -0.01,1.788 L -0.01,3.061 C 2.773,1.431 5.173,1.052 7.472,1.280 C 9.770,1.508 11.969,2.361 14.253,3.218 C 18.820,4.931 23.804,6.676 30.066,3.061 L 30.062,1.788 C 23.622,5.497 19.246,3.770 14.691,2.061 C 12.413,1.207 10.115,0.311 7.597,0.061 z " + id="path6343-63" /> + </pattern> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-9" + id="pattern30331-1" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-9" + id="pattern30338-9" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-9" + id="pattern30345-4" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-9" + id="pattern30352-9" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-9" + id="pattern30359-4" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-9" + id="pattern30366-8" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-9" + id="pattern30373-6" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <inkscape:perspective + id="perspective30318-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-90"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-0" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-56" /> + </linearGradient> + <pattern + inkscape:collect="always" + patternUnits="userSpaceOnUse" + width="30.066020" + height="5.1805778" + id="Wavy-4" + inkscape:stockid="Wavy"> + <path + style="fill:black;stroke:none;" + d="M 7.597,0.061 C 5.079,-0.187 2.656,0.302 -0.01,1.788 L -0.01,3.061 C 2.773,1.431 5.173,1.052 7.472,1.280 C 9.770,1.508 11.969,2.361 14.253,3.218 C 18.820,4.931 23.804,6.676 30.066,3.061 L 30.062,1.788 C 23.622,5.497 19.246,3.770 14.691,2.061 C 12.413,1.207 10.115,0.311 7.597,0.061 z " + id="path6343-5" /> + </pattern> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-4" + id="pattern30331-7" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-4" + id="pattern30338-3" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-4" + id="pattern30345-8" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-4" + id="pattern30352-91" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-4" + id="pattern30359-1" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-4" + id="pattern30366-9" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-4" + id="pattern30373-9" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <inkscape:perspective + id="perspective30318-8" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-52"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-54" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-55" /> + </linearGradient> + <pattern + inkscape:collect="always" + patternUnits="userSpaceOnUse" + width="30.066020" + height="5.1805778" + id="Wavy-92" + inkscape:stockid="Wavy"> + <path + style="fill:black;stroke:none;" + d="M 7.597,0.061 C 5.079,-0.187 2.656,0.302 -0.01,1.788 L -0.01,3.061 C 2.773,1.431 5.173,1.052 7.472,1.280 C 9.770,1.508 11.969,2.361 14.253,3.218 C 18.820,4.931 23.804,6.676 30.066,3.061 L 30.062,1.788 C 23.622,5.497 19.246,3.770 14.691,2.061 C 12.413,1.207 10.115,0.311 7.597,0.061 z " + id="path6343-9" /> + </pattern> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-92" + id="pattern30331-79" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-92" + id="pattern30338-0" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-92" + id="pattern30345-5" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-92" + id="pattern30352-5" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-92" + id="pattern30359-6" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-92" + id="pattern30366-0" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-92" + id="pattern30373-7" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <inkscape:perspective + id="perspective30318-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-19"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-7" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-06" /> + </linearGradient> + <pattern + inkscape:collect="always" + patternUnits="userSpaceOnUse" + width="30.066020" + height="5.1805778" + id="Wavy-6" + inkscape:stockid="Wavy"> + <path + style="fill:black;stroke:none;" + d="M 7.597,0.061 C 5.079,-0.187 2.656,0.302 -0.01,1.788 L -0.01,3.061 C 2.773,1.431 5.173,1.052 7.472,1.280 C 9.770,1.508 11.969,2.361 14.253,3.218 C 18.820,4.931 23.804,6.676 30.066,3.061 L 30.062,1.788 C 23.622,5.497 19.246,3.770 14.691,2.061 C 12.413,1.207 10.115,0.311 7.597,0.061 z " + id="path6343-7" /> + </pattern> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-6" + id="pattern30331-16" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-6" + id="pattern30338-5" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-6" + id="pattern30345-81" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-6" + id="pattern30352-4" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-6" + id="pattern30359-7" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-6" + id="pattern30366-5" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-6" + id="pattern30373-1" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <inkscape:perspective + id="perspective30318-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-900"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-23" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-6" /> + </linearGradient> + <pattern + inkscape:collect="always" + patternUnits="userSpaceOnUse" + width="30.066020" + height="5.1805778" + id="Wavy-1" + inkscape:stockid="Wavy"> + <path + style="fill:black;stroke:none;" + d="M 7.597,0.061 C 5.079,-0.187 2.656,0.302 -0.01,1.788 L -0.01,3.061 C 2.773,1.431 5.173,1.052 7.472,1.280 C 9.770,1.508 11.969,2.361 14.253,3.218 C 18.820,4.931 23.804,6.676 30.066,3.061 L 30.062,1.788 C 23.622,5.497 19.246,3.770 14.691,2.061 C 12.413,1.207 10.115,0.311 7.597,0.061 z " + id="path6343-72" /> + </pattern> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-1" + id="pattern30331-9" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-1" + id="pattern30338-58" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-1" + id="pattern30345-3" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-1" + id="pattern30352-1" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-1" + id="pattern30359-5" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-1" + id="pattern30366-3" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-1" + id="pattern30373-98" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <inkscape:perspective + id="perspective31338" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective33323" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-2" + id="radialGradient28685-2" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + id="linearGradient2202-2-1-2"> + <stop + id="stop2204-6-0-4" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-6-0-6" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-1" + id="linearGradient28681-3" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-93-3-1"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-6-1-4" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-21-0-3" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-1" + id="radialGradient28683-5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient33336"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop33338" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop33340" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-9" + id="linearGradient28677-4" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-9-8-9"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-4-0-7" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-8-1-6" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-9" + id="radialGradient28679-4" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient33347"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop33349" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop33351" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-6" + id="linearGradient28673-6" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-8-3-6"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-1-4-6" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-2-7-1" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-6" + id="radialGradient28675-9" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient33358"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop33360" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop33362" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-6" + id="linearGradient28669-8" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-5-4-6"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-8-4-8" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-5-2-3" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-6" + id="radialGradient28671-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient33369"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop33371" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop33373" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-2" + id="radialGradient28667-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + id="linearGradient33376"> + <stop + id="stop33378" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop33380" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-2" + id="radialGradient33382" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + id="linearGradient33384"> + <stop + id="stop33386" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop33388" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-1" + id="linearGradient33390" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient33392"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop33394" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop33396" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-1" + id="radialGradient33398" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient33400"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop33402" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop33404" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-9" + id="linearGradient33406" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient33408"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop33410" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop33412" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-9" + id="radialGradient33414" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient33416"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop33418" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop33420" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-6" + id="linearGradient33422" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient33424"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop33426" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop33428" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-6" + id="radialGradient33430" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient33432"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop33434" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop33436" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-6" + id="linearGradient33438" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient33440"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop33442" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop33444" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-6" + id="radialGradient33446" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient33448"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop33450" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop33452" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-2" + id="radialGradient33454" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + id="linearGradient33456"> + <stop + id="stop33458" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop33460" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <radialGradient + r="3" + fy="265.86209" + fx="97.48214" + cy="265.86209" + cx="97.48214" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + gradientUnits="userSpaceOnUse" + id="radialGradient33952" + xlink:href="#linearGradient2202-2-1-2" + inkscape:collect="always" /> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="translate(-153,-176.36218)" + gradientUnits="userSpaceOnUse" + id="linearGradient33954" + xlink:href="#linearGradient2202-1-5-4-6" + inkscape:collect="always" /> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + gradientUnits="userSpaceOnUse" + id="radialGradient33956" + xlink:href="#linearGradient2202-1-5-4-6" + inkscape:collect="always" /> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="translate(-153,-176.36218)" + gradientUnits="userSpaceOnUse" + id="linearGradient33958" + xlink:href="#linearGradient2202-1-8-3-6" + inkscape:collect="always" /> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + gradientUnits="userSpaceOnUse" + id="radialGradient33960" + xlink:href="#linearGradient2202-1-8-3-6" + inkscape:collect="always" /> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="translate(-153,-176.36218)" + gradientUnits="userSpaceOnUse" + id="linearGradient33962" + xlink:href="#linearGradient2202-1-9-8-9" + inkscape:collect="always" /> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + gradientUnits="userSpaceOnUse" + id="radialGradient33964" + xlink:href="#linearGradient2202-1-9-8-9" + inkscape:collect="always" /> + <linearGradient + y2="207.36218" + x2="195" + y1="207.36218" + x1="175" + gradientTransform="translate(-153,-176.36218)" + gradientUnits="userSpaceOnUse" + id="linearGradient33966" + xlink:href="#linearGradient2202-1-93-3-1" + inkscape:collect="always" /> + <radialGradient + r="4.5" + fy="349.86218" + fx="109" + cy="349.86218" + cx="109" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + gradientUnits="userSpaceOnUse" + id="radialGradient33968" + xlink:href="#linearGradient2202-1-93-3-1" + inkscape:collect="always" /> + <radialGradient + r="3" + fy="265.86209" + fx="97.48214" + cy="265.86209" + cx="97.48214" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + gradientUnits="userSpaceOnUse" + id="radialGradient33970" + xlink:href="#linearGradient2202-2-1-2" + inkscape:collect="always" /> + <inkscape:perspective + id="perspective35151" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-54"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-57" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-52" /> + </linearGradient> + <linearGradient + id="linearGradient35160"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop35162" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop35164" /> + </linearGradient> + <linearGradient + y2="487.91693" + x2="-124.93314" + y1="472.52106" + x1="-137.36061" + gradientTransform="matrix(0.5806141,-0.290307,0,0.8294487,1235.5061,-245.10175)" + gradientUnits="userSpaceOnUse" + id="linearGradient3438-4" + xlink:href="#linearGradient414-2" + inkscape:collect="always" /> + <linearGradient + id="linearGradient414-2"> + <stop + id="stop415-6" + offset="0.00000000" + style="stop-color:#ffd800;stop-opacity:1.0000000;" /> + <stop + id="stop416-0" + offset="1.0000000" + style="stop-color:#e77900;stop-opacity:1.0000000;" /> + </linearGradient> + <inkscape:perspective + id="perspective35294" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-19-1"> + <stop + id="stop2204-02-4" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-3-1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <inkscape:perspective + id="perspective36260" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-31"> + <stop + id="stop2204-2" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-99" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + id="linearGradient36269"> + <stop + id="stop36271" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop36273" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <inkscape:perspective + id="perspective80107" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective80129" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective80164" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective80186" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective80208" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient4068-1"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop4070-7" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop4490-1" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop4492-25" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop4072-49" /> + </linearGradient> + <linearGradient + id="linearGradient80219"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80221" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80223" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80225" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80227" /> + </linearGradient> + <linearGradient + id="linearGradient80230"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80232" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80234" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80236" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80238" /> + </linearGradient> + <linearGradient + id="linearGradient80241"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80243" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80245" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80247" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80249" /> + </linearGradient> + <linearGradient + id="linearGradient80252"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80254" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80256" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80258" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80260" /> + </linearGradient> + <linearGradient + id="linearGradient80263"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80265" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80267" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80269" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80271" /> + </linearGradient> + <linearGradient + id="linearGradient80274"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80276" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80278" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80280" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80282" /> + </linearGradient> + <linearGradient + id="linearGradient80285"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80287" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80289" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80291" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80293" /> + </linearGradient> + <linearGradient + id="linearGradient80296"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80298" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80300" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80302" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80304" /> + </linearGradient> + <linearGradient + id="linearGradient80307"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80309" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80311" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80313" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80315" /> + </linearGradient> + <linearGradient + id="linearGradient80318"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80320" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80322" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80324" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80326" /> + </linearGradient> + <linearGradient + id="linearGradient80329"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80331" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80333" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80335" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80337" /> + </linearGradient> + <linearGradient + id="linearGradient80340"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80342" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80344" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80346" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80348" /> + </linearGradient> + <linearGradient + id="linearGradient80351"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80353" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80355" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80357" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80359" /> + </linearGradient> + <linearGradient + id="linearGradient80362"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80364" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80366" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80368" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80370" /> + </linearGradient> + <linearGradient + id="linearGradient80373"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80375" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80377" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80379" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80381" /> + </linearGradient> + <linearGradient + id="linearGradient80384"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80386" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80388" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80390" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80392" /> + </linearGradient> + <linearGradient + id="linearGradient80395"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80397" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80399" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80401" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80403" /> + </linearGradient> + <linearGradient + id="linearGradient80406"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80408" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80410" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80412" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80414" /> + </linearGradient> + <linearGradient + id="linearGradient80417"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80419" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80421" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80423" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80425" /> + </linearGradient> + <linearGradient + id="linearGradient80428"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80430" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80432" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80434" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80436" /> + </linearGradient> + <linearGradient + id="linearGradient80439"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80441" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80443" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80445" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80447" /> + </linearGradient> + <linearGradient + id="linearGradient80450"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80452" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80454" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80456" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80458" /> + </linearGradient> + <linearGradient + id="linearGradient80461"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80463" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80465" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80467" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80469" /> + </linearGradient> + <linearGradient + id="linearGradient80472"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop80474" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop80476" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop80478" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop80480" /> + </linearGradient> + <linearGradient + id="linearGradient5178-1"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop5180-8" /> + <stop + style="stop-color:#ffffff;stop-opacity:0.49803922;" + offset="0.89021850" + id="stop5186-98" /> + <stop + style="stop-color:#ffffff;stop-opacity:0.24705882;" + offset="0.95396262" + id="stop5188-20" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop5182-5" /> + </linearGradient> + <inkscape:perspective + id="perspective80938" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-95"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-72" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-406" /> + </linearGradient> + <linearGradient + id="linearGradient80947"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop80949" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop80951" /> + </linearGradient> + <inkscape:perspective + id="perspective81071" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective81097" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-1-95-8"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-72-4" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-406-3" /> + </linearGradient> + <linearGradient + id="linearGradient81106"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop81108" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop81110" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="linearGradient81224" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="radialGradient81226" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="linearGradient81228" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="radialGradient81230" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="linearGradient81232" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="radialGradient81234" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="linearGradient81236" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="radialGradient81238" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-59" + id="linearGradient81240" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-32" + id="linearGradient81242" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-90" + id="linearGradient81244" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-52" + id="linearGradient81246" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-19" + id="linearGradient81248" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient81250" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81252" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient81254" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient81256" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient81258" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient81260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient81262" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient81264" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient81266" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient81268" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81270" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81272" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient81274" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient81276" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient81278" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient81280" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient81282" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient81284" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient81286" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient81288" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81290" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81292" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient81294" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient81296" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient81298" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient81300" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient81302" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient81304" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient81306" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient81308" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81310" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient81312" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81314" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81316" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81318" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81320" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81322" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81324" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81326" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81328" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81330" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81332" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81334" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81336" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81338" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81340" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81342" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81344" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81346" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81348" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81350" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81352" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81354" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81356" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81358" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81360" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81362" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5178-3" + id="radialGradient81364" + gradientUnits="userSpaceOnUse" + cx="384.69696" + cy="571.95715" + fx="384.69696" + fy="571.95715" + r="24.998358" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-54" + id="linearGradient81366" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-54" + id="radialGradient81368" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient414-2" + id="linearGradient81370" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.5806141,-0.290307,0,0.8294487,1235.5061,-245.10175)" + x1="-137.36061" + y1="472.52106" + x2="-124.93314" + y2="487.91693" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19-1" + id="radialGradient81372" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81374" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient81376" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient81378" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient81380" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient81382" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient81384" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient81386" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient81388" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient81390" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81392" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="linearGradient81394" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="radialGradient81396" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="linearGradient81398" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="radialGradient81400" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="linearGradient81402" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="radialGradient81404" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="linearGradient81406" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="radialGradient81408" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="linearGradient81410" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="radialGradient81412" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-59" + id="linearGradient81414" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-32" + id="linearGradient81416" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-90" + id="linearGradient81418" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-52" + id="linearGradient81420" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-19" + id="linearGradient81422" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient81424" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81426" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient81428" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient81430" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient81432" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient81434" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient81436" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient81438" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient81440" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient81442" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81444" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81446" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient81448" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient81450" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient81452" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient81454" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient81456" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient81458" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient81460" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient81462" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81464" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81466" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient81468" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient81470" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient81472" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient81474" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient81476" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient81478" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient81480" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient81482" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81484" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient81486" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81488" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81490" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81492" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81494" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81496" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81498" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81500" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81502" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81504" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81506" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81508" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81510" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81512" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81514" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81516" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81518" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81520" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81522" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81524" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81526" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81528" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81530" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81532" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81534" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient81536" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5178-3" + id="radialGradient81538" + gradientUnits="userSpaceOnUse" + cx="384.69696" + cy="571.95715" + fx="384.69696" + fy="571.95715" + r="24.998358" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-54" + id="linearGradient81540" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-54" + id="radialGradient81542" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient414-2" + id="linearGradient81544" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.5806141,-0.290307,0,0.8294487,1235.5061,-245.10175)" + x1="-137.36061" + y1="472.52106" + x2="-124.93314" + y2="487.91693" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19-1" + id="radialGradient81546" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81548" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient81550" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient81552" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient81554" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient81556" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient81558" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient81560" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient81562" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient81564" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient81566" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="linearGradient81568" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="radialGradient81570" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <inkscape:perspective + id="perspective83870" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 461.88489 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1501.5933 : 461.88489 : 1" + inkscape:persp3d-origin="750.79663 : 307.92326 : 1" + id="perspective838-4" /> + <linearGradient + id="linearGradient5178-3-3"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop5180-4-4" /> + <stop + style="stop-color:#ffffff;stop-opacity:0.49803922;" + offset="0.89021850" + id="stop5186-9-0" /> + <stop + style="stop-color:#ffffff;stop-opacity:0.24705882;" + offset="0.95396262" + id="stop5188-2-5" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop5182-7-0" /> + </linearGradient> + <linearGradient + id="linearGradient4068-4-3"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop4070-2-9" /> + <stop + style="stop-color:#000000;stop-opacity:0.49803922;" + offset="0.67741936" + id="stop4490-5-1" /> + <stop + style="stop-color:#000000;stop-opacity:0.24705882;" + offset="0.86472428" + id="stop4492-2-7" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop4072-4-8" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4554-9-7" + id="linearGradient109184-7" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9519,0,0,1.84182,-382.19925,74.95322)" + x1="302.73621" + y1="377.9527" + x2="311.27377" + y2="390.78342" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4738-6-3" + id="linearGradient109182-7" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.999946,0,0,1.000054,-175.79715,404.73102)" + x1="401.93405" + y1="376.13748" + x2="414.38986" + y2="390.49332" /> + <linearGradient + id="linearGradient4568-4-2"> + <stop + style="stop-color:#e12b1c;stop-opacity:1;" + offset="0" + id="stop4570-3-3" /> + <stop + style="stop-color:#980b00;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop4572-8-4" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4568-4-2" + id="linearGradient109180-9" + gradientUnits="userSpaceOnUse" + x1="314.56537" + y1="369.97995" + x2="332.02466" + y2="387.43924" /> + <linearGradient + id="linearGradient4738-6-3"> + <stop + style="stop-color:#ffffff;stop-opacity:0.72656250;" + offset="0.0000000" + id="stop4740-0-9" /> + <stop + style="stop-color:#ffffff;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop4742-8-3" /> + </linearGradient> + <linearGradient + id="linearGradient4554-9-7"> + <stop + style="stop-color:#ffffff;stop-opacity:1.0000000;" + offset="0.0000000" + id="stop4556-2-0" /> + <stop + style="stop-color:#ffffff;stop-opacity:0.0000000;" + offset="1.0000000" + id="stop4558-2-5" /> + </linearGradient> + <linearGradient + id="linearGradient4886-3-9"> + <stop + style="stop-color:#1c97e1;stop-opacity:1.0000000;" + offset="0.0000000" + id="stop4888-1-4" /> + <stop + style="stop-color:#006798;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop4890-8-3" /> + </linearGradient> + <linearGradient + id="linearGradient2202-3-7"> + <stop + id="stop2204-4-4" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-2-2" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="linearGradient117517-3" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient117519-8" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <pattern + inkscape:collect="always" + patternUnits="userSpaceOnUse" + width="2" + height="1" + patternTransform="matrix(0,5.5342899,-7.4864229,0,31.668795,357.00572)" + id="Strips1_1-2" + inkscape:stockid="Stripes 1:1"> + <rect + style="fill:black;stroke:none" + x="0" + y="-0.5" + width="1" + height="2" + id="rect5260-4" /> + </pattern> + <pattern + patternTransform="matrix(0,5.5342899,-7.4864232,0,521.74506,337.35904)" + id="pattern118687-5" + xlink:href="#Strips1_1-2" + inkscape:collect="always" /> + <linearGradient + id="linearGradient114931-1" + inkscape:collect="always"> + <stop + id="stop114933-7" + offset="0" + style="stop-color:#2e3436;stop-opacity:1;" /> + <stop + id="stop114935-5" + offset="1" + style="stop-color:#2e3436;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient114953-7" + inkscape:collect="always"> + <stop + id="stop114955-1" + offset="0" + style="stop-color:#191a19;stop-opacity:1;" /> + <stop + id="stop114957-6" + offset="1" + style="stop-color:#191a19;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient114975-9" + inkscape:collect="always"> + <stop + id="stop114977-8" + offset="0" + style="stop-color:#3465a4;stop-opacity:1" /> + <stop + id="stop114979-1" + offset="1" + style="stop-color:#3465a4;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7680-2" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7682-4" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7684-9" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7686-2" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7688-6" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7690-2" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7692-9" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7694-2" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7696-1" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7698-0" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7700-9" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7702-4" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7704-3" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7706-2" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7708-0" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7710-1" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7712-4" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7714-8" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7716-6" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7718-6" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7720-2" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7722-6" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7724-6" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7726-8" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient7728-9" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5178-3-3" + id="radialGradient7730-1" + gradientUnits="userSpaceOnUse" + cx="384.69696" + cy="571.95715" + fx="384.69696" + fy="571.95715" + r="24.998358" /> + <pattern + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" + id="pattern6028" + xlink:href="#pattern6024" + inkscape:collect="always" /> + <pattern + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" + id="pattern6030" + xlink:href="#pattern6024" + inkscape:collect="always" /> + <pattern + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" + id="pattern6032" + xlink:href="#pattern6024" + inkscape:collect="always" /> + <pattern + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" + id="pattern6034" + xlink:href="#pattern6024" + inkscape:collect="always" /> + <pattern + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" + id="pattern6036" + xlink:href="#pattern6024" + inkscape:collect="always" /> + <pattern + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" + id="pattern6038" + xlink:href="#pattern6024" + inkscape:collect="always" /> + <pattern + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" + id="pattern6040" + xlink:href="#pattern6024" + inkscape:collect="always" /> + <pattern + inkscape:stockid="Wavy" + id="Wavy" + height="5.1805778" + width="30.066020" + patternUnits="userSpaceOnUse" + inkscape:collect="always"> + <path + id="path6343" + d="M 7.597,0.061 C 5.079,-0.187 2.656,0.302 -0.01,1.788 L -0.01,3.061 C 2.773,1.431 5.173,1.052 7.472,1.280 C 9.770,1.508 11.969,2.361 14.253,3.218 C 18.820,4.931 23.804,6.676 30.066,3.061 L 30.062,1.788 C 23.622,5.497 19.246,3.770 14.691,2.061 C 12.413,1.207 10.115,0.311 7.597,0.061 z " + style="fill:black;stroke:none;" /> + </pattern> + <pattern + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" + id="pattern6024" + xlink:href="#Wavy" + inkscape:collect="always" /> + <pattern + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" + id="pattern6042" + xlink:href="#pattern6024" + inkscape:collect="always" /> + <filter + color-interpolation-filters="sRGB" + id="filter3197" + inkscape:collect="always"> + <feGaussianBlur + id="feGaussianBlur3199" + stdDeviation="5.125686" + inkscape:collect="always" /> + </filter> + <linearGradient + id="linearGradient3180-5"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3186-6" /> + <stop + id="stop3188-7" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient3273-7"> + <stop + id="stop3275-5" + offset="0" + style="stop-color:#ffffff;stop-opacity:0;" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="0.5" + id="stop3289-8" /> + <stop + id="stop3283-6" + offset="1" + style="stop-color:#000000;stop-opacity:0.21602787;" /> + <stop + style="stop-color:#ffffff;stop-opacity:0.59233451;" + offset="1" + id="stop3277-7" /> + </linearGradient> + <linearGradient + id="linearGradient3195-1"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3199-2" /> + <stop + id="stop3201-3" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient3159-7"> + <stop + style="stop-color:#b0dc18;stop-opacity:1;" + offset="0" + id="stop3161-7" /> + <stop + id="stop3187-2" + offset="0.56223178" + style="stop-color:#3ea20c;stop-opacity:1;" /> + <stop + style="stop-color:#006900;stop-opacity:1;" + offset="1" + id="stop3163-7" /> + </linearGradient> + <filter + color-interpolation-filters="sRGB" + id="filter3267" + inkscape:collect="always"> + <feGaussianBlur + id="feGaussianBlur3269" + stdDeviation="0.97583505" + inkscape:collect="always" /> + </filter> + <linearGradient + id="linearGradient3175-8"> + <stop + style="stop-color:#41a0ee;stop-opacity:1;" + offset="0" + id="stop3177-0" /> + <stop + id="stop3191-2" + offset="0.64377683" + style="stop-color:#378be4;stop-opacity:1;" /> + <stop + style="stop-color:#2d77db;stop-opacity:1;" + offset="1" + id="stop3179-5" /> + </linearGradient> + <linearGradient + id="linearGradient4568-5"> + <stop + style="stop-color:#e12b1c;stop-opacity:1;" + offset="0" + id="stop4570-4" /> + <stop + style="stop-color:#980b00;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop4572-1" /> + </linearGradient> + <linearGradient + id="linearGradient414-1"> + <stop + style="stop-color:#ffd800;stop-opacity:1.0000000;" + offset="0.00000000" + id="stop415-0" /> + <stop + style="stop-color:#e77900;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop416-04" /> + </linearGradient> + <linearGradient + id="linearGradient4554-3-1"> + <stop + style="stop-color:#ffffff;stop-opacity:1.0000000;" + offset="0.0000000" + id="stop4556-9-4" /> + <stop + style="stop-color:#ffffff;stop-opacity:0.0000000;" + offset="1.0000000" + id="stop4558-4-5" /> + </linearGradient> + <linearGradient + id="linearGradient4738-8"> + <stop + style="stop-color:#ffffff;stop-opacity:0.72656250;" + offset="0.0000000" + id="stop4740-4" /> + <stop + style="stop-color:#ffffff;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop4742-3" /> + </linearGradient> + <linearGradient + id="linearGradient4886-1-9"> + <stop + style="stop-color:#1c97e1;stop-opacity:1.0000000;" + offset="0.0000000" + id="stop4888-5-5" /> + <stop + style="stop-color:#006798;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop4890-4-8" /> + </linearGradient> + <linearGradient + id="linearGradient2202-1-6"> + <stop + id="stop2204-5-35" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-5-9" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient114975-3"> + <stop + style="stop-color:#3465a4;stop-opacity:1" + offset="0" + id="stop114977-0" /> + <stop + style="stop-color:#3465a4;stop-opacity:0;" + offset="1" + id="stop114979-6" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient114975-3" + id="linearGradient14782-0" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.9983345,0,0,1.0398445,80.706264,173.27788)" + x1="273.62375" + y1="224.83743" + x2="236.19801" + y2="166.61961" /> + <linearGradient + inkscape:collect="always" + id="linearGradient114953-5"> + <stop + style="stop-color:#191a19;stop-opacity:1;" + offset="0" + id="stop114955-3" /> + <stop + style="stop-color:#191a19;stop-opacity:0;" + offset="1" + id="stop114957-7" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient114953-5" + id="linearGradient14780-4" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1048951,0,0,1.1048951,67.985466,73.286385)" + x1="218.73267" + y1="237.31267" + x2="335.66339" + y2="399.49088" /> + <linearGradient + inkscape:collect="always" + id="linearGradient114931-5"> + <stop + style="stop-color:#2e3436;stop-opacity:1;" + offset="0" + id="stop114933-1" /> + <stop + style="stop-color:#2e3436;stop-opacity:0;" + offset="1" + id="stop114935-50" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient114931-5" + id="linearGradient14778-2" + gradientUnits="userSpaceOnUse" + x1="332.67328" + y1="298.85724" + x2="482.37622" + y2="683.92651" /> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective19535-5" /> + <inkscape:perspective + id="perspective19261-3" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-8"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-20" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-63" /> + </linearGradient> + <pattern + inkscape:collect="always" + xlink:href="#Strips1_1" + id="pattern118687" + patternTransform="matrix(0,5.5342899,-7.4864232,0,521.74506,337.35904)" /> + <pattern + inkscape:stockid="Stripes 1:1" + id="Strips1_1" + patternTransform="matrix(0,5.5342899,-7.4864229,0,31.668795,357.00572)" + height="1" + width="2" + patternUnits="userSpaceOnUse" + inkscape:collect="always"> + <rect + id="rect5260" + height="2" + width="1" + y="-0.5" + x="0" + style="fill:black;stroke:none" /> + </pattern> + <linearGradient + id="linearGradient4886-6"> + <stop + id="stop4888-3" + offset="0.0000000" + style="stop-color:#1c97e1;stop-opacity:1.0000000;" /> + <stop + id="stop4890-0" + offset="1.0000000" + style="stop-color:#006798;stop-opacity:1.0000000;" /> + </linearGradient> + <linearGradient + id="linearGradient4554-0"> + <stop + id="stop4556-8" + offset="0.0000000" + style="stop-color:#ffffff;stop-opacity:1.0000000;" /> + <stop + id="stop4558-9" + offset="1.0000000" + style="stop-color:#ffffff;stop-opacity:0.0000000;" /> + </linearGradient> + <linearGradient + id="linearGradient4068-0"> + <stop + id="stop4070-6" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop4490-0" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop4492-1" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop4072-7" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient5178-7"> + <stop + id="stop5180-5" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + id="stop5186-7" + offset="0.89021850" + style="stop-color:#ffffff;stop-opacity:0.49803922;" /> + <stop + id="stop5188-9" + offset="0.95396262" + style="stop-color:#ffffff;stop-opacity:0.24705882;" /> + <stop + id="stop5182-1" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89569" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89571" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89573" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89575" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89577" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89579" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89581" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89583" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89585" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89587" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89589" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89591" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89593" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89595" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89597" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89599" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89601" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89603" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89605" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89607" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89609" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89611" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89613" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89615" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-0" + id="linearGradient89617" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5178-7" + id="radialGradient89619" + gradientUnits="userSpaceOnUse" + cx="384.69696" + cy="571.95715" + fx="384.69696" + fy="571.95715" + r="24.998358" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4886-6" + id="linearGradient89621" + gradientUnits="userSpaceOnUse" + x1="314.56537" + y1="369.97995" + x2="332.02466" + y2="387.43924" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4554-0" + id="linearGradient89623" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9519,0,0,1.84182,-297.02235,74.95322)" + x1="302.73621" + y1="377.9527" + x2="311.27377" + y2="390.78342" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-8" + id="radialGradient89625" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-8" + id="linearGradient89627" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-8" + id="radialGradient89629" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-8" + id="linearGradient89631" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-8" + id="radialGradient89633" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-8" + id="radialGradient89635" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-8" + id="radialGradient89637" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-8" + id="radialGradient89639" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="linearGradient89641" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="linearGradient89643" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="radialGradient89645" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3175-8" + id="radialGradient89647" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.105165,1.228066,-0.8683345,0.7814343,1473.1011,172.79095)" + cx="127.83543" + cy="1736.9607" + fx="127.83543" + fy="1736.9607" + r="199.63403" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3159-7" + id="radialGradient89649" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.5002429,1.4674024,-1.2539857,0.4274882,2324.404,828.29789)" + cx="65.333183" + cy="1808.0941" + fx="65.333183" + fy="1808.0941" + r="195.94841" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3195-1" + id="radialGradient89651" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.1992334,1.195744,-1.1829727,0.1971052,1996.7215,1257.5875)" + cx="13.846332" + cy="1679.6958" + fx="13.846332" + fy="1679.6958" + r="199.13403" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3273-7" + id="radialGradient89653" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.1087803,1.4752039,-1.9297648,-0.1423,3255.8728,1823.5882)" + cx="5.8389463" + cy="1673.207" + fx="5.8389463" + fy="1673.207" + r="199.13403" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3180-5" + id="radialGradient89655" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.466646,1.4600162,-1.3948135,0.4458064,2272.5859,931.37623)" + cx="-90.184074" + cy="1676.9956" + fx="-90.184074" + fy="1676.9956" + r="199.13403" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="linearGradient89657" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="radialGradient89659" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4568-5" + id="linearGradient89661" + gradientUnits="userSpaceOnUse" + x1="314.56537" + y1="369.97995" + x2="332.02466" + y2="387.43924" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4738-8" + id="linearGradient89663" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.999946,0,0,1.000054,-175.79715,404.73102)" + x1="401.93405" + y1="376.13748" + x2="414.38986" + y2="390.49332" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4554-3-1" + id="linearGradient89665" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9519,0,0,1.84182,-382.19925,74.95322)" + x1="302.73621" + y1="377.9527" + x2="311.27377" + y2="390.78342" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="linearGradient89667" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="radialGradient89669" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="linearGradient89671" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="radialGradient89673" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="linearGradient89675" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="radialGradient89677" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient414-1" + id="linearGradient89679" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.5806141,-0.290307,0,0.8294487,1235.5061,-245.10175)" + x1="-137.36061" + y1="472.52106" + x2="-124.93314" + y2="487.91693" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="linearGradient89681" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="radialGradient89683" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="linearGradient89685" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="radialGradient89687" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="linearGradient89689" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="radialGradient89691" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="linearGradient89693" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="radialGradient89695" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="linearGradient89697" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="radialGradient89699" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4886-1-9" + id="linearGradient89701" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(32.697924,534.73628)" + x1="838.01013" + y1="-320.49728" + x2="909.21588" + y2="-321.47269" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4738-8" + id="linearGradient89703" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.638597,0,0,1.565933,-355.04905,402.57752)" + x1="1313.4297" + y1="237.96057" + x2="1333.0073" + y2="258.76886" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4554-3-1" + id="linearGradient89705" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-354.99455,401.23652)" + x1="808.12592" + y1="362.58139" + x2="832.68341" + y2="400.04047" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="linearGradient89707" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-6" + id="radialGradient89709" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="linearGradient89711" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89713" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="linearGradient89715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89717" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="linearGradient89719" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89721" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="linearGradient89723" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89725" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89727" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89729" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89731" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89733" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89735" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89737" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89739" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89741" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89743" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89745" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89747" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89749" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89751" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89753" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89755" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89757" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89759" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89761" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89763" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89765" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89767" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89769" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89771" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89773" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89775" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4-3" + id="linearGradient89777" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5178-3-3" + id="radialGradient89779" + gradientUnits="userSpaceOnUse" + cx="384.69696" + cy="571.95715" + fx="384.69696" + fy="571.95715" + r="24.998358" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="linearGradient89781" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89783" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="linearGradient89785" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89787" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89789" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89791" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89793" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="linearGradient89795" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89797" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="linearGradient89799" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89801" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4886-3-9" + id="linearGradient89803" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(32.697924,534.73628)" + x1="838.01013" + y1="-320.49728" + x2="909.21588" + y2="-321.47269" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4738-6-3" + id="linearGradient89805" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.638597,0,0,1.565933,-355.04905,402.57752)" + x1="1313.4297" + y1="237.96057" + x2="1333.0073" + y2="258.76886" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4554-9-7" + id="linearGradient89807" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-354.99455,401.23652)" + x1="808.12592" + y1="362.58139" + x2="832.68341" + y2="400.04047" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient114931-1" + id="linearGradient89809" + gradientUnits="userSpaceOnUse" + x1="332.67328" + y1="298.85724" + x2="482.37622" + y2="683.92651" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient114953-7" + id="linearGradient89811" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1048951,0,0,1.1048951,67.985466,73.286385)" + x1="218.73267" + y1="237.31267" + x2="335.66339" + y2="399.49088" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient114975-9" + id="linearGradient89813" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.9983345,0,0,1.0398445,80.706264,173.27788)" + x1="273.62375" + y1="224.83743" + x2="236.19801" + y2="166.61961" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89815" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="linearGradient89817" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89819" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="linearGradient89821" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89823" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="linearGradient89825" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-3-7" + id="radialGradient89827" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <inkscape:perspective + id="perspective94039" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + id="linearGradient2202-2-1-25"> + <stop + id="stop2204-6-0-41" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-6-0-8" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + id="linearGradient2202-1-5-4-2"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-8-4-5" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-5-2-1" /> + </linearGradient> + <linearGradient + id="linearGradient94052"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop94054" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop94056" /> + </linearGradient> + <linearGradient + id="linearGradient2202-1-8-3-0"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-1-4-2" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-2-7-6" /> + </linearGradient> + <linearGradient + id="linearGradient94063"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop94065" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop94067" /> + </linearGradient> + <linearGradient + id="linearGradient2202-1-9-8-0"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-4-0-0" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-8-1-3" /> + </linearGradient> + <linearGradient + id="linearGradient94074"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop94076" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop94078" /> + </linearGradient> + <linearGradient + id="linearGradient2202-1-93-3-2"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-6-1-0" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-21-0-1" /> + </linearGradient> + <linearGradient + id="linearGradient94085"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop94087" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop94089" /> + </linearGradient> + <linearGradient + id="linearGradient94092"> + <stop + id="stop94094" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop94096" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <inkscape:perspective + id="perspective95714" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective95802" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective95824" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="linearGradient98580" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="radialGradient98582" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="linearGradient98584" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="radialGradient98586" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="linearGradient98588" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="radialGradient98590" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="linearGradient98592" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="radialGradient98594" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-59" + id="linearGradient98596" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-32" + id="linearGradient98598" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-90" + id="linearGradient98600" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-52" + id="linearGradient98602" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-19" + id="linearGradient98604" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient98606" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient98608" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient98610" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient98612" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient98614" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient98616" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient98618" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient98620" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient98622" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient98624" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient98626" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient98628" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient98630" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient98632" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient98634" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient98636" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient98638" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient98640" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient98642" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient98644" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient98646" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient98648" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient98650" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient98652" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient98654" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient98656" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient98658" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient98660" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient98662" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient98664" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient98666" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient98668" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98670" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98672" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98674" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98676" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98678" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98680" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98682" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98684" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98686" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98688" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98690" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98692" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98694" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98696" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98698" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98700" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98702" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98704" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98706" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98708" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98710" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98712" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98714" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98716" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient98718" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5178-3" + id="radialGradient98720" + gradientUnits="userSpaceOnUse" + cx="384.69696" + cy="571.95715" + fx="384.69696" + fy="571.95715" + r="24.998358" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-54" + id="linearGradient98722" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-54" + id="radialGradient98724" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient414-2" + id="linearGradient98726" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.5806141,-0.290307,0,0.8294487,1235.5061,-245.10175)" + x1="-137.36061" + y1="472.52106" + x2="-124.93314" + y2="487.91693" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19-1" + id="radialGradient98728" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient98730" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient98732" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient98734" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient98736" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient98738" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient98740" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient98742" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient98744" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient98746" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient98748" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="linearGradient98750" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="radialGradient98752" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="linearGradient101496" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="radialGradient101498" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="linearGradient101500" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="radialGradient101502" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="linearGradient101504" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="radialGradient101506" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="linearGradient101508" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="radialGradient101510" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-59" + id="linearGradient101512" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-32" + id="linearGradient101514" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-90" + id="linearGradient101516" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-52" + id="linearGradient101518" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-19" + id="linearGradient101520" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient101522" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient101524" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient101526" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient101528" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient101530" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient101532" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient101534" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient101536" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient101538" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient101540" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient101542" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient101544" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient101546" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient101548" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient101550" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient101552" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient101554" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient101556" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient101558" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient101560" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient101562" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient101564" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient101566" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient101568" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient101570" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient101572" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient101574" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient101576" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient101578" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient101580" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient101582" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient101584" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101586" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101588" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101590" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101592" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101594" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101596" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101598" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101600" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101602" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101604" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101606" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101608" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101610" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101612" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101614" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101616" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101618" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101620" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101622" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101624" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101626" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101628" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101630" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101632" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient101634" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5178-3" + id="radialGradient101636" + gradientUnits="userSpaceOnUse" + cx="384.69696" + cy="571.95715" + fx="384.69696" + fy="571.95715" + r="24.998358" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-54" + id="linearGradient101638" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-54" + id="radialGradient101640" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient414-2" + id="linearGradient101642" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.5806141,-0.290307,0,0.8294487,1235.5061,-245.10175)" + x1="-137.36061" + y1="472.52106" + x2="-124.93314" + y2="487.91693" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19-1" + id="radialGradient101644" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient101646" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="linearGradient101648" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4" + id="radialGradient101650" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="linearGradient101652" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3" + id="radialGradient101654" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="linearGradient101656" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8" + id="radialGradient101658" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="linearGradient101660" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3" + id="radialGradient101662" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1" + id="radialGradient101664" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="linearGradient101666" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="radialGradient101668" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient109444" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="linearGradient109446" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="radialGradient109448" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="linearGradient109450" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="radialGradient109452" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="linearGradient109454" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="radialGradient109456" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="linearGradient109458" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="radialGradient109460" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient109462" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-95" + id="linearGradient109709" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-95" + id="radialGradient109711" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="linearGradient109741" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="radialGradient109743" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19-1" + id="radialGradient109763" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-54" + id="linearGradient109781" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-54" + id="radialGradient109783" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient414-2" + id="linearGradient109788" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.07326939,-0.03663469,0,0.10467055,585.30104,1240.0665)" + x1="-137.36061" + y1="472.52106" + x2="-124.93314" + y2="487.91693" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109813" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109815" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109817" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109819" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109821" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109823" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109825" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109827" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109829" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109831" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109833" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109835" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109837" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109839" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109841" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109843" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109845" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109847" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109849" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109851" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109853" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109855" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109857" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109859" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient109861" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5178-3" + id="radialGradient109863" + gradientUnits="userSpaceOnUse" + cx="384.69696" + cy="571.95715" + fx="384.69696" + fy="571.95715" + r="24.998358" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient109904" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient109922" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-19" + id="linearGradient109940" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-52" + id="linearGradient109961" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-90" + id="linearGradient109982" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-32" + id="linearGradient110003" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-59" + id="linearGradient110024" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="linearGradient110050" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="radialGradient110052" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="linearGradient110054" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="radialGradient110056" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="linearGradient110058" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="radialGradient110060" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="linearGradient110062" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="radialGradient110064" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <inkscape:perspective + id="perspective110844" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="linearGradient115721" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="radialGradient115723" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="linearGradient115725" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="radialGradient115727" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="linearGradient115729" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="radialGradient115731" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="linearGradient115733" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="radialGradient115735" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-59" + id="linearGradient115737" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-32" + id="linearGradient115739" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-90" + id="linearGradient115741" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-52" + id="linearGradient115743" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-19" + id="linearGradient115745" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient115747" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient115749" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115751" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115753" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115755" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115757" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115759" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115761" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115763" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115765" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115767" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115769" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115771" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115773" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115775" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115777" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115779" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115781" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115783" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115785" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115787" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115789" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115791" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115793" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115795" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115797" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient115799" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5178-3" + id="radialGradient115801" + gradientUnits="userSpaceOnUse" + cx="384.69696" + cy="571.95715" + fx="384.69696" + fy="571.95715" + r="24.998358" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-54" + id="linearGradient115803" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-54" + id="radialGradient115805" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient414-2" + id="linearGradient115807" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.07326939,-0.03663469,0,0.10467055,585.30104,1240.0665)" + x1="-137.36061" + y1="472.52106" + x2="-124.93314" + y2="487.91693" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19-1" + id="radialGradient115809" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="linearGradient115811" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="radialGradient115813" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-95" + id="linearGradient115815" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-95" + id="radialGradient115817" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient115819" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="linearGradient115821" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="radialGradient115823" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="linearGradient115825" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="radialGradient115827" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="linearGradient115829" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="radialGradient115831" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="linearGradient115833" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="radialGradient115835" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient115837" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.5378651" + inkscape:cx="202.95323" + inkscape:cy="605.2154" + inkscape:document-units="px" + inkscape:current-layer="layer3" + showgrid="false" + inkscape:window-width="1101" + inkscape:window-height="852" + inkscape:window-x="105" + inkscape:window-y="150" + inkscape:window-maximized="0" /> + <metadata + id="metadata19258"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + <cc:license + rdf:resource="" /> + <dc:creator> + <cc:Agent> + <dc:title>David Pravec <alekibango@danix.org></dc:title> + </cc:Agent> + </dc:creator> + <dc:rights> + <cc:Agent> + <dc:title>released under terms of Apache License</dc:title> + </cc:Agent> + </dc:rights> + <dc:description /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:groupmode="layer" + id="layer3" + inkscape:label="bg"> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.92599999999999993;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect5281" + width="717.65204" + height="349.53003" + x="14.873618" + y="27.941748" /> + </g> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="clipart lib" + style="display:none" + sodipodi:insensitive="true"> + <g + inkscape:label="Layer 1" + id="g4664-9" + transform="matrix(2.2734672,0,0,2.2734672,1088.7555,758.6645)"> + <g + transform="translate(-390.5856,-53.79125)" + id="g35741-72"> + <g + id="g35704-5"> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="text30384-0" + d="m 452.22752,154.79534 c -1.32987,4.3593 0.97442,13.06343 4.32672,7.29809 0.55883,-4.21566 0.16853,-13.66849 -4.32672,-7.29809 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path31227-9" + d="m 459.05645,154.87353 c -5.73123,-1.99396 -4.37255,6.82514 -3.10169,8.88804 4.41472,0.3139 8.88448,0.68282 7.08957,-5.21292 -0.15325,-2.39014 -1.62637,-3.78967 -3.98788,-3.67512 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path31225-6" + d="m 461.48045,154.95173 c -1.09246,1.9721 -0.88144,8.20841 3.07563,8.75771 7.13327,0.55239 -1.24277,-5.48505 3.0235,-5.57782 1.36821,-3.25204 -5.37175,-7.28408 -6.09913,-3.17989 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path31223-7" + d="m 469.14346,154.84748 c -6.26267,0.075 -4.66384,10.71977 1.4292,8.95932 4.83425,0.31308 3.44625,-9.88021 -1.4292,-8.95932 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path31221-5" + d="m 468.85674,155.68154 c -5.85015,2.68836 -2.79296,6.6586 2.86712,4.84803 3.28424,0.8454 -0.45596,-6.36406 -2.86712,-4.84803 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path31219-71" + d="m 475.63355,154.84748 c -5.82517,-1.97942 -4.54812,6.74301 -3.23202,8.91409 4.84187,0.18324 3.39963,-5.16968 5.70816,-6.35977 0.24428,-2.37476 -0.19418,-2.73428 -2.47614,-2.55432 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path31217-4" + d="m 479.49112,154.87353 c -5.77442,-2.02369 -4.43922,6.79664 -3.15383,8.88804 4.41473,0.3139 8.88448,0.68282 7.08958,-5.21292 -0.15836,-2.36396 -1.59101,-3.77955 -3.93575,-3.67512 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path31215-9" + d="m 485.56417,154.84748 c -6.19598,0.15033 -4.65067,10.675 1.42942,8.96143 4.93021,0.35507 3.48048,-9.89643 -1.42942,-8.96143 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path31213-6" + d="m 485.30352,155.68154 c -5.85015,2.68836 -2.79297,6.6586 2.86711,4.84803 3.28424,0.8454 -0.45595,-6.36406 -2.86711,-4.84803 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path31211-8" + d="m 488.0403,154.95173 c -1.06389,1.96915 -0.92086,8.22865 3.04957,8.75771 7.16539,0.57531 -1.21095,-5.48429 3.04956,-5.57782 1.3682,-3.25204 -5.37175,-7.28408 -6.09913,-3.17989 z" /> + <path + transform="matrix(-0.179335,0,0,0.149728,502.1893,-24.02897)" + style="opacity:0.17777776;fill:url(#linearGradient89569);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + inkscape:tile-w="105.36077" + inkscape:tile-h="104.60061" + inkscape:tile-cy="1057.5979" + inkscape:tile-cx="150.57283" + id="path4066-8" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(0.284001,0,0,0.193224,407.7236,-73.15871)" + style="opacity:0.17777776;fill:url(#linearGradient89571);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5006-6" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(0.340554,0,0,0.231701,396.3144,-88.95173)" + style="opacity:0.17777776;fill:url(#linearGradient89573);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5008-47" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(0.249954,0,0,0.170059,406.7992,-32.10751)" + style="opacity:0.17777776;fill:url(#linearGradient89575);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5010-7" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(0.260403,0,0,0.177168,412.2819,-25.25605)" + style="opacity:0.17777776;fill:url(#linearGradient89577);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5012-15" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.104126,-0.150834,-0.146719,0.07084417,668.335,91.43843)" + style="opacity:0.17777776;fill:url(#linearGradient89579);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5014-27" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.154671,-0.224051,-0.217939,0.105233,738.2325,88.88709)" + style="opacity:0.17777776;fill:url(#linearGradient89581);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5016-7" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.138006,-0.19991,-0.194457,0.09389457,722.8067,97.77468)" + style="opacity:0.17777776;fill:url(#linearGradient89583);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5018-7" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.117791,-0.170629,-0.165973,0.08014087,677.6847,122.0894)" + style="opacity:0.17777776;fill:url(#linearGradient89585);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5020-7" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.09614486,-0.139271,-0.135472,0.06541328,635.5166,142.1226)" + style="opacity:0.17777776;fill:url(#linearGradient89587);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5022-12" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.164683,-0.238552,0.232045,-0.112044,265.1906,314.0698)" + style="opacity:0.17777776;fill:url(#linearGradient89589);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5024-4" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.172846,-0.250377,0.243546,-0.117597,239.7257,330.3731)" + style="opacity:0.17777776;fill:url(#linearGradient89591);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5026-4" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.177232,-0.256733,0.249729,-0.120583,225.1178,318.3329)" + style="opacity:0.17777776;fill:url(#linearGradient89593);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5028-2" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.166524,-0.241221,0.23464,-0.113297,227.7161,329.1711)" + style="opacity:0.17777776;fill:url(#linearGradient89595);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5030-4" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.112183,-0.162505,0.158072,-0.07632533,314.1776,290.1886)" + style="opacity:0.17777776;fill:url(#linearGradient89597);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5032-9" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.11826,0.171307,0.166634,0.08045988,311.5686,16.07786)" + style="opacity:0.17777776;fill:url(#linearGradient89599);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5034-9" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.0943583,0.136684,0.132956,0.06419815,331.8395,50.2111)" + style="opacity:0.17777776;fill:url(#linearGradient89601);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5036-4" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.114364,0.165662,0.161143,0.07780872,322.2702,30.08746)" + style="opacity:0.17777776;fill:url(#linearGradient89603);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5038-8" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.140702,0.203815,0.198255,0.09572832,286.7172,18.15027)" + style="opacity:0.17777776;fill:url(#linearGradient89605);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5040-52" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.162185,0.234935,0.228526,0.110345,259.9411,6.05945)" + style="opacity:0.17777776;fill:url(#linearGradient89607);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5042-5" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.160583,0.232613,-0.226269,-0.109254,748.0707,211.5833)" + style="opacity:0.17777776;fill:url(#linearGradient89609);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5044-45" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.12628,0.182922,-0.177934,-0.08591606,697.8146,196.7379)" + style="opacity:0.17777776;fill:url(#linearGradient89611);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5046-2" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.137748,0.199537,-0.194093,-0.09371803,714.1281,221.8225)" + style="opacity:0.17777776;fill:url(#linearGradient89613);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5048-5" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.120979,0.175247,-0.170466,-0.08231039,662.6019,207.1803)" + style="opacity:0.17777776;fill:url(#linearGradient89615);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5050-1" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.14434,0.209086,-0.203383,-0.09820396,735.5011,232.5166)" + style="opacity:0.17777776;fill:url(#linearGradient89617);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="use5052-23" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + </g> + <path + transform="matrix(1.155532,0,0,1.155532,26.16756,-503.197)" + style="fill:url(#radialGradient89619);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:ry="24.998358" + sodipodi:rx="24.998358" + sodipodi:cy="571.95715" + sodipodi:cx="384.69696" + id="path5176-7" + d="m 409.69532,571.95715 a 24.998358,24.998358 0 1 1 -49.99672,0 24.998358,24.998358 0 1 1 49.99672,0 z" /> + <text + y="161.44913" + xml:space="preserve" + x="469.55161" + style="font-size:10.00881386px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#9f0021;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="text5270-6"><tspan + y="161.44913" + x="469.55161" + sodipodi:role="line" + id="tspan5272-0">Networ</tspan></text> + </g> + </g> + <g + transform="matrix(0.7071068,0.3535534,-0.7071068,0.3535534,1568.0998,175.24649)" + id="g3893"> + <g + id="g3895"> + <path + sodipodi:type="arc" + style="fill:#166496;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.625;marker:none;visibility:visible;display:inline;overflow:visible" + id="path3897" + sodipodi:cx="325.57108" + sodipodi:cy="378.05789" + sodipodi:rx="13.966679" + sodipodi:ry="13.966679" + d="m 339.53775,378.05789 a 13.966679,13.966679 0 1 1 -27.93335,0 13.966679,13.966679 0 1 1 27.93335,0 z" + transform="matrix(1.896061,0,0,1.896061,-297.02235,74.95322)" /> + <path + sodipodi:type="arc" + style="fill:url(#linearGradient89621);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.68594635;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" + id="path3899" + sodipodi:cx="325.57108" + sodipodi:cy="378.05789" + sodipodi:rx="13.966679" + sodipodi:ry="13.966679" + d="m 339.53775,378.05789 a 13.966679,13.966679 0 1 1 -27.93335,0 13.966679,13.966679 0 1 1 27.93335,0 z" + transform="matrix(1.731185,0,0,1.731185,-243.34385,137.28542)" /> + <path + style="fill:url(#linearGradient89623);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.61607176;marker:none;visibility:visible;display:inline;overflow:visible" + d="m 320.26406,767.60785 c -13.34675,0 -24.1748,10.82803 -24.17478,24.17478 0,6.41257 2.61694,12.14291 6.69547,16.47203 2.11885,-17.50049 16.88952,-31.10725 34.95862,-31.10725 0.48721,0 0.93961,0.099 1.42205,0.1185 -4.42143,-5.75069 -11.09207,-9.65806 -18.90136,-9.65806 z" + id="path3901" /> + </g> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:1.12660336;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 320.34678,804.36122 -4.67297,-8.6922 -9.86146,0.37754 5.19118,-8.39301 -5.25769,-8.35151 9.86416,0.2992 4.53346,8.0813 4.74328,-8.11814 9.86147,-0.37754 -5.19119,8.393 5.25768,8.35151 -9.86416,-0.29919 -4.60376,8.72904 z" + id="path3903" + sodipodi:nodetypes="ccccccccccccc" /> + </g> + <g + id="g3259" + transform="translate(1251.0009,-809.31822)"> + <g + id="g118215" + inkscape:label="Calque 1" + transform="matrix(6.5383417,0,0,6.5383417,364.86909,935.55835)"> + <path + id="path118217" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path118219" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path118221" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g118223" + transform="translate(-68.205597,-63.743549)"> + <path + id="path118225" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path118227" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path118229" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path118231" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + style="fill:url(#radialGradient89625);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + <g + id="g2662" + transform="matrix(0.6363961,0.3181981,-0.6363961,0.3181981,-697.62009,289.09977)"> + <path + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" + d="m 1044.4209,-4.5996044 0,78.9062504 78.9063,0 0,-78.9062504 -78.9063,0 z m 39.4688,2.46875 c 20.4177,0 37,16.5823004 37,37.0000004 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 -10e-5,-20.41771 16.5823,-37.0000004 37,-37.0000004 z" + id="path2664" /> + <g + transform="translate(705.44117,-218.9829)" + style="fill:#00ffff;stroke:#ffffff" + id="g2666"> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 378.53666,218.814 -6.22099,11.28987 1.97176,0 0,18.4037 8.49847,0 0,-18.4037 1.95647,0 -6.20571,-11.28987 z" + id="path2668" /> + <path + id="path2670" + d="m 378.53666,288.85884 -6.22099,-11.28987 1.97176,0 0,-18.4037 8.49847,0 0,18.4037 1.95647,0 -6.20571,11.28987 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + id="path2672" + d="m 343.41044,253.56675 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 413.45528,253.56675 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + id="path2674" /> + </g> + </g> + </g> + <g + id="g3496" + transform="translate(657.32073,-89.394509)"> + <g + id="g3795" + transform="translate(-87.70399,-526.32022)"> + <path + id="path3797" + d="m 607.23277,879.49528 55.44283,-27.72141 55.44282,27.72141 -55.44282,27.72142 -55.44283,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path3799" + d="m 607.23277,879.49528 0,83.16424 55.44283,27.72141 0,-83.16423 -55.44283,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path3801" + d="m 662.6756,990.38093 55.44282,-27.72141 0,-83.16424 -55.44282,27.72142 0,83.16423 z" + style="fill:url(#linearGradient89627);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path3803" + d="m 634.81813,937.76977 22.17713,11.08857 0,24.94927 -22.17713,-11.08856 0,-24.94928 z" + style="fill:url(#radialGradient89629);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 633.56811,935.45788 0,2.25237 0,24.94927 0,0.86629 0.77967,0.34652 22.17713,11.08857 1.99247,1.03955 0,-2.25237 0,-24.94927 0,-0.86629 -0.77966,-0.34652 -22.17713,-11.08856 -1.99248,-1.03956 z m 2.77214,4.50473 19.40499,9.7025 0,21.83061 -19.40499,-9.70249 0,-21.83062 z" + id="path3805" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 611.39098,891.10362 0,2.25237 0,66.53139 0,0.86629 0.77967,0.34652 5.54428,2.77214 1.99248,1.03955 0,-2.25236 0,-66.53139 0,-0.86629 -0.77967,-0.34652 -5.54428,-2.77214 -1.99248,-1.03956 z m 2.77215,4.50473 2.77214,1.38607 0,63.41273 -2.77214,-1.38607 0,-63.41273 z" + id="path3807" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 621.09348,895.26184 0,69.65004 8.31642,4.15822 0,-69.65005 -8.31642,-4.15821 z" + id="path3809" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 633.56811,899.42005 0,2.25236 0,27.72141 0,0.8663 0.77967,0.34652 11.08856,5.54428 1.99248,1.03955 0,-2.25236 0,-27.72141 0,-0.8663 -0.77966,-0.34652 -11.08857,-5.54428 -1.99248,-1.03955 z m 2.77214,4.50473 8.31643,4.15821 0,24.60275 -8.31643,-4.15821 0,-24.60275 z" + id="path3811" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 650.20096,907.73647 0,2.25237 0,30.49355 0,0.86629 0.77967,0.34652 5.54428,2.77214 1.99247,1.03956 0,-2.25237 0,-30.49355 0,-0.8663 -0.77966,-0.34651 -5.54428,-2.77215 -1.99248,-1.03955 z m 2.77214,4.50473 2.77214,1.38607 0,27.3749 -2.77214,-1.38607 0,-27.3749 z" + id="path3813" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 662.6756,850.21454 -0.60641,0.34652 -55.44282,27.72141 -0.77967,0.34652 0,0.86629 0,83.16424 0,0.86629 0.77967,0.34652 55.44282,27.72141 0.60641,0.34652 0.6064,-0.34652 55.44283,-27.72141 0.77966,-0.34652 0,-0.86629 0,-83.16424 0,-0.86629 -0.77966,-0.34652 -55.44283,-27.72141 -0.6064,-0.34652 z m 0,3.11866 54.05675,27.02838 0,81.43165 -54.05675,27.02837 -54.05676,-27.02837 0,-81.43165 54.05676,-27.02838 z" + id="path3815" /> + <rect + transform="matrix(0.8944272,-0.4472136,0,1,0,0)" + ry="0" + rx="0" + y="1269.7253" + x="747.37006" + height="45.980042" + width="47.62381" + id="rect3817" + style="opacity:0.5;fill:url(#pattern118687);fill-opacity:1;stroke:none" /> + </g> + <g + transform="matrix(0.6363961,0.3181981,-0.6363961,0.3181981,58.04311,-123.34555)" + id="g3887"> + <path + id="path3889" + d="m 1116.1606,302.26602 0,78.90625 78.9062,0 0,-78.90625 -78.9062,0 z m 39.4687,2.46875 c 20.4177,0 37,16.5823 37,37 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 0,-20.41771 16.5823,-37 37,-37 z" + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" /> + <path + style="fill:#00ffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.05110741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 1134.6137,320.71915 42,0 -14,21 14,21 -42,0 14,-21 -14,-21 z" + id="path3891" + sodipodi:nodetypes="ccccccc" /> + </g> + </g> + <g + id="g3513" + transform="translate(939.10013,-77.263449)"> + <g + id="g3767" + transform="translate(-369.48339,-385.43051)"> + <path + id="path3769" + d="m 607.23277,879.49528 55.44283,-27.72141 55.44282,27.72141 -55.44282,27.72142 -55.44283,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path3771" + d="m 607.23277,879.49528 0,83.16424 55.44283,27.72141 0,-83.16423 -55.44283,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path3773" + d="m 662.6756,990.38093 55.44282,-27.72141 0,-83.16424 -55.44282,27.72142 0,83.16423 z" + style="fill:url(#linearGradient89631);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path3775" + d="m 634.81813,937.76977 22.17713,11.08857 0,24.94927 -22.17713,-11.08856 0,-24.94928 z" + style="fill:url(#radialGradient89633);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 633.56811,935.45788 0,2.25237 0,24.94927 0,0.86629 0.77967,0.34652 22.17713,11.08857 1.99247,1.03955 0,-2.25237 0,-24.94927 0,-0.86629 -0.77966,-0.34652 -22.17713,-11.08856 -1.99248,-1.03956 z m 2.77214,4.50473 19.40499,9.7025 0,21.83061 -19.40499,-9.70249 0,-21.83062 z" + id="path3777" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 611.39098,891.10362 0,2.25237 0,66.53139 0,0.86629 0.77967,0.34652 5.54428,2.77214 1.99248,1.03955 0,-2.25236 0,-66.53139 0,-0.86629 -0.77967,-0.34652 -5.54428,-2.77214 -1.99248,-1.03956 z m 2.77215,4.50473 2.77214,1.38607 0,63.41273 -2.77214,-1.38607 0,-63.41273 z" + id="path3779" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 621.09348,895.26184 0,69.65004 8.31642,4.15822 0,-69.65005 -8.31642,-4.15821 z" + id="path3781" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 633.56811,899.42005 0,2.25236 0,27.72141 0,0.8663 0.77967,0.34652 11.08856,5.54428 1.99248,1.03955 0,-2.25236 0,-27.72141 0,-0.8663 -0.77966,-0.34652 -11.08857,-5.54428 -1.99248,-1.03955 z m 2.77214,4.50473 8.31643,4.15821 0,24.60275 -8.31643,-4.15821 0,-24.60275 z" + id="path3783" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 650.20096,907.73647 0,2.25237 0,30.49355 0,0.86629 0.77967,0.34652 5.54428,2.77214 1.99247,1.03956 0,-2.25237 0,-30.49355 0,-0.8663 -0.77966,-0.34651 -5.54428,-2.77215 -1.99248,-1.03955 z m 2.77214,4.50473 2.77214,1.38607 0,27.3749 -2.77214,-1.38607 0,-27.3749 z" + id="path3785" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 662.6756,850.21454 -0.60641,0.34652 -55.44282,27.72141 -0.77967,0.34652 0,0.86629 0,83.16424 0,0.86629 0.77967,0.34652 55.44282,27.72141 0.60641,0.34652 0.6064,-0.34652 55.44283,-27.72141 0.77966,-0.34652 0,-0.86629 0,-83.16424 0,-0.86629 -0.77966,-0.34652 -55.44283,-27.72141 -0.6064,-0.34652 z m 0,3.11866 54.05675,27.02838 0,81.43165 -54.05675,27.02837 -54.05676,-27.02837 0,-81.43165 54.05676,-27.02838 z" + id="path3787" /> + <rect + transform="matrix(0.8944272,-0.4472136,0,1,0,0)" + ry="0" + rx="0" + y="1269.7253" + x="747.37006" + height="45.980042" + width="47.62381" + id="rect3789" + style="opacity:0.5;fill:url(#pattern118687);fill-opacity:1;stroke:none" /> + </g> + <g + transform="matrix(0.6363961,-0.3181981,-0.6363961,-0.3181981,-304.10649,883.79115)" + id="g3863"> + <path + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" + d="m 1042.8959,100.2653 0,78.90625 78.9063,0 0,-78.90625 -78.9063,0 z m 39.4688,2.46875 c 20.4177,0 37,16.5823 37,37 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 0,-20.41771 16.5823,-37 37,-37 z" + id="path3865" /> + <g + id="g3867" + transform="translate(606.95622,-331.6564)" + style="fill:#00ffff;stroke:#ffffff"> + <path + transform="translate(212.65401,-137.99186)" + d="m 256.53294,609.1156 -11.54674,6.66652 -11.54674,6.66651 0,-13.33303 0,-13.33303 11.54674,6.66652 11.54674,6.66651 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="false" + sodipodi:arg2="1.0471976" + sodipodi:arg1="0" + sodipodi:r2="7.6978278" + sodipodi:r1="15.395656" + sodipodi:cy="609.1156" + sodipodi:cx="241.13728" + sodipodi:sides="3" + id="path3869" + style="fill:#00ffff;fill-opacity:1;stroke:#ffffff;stroke-linecap:butt;stroke-linejoin:miter" + sodipodi:type="star" /> + <rect + y="454.18146" + x="471.7662" + height="34.386734" + width="7.6689839" + id="rect3871" + style="fill:#00ffff;fill-opacity:1;stroke:#ffffff;stroke-linecap:butt;stroke-linejoin:miter" /> + <path + sodipodi:type="star" + style="fill:#00ffff;fill-opacity:1;stroke:#ffffff;stroke-linecap:butt;stroke-linejoin:miter" + id="path3873" + sodipodi:sides="3" + sodipodi:cx="241.13728" + sodipodi:cy="609.1156" + sodipodi:r1="15.395656" + sodipodi:r2="7.6978278" + sodipodi:arg1="0" + sodipodi:arg2="1.0471976" + inkscape:flatsided="false" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 256.53294,609.1156 -11.54674,6.66652 -11.54674,6.66651 0,-13.33303 0,-13.33303 11.54674,6.66652 11.54674,6.66651 z" + transform="matrix(-1,0,0,1,738.13162,-137.99186)" /> + </g> + </g> + </g> + <g + id="g3279" + transform="translate(1134.8215,-530.82304)"> + <g + id="g118255" + inkscape:label="Calque 1" + transform="matrix(6.5383417,0,0,6.5383417,488.78696,875.42775)"> + <path + id="path118257" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path118259" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path118261" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g118263" + transform="translate(-68.205597,-63.743549)"> + <path + id="path118265" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path118267" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path118269" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path118271" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + style="fill:url(#radialGradient89635);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + <g + transform="matrix(0.6363961,-0.3181981,-0.6363961,-0.3181981,-338.72869,1082.8342)" + id="g3697"> + <path + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" + d="m 1081.1367,402.39569 0,78.90625 78.9062,0 0,-78.90625 -78.9062,0 z m 39.4687,2.46875 c 20.4177,0 37,16.5823 37,37 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 0,-20.41771 16.5823,-37 37,-37 z" + id="path3699" /> + <g + id="g3701" + transform="translate(456.4439,-26.889185)" + style="fill:#00ffff;stroke:#ffffff"> + <path + id="path3703" + d="m 660.00267,458.32498 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 668.28911,465.32717 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + id="path3705" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 660.00267,472.20199 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + id="path3707" /> + <path + id="path3709" + d="m 668.28911,479.13574 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + </g> + </g> + <g + id="g4812" + transform="translate(467.27411,-273.27841)"> + <g + id="g118275" + inkscape:label="Calque 1" + transform="matrix(6.5383417,0,0,6.5383417,1162.7579,726.53635)"> + <path + id="path118277" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path118279" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path118281" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g118283" + transform="translate(-68.205597,-63.743549)"> + <path + id="path118285" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path118287" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path118289" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path118291" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + style="fill:url(#radialGradient89637);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + <g + id="g2734" + transform="matrix(0.6363961,0.3181981,-0.6363961,0.3181981,415.57747,-87.876339)"> + <g + transform="translate(-61.737701,14.763031)" + id="g2736"> + <path + id="path2738" + d="m 1160.246,537.14905 6.221,-11.2899 -1.9718,0 0,-18.4037 -8.4984,0 0,18.4037 -1.9565,0 6.2057,11.2899 z" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#00ffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 1159.9433,537.34735 -12.8878,0.2574 0.9859,1.7076 -15.9381,9.2019 4.2493,7.3599 15.938,-9.2019 0.9783,1.6943 6.6744,-11.0192 z" + id="path2740" /> + <path + id="path2742" + d="m 1188.3639,552.93325 -12.8878,-0.2574 0.9859,-1.7076 -15.9381,-9.2019 4.2493,-7.3599 15.938,9.2019 0.9783,-1.6944 6.6744,11.0193 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <path + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" + d="m 1059.0428,506.87882 0,78.90625 78.9062,0 0,-78.90625 -78.9062,0 z m 39.4687,2.46875 c 20.4177,0 37,16.5823 37,37 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 0,-20.41771 16.5823,-37 37,-37 z" + id="path2744" /> + </g> + </g> + <text + id="text19149" + y="-154.39288" + x="1289.1212" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + id="tspan19151" + y="-154.39288" + x="1289.1212" + sodipodi:role="line" + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold">ROUTER</tspan><tspan + y="-136.89288" + x="1289.1212" + sodipodi:role="line" + id="tspan19153" + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="1305.3099" + y="60.111889" + id="text19097"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="1305.3099" + y="60.111889" + id="tspan19099">SWITCH</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19101" + sodipodi:role="line" + x="1305.3099" + y="77.611893">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="1305.3099" + y="168.75134" + id="text19103"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="1305.3099" + y="168.75134" + id="tspan19105">KVM SWITCH</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19107" + sodipodi:role="line" + x="1305.3099" + y="186.25134">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="1289.6263" + y="-61.736378" + id="text19109"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="1289.6263" + y="-61.736378" + id="tspan19111">VPN-GW</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19113" + sodipodi:role="line" + x="1289.6263" + y="-44.236378">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="1311.0073" + y="303.39124" + id="text19115"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="1311.0073" + y="303.39124" + id="tspan19117">BALANCER</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19119" + sodipodi:role="line" + x="1311.0073" + y="320.89124">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="1309.1835" + y="447.4747" + id="text19121"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="1309.1835" + y="447.4747" + id="tspan19123">FIREWALL</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19125" + sodipodi:role="line" + x="1309.1835" + y="464.9747">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="1289.1212" + y="554.26849" + id="text19127"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="1289.1212" + y="554.26849" + id="tspan19129">CARP (virtual IP)</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19131" + sodipodi:role="line" + x="1289.1212" + y="571.76849">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="1325.7358" + y="677.34473" + id="text19133"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="1325.7358" + y="677.34473" + id="tspan19135">CABLE connection</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19137" + sodipodi:role="line" + x="1325.7358" + y="694.84473">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="1330.007" + y="816.90076" + id="text19139"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19143" + sodipodi:role="line" + x="1330.007" + y="816.90076">rfIBER connection</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="1330.007" + y="834.40076" + id="tspan19147">IP: 192.168.12.10</tspan></text> + <path + style="fill:none;stroke:#808080;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 1183.0041,712.7976 139.0826,-70.8662" + id="path3533" /> + <path + style="fill:none;stroke:#808080;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 1182.0512,641.4459 139.0826,70.8661" + id="path3535" /> + <g + id="g8726" + transform="translate(862.38433,-1019.7849)"> + <g + id="g7342" + inkscape:label="Calque 1" + transform="matrix(6.5383417,0,0,6.5383417,753.88482,1246.3598)"> + <path + id="path7344" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path7346" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path7348" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g7350" + transform="translate(-68.205597,-63.743549)"> + <path + id="path7352" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path7354" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path7356" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path7358" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + style="fill:url(#radialGradient89639);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + <g + transform="matrix(0.6363961,0.3181981,-0.6363961,0.3181981,-171.20316,533.51496)" + id="g7524"> + <path + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" + d="m 1039.327,209.10189 0,78.90626 78.9063,0 0,-78.90626 -78.9063,0 z m 39.4688,2.46876 c 20.4177,0 37,16.5823 37,37 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 0,-20.41771 16.5823,-37 37,-37 z" + id="path7526" /> + <g + id="g7528" + transform="translate(-56.606987,6.6461916)"> + <g + id="g7530" + style="fill:#00ffff;stroke:#ffffff" + transform="matrix(0.7071068,-0.7071068,0.7071068,0.7071068,688.36387,330.14386)"> + <path + id="path7532" + d="m 378.53666,218.814 -6.22099,11.28987 1.97176,0 0,18.4037 8.49847,0 0,-18.4037 1.95647,0 -6.20571,-11.28987 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 378.53666,288.85884 -6.22099,-11.28987 1.97176,0 0,-18.4037 8.49847,0 0,18.4037 1.95647,0 -6.20571,11.28987 z" + id="path7534" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 343.41044,253.56675 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + id="path7536" /> + <path + id="path7538" + d="m 413.45528,253.56675 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <path + id="path7540" + d="m 1115.6726,231.44138 10.3619,10.36186 -9.9045,9.90444" + style="fill:none;stroke:#00ffff;stroke-width:0.99300444;stroke-linecap:butt;stroke-linejoin:miter" /> + <path + style="fill:none;stroke:#00ffff;stroke-width:0.99300444;stroke-linecap:butt;stroke-linejoin:miter" + d="m 1155.0496,231.44138 -10.3618,10.36186 9.9044,9.90444" + id="path7542" /> + <g + transform="matrix(0,-1,1,0,1020.0499,767.50988)" + id="g7544" + style="fill:none;stroke:#00ffff"> + <path + id="path7546" + d="m 506.40857,105.24507 10.36186,10.36186 -9.90443,9.90444" + style="fill:none;stroke:#00ffff;stroke-width:0.99300444;stroke-linecap:butt;stroke-linejoin:miter" /> + <path + style="fill:none;stroke:#00ffff;stroke-width:0.99300444;stroke-linecap:butt;stroke-linejoin:miter" + d="m 545.78557,105.24507 -10.36186,10.36186 9.90443,9.90444" + id="path7548" /> + </g> + </g> + </g> + </g> + <path + id="path6475" + d="m 1190.2296,787.3453 139.0827,70.86613" + style="fill:none;stroke:#808080;stroke-width:10;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:20, 20;stroke-dashoffset:0" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#808080;stroke-width:10;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:20, 20;stroke-dashoffset:0" + d="M 1190.9453,858.57613 1330.028,787.71" + id="path19085" + sodipodi:nodetypes="cc" /> + <g + transform="translate(-649.56327,-378.70234)" + id="layer1-9" + inkscape:label="Livello 1"> + <g + transform="translate(-1074.1299,601.25107)" + id="g3925"> + <g + id="g108584" + transform="translate(59.882331,-420.31793)"> + <g + id="g92198"> + <path + id="path5361" + d="m 1005.3987,644.36812 55.4428,-27.72141 55.4429,27.72141 -55.4429,27.72142 -55.4428,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path5363" + d="m 1005.3987,644.36812 0,83.16424 55.4428,27.72141 0,-83.16423 -55.4428,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path5365" + d="m 1060.8415,755.25377 55.4429,-27.72141 0,-83.16424 -55.4429,27.72142 0,83.16423 z" + style="fill:url(#linearGradient89641);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 1060.8415,615.08738 -0.6064,0.34652 -55.4428,27.72141 -0.7797,0.34652 0,0.86629 0,83.16424 0,0.86629 0.7797,0.34652 55.4428,27.72141 0.6064,0.34652 0.6064,-0.34652 55.4429,-27.72141 0.7796,-0.34652 0,-0.86629 0,-83.16424 0,-0.86629 -0.7796,-0.34652 -55.4429,-27.72141 -0.6064,-0.34652 z m 0,3.11866 54.0568,27.02838 0,81.43165 -54.0568,27.02837 -54.0567,-27.02837 0,-81.43165 54.0567,-27.02838 z" + id="path5391" /> + <path + style="fill:url(#pattern6042);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1010.0335,651.21095 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4979" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#pattern6040);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1022.9003,658.59748 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4981" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#pattern6038);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1035.7672,665.26918 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4983" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 1048.3958,671.70261 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4985" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path4977" + d="m 1048.3958,671.70261 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6036);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4987" + d="m 1010.0335,689.81151 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6034);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4989" + d="m 1022.9003,697.19804 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6032);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4991" + d="m 1035.7672,703.86974 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6030);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:url(#pattern6028);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1048.3958,710.30317 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4993" + sodipodi:nodetypes="ccccc" /> + </g> + </g> + <g + transform="matrix(0.4481573,-0.2240787,0,0.6402247,1001.8024,-178.48439)" + id="g108970"> + <path + d="m 314.09476,861.04125 c -1.56438,0.834 -3.6901,0.50384 -4.68956,-1.58568 -0.84011,-1.93879 -15.12073,-31.80949 -15.51636,-32.75301 -1.17184,-2.57186 -0.21709,-4.29384 1.44804,-5.1975 2.29126,-1.26473 21.81453,-11.77888 23.51292,-12.64626 1.86955,-1.02115 3.89506,-0.88867 5.13133,1.65883 0.9779,2.05018 14.86956,31.16397 15.69988,32.85344 0.87451,1.81637 0.0508,3.97006 -1.72579,4.83701 -1.32383,0.66683 -22.9908,12.34832 -23.86046,12.83317 z" + id="path108972" + style="font-size:12px;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.74380612" /> + <path + d="m 314.23273,847.2469 c -1.75078,-0.007 -3.50603,-1.32081 -3.50687,-3.66398 0.0771,-2.13226 0.0716,-35.62533 0.12093,-36.65668 0.051,-2.85603 1.63653,-3.93391 3.50687,-3.94111 2.5827,-0.0289 24.47747,-0.0411 26.36202,0 2.10274,-0.0139 3.85286,1.07587 3.8697,3.94111 -0.002,2.29773 -0.0205,34.9291 -2e-5,36.8343 0.006,2.03958 -1.64681,3.56538 -3.60097,3.48636 -1.46498,-0.0403 -25.76932,-0.0153 -26.75166,0 z" + id="path108974" + style="font-size:12px;fill:#ffffeb;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.743806" /> + <path + d="m 322.93888,855.54573 c -1.47013,-1.00866 -2.27836,-3.12041 -1.08622,-5.09293 1.15034,-1.7504 18.19628,-29.94194 18.7628,-30.78168 1.49688,-2.37446 3.37999,-2.37319 4.95778,-1.30763 2.18836,1.45544 20.62163,13.98988 22.18679,15.10424 1.77679,1.19305 2.69491,3.113 1.25047,5.53408 -1.17108,1.93287 -17.79882,29.38525 -18.75145,31.00043 -1.03344,1.71987 -3.20105,2.05714 -4.80547,0.87102 -1.21244,-0.8733 -21.68017,-14.77752 -22.5147,-15.32753 z" + id="path108976" + style="font-size:12px;fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.743806" /> + </g> + </g> + <g + transform="translate(-643.1028,19.368173)" + id="g3299"> + <g + transform="translate(466.84383,64.105478)" + id="g117221"> + <g + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)" + inkscape:label="Calque 1" + id="g117223"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path117225" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path117227" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path117229" /> + <g + id="g117231"> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 2,11 22,1 42,11 22,21 2,11 z" + id="path117233" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 2,11 2,41 22,51 22,21 2,11 z" + id="path117235" /> + <path + style="fill:url(#linearGradient89643);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,51 42,41 42,11 22,21 22,51 z" + id="path117237" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path117239" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117241" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117243" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117245" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117247" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117249" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117251" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:url(#radialGradient89645);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + id="path117253" + sodipodi:nodetypes="ccccc" /> + <path + id="path117255" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117257" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117259" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117261" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117263" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117265" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + </g> + <g + id="g108978" + transform="matrix(0.08706124,-0.04353062,0,0.1242649,704.11524,-22.263442)" + inkscape:export-filename="/home/maidis/Belgeler/goreseeel/inkscape/dunya/dunya.png" + inkscape:export-xdpi="114.54683" + inkscape:export-ydpi="114.54683"> + <path + transform="translate(-56.33397,20.961477)" + d="m 399.57816,1737.5405 a 199.13403,199.13403 0 1 1 -398.2680709,0 199.13403,199.13403 0 1 1 398.2680709,0 z" + sodipodi:ry="199.13403" + sodipodi:rx="199.13403" + sodipodi:cy="1737.5405" + sodipodi:cx="200.44412" + id="path108980" + style="fill:url(#radialGradient89647);fill-opacity:1;fill-rule:evenodd;stroke:none" + sodipodi:type="arc" /> + <path + style="opacity:0.36909102;fill:#000000;fill-opacity:1;filter:url(#filter3267)" + d="m 107.6879,1950.8501 c 0.77589,-0.7759 1.93006,-1.5838 2.56481,-1.7954 0.83388,-0.278 0.76947,-1.0049 -0.23214,-2.6198 -1.16233,-1.8741 -1.16774,-2.3711 -0.0336,-3.0771 1.14186,-0.7107 9.35283,-3.495 13.99054,-4.744 2.25888,-0.6084 0.3076,-10.0936 -3.62263,-17.6097 -3.37859,-6.4612 -3.47822,-6.9424 -2.27769,-11 0.95216,-3.2182 3.33527,-6.2611 9.86486,-12.596 4.73517,-4.594 10.95061,-9.8503 13.81207,-11.6808 10.6188,-6.7928 26.83325,-30.4592 26.18992,-38.2265 -0.30594,-3.6937 -0.35923,-3.7369 -4.30977,-3.4882 -4.05103,0.255 -6.44608,0.7935 -16.68187,3.7502 -4.303,1.243 -6.17821,1.3757 -7.72709,0.5467 -2.38044,-1.2739 -4.09104,-4.1187 -4.09104,-6.8034 0,-1.0779 -4.92806,-6.7724 -11.49999,-13.2886 -6.325,-6.2713 -11.5,-12.2244 -11.5,-13.2292 0,-2.3414 -2.55047,-7.278 -5.05318,-9.7807 -1.33367,-1.3336 -1.94682,-3.3198 -1.94682,-6.3063 0,-2.792 -1.04376,-6.4776 -2.90275,-10.25 -4.198162,-8.5192 -7.097252,-15.2155 -7.097252,-16.3932 0,-0.5634 -0.39883,-1.8058 -0.88629,-2.7609 -1.56863,-3.0732 -4.04953,-12.5312 -3.51423,-13.3973 0.70961,-1.1482 6.12149,-1.0588 8.35786,0.1381 1.902442,1.0181 5.506412,6.6462 10.260352,16.0228 1.53367,3.025 3.89943,7.525 5.25723,10 1.35781,2.475 2.48142,5.9818 2.49691,7.7929 0.021,2.4577 1.11586,4.4865 4.31723,8 2.35898,2.5889 5.62148,6.6791 7.25,9.0893 1.6285,2.4103 3.76361,5.5603 4.74466,7 0.98596,1.447 1.59117,3.7072 1.35319,5.0535 -0.2368,1.3395 0.37786,4.2645 1.36591,6.5 0.98805,2.2354 2.28197,5.3018 2.87537,6.8143 1.19523,3.0465 3.22064,3.5408 5.1218,1.25 0.68469,-0.825 2.87729,-1.5143 4.87244,-1.5318 1.99516,-0.018 4.50107,-0.6925 5.56869,-1.5 1.06762,-0.8075 2.72059,-1.4682 3.67327,-1.4682 0.95268,0 3.00799,-1.0735 4.56735,-2.3857 1.55936,-1.3121 4.48267,-3.074 6.49624,-3.9153 2.01356,-0.8413 4.16229,-2.4663 4.77495,-3.6111 1.17971,-2.2043 7.89828,-6.0879 10.53197,-6.0879 0.86053,0 2.00887,-1.1685 2.55188,-2.5968 0.54301,-1.4282 1.86697,-2.8268 2.94213,-3.1079 1.07516,-0.2812 2.22522,-1.3631 2.55569,-2.4043 0.33046,-1.0412 1.47036,-2.3585 2.53311,-2.9272 1.21395,-0.6497 1.93228,-2.0908 1.93228,-3.8765 0,-1.5633 0.675,-3.4026 1.5,-4.0873 0.825,-0.6847 1.5,-1.9078 1.5,-2.7181 0,-0.8103 0.7875,-2.8107 1.75,-4.4452 l 1.75,-2.972 -3.5,-2.9054 c -1.925,-1.598 -4.70488,-2.9176 -6.17752,-2.9324 -1.8082,-0.018 -3.49624,-1.073 -5.19917,-3.249 l -2.52165,-3.222 -2.31448,2.1743 c -1.27296,1.1959 -3.98138,2.8708 -6.01871,3.7221 -6.74082,2.8165 -10.76847,1.5969 -10.76847,-3.2607 0,-2.0009 -0.38212,-2.3125 -2.25831,-1.8416 -3.11225,0.7811 -4.12747,-0.098 -6.59154,-5.7087 -1.17363,-2.6723 -3.48753,-6.4004 -5.14201,-8.2848 -4.66439,-5.3124 -3.74468,-11.0358 2.06995,-12.8813 3.58851,-1.1389 6.74265,0.4048 9.77345,4.7833 3.6067,5.2105 6.43358,7.7858 11.72854,10.6849 l 4.08007,2.2339 3.41993,-2.0849 c 4.56278,-2.7816 5.41388,-2.6651 9.36073,1.2818 3.20443,3.2044 3.84486,3.4094 12.73247,4.0757 7.31208,0.5482 10.33882,0.3603 13.84252,-0.8596 7.76987,-2.7051 13.00584,-1.5999 16.7373,3.5329 0.68921,0.9481 2.82671,2.2431 4.75,2.8778 2.86978,0.9471 3.4969,1.6479 3.4969,3.9076 0,1.9195 0.76335,3.162 2.52021,4.1022 2.74129,1.4671 4.05666,0.7592 4.64421,-2.4993 0.1972,-1.0937 1.11485,-2.1342 2.03923,-2.3122 2.25597,-0.4345 4.79637,4.6419 4.79637,9.5844 0,2.1356 0.3084,4.1914 0.6853,4.5683 0.8571,0.8571 3.2793,7.7282 3.2996,9.3599 0.008,0.6665 1.6782,4.7156 3.7109,8.9981 2.0327,4.2824 4.8919,11.3871 6.3538,15.7881 1.6318,4.9127 3.197,8.0019 4.0542,8.0019 0.7679,0 2.4759,-2.25 3.7955,-5 2.0974,-4.3708 2.412,-6.5131 2.5,-17.0248 0.091,-10.8714 0.3165,-12.2992 2.3507,-14.8849 1.2375,-1.573 2.25,-3.2771 2.25,-3.7868 0,-0.5098 1.5027,-4.1616 3.3394,-8.1152 4.7065,-10.131 5.921,-13.6457 6.2076,-17.9639 0.2719,-4.0966 1.8777,-6.7244 4.1091,-6.7244 0.7762,0 2.352,-1.5942 3.5016,-3.5427 1.9927,-3.3774 2.1779,-3.4636 3.9663,-1.8451 1.0318,0.9338 1.876,2.303 1.876,3.0428 0,0.7398 0.9989,2.344 2.2199,3.5649 2.9102,2.9103 5.7801,8.6159 5.7801,11.4916 0,3.0451 1.8103,2.9175 3,-0.2115 1.41,-3.7086 2.7401,-3.0407 3.4851,1.75 1.0325,6.6388 1.4902,7.6967 3.0684,7.0911 0.8204,-0.3148 2.2872,0.468 3.3745,1.801 2.2923,2.8102 2.5502,2.355 4.0227,-7.102 1.1992,-7.7024 0.6753,-12.0756 -2.6273,-21.9299 -2.5953,-7.744 -2.5779,-7.1047 -0.7689,-28.2624 0.5132,-6.0036 0.1849,-9.7739 -1.5239,-17.5 -4.3512,-19.6728 -6.6973,-24.5744 -21.8047,-45.5566 -1.2508,-1.7372 -3.5478,-3.7753 -5.1046,-4.5293 -3.5903,-1.7388 -8.104,-10.6792 -6.3015,-12.4817 1.9739,-1.974 1.3993,-3.3473 -4.3198,-10.3246 -3.025,-3.6904 -5.5,-7.043 -5.5,-7.4501 0,-1.0862 -12.8332,-13.9421 -17.9374,-17.9692 -7.1636,-5.6519 -15.34307,-10.1962 -17.38945,-9.6611 -2.60758,0.6819 -5.71089,-0.6539 -11.13132,-4.7914 -2.54201,-1.9403 -6.06634,-4.2172 -7.83185,-5.0597 -1.7655,-0.8424 -3.98191,-2.8893 -4.92536,-4.5486 -1.05876,-1.8621 -3.4875,-3.7765 -6.34498,-5.0013 -2.85084,-1.2221 -4.69781,-2.8337 -5.17645,-4.0757 -0.71594,-1.8577 -8.09791,-4.869 -11.89442,-5.8985 -1.20523,-0.3268 -3.31852,-1.3764 -6.54076,-1.969 -4.79856,-0.8825 -7.01314,-1.5652 -9.57053,2.0361 -0.69332,0.9762 -2.03244,1.543 -3.02968,1.2822 -2.44281,-0.6388 -7.22782,1.2995 -7.22782,2.9278 0,2.0346 -17.517,1.298 -21.61488,-0.9089 -4.24326,-2.2851 -6.84093,-1.2335 -5.91417,2.3943 0.38465,1.5056 0.67509,4.0268 0.64544,5.6025 -0.0315,1.675 0.76033,3.5441 1.90637,4.5 2.15854,1.8004 3.03035,5.35 1.50677,6.135 -0.53375,0.275 -1.43388,-0.4 -2.00027,-1.5 -1.97535,-3.8363 -2.67543,-4.5277 -3.84836,-3.8004 -0.64949,0.4027 -4.02134,0.8436 -7.493,0.9797 -5.07768,0.199 -6.90164,0.7435 -9.32672,2.7841 -1.65805,1.3951 -3.63945,2.5366 -4.4031,2.5366 -0.76366,0 -2.92604,1.35 -4.80529,3 -3.87858,3.4055 -4.88637,3.6284 -6.67253,1.4762 -2.17704,-2.6232 0.0615,-5.8592 4.09696,-5.9225 1.88253,-0.029 3.42279,-0.5157 3.42279,-1.0804 0,-0.5647 -1.88264,-2.7276 -4.18364,-4.8064 -3.98267,-3.5981 -4.36698,-3.7298 -8,-2.74 -2.099,0.5718 -7.64136,3.5531 -12.31636,6.625 -4.675002,3.0719 -9.850002,5.8444 -11.500002,6.161 -4.71239,0.9045 -10.01079,3.917 -12.87421,7.32 -3.3161,3.941 -3.35547,5.3671 -0.12579,4.5565 2.90698,-0.7296 3.03593,-0.1163 1,4.7564 -0.825,1.9745 -1.5,4.0544 -1.5,4.6221 0,2.0989 2.92982,0.9394 5.01074,-1.983 1.18082,-1.6583 3.4013,-3.6637 4.93441,-4.4565 1.78002,-0.9205 3.00512,-2.5297 3.38968,-4.4525 0.56793,-2.8397 1.65427,-3.8022 10.78458,-9.5555 4.741102,-2.9874 8.127312,-4.607 8.614292,-4.12 0.30131,0.3013 -2.25128,3.2446 -5.67243,6.5406 -3.421142,3.296 -5.932932,6.4577 -5.581752,7.0259 0.35118,0.5682 2.18696,1.0331 4.079502,1.0331 2.70949,0 3.44098,0.4024 3.44098,1.893 0,2.0581 -1.85105,3.107 -5.483012,3.107 -1.59078,0 -2.96818,1.0996 -4.38449,3.5 -1.48728,2.5208 -2.76677,3.5 -4.57309,3.5 -1.78318,0 -2.96284,0.8795 -4.08163,3.043 -1.95167,3.7741 -4.67207,4.8597 -11.03119,4.402 -2.72062,-0.1958 -5.95909,-0.376 -7.19659,-0.4005 -1.2375,-0.024 -2.25,-0.6646 -2.25,-1.4225 0,-0.7579 1.0125,-2.065 2.25,-2.9047 1.85148,-1.2562 2.02068,-1.7639 0.95531,-2.8666 -1.07469,-1.1124 -1.83938,-0.7205 -4.5,2.3061 -2.33014,2.6506 -4.27182,3.7993 -7.111414,4.2071 -2.14835,0.3086 -5.07335,1.6562 -6.5,2.9948 -3.72928,3.4991 -15.762709,8.8139 -20.507899,9.0578 -3.91827,0.2014 -4.07511,0.3439 -4.75379,4.3195 -0.85597,5.0141 -2.71282,8.5188 -7.292331,13.764 l -3.49236,4 -5.4924401,-2.948 c -3.02085,-1.6214 -5.67099,-2.7464 -5.88921,-2.5 -0.21823,0.2464 -1.65074,2.473 -3.18337996,4.948 -1.53263004,2.475 -3.80504004,5.4557 -5.04979004,6.6237 -4.01628,3.7688 -6.3523099,9.5568 -5.7299199,14.1971 0.5506,4.105 0.63068,4.1792 4.5070999,4.1792 3.60786,0 4.62483,-0.6865 11.85036,-8 4.3471,-4.4 8.6747801,-8 9.6170701,-8 0.94229,0 3.00543,-1.2375 4.584771,-2.75 2.28261,-2.186 3.9345,-2.7937 8.05471,-2.963 2.85077,-0.1172 6.53321,-0.3422 8.18321,-0.5 l 3,-0.287 -0.3389,6.5676 c -0.30295,5.8709 -0.06426,6.8941 2.249999,9.6444 1.42389,1.6922 2.5889,3.7993 2.5889,4.6824 0,0.9389 0.8304,1.6056 2,1.6056 1.1,0 2,-0.1474 2,-0.3276 0,-0.1802 -1.125,-3.0962 -2.5,-6.4801 -3.29441,-8.1076 -3.26835,-13.1257 0.08889,-17.1156 3.90509,-4.6409 5.03665,-3.9896 5.71644,3.2901 0.4487,4.805 1.44437,7.7776 4.05876,12.1176 3.40165,5.6469 3.4381,5.8248 2.01812,9.8495 -1.58166,4.4829 -1.08507,8.8379 1.22653,10.7564 0.99587,0.8265 1.27603,2.1579 0.85626,4.0691 -0.79072,3.6001 1.766624,3.943 3.998874,0.5361 1.23365,-1.8828 1.29412,-2.8764 0.33042,-5.4295 -1.9266,-5.1042 -0.0022,-8.0135 5.3495,-8.0874 6.19972,-0.086 6.85621,0.8597 6.85621,9.8724 0,5.7769 0.4102,8.2164 1.57798,9.3841 2.60879,2.6088 5.37735,3.7139 7.56504,3.0195 1.22642,-0.3892 3.41491,0.07 5.37976,1.1276 2.86495,1.5429 3.86285,1.6189 7.38882,0.5624 10.169562,-3.0468 11.677372,5.6177 3.725522,21.4086 -4.008462,7.96 -5.377482,8.7995 -12.831492,7.8686 -3.4681,-0.4332 -8.46374,-0.6813 -11.10143,-0.5514 -5.33869,0.2629 -8.45784,-1.2682 -17.493114,-8.5865 -2.90891,-2.3561 -6.29628,-4.2839 -7.5275,-4.2839 -3.53138,0 -6.68359,2.7622 -6.68359,5.8567 0,5.2961 -4.46372,6.8348 -8.297749,2.8604 -1.21124,-1.2555 -3.43396,-3.0621 -4.93939,-4.0146 -1.50542,-0.9524 -3.67095,-3.5622 -4.81229,-5.7994 -1.14133,-2.2372 -3.37021,-4.8109 -4.95307,-5.7193 -1.58286,-0.9084 -3.528981,-3.3091 -4.324721,-5.3349 -1.35769,-3.4563 -1.3017,-3.9192 0.909,-7.516 3.002541,-4.8851 3.213291,-10.837 0.436331,-12.3232 -1.090041,-0.5834 -3.677541,-1.0064 -5.750001,-0.9401 -2.07246,0.066 -5.9234901,-0.4125 -8.5578501,-1.064 -3.30664,-0.8177 -5.17463996,-0.8651 -6.03277,-0.1529 -3.23662,2.6862 -6.41105,3.038 -10.0093699,1.1094 l -3.55303,-1.9043 -5.16991,3.4791 c -5.82709,3.9213 -7.69353,6.0397 -10.92034,12.394 -2.30392,4.537 -5.6027,7.9766 -7.70675,8.0358 -1.76858,0.05 -6.76115,7.4047 -10.88041,16.0287 -0.91827,1.9225 -2.28091,7.9975 -3.02809,13.5 -0.74718,5.5025 -2.210357,13.1203 -2.3149,17.0046 -0.449746,16.7105 2.267313,37.0861 9.19604,52.3382 3.85806,8.4927 4.52186,9.6202 9.2849,12.667 2.86207,1.8309 5.50496,3.8162 5.87309,4.4118 0.36812,0.5957 2.50807,1.083 4.75544,1.083 5.69166,0 11.64921,3.9919 15.05121,10.0852 2.0388499,3.6517 3.9429299,5.4883 7.6237099,7.3535 6.12073,3.1017 9.17306,8.6963 9.54232,17.4905 0.13725,3.2684 0.88608,6.8404 1.66407,7.9376 0.77799,1.0973 4.7895301,6.3461 8.9145301,11.6642 11.621791,14.983 20.000001,27.5178 20.000001,29.9225 0,5.1292 11.240759,14.3909 29.035233,23.9234 5.99985,3.2141 12.53494,5.6086 22,8.0607 15.084362,3.908 17.496152,4.1739 19.518342,2.1517 z m 46.4917,-239.0347 c -0.76234,-0.9186 -2.88439,-2.2962 -4.71567,-3.0613 -3.72472,-1.5563 -4.09671,-3.452 -2.25,-11.4664 0.80507,-3.4938 0.74001,-4.6979 -0.29719,-5.5 -3.43088,-2.6532 -8.78242,-10.4656 -8.78242,-12.8209 0,-1.4234 -0.45,-2.8661 -1,-3.206 -2.33005,-1.44 -0.72695,-5.0203 4.49408,-10.0369 4.26272,-4.0958 5.99968,-5.1559 7.75,-4.73 5.88115,1.4311 8.09926,8.4255 3.25592,10.2669 -1.375,0.5228 -2.48213,1.5242 -2.46029,2.2253 0.0582,1.8686 8.19011,10.3955 10.66231,11.1801 1.16548,0.3699 2.90196,1.8675 3.85883,3.3278 1.68361,2.5695 1.67035,2.7013 -0.41054,4.083 -2.53059,1.6803 -2.722,3.0423 -0.64274,4.5736 1.88123,1.3854 5.04409,13.4586 3.84099,14.6617 -0.48152,0.4815 -3.35988,1.1674 -6.39635,1.5243 -4.47768,0.5263 -5.78277,0.3333 -6.90693,-1.0212 z m -41.83872,-21.2889 c -2.36139,-0.2117 -5.91169,-1.4831 -7.88954,-2.8253 -4.101,-2.783 -6.177632,-2.9432 -11.817012,-0.9115 -5.94779,2.1427 -7.7653,1.8243 -11.48322,-2.0116 l -3.37556,-3.4827 3.27417,-6.5157 c 1.94439,-3.8694 5.12324,-8.1434 7.82689,-10.5232 l 4.55272,-4.0075 3.1025,1.8181 c 1.906,1.1169 3.1025,2.627 3.1025,3.9156 0,3.5824 1.319052,3.6469 2.786512,0.1362 1.77335,-4.2425 3.27971,-5.429 7.96349,-6.273 4.32395,-0.7791 4.81548,0.4538 2.19847,5.5146 -1.83976,3.5577 -1.24596,6.1151 1.8181,7.8304 2.53767,1.4206 9.73343,10.8873 9.73343,12.8053 0,1.937 -3.78353,5.2862 -5.75,5.0899 -0.9625,-0.096 -3.68205,-0.3479 -6.04345,-0.5596 z m 32.18854,260.85 c 2.65143,-1.0405 14.58497,-15.2386 14.5959,-17.3657 0.0125,-2.4361 -1.315,-2.1897 -5.02609,0.933 -1.7537,1.4756 -5.27572,3.2101 -7.82672,3.8544 -4.04232,1.021 -4.68059,1.5435 -4.96827,4.0671 -0.18154,1.5925 -1.24118,3.8747 -2.35477,5.0715 -1.11358,1.1968 -1.72598,2.6593 -1.3609,3.25 0.74917,1.2122 4.10192,1.3038 6.94085,0.1897 z m 143.20592,-116.6623 c 0.5733,-2.2841 -0.0402,-4.437 -0.9603,-3.3701 -1.0142,1.176 -1.558,5.9167 -0.6788,5.9167 0.55,0 1.2876,-1.1459 1.6391,-2.5466 z M 41.716664,1627.6149 c 2.25231,-1.4758 6.41766,-8.361 6.41766,-10.6083 0,-0.4832 -2.7,1.2428 -6,3.8354 -5.669989,4.4546 -6.876789,6.2087 -5.333329,7.7521 1.03526,1.0353 2.193199,0.8046 4.915669,-0.9792 z m -1.58234,-10.8541 c 1.73334,-1.845 1.95566,-2.5 0.84863,-2.5 -0.825,0 -2.556879,1.125 -3.848629,2.5 -1.73334,1.8451 -1.95566,2.5 -0.84863,2.5 0.825,0 2.556879,-1.125 3.848629,-2.5 z m 15.55793,-10.2754 c -0.68187,-0.6819 -6.55793,5.3923 -6.55793,6.779 0,0.4029 1.62915,-0.8039 3.62033,-2.6818 1.99118,-1.878 3.3131,-3.7217 2.9376,-4.0972 z m 20.442074,-22.2246 c 0,-0.55 -0.45,-1 -1,-1 -0.55,0 -1,0.45 -1,1 0,0.55 0.45,1 1,1 0.55,0 1,-0.45 1,-1 z m 71.999992,-2.5 c -0.70675,-0.8516 -1.51,-1.3233 -1.785,-1.0483 -0.275,0.275 0.0782,1.1967 0.785,2.0483 0.70675,0.8516 1.51,1.3233 1.785,1.0483 0.275,-0.275 -0.0782,-1.1967 -0.785,-2.0483 z m -82.499992,-3.6979 c 4.12766,-0.9645 11.1401,-2.0069 25,-3.7163 4.4,-0.5427 10.025002,-1.6393 12.500002,-2.437 2.475,-0.7977 9.7875,-2.693 16.25,-4.2119 6.4625,-1.5188 11.74999,-3.0874 11.74999,-3.4857 0,-1.5373 -6.76833,-1.6613 -12.46055,-0.2283 -3.27831,0.8254 -9.57831,2.0817 -14,2.7919 -24.854212,3.992 -35.670602,6.6915 -44.039442,10.9912 -5.130544,2.636 -5.037054,2.6416 5,0.2961 z" + id="path108982" + sodipodi:nodetypes="csssssssssssssssssssssssssssssssssssssssssssssscccscccssssssscccssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssscccssssssssscccssssssssssssssssssssssssssssssssssscccsssssssssssssssssccsssssssssssssssccssccccccsssssssccssssssccssccsssccsssccssccsssccsssccsssssssc" /> + <path + sodipodi:nodetypes="csssssssssssssssssssssssssssssssssssssssssssssscccscccssssssscccssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssscccssssssssscccssssssssssssssssssssssssssssssssssscccsssssssssssssssssccsssssssssssssssccssccccccsssssssccssssssccssccsssccsssccssccsssccsssccsssssssc" + id="path108984" + d="m 107.6879,1950.8501 c 0.77589,-0.7759 1.93006,-1.5838 2.56481,-1.7954 0.83388,-0.278 0.76947,-1.0049 -0.23214,-2.6198 -1.16233,-1.8741 -1.16774,-2.3711 -0.0336,-3.0771 1.14186,-0.7107 9.35283,-3.495 13.99054,-4.744 2.25888,-0.6084 0.3076,-10.0936 -3.62263,-17.6097 -3.37859,-6.4612 -3.47822,-6.9424 -2.27769,-11 0.95216,-3.2182 3.33527,-6.2611 9.86486,-12.596 4.73517,-4.594 10.95061,-9.8503 13.81207,-11.6808 10.6188,-6.7928 26.83325,-30.4592 26.18992,-38.2265 -0.30594,-3.6937 -0.35923,-3.7369 -4.30977,-3.4882 -4.05103,0.255 -6.44608,0.7935 -16.68187,3.7502 -4.303,1.243 -6.17821,1.3757 -7.72709,0.5467 -2.38044,-1.2739 -4.09104,-4.1187 -4.09104,-6.8034 0,-1.0779 -4.92806,-6.7724 -11.49999,-13.2886 -6.325,-6.2713 -11.5,-12.2244 -11.5,-13.2292 0,-2.3414 -2.55047,-7.278 -5.05318,-9.7807 -1.33367,-1.3336 -1.94682,-3.3198 -1.94682,-6.3063 0,-2.792 -1.04376,-6.4776 -2.90275,-10.25 -4.198162,-8.5192 -7.097252,-15.2155 -7.097252,-16.3932 0,-0.5634 -0.39883,-1.8058 -0.88629,-2.7609 -1.56863,-3.0732 -4.04953,-12.5312 -3.51423,-13.3973 0.70961,-1.1482 6.12149,-1.0588 8.35786,0.1381 1.902442,1.0181 5.506412,6.6462 10.260352,16.0228 1.53367,3.025 3.89943,7.525 5.25723,10 1.35781,2.475 2.48142,5.9818 2.49691,7.7929 0.021,2.4577 1.11586,4.4865 4.31723,8 2.35898,2.5889 5.62148,6.6791 7.25,9.0893 1.6285,2.4103 3.76361,5.5603 4.74466,7 0.98596,1.447 1.59117,3.7072 1.35319,5.0535 -0.2368,1.3395 0.37786,4.2645 1.36591,6.5 0.98805,2.2354 2.28197,5.3018 2.87537,6.8143 1.19523,3.0465 3.22064,3.5408 5.1218,1.25 0.68469,-0.825 2.87729,-1.5143 4.87244,-1.5318 1.99516,-0.018 4.50107,-0.6925 5.56869,-1.5 1.06762,-0.8075 2.72059,-1.4682 3.67327,-1.4682 0.95268,0 3.00799,-1.0735 4.56735,-2.3857 1.55936,-1.3121 4.48267,-3.074 6.49624,-3.9153 2.01356,-0.8413 4.16229,-2.4663 4.77495,-3.6111 1.17971,-2.2043 7.89828,-6.0879 10.53197,-6.0879 0.86053,0 2.00887,-1.1685 2.55188,-2.5968 0.54301,-1.4282 1.86697,-2.8268 2.94213,-3.1079 1.07516,-0.2812 2.22522,-1.3631 2.55569,-2.4043 0.33046,-1.0412 1.47036,-2.3585 2.53311,-2.9272 1.21395,-0.6497 1.93228,-2.0908 1.93228,-3.8765 0,-1.5633 0.675,-3.4026 1.5,-4.0873 0.825,-0.6847 1.5,-1.9078 1.5,-2.7181 0,-0.8103 0.7875,-2.8107 1.75,-4.4452 l 1.75,-2.972 -3.5,-2.9054 c -1.925,-1.598 -4.70488,-2.9176 -6.17752,-2.9324 -1.8082,-0.018 -3.49624,-1.073 -5.19917,-3.249 l -2.52165,-3.222 -2.31448,2.1743 c -1.27296,1.1959 -3.98138,2.8708 -6.01871,3.7221 -6.74082,2.8165 -10.76847,1.5969 -10.76847,-3.2607 0,-2.0009 -0.38212,-2.3125 -2.25831,-1.8416 -3.11225,0.7811 -4.12747,-0.098 -6.59154,-5.7087 -1.17363,-2.6723 -3.48753,-6.4004 -5.14201,-8.2848 -4.66439,-5.3124 -3.74468,-11.0358 2.06995,-12.8813 3.58851,-1.1389 6.74265,0.4048 9.77345,4.7833 3.6067,5.2105 6.43358,7.7858 11.72854,10.6849 l 4.08007,2.2339 3.41993,-2.0849 c 4.56278,-2.7816 5.41388,-2.6651 9.36073,1.2818 3.20443,3.2044 3.84486,3.4094 12.73247,4.0757 7.31208,0.5482 10.33882,0.3603 13.84252,-0.8596 7.76987,-2.7051 13.00584,-1.5999 16.7373,3.5329 0.68921,0.9481 2.82671,2.2431 4.75,2.8778 2.86978,0.9471 3.4969,1.6479 3.4969,3.9076 0,1.9195 0.76335,3.162 2.52021,4.1022 2.74129,1.4671 4.05666,0.7592 4.64421,-2.4993 0.1972,-1.0937 1.11485,-2.1342 2.03923,-2.3122 2.25597,-0.4345 4.79637,4.6419 4.79637,9.5844 0,2.1356 0.3084,4.1914 0.6853,4.5683 0.8571,0.8571 3.2793,7.7282 3.2996,9.3599 0.008,0.6665 1.6782,4.7156 3.7109,8.9981 2.0327,4.2824 4.8919,11.3871 6.3538,15.7881 1.6318,4.9127 3.197,8.0019 4.0542,8.0019 0.7679,0 2.4759,-2.25 3.7955,-5 2.0974,-4.3708 2.412,-6.5131 2.5,-17.0248 0.091,-10.8714 0.3165,-12.2992 2.3507,-14.8849 1.2375,-1.573 2.25,-3.2771 2.25,-3.7868 0,-0.5098 1.5027,-4.1616 3.3394,-8.1152 4.7065,-10.131 5.921,-13.6457 6.2076,-17.9639 0.2719,-4.0966 1.8777,-6.7244 4.1091,-6.7244 0.7762,0 2.352,-1.5942 3.5016,-3.5427 1.9927,-3.3774 2.1779,-3.4636 3.9663,-1.8451 1.0318,0.9338 1.876,2.303 1.876,3.0428 0,0.7398 0.9989,2.344 2.2199,3.5649 2.9102,2.9103 5.7801,8.6159 5.7801,11.4916 0,3.0451 1.8103,2.9175 3,-0.2115 1.41,-3.7086 2.7401,-3.0407 3.4851,1.75 1.0325,6.6388 1.4902,7.6967 3.0684,7.0911 0.8204,-0.3148 2.2872,0.468 3.3745,1.801 2.2923,2.8102 2.5502,2.355 4.0227,-7.102 1.1992,-7.7024 0.6753,-12.0756 -2.6273,-21.9299 -2.5953,-7.744 -2.5779,-7.1047 -0.7689,-28.2624 0.5132,-6.0036 0.1849,-9.7739 -1.5239,-17.5 -4.3512,-19.6728 -6.6973,-24.5744 -21.8047,-45.5566 -1.2508,-1.7372 -3.5478,-3.7753 -5.1046,-4.5293 -3.5903,-1.7388 -8.104,-10.6792 -6.3015,-12.4817 1.9739,-1.974 1.3993,-3.3473 -4.3198,-10.3246 -3.025,-3.6904 -5.5,-7.043 -5.5,-7.4501 0,-1.0862 -12.8332,-13.9421 -17.9374,-17.9692 -7.1636,-5.6519 -15.34307,-10.1962 -17.38945,-9.6611 -2.60758,0.6819 -5.71089,-0.6539 -11.13132,-4.7914 -2.54201,-1.9403 -6.06634,-4.2172 -7.83185,-5.0597 -1.7655,-0.8424 -3.98191,-2.8893 -4.92536,-4.5486 -1.05876,-1.8621 -3.4875,-3.7765 -6.34498,-5.0013 -2.85084,-1.2221 -4.69781,-2.8337 -5.17645,-4.0757 -0.71594,-1.8577 -8.09791,-4.869 -11.89442,-5.8985 -1.20523,-0.3268 -3.31852,-1.3764 -6.54076,-1.969 -4.79856,-0.8825 -7.01314,-1.5652 -9.57053,2.0361 -0.69332,0.9762 -2.03244,1.543 -3.02968,1.2822 -2.44281,-0.6388 -7.22782,1.2995 -7.22782,2.9278 0,2.0346 -17.517,1.298 -21.61488,-0.9089 -4.24326,-2.2851 -6.84093,-1.2335 -5.91417,2.3943 0.38465,1.5056 0.67509,4.0268 0.64544,5.6025 -0.0315,1.675 0.76033,3.5441 1.90637,4.5 2.15854,1.8004 3.03035,5.35 1.50677,6.135 -0.53375,0.275 -1.43388,-0.4 -2.00027,-1.5 -1.97535,-3.8363 -2.67543,-4.5277 -3.84836,-3.8004 -0.64949,0.4027 -4.02134,0.8436 -7.493,0.9797 -5.07768,0.199 -6.90164,0.7435 -9.32672,2.7841 -1.65805,1.3951 -3.63945,2.5366 -4.4031,2.5366 -0.76366,0 -2.92604,1.35 -4.80529,3 -3.87858,3.4055 -4.88637,3.6284 -6.67253,1.4762 -2.17704,-2.6232 0.0615,-5.8592 4.09696,-5.9225 1.88253,-0.029 3.42279,-0.5157 3.42279,-1.0804 0,-0.5647 -1.88264,-2.7276 -4.18364,-4.8064 -3.98267,-3.5981 -4.36698,-3.7298 -8,-2.74 -2.099,0.5718 -7.64136,3.5531 -12.31636,6.625 -4.675002,3.0719 -9.850002,5.8444 -11.500002,6.161 -4.71239,0.9045 -10.01079,3.917 -12.87421,7.32 -3.3161,3.941 -3.35547,5.3671 -0.12579,4.5565 2.90698,-0.7296 3.03593,-0.1163 1,4.7564 -0.825,1.9745 -1.5,4.0544 -1.5,4.6221 0,2.0989 2.92982,0.9394 5.01074,-1.983 1.18082,-1.6583 3.4013,-3.6637 4.93441,-4.4565 1.78002,-0.9205 3.00512,-2.5297 3.38968,-4.4525 0.56793,-2.8397 1.65427,-3.8022 10.78458,-9.5555 4.741102,-2.9874 8.127312,-4.607 8.614292,-4.12 0.30131,0.3013 -2.25128,3.2446 -5.67243,6.5406 -3.421142,3.296 -5.932932,6.4577 -5.581752,7.0259 0.35118,0.5682 2.18696,1.0331 4.079502,1.0331 2.70949,0 3.44098,0.4024 3.44098,1.893 0,2.0581 -1.85105,3.107 -5.483012,3.107 -1.59078,0 -2.96818,1.0996 -4.38449,3.5 -1.48728,2.5208 -2.76677,3.5 -4.57309,3.5 -1.78318,0 -2.96284,0.8795 -4.08163,3.043 -1.95167,3.7741 -4.67207,4.8597 -11.03119,4.402 -2.72062,-0.1958 -5.95909,-0.376 -7.19659,-0.4005 -1.2375,-0.024 -2.25,-0.6646 -2.25,-1.4225 0,-0.7579 1.0125,-2.065 2.25,-2.9047 1.85148,-1.2562 2.02068,-1.7639 0.95531,-2.8666 -1.07469,-1.1124 -1.83938,-0.7205 -4.5,2.3061 -2.33014,2.6506 -4.27182,3.7993 -7.111414,4.2071 -2.14835,0.3086 -5.07335,1.6562 -6.5,2.9948 -3.72928,3.4991 -15.762709,8.8139 -20.507899,9.0578 -3.91827,0.2014 -4.07511,0.3439 -4.75379,4.3195 -0.85597,5.0141 -2.71282,8.5188 -7.292331,13.764 l -3.49236,4 -5.4924401,-2.948 c -3.02085,-1.6214 -5.67099,-2.7464 -5.88921,-2.5 -0.21823,0.2464 -1.65074,2.473 -3.18337996,4.948 -1.53263004,2.475 -3.80504004,5.4557 -5.04979004,6.6237 -4.01628,3.7688 -6.3523099,9.5568 -5.7299199,14.1971 0.5506,4.105 0.63068,4.1792 4.5070999,4.1792 3.60786,0 4.62483,-0.6865 11.85036,-8 4.3471,-4.4 8.6747801,-8 9.6170701,-8 0.94229,0 3.00543,-1.2375 4.584771,-2.75 2.28261,-2.186 3.9345,-2.7937 8.05471,-2.963 2.85077,-0.1172 6.53321,-0.3422 8.18321,-0.5 l 3,-0.287 -0.3389,6.5676 c -0.30295,5.8709 -0.06426,6.8941 2.249999,9.6444 1.42389,1.6922 2.5889,3.7993 2.5889,4.6824 0,0.9389 0.8304,1.6056 2,1.6056 1.1,0 2,-0.1474 2,-0.3276 0,-0.1802 -1.125,-3.0962 -2.5,-6.4801 -3.29441,-8.1076 -3.26835,-13.1257 0.08889,-17.1156 3.90509,-4.6409 5.03665,-3.9896 5.71644,3.2901 0.4487,4.805 1.44437,7.7776 4.05876,12.1176 3.40165,5.6469 3.4381,5.8248 2.01812,9.8495 -1.58166,4.4829 -1.08507,8.8379 1.22653,10.7564 0.99587,0.8265 1.27603,2.1579 0.85626,4.0691 -0.79072,3.6001 1.766624,3.943 3.998874,0.5361 1.23365,-1.8828 1.29412,-2.8764 0.33042,-5.4295 -1.9266,-5.1042 -0.0022,-8.0135 5.3495,-8.0874 6.19972,-0.086 6.85621,0.8597 6.85621,9.8724 0,5.7769 0.4102,8.2164 1.57798,9.3841 2.60879,2.6088 5.37735,3.7139 7.56504,3.0195 1.22642,-0.3892 3.41491,0.07 5.37976,1.1276 2.86495,1.5429 3.86285,1.6189 7.38882,0.5624 10.169562,-3.0468 11.677372,5.6177 3.725522,21.4086 -4.008462,7.96 -5.377482,8.7995 -12.831492,7.8686 -3.4681,-0.4332 -8.46374,-0.6813 -11.10143,-0.5514 -5.33869,0.2629 -8.45784,-1.2682 -17.493114,-8.5865 -2.90891,-2.3561 -6.29628,-4.2839 -7.5275,-4.2839 -3.53138,0 -6.68359,2.7622 -6.68359,5.8567 0,5.2961 -4.46372,6.8348 -8.297749,2.8604 -1.21124,-1.2555 -3.43396,-3.0621 -4.93939,-4.0146 -1.50542,-0.9524 -3.67095,-3.5622 -4.81229,-5.7994 -1.14133,-2.2372 -3.37021,-4.8109 -4.95307,-5.7193 -1.58286,-0.9084 -3.528981,-3.3091 -4.324721,-5.3349 -1.35769,-3.4563 -1.3017,-3.9192 0.909,-7.516 3.002541,-4.8851 3.213291,-10.837 0.436331,-12.3232 -1.090041,-0.5834 -3.677541,-1.0064 -5.750001,-0.9401 -2.07246,0.066 -5.9234901,-0.4125 -8.5578501,-1.064 -3.30664,-0.8177 -5.17463996,-0.8651 -6.03277,-0.1529 -3.23662,2.6862 -6.41105,3.038 -10.0093699,1.1094 l -3.55303,-1.9043 -5.16991,3.4791 c -5.82709,3.9213 -7.69353,6.0397 -10.92034,12.394 -2.30392,4.537 -5.6027,7.9766 -7.70675,8.0358 -1.76858,0.05 -6.76115,7.4047 -10.88041,16.0287 -0.91827,1.9225 -2.28091,7.9975 -3.02809,13.5 -0.74718,5.5025 -2.210357,13.1203 -2.3149,17.0046 -0.449746,16.7105 2.267313,37.0861 9.19604,52.3382 3.85806,8.4927 4.52186,9.6202 9.2849,12.667 2.86207,1.8309 5.50496,3.8162 5.87309,4.4118 0.36812,0.5957 2.50807,1.083 4.75544,1.083 5.69166,0 11.64921,3.9919 15.05121,10.0852 2.0388499,3.6517 3.9429299,5.4883 7.6237099,7.3535 6.12073,3.1017 9.17306,8.6963 9.54232,17.4905 0.13725,3.2684 0.88608,6.8404 1.66407,7.9376 0.77799,1.0973 4.7895301,6.3461 8.9145301,11.6642 11.621791,14.983 20.000001,27.5178 20.000001,29.9225 0,5.1292 11.240759,14.3909 29.035233,23.9234 5.99985,3.2141 12.53494,5.6086 22,8.0607 15.084362,3.908 17.496152,4.1739 19.518342,2.1517 z m 46.4917,-239.0347 c -0.76234,-0.9186 -2.88439,-2.2962 -4.71567,-3.0613 -3.72472,-1.5563 -4.09671,-3.452 -2.25,-11.4664 0.80507,-3.4938 0.74001,-4.6979 -0.29719,-5.5 -3.43088,-2.6532 -8.78242,-10.4656 -8.78242,-12.8209 0,-1.4234 -0.45,-2.8661 -1,-3.206 -2.33005,-1.44 -0.72695,-5.0203 4.49408,-10.0369 4.26272,-4.0958 5.99968,-5.1559 7.75,-4.73 5.88115,1.4311 8.09926,8.4255 3.25592,10.2669 -1.375,0.5228 -2.48213,1.5242 -2.46029,2.2253 0.0582,1.8686 8.19011,10.3955 10.66231,11.1801 1.16548,0.3699 2.90196,1.8675 3.85883,3.3278 1.68361,2.5695 1.67035,2.7013 -0.41054,4.083 -2.53059,1.6803 -2.722,3.0423 -0.64274,4.5736 1.88123,1.3854 5.04409,13.4586 3.84099,14.6617 -0.48152,0.4815 -3.35988,1.1674 -6.39635,1.5243 -4.47768,0.5263 -5.78277,0.3333 -6.90693,-1.0212 z m -41.83872,-21.2889 c -2.36139,-0.2117 -5.91169,-1.4831 -7.88954,-2.8253 -4.101,-2.783 -6.177632,-2.9432 -11.817012,-0.9115 -5.94779,2.1427 -7.7653,1.8243 -11.48322,-2.0116 l -3.37556,-3.4827 3.27417,-6.5157 c 1.94439,-3.8694 5.12324,-8.1434 7.82689,-10.5232 l 4.55272,-4.0075 3.1025,1.8181 c 1.906,1.1169 3.1025,2.627 3.1025,3.9156 0,3.5824 1.319052,3.6469 2.786512,0.1362 1.77335,-4.2425 3.27971,-5.429 7.96349,-6.273 4.32395,-0.7791 4.81548,0.4538 2.19847,5.5146 -1.83976,3.5577 -1.24596,6.1151 1.8181,7.8304 2.53767,1.4206 9.73343,10.8873 9.73343,12.8053 0,1.937 -3.78353,5.2862 -5.75,5.0899 -0.9625,-0.096 -3.68205,-0.3479 -6.04345,-0.5596 z m 32.18854,260.85 c 2.65143,-1.0405 14.58497,-15.2386 14.5959,-17.3657 0.0125,-2.4361 -1.315,-2.1897 -5.02609,0.933 -1.7537,1.4756 -5.27572,3.2101 -7.82672,3.8544 -4.04232,1.021 -4.68059,1.5435 -4.96827,4.0671 -0.18154,1.5925 -1.24118,3.8747 -2.35477,5.0715 -1.11358,1.1968 -1.72598,2.6593 -1.3609,3.25 0.74917,1.2122 4.10192,1.3038 6.94085,0.1897 z m 143.20592,-116.6623 c 0.5733,-2.2841 -0.0402,-4.437 -0.9603,-3.3701 -1.0142,1.176 -1.558,5.9167 -0.6788,5.9167 0.55,0 1.2876,-1.1459 1.6391,-2.5466 z M 41.716664,1627.6149 c 2.25231,-1.4758 6.41766,-8.361 6.41766,-10.6083 0,-0.4832 -2.7,1.2428 -6,3.8354 -5.669989,4.4546 -6.876789,6.2087 -5.333329,7.7521 1.03526,1.0353 2.193199,0.8046 4.915669,-0.9792 z m -1.58234,-10.8541 c 1.73334,-1.845 1.95566,-2.5 0.84863,-2.5 -0.825,0 -2.556879,1.125 -3.848629,2.5 -1.73334,1.8451 -1.95566,2.5 -0.84863,2.5 0.825,0 2.556879,-1.125 3.848629,-2.5 z m 15.55793,-10.2754 c -0.68187,-0.6819 -6.55793,5.3923 -6.55793,6.779 0,0.4029 1.62915,-0.8039 3.62033,-2.6818 1.99118,-1.878 3.3131,-3.7217 2.9376,-4.0972 z m 20.442074,-22.2246 c 0,-0.55 -0.45,-1 -1,-1 -0.55,0 -1,0.45 -1,1 0,0.55 0.45,1 1,1 0.55,0 1,-0.45 1,-1 z m 71.999992,-2.5 c -0.70675,-0.8516 -1.51,-1.3233 -1.785,-1.0483 -0.275,0.275 0.0782,1.1967 0.785,2.0483 0.70675,0.8516 1.51,1.3233 1.785,1.0483 0.275,-0.275 -0.0782,-1.1967 -0.785,-2.0483 z m -82.499992,-3.6979 c 4.12766,-0.9645 11.1401,-2.0069 25,-3.7163 4.4,-0.5427 10.025002,-1.6393 12.500002,-2.437 2.475,-0.7977 9.7875,-2.693 16.25,-4.2119 6.4625,-1.5188 11.74999,-3.0874 11.74999,-3.4857 0,-1.5373 -6.76833,-1.6613 -12.46055,-0.2283 -3.27831,0.8254 -9.57831,2.0817 -14,2.7919 -24.854212,3.992 -35.670602,6.6915 -44.039442,10.9912 -5.130544,2.636 -5.037054,2.6416 5,0.2961 z" + style="fill:url(#radialGradient89649);fill-opacity:1" /> + <path + sodipodi:type="arc" + style="fill:url(#radialGradient89651);fill-opacity:1;fill-rule:evenodd;stroke:none" + id="path108986" + sodipodi:cx="200.44412" + sodipodi:cy="1737.5405" + sodipodi:rx="199.13403" + sodipodi:ry="199.13403" + d="m 399.57816,1737.5405 a 199.13403,199.13403 0 1 1 -398.2680709,0 199.13403,199.13403 0 1 1 398.2680709,0 z" + transform="translate(-57.435743,20.958068)" /> + <path + transform="translate(-57.435743,20.958068)" + d="m 399.57816,1737.5405 a 199.13403,199.13403 0 1 1 -398.2680709,0 199.13403,199.13403 0 1 1 398.2680709,0 z" + sodipodi:ry="199.13403" + sodipodi:rx="199.13403" + sodipodi:cy="1737.5405" + sodipodi:cx="200.44412" + id="path108988" + style="fill:url(#radialGradient89653);fill-opacity:1;fill-rule:evenodd;stroke:none" + sodipodi:type="arc" /> + <path + transform="matrix(-0.957313,-0.2890533,0.2890533,-0.957313,-163.64008,3479.8078)" + style="fill:url(#radialGradient89655);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 399.57816,1737.5405 c 0,109.922 -89.21205,199.1341 -199.13404,199.1341 -109.921984,0 -199.1340309,-89.2121 -199.1340309,-199.1341 0,-109.922 89.2120469,-199.134 199.1340309,-199.134 109.92199,0 199.13404,89.212 199.13404,199.134 z" + id="path108990" /> + <path + transform="matrix(0.9990162,-0.04434574,0.04434574,0.9990162,-71.66061,4.3077244)" + sodipodi:nodetypes="ccc" + id="path108992" + d="m 92.750756,1567.6849 c 94.430094,-18.2974 -110.062425,25.1793 -139.481349,163.0909 -16.895004,-90.4919 85.243172,-139.8951 139.481349,-163.0909 z" + style="opacity:0.56060606;fill:#ffffff;fill-rule:evenodd;stroke:none;filter:url(#filter3197)" /> + </g> + </g> + <g + transform="translate(-628.98887,416.46925)" + id="g3378"> + <g + transform="translate(775.01164,364.10273)" + id="g117471"> + <g + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)" + inkscape:label="Calque 1" + id="g117473"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path117475" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path117477" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path117479" /> + <g + id="g117481"> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 2,11 22,1 42,11 22,21 2,11 z" + id="path117483" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 2,11 2,41 22,51 22,21 2,11 z" + id="path117485" /> + <path + style="fill:url(#linearGradient89657);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,51 42,41 42,11 22,21 22,51 z" + id="path117487" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path117489" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117491" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117493" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117495" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117497" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117499" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117501" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:url(#radialGradient89659);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + id="path117503" + sodipodi:nodetypes="ccccc" /> + <path + id="path117505" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117507" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117509" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117511" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117513" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117515" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + </g> + <g + transform="matrix(0.6608344,-0.3304172,0,0.9440491,868.88814,-184.59906)" + id="g109132"> + <path + transform="matrix(1.896061,0,0,1.896061,-382.19925,74.95322)" + d="m 339.53775,378.05789 a 13.966679,13.966679 0 1 1 -27.93335,0 13.966679,13.966679 0 1 1 27.93335,0 z" + sodipodi:ry="13.966679" + sodipodi:rx="13.966679" + sodipodi:cy="378.05789" + sodipodi:cx="325.57108" + id="path109134" + style="fill:#b4281c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.625;marker:none;visibility:visible;display:inline;overflow:visible" + sodipodi:type="arc" /> + <path + transform="matrix(1.731185,0,0,1.731185,-328.52075,137.28542)" + d="m 339.53775,378.05789 a 13.966679,13.966679 0 1 1 -27.93335,0 13.966679,13.966679 0 1 1 27.93335,0 z" + sodipodi:ry="13.966679" + sodipodi:rx="13.966679" + sodipodi:cy="378.05789" + sodipodi:cx="325.57108" + id="path109136" + style="fill:url(#linearGradient89661);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.32492188;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" + sodipodi:type="arc" /> + <path + id="path109138" + d="m 221.63805,783.36141 c -0.22285,0.22282 -0.18093,0.57323 0.0419,0.79604 l 7.58343,7.58343 -7.62531,7.62533 c -0.22285,0.22283 -0.22285,0.61512 0,0.83795 l 5.02769,5.02769 c 0.22282,0.22284 0.57323,0.18092 0.79604,-0.0419 l 7.62533,-7.62533 7.62533,7.62533 c 0.22283,0.22283 0.57322,0.26469 0.79604,0.0419 l 5.02769,-5.02769 c 0.22285,-0.22283 0.22285,-0.61512 0,-0.83795 l -7.62531,-7.62533 7.62531,-7.62533 c 0.22285,-0.22283 0.22281,-0.53132 0,-0.75414 l -5.02769,-5.02769 c -0.22282,-0.22285 -0.57323,-0.26475 -0.79604,-0.0419 l -7.62533,7.62534 -7.58343,-7.58343 c -0.22282,-0.22285 -0.61512,-0.22285 -0.83794,0 l -5.02769,5.02769 z" + style="fill:url(#linearGradient89663);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.61607176;marker:none;visibility:visible;display:inline;overflow:visible" /> + <path + id="path109140" + d="m 235.08711,767.608 c -13.34675,0 -24.1748,10.82803 -24.17478,24.17478 0,6.41257 2.61694,12.14291 6.69547,16.47203 2.11885,-17.50049 16.88952,-31.10725 34.95862,-31.10725 0.48721,0 0.93961,0.099 1.42205,0.1185 -4.42143,-5.75069 -11.09207,-9.65806 -18.90136,-9.65806 z" + style="fill:url(#linearGradient89665);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.61607176;marker:none;visibility:visible;display:inline;overflow:visible" /> + </g> + </g> + <g + transform="translate(-1073.6433,295.56044)" + id="g3346"> + <g + transform="translate(897.38434,-46.491083)" + id="g117421"> + <g + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)" + inkscape:label="Calque 1" + id="g117423"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path117425" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path117427" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path117429" /> + <g + id="g117431"> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 2,11 22,1 42,11 22,21 2,11 z" + id="path117433" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 2,11 2,41 22,51 22,21 2,11 z" + id="path117435" /> + <path + style="fill:url(#linearGradient89667);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,51 42,41 42,11 22,21 22,51 z" + id="path117437" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path117439" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117441" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117443" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117445" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117447" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117449" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117451" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:url(#radialGradient89669);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + id="path117453" + sodipodi:nodetypes="ccccc" /> + <path + id="path117455" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117457" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117459" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117461" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117463" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117465" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + </g> + <g + style="fill:#00ff00;fill-opacity:1" + transform="matrix(0.2766711,-0.1383356,0,0.2555605,1099.9201,-86.84348)" + id="g109152" + inkscape:label="Calque 1"> + <path + id="path109154" + d="m 174.71965,639.58466 c -29.19719,0 -52.90625,13.34326 -52.90625,29.78125 l 0,119.125 c 0,16.43799 23.70907,29.78125 52.90625,29.78125 29.19719,-10e-6 52.90625,-13.34324 52.90625,-29.78125 l 0,-119.125 -0.0312,0 c 0,-16.43799 -23.67781,-29.78125 -52.875,-29.78125 z" + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + transform="matrix(1.6638767,0,0,1.6225174,-131.61326,-463.20234)" + d="m 214.80157,698.03149 a 30.68594,17.716536 0 1 1 -61.37188,0 30.68594,17.716536 0 1 1 61.37188,0 z" + sodipodi:ry="17.716536" + sodipodi:rx="30.68594" + sodipodi:cy="698.03149" + sodipodi:cx="184.11563" + id="path109156" + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:2.93746948;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="arc" /> + </g> + </g> + <g + transform="translate(23.967614,920.33811)" + id="g3462"> + <g + id="g108629" + transform="translate(134.05913,35.984128)"> + <g + id="g4883" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path4885" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path4887" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path4889" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g4891"> + <path + id="path4893" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path4895" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path4897" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient89671);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path4899" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path4901" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path4903" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path4905" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path4907" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path4909" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path4911" /> + <path + sodipodi:nodetypes="ccccc" + id="path4913" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient89673);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path4915" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path4917" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path4919" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path4921" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path4923" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path4925" /> + </g> + </g> + </g> + <g + transform="translate(15.21711,1.7214477)" + id="g3159"> + <rect + transform="matrix(0.8944272,-0.4472136,0,1,0,0)" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.75346398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect109160" + width="36.695312" + height="35.799278" + x="395.43951" + y="330.15076" + ry="8.8706169" /> + <path + sodipodi:nodetypes="ccccc" + id="path109162" + d="m 372.22665,145.64754 -0.13558,32.8959 -2.71818,1.81754 0,-33.0536 2.85376,-1.65984 z" + style="fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path109164" + d="m 385.06359,155.06606 0.16889,4.18009 -30.14532,15.26938 0.34578,-4.66405 29.63065,-14.78542 z" + style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="cccccccccccccccccccccc" + id="path109166" + d="m 373.89476,146.06666 0.18935,0.85117 2.46154,10.52408 8.33137,-6.09926 0.22711,2.41718 -8.55848,6.65757 -0.94674,0.61318 -0.37871,-1.43183 -1.70413,-7.38993 -2.65089,23.5191 -0.18936,2.39483 -1.32544,-2.17115 -5.68048,-9.30487 -9.13434,3.64409 0.25777,-2.59705 8.68723,-3.52121 0.56805,-0.42199 0.56804,0.93049 4.73373,7.75407 2.84024,-25.91394 0,-0.541 1.70414,0.0865 z" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + <g + transform="translate(-1086.3477,882.01165)" + id="g3408"> + <g + id="g117789" + transform="translate(910.08874,75.719118)"> + <g + id="g117791" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path117793" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path117795" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path117797" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g117799"> + <path + id="path117801" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117803" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117805" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient89675);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path117807" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path117809" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path117811" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path117813" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path117815" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path117817" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path117819" /> + <path + sodipodi:nodetypes="ccccc" + id="path117821" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient89677);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path117823" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path117825" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path117827" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path117829" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path117831" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path117833" /> + </g> + </g> + </g> + <path + id="path117855" + d="m 1162.9818,171.48314 c -0.6741,0.33705 -1.3556,0.72418 -2.0094,1.15981 l -0.1629,0.81846 0,0.34911 0.3259,3.40575 -3.4213,3.02948 -0.9775,-2.84717 -0.1086,-0.25601 -0.3801,-0.31421 c -1.2465,1.38745 -2.403,2.96448 -3.4756,4.64702 l 0.1086,0.64391 0.1086,0.25601 1.5477,2.05781 -2.5252,4.87005 -1.9821,-1.21995 -0.2173,-0.0465 -0.4887,0.0892 c -0.8024,1.93355 -1.5015,3.93523 -2.0365,5.98332 l 0.353,0.36657 0.2172,0.0465 2.3352,0.22887 -0.9232,5.34909 -2.4981,0.78357 -0.2444,0.12218 -0.5159,0.49068 c -0.076,0.97201 -0.1086,1.96181 -0.1086,2.92475 0,0.96297 0.033,1.8815 0.1086,2.77735 l 0.5159,-0.0252 0.2444,-0.12218 2.4981,-1.71451 0.9232,4.46471 -2.3352,2.52521 -0.2172,0.30256 -0.3258,0.70598 c 0.5378,1.51081 1.2313,2.81882 2.0364,3.94685 l 0.4616,-0.38596 0.2173,-0.30256 1.9821,-3.20209 2.5252,2.34484 -1.5477,3.64429 -0.1086,0.36463 -0.1086,0.75251 c 1.0633,0.60459 2.2142,1.00228 3.4484,1.14625 l 0.4073,-0.70792 0.1086,-0.36462 0.9775,-3.78588 3.4213,-0.39177 -0.3259,3.69278 0,0.38789 0.1629,0.61677 c 0.6538,-0.21809 1.3353,-0.51246 2.0094,-0.8495 0.674,-0.33703 1.3284,-0.7106 1.9821,-1.14624 l 0.1629,-0.77967 0,-0.38789 -0.3258,-3.36696 3.4484,-3.04306 0.9504,2.82195 0.1357,0.24244 0.3802,0.3142 c 1.246,-1.39144 2.4039,-2.96071 3.4755,-4.64701 l -0.1086,-0.60513 -0.1358,-0.24243 -1.5477,-2.09659 2.5253,-4.87005 2.0093,1.20636 0.2172,0.0853 0.4616,-0.0756 c 0.8053,-1.93359 1.4986,-3.93425 2.0365,-5.98332 l -0.353,-0.36656 -0.2173,-0.0853 -2.308,-0.20365 0.9232,-5.3879 2.471,-0.76998 0.2715,-0.13576 0.4887,-0.47711 c 0.076,-0.97198 0.1086,-1.92301 0.1086,-2.88597 0,-0.96294 -0.032,-1.92028 -0.1086,-2.81613 l -0.4887,0.0117 -0.2715,0.13576 -2.471,1.70092 -0.9232,-4.4259 2.308,-2.55043 0.2173,-0.26376 0.353,-0.75835 c -0.5328,-1.49679 -1.214,-2.80035 -2.0094,-3.92164 l -0.4887,0.39953 -0.2172,0.26376 -2.0093,3.21568 -2.5253,-2.34484 1.5477,-3.60551 0.1358,-0.37821 0.1086,-0.71372 c -1.0714,-0.61452 -2.2297,-1.02602 -3.4755,-1.17145 l -0.3802,0.65555 -0.1357,0.37819 -0.9504,3.8111 -3.4484,0.40535 0.3258,-3.73157 0,-0.34911 -0.1629,-0.65556 c -0.6537,0.21813 -1.3081,0.4989 -1.9821,0.83593 z m 0,11.13266 c 5.1162,-2.5581 9.2591,1.28891 9.2591,8.59776 0,7.30887 -4.1429,15.33755 -9.2591,17.89564 -5.1162,2.55808 -9.2863,-1.31411 -9.2863,-8.62295 0,-7.30884 4.1701,-15.31235 9.2863,-17.87045 z" + style="fill:url(#linearGradient89679);fill-opacity:1;stroke:#000000;stroke-width:1.03852296" /> + </g> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="129.39964" + y="178.27731" + id="text19155"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="129.39964" + y="178.27731" + id="tspan19157">WEB SERVER</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19159" + sodipodi:role="line" + x="129.39964" + y="195.77731">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="135.7863" + y="337.26468" + id="text19161"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="135.7863" + y="337.26468" + id="tspan19163">DB SERVER</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19165" + sodipodi:role="line" + x="135.7863" + y="354.76468">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="133.80254" + y="510.69449" + id="text19167"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="133.80254" + y="510.69449" + id="tspan19169">MAIL SERVER</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19171" + sodipodi:role="line" + x="133.80254" + y="528.19446">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="139.84511" + y="689.52734" + id="text19173"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="139.84511" + y="689.52734" + id="tspan19175">FTP SERVER</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19177" + sodipodi:role="line" + x="139.84511" + y="707.02734">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="132.80513" + y="864.51697" + id="text19179"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="132.80513" + y="864.51697" + id="tspan19181">DOC SERVER (storage)</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19183" + sodipodi:role="line" + x="132.80513" + y="882.01697">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="136.19527" + y="1045.7178" + id="text19185"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="136.19527" + y="1045.7178" + id="tspan19187">VIRTUAL SERVER</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19189" + sodipodi:role="line" + x="136.19527" + y="1063.2178">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="460.03769" + y="1054.0387" + id="text19191"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="460.03769" + y="1054.0387" + id="tspan19193">MONITOR SERVER</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19195" + sodipodi:role="line" + x="460.03769" + y="1071.5387">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="480.84525" + y="870.1098" + id="text19209"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="480.84525" + y="870.1098" + id="tspan19211">SPARE</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19213" + sodipodi:role="line" + x="480.84525" + y="887.6098">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="477.48007" + y="730.09216" + id="text19215"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="477.48007" + y="730.09216" + id="tspan19217">APP SERVER</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19219" + sodipodi:role="line" + x="477.48007" + y="747.59216">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="451.39609" + y="530.78418" + id="text19221"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="451.39609" + y="530.78418" + id="tspan19223">DW SERVER</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19225" + sodipodi:role="line" + x="451.39609" + y="548.28418">IP: 192.168.12.10</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="451.39609" + y="362.48529" + id="text19227"><tspan + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + sodipodi:role="line" + x="451.39609" + y="362.48529" + id="tspan19229">SMS OPERATORE</tspan><tspan + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold" + id="tspan19231" + sodipodi:role="line" + x="451.39609" + y="379.98529">IP: 192.168.12.10</tspan></text> + <text + id="text19091" + y="201.98724" + x="451.39609" + style="font-size:14px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + id="tspan19093" + y="201.98724" + x="451.39609" + sodipodi:role="line" + style="font-weight:bold;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold">INFO CLIENTE</tspan><tspan + y="219.48724" + x="451.39609" + sodipodi:role="line" + id="tspan19095" + style="font-weight:normal;text-align:start;text-anchor:start;-inkscape-font-specification:Bitstream Vera Sans Bold">IP: 192.168.12.10</tspan></text> + <g + transform="translate(-97.747788,289.40683)" + id="g6894"> + <g + transform="translate(-78.51118,124.89176)" + id="g7145"> + <g + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)" + inkscape:label="Calque 1" + id="g3410"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path3412" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path3414" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path3416" /> + <g + id="g3418"> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 2,11 22,1 42,11 22,21 2,11 z" + id="path3420" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 2,11 2,41 22,51 22,21 2,11 z" + id="path3422" /> + <path + style="fill:url(#linearGradient89681);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,51 42,41 42,11 22,21 22,51 z" + id="path3424" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path3426" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path3428" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path3430" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path3432" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path3434" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path3436" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path3438" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:url(#radialGradient89683);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + id="path3440" + sodipodi:nodetypes="ccccc" /> + <path + id="path3442" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path3444" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path3446" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path3448" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path3450" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path3452" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + </g> + <g + id="g108994" + transform="matrix(0.2668516,-0.1334258,0,0.3812166,147.18815,234.03981)"> + <g + transform="matrix(0.810875,0,0,0.810875,5.90968,-403.3576)" + id="g108996"> + <rect + y="560.36218" + x="30" + width="158" + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3.75;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + ry="3" + rx="3" + id="rect108998" + height="100" /> + <path + style="fill:none;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path109000" + d="m 32,658.36218 76,-56 80,58" /> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path109002" + d="M 31.935135,561.05047 107.7045,621.01804 186,560.39461 31.935135,561.05047 z" /> + </g> + </g> + </g> + <g + transform="translate(461.68849,275.96747)" + id="g6826"> + <g + id="g3466" + transform="translate(-315.66572,-16.46302)"> + <g + id="g3468" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path3470" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path3472" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path3474" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g3476"> + <path + id="path3478" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path3480" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path3482" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient89685);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path3484" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path3486" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path3488" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path3490" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path3492" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path3494" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path3496" /> + <path + sodipodi:nodetypes="ccccc" + id="path3498" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient89687);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path3500" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path3502" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path3504" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path3506" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path3508" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path3510" /> + </g> + </g> + </g> + <g + id="g109004" + v:mID="0" + v:index="1" + v:groupContext="foregroundPage" + transform="matrix(0.3732139,-0.1866069,0,0.5331627,-81.489401,110.20827)"> + <title + id="title109006">P gina-1</title> + <v:pageProperties + v:shadowOffsetY="-8.50394" + v:shadowOffsetX="8.50394" + v:pageScale="0.0393701" + v:drawingUnits="24" + v:drawingScale="0.0393701" /> + <g + v:mID="14" + v:groupContext="shape" + transform="translate(0.24,-0.24)" + id="g109008"> + <title + id="title109010">Hoja.14</title> + <path + id="path109012" + d="m 0,57.17 93.54,0 0,-56.69 -74.83,0 L 0,20.32 0,57.17 z" + class="st1" + style="fill:#ff0000;stroke:#000000;stroke-width:0.23999999;stroke-linecap:round;stroke-linejoin:round" /> + </g> + <g + v:mID="2" + v:groupContext="group" + transform="translate(31.4211,-7.49015)" + id="g109014"> + <title + id="title109016">Hoja.2</title> + <g + v:mID="1" + v:groupContext="shape" + transform="translate(0,-21.5869)" + id="g109018"> + <title + id="title109020">Box</title> + <v:userDefs> + <v:ud + v:val="VT0(11):26" + v:nameU="visVersion" /> + </v:userDefs> + <rect + id="rect109022" + y="47.360699" + x="0" + width="19.6245" + height="9.8122396" + class="st2" + style="fill:#ffff99;stroke:#000000;stroke-width:0.23999999;stroke-linecap:round;stroke-linejoin:round" /> + </g> + <g + v:mID="3" + v:groupContext="shape" + transform="translate(0,-10.7935)" + id="g109024"> + <title + id="title109026">Box.3</title> + <v:userDefs> + <v:ud + v:val="VT0(11):26" + v:nameU="visVersion" /> + </v:userDefs> + <rect + id="rect109028" + y="47.360699" + x="0" + width="19.6245" + height="9.8122396" + class="st2" + style="fill:#ffff99;stroke:#000000;stroke-width:0.23999999;stroke-linecap:round;stroke-linejoin:round" /> + </g> + <g + v:mID="4" + v:groupContext="shape" + transform="translate(0,-32.3804)" + id="g109030"> + <title + id="title109032">Hoja.4</title> + <path + id="path109034" + d="m 0,57.17 19.62,0 0,-9.81 -15.7,0 -3.92,3.43 0,6.38 z" + class="st2" + style="fill:#ffff99;stroke:#000000;stroke-width:0.23999999;stroke-linecap:round;stroke-linejoin:round" /> + </g> + <g + v:mID="5" + v:groupContext="shape" + transform="matrix(1,0,0,-1,0,104.534)" + id="g109036"> + <title + id="title109038">Hoja.5</title> + <path + id="path109040" + d="m 0,57.17 19.62,0 0,-9.81 -15.7,0 -3.92,3.43 0,6.38 z" + class="st2" + style="fill:#ffff99;stroke:#000000;stroke-width:0.23999999;stroke-linecap:round;stroke-linejoin:round" /> + </g> + <g + v:mID="6" + v:groupContext="shape" + transform="translate(20.6057,0)" + id="g109042"> + <title + id="title109044">Box.6</title> + <v:userDefs> + <v:ud + v:val="VT0(11):26" + v:nameU="visVersion" /> + </v:userDefs> + <rect + id="rect109046" + y="14.9803" + x="0" + width="9.8122396" + height="42.1926" + class="st2" + style="fill:#ffff99;stroke:#000000;stroke-width:0.23999999;stroke-linecap:round;stroke-linejoin:round" /> + </g> + <g + v:mID="7" + v:groupContext="shape" + transform="matrix(-1,0,0,-1,51.0236,104.534)" + id="g109048"> + <title + id="title109050">Hoja.7</title> + <path + id="path109052" + d="m 0,57.17 19.62,0 0,-9.81 -15.7,0 -3.92,3.43 0,6.38 z" + class="st2" + style="fill:#ffff99;stroke:#000000;stroke-width:0.23999999;stroke-linecap:round;stroke-linejoin:round" /> + </g> + <g + v:mID="8" + v:groupContext="shape" + transform="matrix(-1,0,0,1,51.0236,-32.3804)" + id="g109054"> + <title + id="title109056">Hoja.8</title> + <path + id="path109058" + d="m 0,57.17 20.61,0 0,-9.81 -16.49,0 -4.12,3.43 0,6.38 z" + class="st2" + style="fill:#ffff99;stroke:#000000;stroke-width:0.23999999;stroke-linecap:round;stroke-linejoin:round" /> + </g> + <g + v:mID="9" + v:groupContext="shape" + transform="translate(31.3992,-10.7935)" + id="g109060"> + <title + id="title109062">Box.9</title> + <v:userDefs> + <v:ud + v:val="VT0(11):26" + v:nameU="visVersion" /> + </v:userDefs> + <rect + id="rect109064" + y="47.360699" + x="0" + width="19.6245" + height="9.8122396" + class="st2" + style="fill:#ffff99;stroke:#000000;stroke-width:0.23999999;stroke-linecap:round;stroke-linejoin:round" /> + </g> + <g + v:mID="10" + v:groupContext="shape" + transform="translate(31.3992,-21.5869)" + id="g109066"> + <title + id="title109068">Box.10</title> + <v:userDefs> + <v:ud + v:val="VT0(11):26" + v:nameU="visVersion" /> + </v:userDefs> + <rect + id="rect109070" + y="47.360699" + x="0" + width="19.6245" + height="9.8122396" + class="st2" + style="fill:#ffff99;stroke:#000000;stroke-width:0.23999999;stroke-linecap:round;stroke-linejoin:round" /> + </g> + <g + v:mID="11" + v:groupContext="shape" + transform="translate(24.5306,-32.3804)" + id="g109072"> + <title + id="title109074">Box.11</title> + <v:userDefs> + <v:ud + v:val="VT0(11):26" + v:nameU="visVersion" /> + </v:userDefs> + <rect + id="rect109076" + y="47.360699" + x="0" + width="8.8310099" + height="9.8122396" + class="st3" + style="fill:#ffff99;stroke:none" /> + </g> + <g + v:mID="12" + v:groupContext="shape" + transform="translate(20.6057,-42.1926)" + id="g109078"> + <title + id="title109080">Hoja.12</title> + <path + id="path109082" + d="m 0,57.17 12.76,0" + class="st4" + style="stroke:#000000;stroke-width:0.23999999;stroke-linecap:round;stroke-linejoin:round" /> + </g> + <g + v:mID="13" + v:groupContext="shape" + transform="translate(30.4179,-32.3804)" + id="g109084"> + <title + id="title109086">Hoja.13</title> + <path + id="path109088" + d="m 0,57.17 20.61,0" + class="st4" + style="stroke:#000000;stroke-width:0.23999999;stroke-linecap:round;stroke-linejoin:round" /> + </g> + </g> + </g> + </g> + <g + transform="translate(-695.86116,680.88905)" + id="g8215"> + <g + id="g117071" + transform="translate(519.60219,-104.51902)"> + <g + id="g117073" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path117075" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path117077" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path117079" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g117081"> + <path + id="path117083" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117085" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117087" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient89689);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path117089" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path117091" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path117093" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path117095" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path117097" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path117099" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path117101" /> + <path + sodipodi:nodetypes="ccccc" + id="path117103" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient89691);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path117105" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path117107" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path117109" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path117111" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path117113" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path117115" /> + </g> + </g> + </g> + <g + transform="matrix(0.2910011,-0.1455006,0,0.4157158,726.80853,-83.694828)" + id="g109114" + inkscape:label="Warstwa 1"> + <g + id="g109116"> + <path + style="fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:3.51475525;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 201.29393,277.81602 0,83.33892 c 0,3.30324 -2.65929,5.96253 -5.96253,5.96253 l -70.92274,-1e-5 c -3.30324,1e-5 -5.96253,-2.65928 -5.96253,-5.96252 l 0,-104.18739 c 0,-3.30324 2.65929,-5.96253 5.96253,-5.96253 l 0,0 51.51028,0" + id="path109118" /> + <path + style="fill:none;stroke:#333333;stroke-width:3.51475525;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 200.66629,278.44365 -19.41245,0 c -3.30325,0 -5.96254,-2.65929 -5.96254,-5.96253 l 0,-20.84846" + id="path109120" /> + <rect + style="fill:#666666;fill-opacity:1;fill-rule:nonzero;stroke:#888888;stroke-width:3.51475525;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect109122" + width="59.625309" + height="7.5316181" + x="130.05737" + y="298.91449" /> + <rect + y="320.46329" + x="130.05737" + height="7.5316181" + width="59.625309" + id="rect109124" + style="fill:#666666;fill-opacity:1;fill-rule:nonzero;stroke:#888888;stroke-width:3.51475525;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#666666;fill-opacity:1;fill-rule:nonzero;stroke:#888888;stroke-width:3.51475525;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect109126" + width="59.625309" + height="7.5316181" + x="129.42973" + y="342.01205" /> + <rect + y="276.95511" + x="129.64677" + height="8.3528175" + width="31.575304" + id="rect109128" + style="fill:#666666;fill-opacity:1;fill-rule:nonzero;stroke:#888888;stroke-width:2.69355536;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:none;stroke:#333333;stroke-width:3.55898809;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 174.47857,250.37988 27.11315,28.70931" + id="path109130" + sodipodi:nodetypes="cc" /> + </g> + </g> + </g> + <g + transform="translate(-2067.4755,229.85634)" + id="g14851"> + <g + transform="translate(2213.4983,196.38493)" + id="g6628"> + <g + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)" + inkscape:label="Calque 1" + id="g6630"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path6632" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path6634" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path6636" /> + <g + id="g6638"> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 2,11 22,1 42,11 22,21 2,11 z" + id="path6640" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 2,11 2,41 22,51 22,21 2,11 z" + id="path6642" /> + <path + style="fill:url(#linearGradient89693);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,51 42,41 42,11 22,21 22,51 z" + id="path6644" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path6646" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path6648" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path6650" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path6652" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path6654" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path6656" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path6658" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:url(#radialGradient89695);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + id="path6660" + sodipodi:nodetypes="ccccc" /> + <path + id="path6662" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path6664" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path6666" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path6668" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path6670" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path6672" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + </g> + <g + transform="matrix(1.1666667,-0.5833333,0,1.6666667,2447.9468,308.67784)" + inkscape:label="Calque 1" + id="g109090"> + <rect + style="fill:#427bc3;fill-opacity:1;stroke:none" + id="rect109092" + width="6" + height="0" + x="16" + y="12.5" + ry="0" /> + <g + id="g109094"> + <path + id="path109096" + d="M 8,2 15,2 15,27 8,27 8,2 z" + style="fill:#4e9a06;fill-opacity:1;stroke:none" /> + <path + id="path109098" + d="m 15,9 7,0 0,18 -7,0 0,-18 z" + style="fill:#f57900;fill-opacity:1;stroke:none" /> + <path + id="path109100" + d="m 22,18 7,0 0,9 -7,0 0,-9 z" + style="fill:#cc0000;fill-opacity:1;stroke:none" /> + <path + id="path109102" + d="M 9,3 14,3 14,27 9,27 9,3 z" + style="fill:#8ae234;fill-opacity:1;stroke:none" /> + <path + id="path109104" + d="m 16,10 5,0 0,17 -5,0 0,-17 z" + style="fill:#fcaf3e;fill-opacity:1;stroke:none" /> + <path + id="path109106" + d="m 23,19 5,0 0,8 -5,0 0,-8 z" + style="fill:#ef2929;fill-opacity:1;stroke:none" /> + <path + id="path109108" + d="M 1,13 8,13 8,27 1,27 1,13 z" + style="fill:#204a87;fill-opacity:1;stroke:none" /> + <path + id="path109110" + d="M 2,14 7,14 7,27 2,27 2,14 z" + style="fill:#729fcf;fill-opacity:1;stroke:none" /> + <path + id="path109112" + d="m 0.5,27 29,0 c 0.277,0 0.5,0.223 0.5,0.5 0,0.277 -0.223,0.5 -0.5,0.5 l -29,0 C 0.223,28 0,27.777 0,27.5 0,27.223 0.223,27 0.5,27 z" + style="fill:#555753;fill-opacity:1;stroke:none" /> + </g> + </g> + </g> + <g + transform="translate(55.376622,226.89494)" + id="g3940"> + <g + id="g6928" + transform="translate(90.64615,-128.51935)"> + <g + id="g6930" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path6932" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path6934" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path6936" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g6938"> + <path + id="path6940" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path6942" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path6944" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient89697);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path6946" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path6948" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path6950" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path6952" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path6954" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path6956" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path6958" /> + <path + sodipodi:nodetypes="ccccc" + id="path6960" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient89699);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path6962" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path6964" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path6966" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path6968" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path6970" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path6972" /> + </g> + </g> + </g> + <g + id="g7116" + transform="matrix(0.5539927,-0.2769963,0,0.7914182,69.441655,-494.70209)"> + <rect + style="fill:#166496;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.68594635;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect7118" + width="48.180401" + height="48.180401" + x="882.70941" + y="188.84785" + rx="6.0000076" + ry="6.0000076" + transform="matrix(0.7071068,0.7071068,-0.7071068,0.7071068,0,0)" /> + <rect + style="fill:url(#linearGradient89701);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.18750143;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect7120" + width="42.856983" + height="42.856983" + x="885.3714" + y="191.50948" + rx="3.0000038" + ry="3.0000038" + transform="matrix(0.7071068,0.7071068,-0.7071068,0.7071068,0,0)" /> + <path + style="font-size:47.54045868px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient89703);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;font-family:URW Bookman L" + d="m 493.74763,784.00094 -1.61638,0 c -2.89996,0.52294 -4.4688,0.76064 -6.98845,0.95081 l 0,1.42621 0.95081,0.0951 c 2.4721,0.2377 3.13767,1.09343 3.13767,3.94586 l 0,11.17201 c 0,2.61472 -0.85573,3.70815 -2.94751,3.94586 l -1.18851,0.0951 0,1.42621 12.74085,0 0,-1.42621 -1.14098,-0.0951 c -2.13931,-0.23771 -2.9475,-1.33114 -2.9475,-3.94586 l 0,-17.58997 m -2.18686,-8.03434 c -1.61638,0 -2.89997,1.28359 -2.89997,2.85243 0,1.61637 1.28359,2.89997 2.85242,2.89997 1.61638,0 2.89997,-1.2836 2.89997,-2.85243 0,-1.56884 -1.28359,-2.89997 -2.85242,-2.89997" + id="path7122" /> + <path + style="fill:url(#linearGradient89705);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.18749964;marker:none;visibility:visible;display:inline;overflow:visible" + d="m 490.63046,762.7053 c -0.76686,0 -1.53738,0.2874 -2.125,0.875 l -26.0625,26.0625 c -1.17521,1.17521 -1.17521,3.07478 0,4.25 l 16.65625,16.65625 c 0.0426,-17.36725 11.74174,-31.56494 26.8125,-33.8125 L 492.75546,763.5803 c -0.58761,-0.58761 -1.35814,-0.875 -2.125,-0.875 z" + id="path7124" /> + </g> + </g> + <g + transform="translate(-2204.5921,828.95657)" + id="g14796"> + <g + transform="translate(2350.6149,-222.65428)" + id="g117371"> + <g + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)" + inkscape:label="Calque 1" + id="g117373"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path117375" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path117377" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path117379" /> + <g + id="g117381"> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 2,11 22,1 42,11 22,21 2,11 z" + id="path117383" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 2,11 2,41 22,51 22,21 2,11 z" + id="path117385" /> + <path + style="fill:url(#linearGradient89707);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,51 42,41 42,11 22,21 22,51 z" + id="path117387" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path117389" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117391" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117393" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117395" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117397" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117399" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117401" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:url(#radialGradient89709);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + id="path117403" + sodipodi:nodetypes="ccccc" /> + <path + id="path117405" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117407" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117409" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117411" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117413" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117415" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + </g> + <g + id="g119362" + transform="matrix(0.7,-0.35,0,1,2334.3228,-284.85697)"> + <rect + y="293.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect119364" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect119366" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="293.20496" /> + <rect + y="293.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect119368" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect119370" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="293.20496" /> + <rect + y="293.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect119372" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect119374" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="303.20496" /> + <rect + y="303.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect119376" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect119378" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="303.20496" /> + <rect + y="303.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect119380" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect119382" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="303.20496" /> + <rect + y="313.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect119384" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect119386" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="313.20496" /> + <rect + y="313.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect119388" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect119390" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="313.20496" /> + <rect + y="313.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect119392" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect119394" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="323.20496" /> + <rect + y="323.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect119396" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect119398" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="323.20496" /> + <rect + y="323.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect119400" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect119402" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="323.20496" /> + <rect + y="333.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect119404" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect119406" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="333.20496" /> + <rect + y="333.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect119408" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect119410" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="333.20496" /> + <rect + y="333.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect119412" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + </g> + </g> + </g> + <path + id="path91016" + d="M 591.58063,780.69364 1453.3182,1219.7707" + style="fill:none;stroke:#e68080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#d58080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 1279.7263,1216.7279 1979.6754,860.08563" + id="path3533-3" /> + </g> + <g + inkscape:label="diagram" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-83.461244,-149.71426)" + sodipodi:insensitive="true"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path117863" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path117865" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path117867" /> + <path + id="path118257-3" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path118259-1" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path118261-4" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path3356" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path3358" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path3360" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="203.22742" + y="1254.4452" + id="text3547"><tspan + sodipodi:role="line" + id="tspan3549" + x="203.22742" + y="1254.4452" /></text> + <path + id="path6262" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path6264" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path6266" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="225.9373" + y="214.30464" + id="text12366"><tspan + sodipodi:role="line" + x="227.67558" + y="214.30464" + id="tspan12370" + style="font-weight:bold">A) Cinder running on 1 Hardware node </tspan><tspan + sodipodi:role="line" + x="225.9373" + y="226.80464" + id="tspan40327" /></text> + <flowRoot + xml:space="preserve" + id="flowRoot12372" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><flowRegion + id="flowRegion12374"><rect + id="rect12376" + width="277.79196" + height="248.49753" + x="40.406101" + y="25.037045" /></flowRegion><flowPara + id="flowPara12378" /></flowRoot> <path + id="path28160" + d="m 315.22338,426.34039 91.36936,46.55496" + style="fill:none;stroke:#808080;stroke-width:3.28471541;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:3.28471541;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 380.6955,469.21927 91.36934,-46.55506" + id="path20157" /> + <path + sodipodi:nodetypes="cc" + style="fill:none;stroke:#808080;stroke-width:3.28471541;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 185.78351,323.11038 137.40741,72.74725" + id="path27639-3" /> + <g + transform="matrix(0.65694308,0,0,0.65694308,-1522.2473,382.17184)" + id="g11976"> + <g + transform="translate(2350.6149,-222.65428)" + id="g11978"> + <g + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)" + inkscape:label="Calque 1" + id="g11980"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path11982" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path11984" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path11986" /> + <g + id="g11988"> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 2,11 22,1 42,11 22,21 2,11 z" + id="path11990" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 2,11 2,41 22,51 22,21 2,11 z" + id="path11992" /> + <path + style="fill:url(#linearGradient12076);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,51 42,41 42,11 22,21 22,51 z" + id="path11994" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path11996" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path11998" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path12000" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path12002" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path12004" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path12006" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path12008" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:url(#radialGradient12078);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + id="path12010" + sodipodi:nodetypes="ccccc" /> + <path + id="path12012" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path12014" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path12016" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path12018" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path12020" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path12022" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + </g> + <g + id="g12024" + transform="matrix(0.7,-0.35,0,1,2334.3228,-284.85697)"> + <rect + y="293.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect12026" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12028" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="293.20496" /> + <rect + y="293.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect12030" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12032" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="293.20496" /> + <rect + y="293.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect12034" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12036" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="303.20496" /> + <rect + y="303.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect12038" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12040" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="303.20496" /> + <rect + y="303.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect12042" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12044" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="303.20496" /> + <rect + y="313.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect12046" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12048" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="313.20496" /> + <rect + y="313.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect12050" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12052" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="313.20496" /> + <rect + y="313.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect12054" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12056" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="323.20496" /> + <rect + y="323.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect12058" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12060" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="323.20496" /> + <rect + y="323.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect12062" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12064" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="323.20496" /> + <rect + y="333.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect12066" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12068" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="333.20496" /> + <rect + y="333.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect12070" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12072" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="333.20496" /> + <rect + y="333.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect12074" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + </g> + </g> + <g + transform="matrix(1.4935386,0,0,1.4935386,-380.65184,167.40421)" + id="g12102"> + <g + id="g12104"> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path12106" + d="m 452.22752,154.79534 c -1.32987,4.3593 0.97442,13.06343 4.32672,7.29809 0.55883,-4.21566 0.16853,-13.66849 -4.32672,-7.29809 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path12108" + d="m 459.05645,154.87353 c -5.73123,-1.99396 -4.37255,6.82514 -3.10169,8.88804 4.41472,0.3139 8.88448,0.68282 7.08957,-5.21292 -0.15325,-2.39014 -1.62637,-3.78967 -3.98788,-3.67512 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path12110" + d="m 461.48045,154.95173 c -1.09246,1.9721 -0.88144,8.20841 3.07563,8.75771 7.13327,0.55239 -1.24277,-5.48505 3.0235,-5.57782 1.36821,-3.25204 -5.37175,-7.28408 -6.09913,-3.17989 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path12112" + d="m 469.14346,154.84748 c -6.26267,0.075 -4.66384,10.71977 1.4292,8.95932 4.83425,0.31308 3.44625,-9.88021 -1.4292,-8.95932 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path12114" + d="m 468.85674,155.68154 c -5.85015,2.68836 -2.79296,6.6586 2.86712,4.84803 3.28424,0.8454 -0.45596,-6.36406 -2.86712,-4.84803 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path12116" + d="m 475.63355,154.84748 c -5.82517,-1.97942 -4.54812,6.74301 -3.23202,8.91409 4.84187,0.18324 3.39963,-5.16968 5.70816,-6.35977 0.24428,-2.37476 -0.19418,-2.73428 -2.47614,-2.55432 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path12118" + d="m 479.49112,154.87353 c -5.77442,-2.02369 -4.43922,6.79664 -3.15383,8.88804 4.41473,0.3139 8.88448,0.68282 7.08958,-5.21292 -0.15836,-2.36396 -1.59101,-3.77955 -3.93575,-3.67512 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path12120" + d="m 485.56417,154.84748 c -6.19598,0.15033 -4.65067,10.675 1.42942,8.96143 4.93021,0.35507 3.48048,-9.89643 -1.42942,-8.96143 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path12122" + d="m 485.30352,155.68154 c -5.85015,2.68836 -2.79297,6.6586 2.86711,4.84803 3.28424,0.8454 -0.45595,-6.36406 -2.86711,-4.84803 z" /> + <path + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="path12124" + d="m 488.0403,154.95173 c -1.06389,1.96915 -0.92086,8.22865 3.04957,8.75771 7.16539,0.57531 -1.21095,-5.48429 3.04956,-5.57782 1.3682,-3.25204 -5.37175,-7.28408 -6.09913,-3.17989 z" /> + <path + transform="matrix(-0.179335,0,0,0.149728,502.1893,-24.02897)" + style="opacity:0.17777776;fill:url(#linearGradient12182);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + inkscape:tile-w="105.36077" + inkscape:tile-h="104.60061" + inkscape:tile-cy="1057.5979" + inkscape:tile-cx="150.57283" + id="path12126" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(0.284001,0,0,0.193224,407.7236,-73.15871)" + style="opacity:0.17777776;fill:url(#linearGradient12184);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12128" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(0.340554,0,0,0.231701,396.3144,-88.95173)" + style="opacity:0.17777776;fill:url(#linearGradient12186);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12130" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(0.249954,0,0,0.170059,406.7992,-32.10751)" + style="opacity:0.17777776;fill:url(#linearGradient12188);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12132" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(0.260403,0,0,0.177168,412.2819,-25.25605)" + style="opacity:0.17777776;fill:url(#linearGradient12190);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12134" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.104126,-0.150834,-0.146719,0.07084417,668.335,91.43843)" + style="opacity:0.17777776;fill:url(#linearGradient12192);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12136" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.154671,-0.224051,-0.217939,0.105233,738.2325,88.88709)" + style="opacity:0.17777776;fill:url(#linearGradient12194);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12138" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.138006,-0.19991,-0.194457,0.09389457,722.8067,97.77468)" + style="opacity:0.17777776;fill:url(#linearGradient12196);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12140" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.117791,-0.170629,-0.165973,0.08014087,677.6847,122.0894)" + style="opacity:0.17777776;fill:url(#linearGradient12198);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12142" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.09614486,-0.139271,-0.135472,0.06541328,635.5166,142.1226)" + style="opacity:0.17777776;fill:url(#linearGradient12200);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12144" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.164683,-0.238552,0.232045,-0.112044,265.1906,314.0698)" + style="opacity:0.17777776;fill:url(#linearGradient12202);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12146" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.172846,-0.250377,0.243546,-0.117597,239.7257,330.3731)" + style="opacity:0.17777776;fill:url(#linearGradient12204);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12148" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.177232,-0.256733,0.249729,-0.120583,225.1178,318.3329)" + style="opacity:0.17777776;fill:url(#linearGradient12206);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12150" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.166524,-0.241221,0.23464,-0.113297,227.7161,329.1711)" + style="opacity:0.17777776;fill:url(#linearGradient12208);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12152" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.112183,-0.162505,0.158072,-0.07632533,314.1776,290.1886)" + style="opacity:0.17777776;fill:url(#linearGradient12210);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12154" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.11826,0.171307,0.166634,0.08045988,311.5686,16.07786)" + style="opacity:0.17777776;fill:url(#linearGradient12212);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12156" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.0943583,0.136684,0.132956,0.06419815,331.8395,50.2111)" + style="opacity:0.17777776;fill:url(#linearGradient12214);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12158" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.114364,0.165662,0.161143,0.07780872,322.2702,30.08746)" + style="opacity:0.17777776;fill:url(#linearGradient12216);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12160" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.140702,0.203815,0.198255,0.09572832,286.7172,18.15027)" + style="opacity:0.17777776;fill:url(#linearGradient12218);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12162" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.162185,0.234935,0.228526,0.110345,259.9411,6.05945)" + style="opacity:0.17777776;fill:url(#linearGradient12220);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12164" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.160583,0.232613,-0.226269,-0.109254,748.0707,211.5833)" + style="opacity:0.17777776;fill:url(#linearGradient12222);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12166" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.12628,0.182922,-0.177934,-0.08591606,697.8146,196.7379)" + style="opacity:0.17777776;fill:url(#linearGradient12224);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12168" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.137748,0.199537,-0.194093,-0.09371803,714.1281,221.8225)" + style="opacity:0.17777776;fill:url(#linearGradient12226);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12170" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.120979,0.175247,-0.170466,-0.08231039,662.6019,207.1803)" + style="opacity:0.17777776;fill:url(#linearGradient12228);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12172" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + <path + transform="matrix(-0.14434,0.209086,-0.203383,-0.09820396,735.5011,232.5166)" + style="opacity:0.17777776;fill:url(#linearGradient12230);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:start="0.32872637" + sodipodi:ry="52.289352" + sodipodi:rx="52.660198" + sodipodi:open="true" + sodipodi:end="6.478369" + sodipodi:cy="1057.5979" + sodipodi:cx="150.56367" + id="path12174" + d="m 200.40415,1074.4789 a 52.660198,52.289352 0 1 1 1.81981,-6.7397" /> + </g> + <path + transform="matrix(1.155532,0,0,1.155532,26.16756,-503.197)" + style="fill:url(#radialGradient12232);fill-opacity:1;fill-rule:nonzero;stroke:none" + sodipodi:type="arc" + sodipodi:ry="24.998358" + sodipodi:rx="24.998358" + sodipodi:cy="571.95715" + sodipodi:cx="384.69696" + id="path12176" + d="m 409.69532,571.95715 a 24.998358,24.998358 0 1 1 -49.99672,0 24.998358,24.998358 0 1 1 49.99672,0 z" /> + <text + y="161.44913" + xml:space="preserve" + x="469.55161" + style="font-size:10.00881386px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#9f0021;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + id="text12178"><tspan + y="161.44913" + x="469.55161" + sodipodi:role="line" + id="tspan12180">Internet</tspan></text> + </g> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="538.89154" + y="215.79129" + id="text13881"><tspan + sodipodi:role="line" + x="538.89154" + y="215.79129" + id="tspan14065" + style="font-weight:bold">B) Cloud of 2-4 servers in one cluster</tspan><tspan + sodipodi:role="line" + x="538.89154" + y="228.29129" + id="tspan29240">Self-contained storage solution</tspan><tspan + sodipodi:role="line" + x="538.89154" + y="240.79129" + id="tspan6068">Typical smallest private cloud</tspan><tspan + sodipodi:role="line" + x="538.89154" + y="253.29129" + id="tspan29232" /><tspan + sodipodi:role="line" + x="538.89154" + y="265.79129" + id="tspan14069" /></text> + <g + transform="matrix(0.65694308,0,0,0.65694308,409.13381,29.158398)" + id="g14000"> + <g + transform="matrix(6.5383417,0,0,6.5383417,364.86909,935.55835)" + inkscape:label="Calque 1" + id="g14002"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path14004" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path14006" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path14008" /> + <g + transform="translate(-68.205597,-63.743549)" + id="g14010"> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + id="path14012" /> + <path + sodipodi:nodetypes="ccccc" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + id="path14014" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + id="path14016" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#radialGradient14034);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + id="path14018" + sodipodi:nodetypes="ccccc" /> + </g> + </g> + <g + transform="matrix(0.6363961,0.3181981,-0.6363961,0.3181981,-697.62009,289.09977)" + id="g14020"> + <path + id="path14022" + d="m 1044.4209,-4.5996044 0,78.9062504 78.9063,0 0,-78.9062504 -78.9063,0 z m 39.4688,2.46875 c 20.4177,0 37,16.5823004 37,37.0000004 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 -10e-5,-20.41771 16.5823,-37.0000004 37,-37.0000004 z" + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" /> + <g + id="g14024" + style="fill:#00ffff;stroke:#ffffff" + transform="translate(705.44117,-218.9829)"> + <path + id="path14026" + d="m 378.53666,218.814 -6.22099,11.28987 1.97176,0 0,18.4037 8.49847,0 0,-18.4037 1.95647,0 -6.20571,-11.28987 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 378.53666,288.85884 -6.22099,-11.28987 1.97176,0 0,-18.4037 8.49847,0 0,18.4037 1.95647,0 -6.20571,11.28987 z" + id="path14028" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 343.41044,253.56675 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + id="path14030" /> + <path + id="path14032" + d="m 413.45528,253.56675 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + </g> + </g> + <path + sodipodi:nodetypes="cc" + style="fill:none;stroke:#808080;stroke-width:3.28471541;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 403.08993,404.14504 138.94378,71.0712" + id="path27639" /> + <path + style="fill:none;stroke:#808080;stroke-width:3.28471541;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 608.79612,390.33518 91.36933,-46.55506" + id="path27641" /> + <path + id="path91031" + d="m 608.68499,296.87805 138.94378,71.0712" + style="fill:none;stroke:#808080;stroke-width:3.28471541;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:nodetypes="cc" /> + <path + id="path27643" + d="m 563.28267,366.85747 91.36934,-46.55505" + style="fill:none;stroke:#808080;stroke-width:3.28471541;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + id="path27645" + d="m 495.86167,451.62164 91.36934,-46.55506" + style="fill:none;stroke:#808080;stroke-width:3.28471541;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:3.28471541;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 654.30956,413.81288 745.6789,367.25782" + id="path27647" /> + <path + style="fill:none;stroke:#808080;stroke-width:3.28471541;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 450.34043,428.08107 91.36934,-46.55506" + id="path27649" /> + <path + id="path27651" + d="m 541.38287,475.16213 91.36934,-46.55506" + style="fill:none;stroke:#808080;stroke-width:3.28471541;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:3.28471541;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 404.81919,404.54058 91.36935,-46.55506" + id="path27653" /> + <g + id="g27655" + transform="matrix(0.65694308,0,0,0.65694308,391.71742,31.819328)"> + <g + id="g27657" + inkscape:label="Calque 1" + transform="matrix(6.5383417,0,0,6.5383417,488.78696,875.42775)"> + <path + id="path27659" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path27661" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path27663" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g27665" + transform="translate(-68.205597,-63.743549)"> + <path + id="path27667" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path27669" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path27671" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path27673" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + style="fill:url(#radialGradient28127);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + <g + transform="matrix(0.6363961,-0.3181981,-0.6363961,-0.3181981,-338.72869,1082.8342)" + id="g27675"> + <path + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" + d="m 1081.1367,402.39569 0,78.90625 78.9062,0 0,-78.90625 -78.9062,0 z m 39.4687,2.46875 c 20.4177,0 37,16.5823 37,37 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 0,-20.41771 16.5823,-37 37,-37 z" + id="path27677" /> + <g + id="g27679" + transform="translate(456.4439,-26.889185)" + style="fill:#00ffff;stroke:#ffffff"> + <path + id="path27681" + d="m 660.00267,458.32498 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 668.28911,465.32717 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + id="path27683" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 660.00267,472.20199 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + id="path27685" /> + <path + id="path27687" + d="m 668.28911,479.13574 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + </g> + </g> + <path + id="path27689" + d="m 517.76922,343.37971 91.36935,-46.55506" + style="fill:none;stroke:#808080;stroke-width:3.28471541;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <g + id="g27691" + transform="matrix(0.65694308,0,0,0.65694308,-1189.4227,405.31085)"> + <g + id="g27693" + transform="translate(2350.6149,-222.65428)"> + <g + id="g27695" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path27697" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path27699" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path27701" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g27703"> + <path + id="path27705" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path27707" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path27709" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient28129);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path27711" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path27713" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path27715" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path27717" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path27719" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path27721" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path27723" /> + <path + sodipodi:nodetypes="ccccc" + id="path27725" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient28131);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path27727" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path27729" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path27731" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path27733" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path27735" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path27737" /> + </g> + </g> + </g> + <g + transform="matrix(0.7,-0.35,0,1,2334.3228,-284.85697)" + id="g27739"> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27741" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="293.20496" /> + <rect + y="293.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect27743" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27745" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="293.20496" /> + <rect + y="293.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect27747" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27749" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="293.20496" /> + <rect + y="303.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect27751" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27753" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="303.20496" /> + <rect + y="303.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect27755" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27757" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="303.20496" /> + <rect + y="303.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect27759" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27761" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="313.20496" /> + <rect + y="313.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect27763" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27765" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="313.20496" /> + <rect + y="313.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect27767" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27769" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="313.20496" /> + <rect + y="323.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect27771" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27773" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="323.20496" /> + <rect + y="323.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect27775" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27777" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="323.20496" /> + <rect + y="323.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect27779" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27781" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="333.20496" /> + <rect + y="333.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect27783" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27785" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="333.20496" /> + <rect + y="333.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect27787" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27789" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="333.20496" /> + </g> + </g> + <g + id="g27791" + transform="matrix(0.65694308,0,0,0.65694308,-1143.4472,428.64223)"> + <g + id="g27793" + transform="translate(2350.6149,-222.65428)"> + <g + id="g27795" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path27797" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path27799" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path27801" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g27803"> + <path + id="path27805" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path27807" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path27809" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient28133);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path27811" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path27813" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path27815" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path27817" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path27819" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path27821" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path27823" /> + <path + sodipodi:nodetypes="ccccc" + id="path27825" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient28135);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path27827" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path27829" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path27831" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path27833" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path27835" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path27837" /> + </g> + </g> + </g> + <g + transform="matrix(0.7,-0.35,0,1,2334.3228,-284.85697)" + id="g27839"> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27841" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="293.20496" /> + <rect + y="293.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect27843" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27845" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="293.20496" /> + <rect + y="293.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect27847" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27849" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="293.20496" /> + <rect + y="303.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect27851" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27853" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="303.20496" /> + <rect + y="303.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect27855" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27857" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="303.20496" /> + <rect + y="303.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect27859" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27861" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="313.20496" /> + <rect + y="313.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect27863" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27865" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="313.20496" /> + <rect + y="313.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect27867" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27869" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="313.20496" /> + <rect + y="323.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect27871" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27873" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="323.20496" /> + <rect + y="323.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect27875" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27877" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="323.20496" /> + <rect + y="323.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect27879" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27881" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="333.20496" /> + <rect + y="333.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect27883" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27885" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="333.20496" /> + <rect + y="333.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect27887" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27889" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="333.20496" /> + </g> + </g> + <g + id="g27891" + transform="matrix(0.65694308,0,0,0.65694308,-1097.4717,451.97365)"> + <g + id="g27893" + transform="translate(2350.6149,-222.65428)"> + <g + id="g27895" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path27897" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path27899" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path27901" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g27903"> + <path + id="path27905" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path27907" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path27909" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient28137);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path27911" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path27913" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path27915" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path27917" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path27919" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path27921" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path27923" /> + <path + sodipodi:nodetypes="ccccc" + id="path27925" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient28139);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path27927" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path27929" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path27931" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path27933" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path27935" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path27937" /> + </g> + </g> + </g> + <g + transform="matrix(0.7,-0.35,0,1,2334.3228,-284.85697)" + id="g27939"> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27941" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="293.20496" /> + <rect + y="293.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect27943" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27945" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="293.20496" /> + <rect + y="293.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect27947" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27949" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="293.20496" /> + <rect + y="303.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect27951" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27953" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="303.20496" /> + <rect + y="303.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect27955" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27957" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="303.20496" /> + <rect + y="303.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect27959" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27961" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="313.20496" /> + <rect + y="313.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect27963" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27965" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="313.20496" /> + <rect + y="313.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect27967" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27969" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="313.20496" /> + <rect + y="323.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect27971" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27973" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="323.20496" /> + <rect + y="323.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect27975" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27977" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="323.20496" /> + <rect + y="323.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect27979" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27981" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="333.20496" /> + <rect + y="333.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect27983" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27985" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="333.20496" /> + <rect + y="333.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect27987" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect27989" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="333.20496" /> + </g> + </g> + <g + id="g27991" + transform="matrix(0.65694308,0,0,0.65694308,-1051.4962,475.30499)"> + <g + id="g27993" + transform="translate(2350.6149,-222.65428)"> + <g + id="g27995" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path27997" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path27999" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path28001" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g28003"> + <path + id="path28005" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path28007" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path28009" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient28141);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path28011" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path28013" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path28015" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path28017" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path28019" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path28021" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path28023" /> + <path + sodipodi:nodetypes="ccccc" + id="path28025" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient28143);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path28027" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path28029" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path28031" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path28033" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path28035" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path28037" /> + </g> + </g> + </g> + <g + transform="matrix(0.7,-0.35,0,1,2334.3228,-284.85697)" + id="g28039"> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect28041" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="293.20496" /> + <rect + y="293.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect28043" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect28045" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="293.20496" /> + <rect + y="293.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect28047" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect28049" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="293.20496" /> + <rect + y="303.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect28051" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect28053" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="303.20496" /> + <rect + y="303.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect28055" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect28057" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="303.20496" /> + <rect + y="303.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect28059" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect28061" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="313.20496" /> + <rect + y="313.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect28063" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect28065" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="313.20496" /> + <rect + y="313.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect28067" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect28069" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="313.20496" /> + <rect + y="323.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect28071" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect28073" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="323.20496" /> + <rect + y="323.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect28075" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect28077" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="323.20496" /> + <rect + y="323.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect28079" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect28081" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="333.20496" /> + <rect + y="333.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect28083" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect28085" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="333.20496" /> + <rect + y="333.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect28087" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect28089" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="333.20496" /> + </g> + </g> + <g + transform="matrix(0.65694308,0,0,0.65694308,594.78291,-79.667593)" + id="g28093"> + <g + transform="matrix(6.5383417,0,0,6.5383417,488.78696,875.42775)" + inkscape:label="Calque 1" + id="g28095"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path28097" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path28099" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path28101" /> + <g + transform="translate(-68.205597,-63.743549)" + id="g28103"> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + id="path28105" /> + <path + sodipodi:nodetypes="ccccc" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + id="path28107" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + id="path28109" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#radialGradient28145);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + id="path28111" + sodipodi:nodetypes="ccccc" /> + </g> + </g> + <g + id="g28113" + transform="matrix(0.6363961,-0.3181981,-0.6363961,-0.3181981,-338.72869,1082.8342)"> + <path + id="path28115" + d="m 1081.1367,402.39569 0,78.90625 78.9062,0 0,-78.90625 -78.9062,0 z m 39.4687,2.46875 c 20.4177,0 37,16.5823 37,37 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 0,-20.41771 16.5823,-37 37,-37 z" + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" /> + <g + style="fill:#00ffff;stroke:#ffffff" + transform="translate(456.4439,-26.889185)" + id="g28117"> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 660.00267,458.32498 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + id="path28119" /> + <path + id="path28121" + d="m 668.28911,465.32717 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + id="path28123" + d="m 660.00267,472.20199 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 668.28911,479.13574 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + id="path28125" /> + </g> + </g> + </g> + </g> +</svg> diff --git a/doc/source/images/NOVA_clouds_C1_C2.svg b/doc/source/images/NOVA_clouds_C1_C2.svg new file mode 100644 index 000000000..5b10faf7c --- /dev/null +++ b/doc/source/images/NOVA_clouds_C1_C2.svg @@ -0,0 +1,9763 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + inkscape:label="PozadÃ" + version="1.1" + inkscape:version="0.47 r22583" + sodipodi:docname="CINDER_clouds_C1_C2.svg" + inkscape:export-filename="/var/www/alekiba/cinder/CINDER_clouds_C1_C2.svg.png" + inkscape:export-xdpi="120" + inkscape:export-ydpi="120"> + <defs + id="defs7744"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective7750" /> + <inkscape:perspective + id="perspective6086" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="linearGradient104830" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-53"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-2" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-4" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="radialGradient104832" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6095"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6097" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6099" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="linearGradient104834" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-51"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-42" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-82" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="radialGradient104836" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6106"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6108" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6110" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="linearGradient104838" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-7"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-64" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-23" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="radialGradient104840" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6117"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6119" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6121" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="linearGradient104842" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-87"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-5" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-40" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="radialGradient104844" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6128"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6130" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6132" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-59" + id="linearGradient104846" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-59"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-33" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-0" /> + </linearGradient> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-8" + id="pattern6042-6" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-5" + id="pattern6024-8" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + patternUnits="userSpaceOnUse" + width="30.066020" + height="5.1805778" + id="Wavy-5" + inkscape:stockid="Wavy"> + <path + style="fill:black;stroke:none;" + d="M 7.597,0.061 C 5.079,-0.187 2.656,0.302 -0.01,1.788 L -0.01,3.061 C 2.773,1.431 5.173,1.052 7.472,1.280 C 9.770,1.508 11.969,2.361 14.253,3.218 C 18.820,4.931 23.804,6.676 30.066,3.061 L 30.062,1.788 C 23.622,5.497 19.246,3.770 14.691,2.061 C 12.413,1.207 10.115,0.311 7.597,0.061 z " + id="path6343-6" /> + </pattern> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-8" + id="pattern6040-9" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-5" + id="pattern6143" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-8" + id="pattern6038-2" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-5" + id="pattern6150" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-8" + id="pattern6036-5" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-5" + id="pattern6157" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-8" + id="pattern6034-1" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-5" + id="pattern6164" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-8" + id="pattern6032-6" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-5" + id="pattern6171" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-8" + id="pattern6030-0" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-5" + id="pattern6178" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-8" + id="pattern6028-4" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-5" + id="pattern6185" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-32" + id="linearGradient104848" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-32"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-47" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-85" /> + </linearGradient> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-0" + id="pattern6042-3" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-9" + id="pattern6024-0" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + patternUnits="userSpaceOnUse" + width="30.066020" + height="5.1805778" + id="Wavy-9" + inkscape:stockid="Wavy"> + <path + style="fill:black;stroke:none;" + d="M 7.597,0.061 C 5.079,-0.187 2.656,0.302 -0.01,1.788 L -0.01,3.061 C 2.773,1.431 5.173,1.052 7.472,1.280 C 9.770,1.508 11.969,2.361 14.253,3.218 C 18.820,4.931 23.804,6.676 30.066,3.061 L 30.062,1.788 C 23.622,5.497 19.246,3.770 14.691,2.061 C 12.413,1.207 10.115,0.311 7.597,0.061 z " + id="path6343-63" /> + </pattern> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-0" + id="pattern6040-4" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-9" + id="pattern6200" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-0" + id="pattern6038-8" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-9" + id="pattern6207" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-0" + id="pattern6036-0" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-9" + id="pattern6214" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-0" + id="pattern6034-4" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-9" + id="pattern6221" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-0" + id="pattern6032-9" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-9" + id="pattern6228" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-0" + id="pattern6030-4" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-9" + id="pattern6235" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-0" + id="pattern6028-1" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-9" + id="pattern6242" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-90" + id="linearGradient104850" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-90"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-0" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-56" /> + </linearGradient> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-6" + id="pattern6042-0" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-4" + id="pattern6024-6" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + patternUnits="userSpaceOnUse" + width="30.066020" + height="5.1805778" + id="Wavy-4" + inkscape:stockid="Wavy"> + <path + style="fill:black;stroke:none;" + d="M 7.597,0.061 C 5.079,-0.187 2.656,0.302 -0.01,1.788 L -0.01,3.061 C 2.773,1.431 5.173,1.052 7.472,1.280 C 9.770,1.508 11.969,2.361 14.253,3.218 C 18.820,4.931 23.804,6.676 30.066,3.061 L 30.062,1.788 C 23.622,5.497 19.246,3.770 14.691,2.061 C 12.413,1.207 10.115,0.311 7.597,0.061 z " + id="path6343-5" /> + </pattern> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-6" + id="pattern6040-7" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-4" + id="pattern6257" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-6" + id="pattern6038-27" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-4" + id="pattern6264" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-6" + id="pattern6036-2" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-4" + id="pattern6271" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-6" + id="pattern6034-5" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-4" + id="pattern6278" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-6" + id="pattern6032-3" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-4" + id="pattern6285" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-6" + id="pattern6030-42" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-4" + id="pattern6292" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-6" + id="pattern6028-0" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-4" + id="pattern6299" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-52" + id="linearGradient104852" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-52"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-54" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-55" /> + </linearGradient> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-2" + id="pattern6042-7" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-92" + id="pattern6024-2" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + patternUnits="userSpaceOnUse" + width="30.066020" + height="5.1805778" + id="Wavy-92" + inkscape:stockid="Wavy"> + <path + style="fill:black;stroke:none;" + d="M 7.597,0.061 C 5.079,-0.187 2.656,0.302 -0.01,1.788 L -0.01,3.061 C 2.773,1.431 5.173,1.052 7.472,1.280 C 9.770,1.508 11.969,2.361 14.253,3.218 C 18.820,4.931 23.804,6.676 30.066,3.061 L 30.062,1.788 C 23.622,5.497 19.246,3.770 14.691,2.061 C 12.413,1.207 10.115,0.311 7.597,0.061 z " + id="path6343-9" /> + </pattern> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-2" + id="pattern6040-5" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-92" + id="pattern6314" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-2" + id="pattern6038-6" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-92" + id="pattern6321" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-2" + id="pattern6036-8" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-92" + id="pattern6328" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-2" + id="pattern6034-0" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-92" + id="pattern6335" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-2" + id="pattern6032-4" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-92" + id="pattern6342" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-2" + id="pattern6030-5" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-92" + id="pattern6349" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-2" + id="pattern6028-7" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-92" + id="pattern6356" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-19" + id="linearGradient104854" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,575.71683,124.9737)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-19"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-7" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-06" /> + </linearGradient> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-67" + id="pattern6042-2" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-6" + id="pattern6024-67" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + patternUnits="userSpaceOnUse" + width="30.066020" + height="5.1805778" + id="Wavy-6" + inkscape:stockid="Wavy"> + <path + style="fill:black;stroke:none;" + d="M 7.597,0.061 C 5.079,-0.187 2.656,0.302 -0.01,1.788 L -0.01,3.061 C 2.773,1.431 5.173,1.052 7.472,1.280 C 9.770,1.508 11.969,2.361 14.253,3.218 C 18.820,4.931 23.804,6.676 30.066,3.061 L 30.062,1.788 C 23.622,5.497 19.246,3.770 14.691,2.061 C 12.413,1.207 10.115,0.311 7.597,0.061 z " + id="path6343-7" /> + </pattern> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-67" + id="pattern6040-43" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-6" + id="pattern6371" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-67" + id="pattern6038-7" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-6" + id="pattern6378" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-67" + id="pattern6036-83" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-6" + id="pattern6385" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-67" + id="pattern6034-16" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-6" + id="pattern6392" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-67" + id="pattern6032-92" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-6" + id="pattern6399" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-67" + id="pattern6030-6" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-6" + id="pattern6406" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <pattern + inkscape:collect="always" + xlink:href="#pattern6024-67" + id="pattern6028-2" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,719.32799,775.7824)" /> + <pattern + inkscape:collect="always" + xlink:href="#Wavy-6" + id="pattern6413" + patternTransform="matrix(0.562565,0.3226862,-0.3226862,0.562565,37.897429,823.71177)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient104856" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + id="linearGradient2202-19"> + <stop + id="stop2204-02" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-3" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient104858" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + id="linearGradient6424"> + <stop + id="stop6426" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop6428" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104860" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient4068-4"> + <stop + id="stop4070-2" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop4490-5" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop4492-2" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop4072-4" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104862" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6437"> + <stop + id="stop6439" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6441" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6443" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6445" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104864" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6448"> + <stop + id="stop6450" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6452" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6454" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6456" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104866" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6459"> + <stop + id="stop6461" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6463" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6465" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6467" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104868" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6470"> + <stop + id="stop6472" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6474" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6476" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6478" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104870" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6481"> + <stop + id="stop6483" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6485" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6487" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6489" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104872" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6492"> + <stop + id="stop6494" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6496" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6498" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6500" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104874" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6503"> + <stop + id="stop6505" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6507" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6509" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6511" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104876" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6514"> + <stop + id="stop6516" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6518" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6520" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6522" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104878" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6525"> + <stop + id="stop6527" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6529" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6531" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6533" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104880" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6536"> + <stop + id="stop6538" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6540" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6542" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6544" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104882" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6547"> + <stop + id="stop6549" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6551" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6553" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6555" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104884" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6558"> + <stop + id="stop6560" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6562" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6564" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6566" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104886" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6569"> + <stop + id="stop6571" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6573" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6575" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6577" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104888" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6580"> + <stop + id="stop6582" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6584" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6586" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6588" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104890" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6591"> + <stop + id="stop6593" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6595" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6597" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6599" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104892" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6602"> + <stop + id="stop6604" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6606" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6608" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6610" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104894" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6613"> + <stop + id="stop6615" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6617" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6619" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6621" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104896" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6624"> + <stop + id="stop6626" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6628" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6630" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6632" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104898" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6635"> + <stop + id="stop6637" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6639" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6641" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6643" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104900" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6646"> + <stop + id="stop6648" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6650" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6652" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6654" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104902" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6657"> + <stop + id="stop6659" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6661" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6663" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6665" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104904" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6668"> + <stop + id="stop6670" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6672" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6674" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6676" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104906" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6679"> + <stop + id="stop6681" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6683" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6685" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6687" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient104908" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + id="linearGradient6690"> + <stop + id="stop6692" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop6694" + offset="0.67741936" + style="stop-color:#000000;stop-opacity:0.49803922;" /> + <stop + id="stop6696" + offset="0.86472428" + style="stop-color:#000000;stop-opacity:0.24705882;" /> + <stop + id="stop6698" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5178-3" + id="radialGradient104910" + gradientUnits="userSpaceOnUse" + cx="384.69696" + cy="571.95715" + fx="384.69696" + fy="571.95715" + r="24.998358" /> + <linearGradient + id="linearGradient5178-3"> + <stop + id="stop5180-4" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + id="stop5186-9" + offset="0.89021850" + style="stop-color:#ffffff;stop-opacity:0.49803922;" /> + <stop + id="stop5188-2" + offset="0.95396262" + style="stop-color:#ffffff;stop-opacity:0.24705882;" /> + <stop + id="stop5182-7" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-54" + id="linearGradient104912" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-54"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-57" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-52" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-54" + id="radialGradient104914" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6711"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6713" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6715" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient414-2" + id="linearGradient104916" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.5806141,-0.290307,0,0.8294487,1235.5061,-245.10175)" + x1="-137.36061" + y1="472.52106" + x2="-124.93314" + y2="487.91693" /> + <linearGradient + id="linearGradient414-2"> + <stop + id="stop415-6" + offset="0.00000000" + style="stop-color:#ffd800;stop-opacity:1.0000000;" /> + <stop + id="stop416-0" + offset="1.0000000" + style="stop-color:#e77900;stop-opacity:1.0000000;" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19-1" + id="radialGradient104918" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + id="linearGradient2202-19-1"> + <stop + id="stop2204-02-4" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-3-1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="linearGradient104920" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-31"> + <stop + id="stop2204-2" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-99" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="radialGradient104922" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6730"> + <stop + id="stop6732" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop6734" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <pattern + patternTransform="matrix(0,5.5342899,-7.4864232,0,521.74506,337.35904)" + id="pattern118687-0" + xlink:href="#Strips1_1-6" + inkscape:collect="always" /> + <pattern + inkscape:collect="always" + patternUnits="userSpaceOnUse" + width="2" + height="1" + patternTransform="matrix(0,5.5342899,-7.4864229,0,31.668795,357.00572)" + id="Strips1_1-6" + inkscape:stockid="Stripes 1:1"> + <rect + style="fill:black;stroke:none" + x="0" + y="-0.5" + width="1" + height="2" + id="rect5260-9" /> + </pattern> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-95" + id="linearGradient104924" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-95"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-72" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-406" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-95" + id="radialGradient104926" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6744"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6746" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6748" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient104928" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + id="linearGradient2202-2-1-25"> + <stop + id="stop2204-6-0-41" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop2206-6-0-8" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="linearGradient104930" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-5-4-2"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-8-4-5" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-5-2-1" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="radialGradient104932" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6759"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6761" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6763" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="linearGradient104934" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-8-3-0"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-1-4-2" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-2-7-6" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="radialGradient104936" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6770"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6772" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6774" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="linearGradient104938" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-9-8-0"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-4-0-0" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-8-1-3" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="radialGradient104940" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6781"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6783" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6785" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="linearGradient104942" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient2202-1-93-3-2"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop2204-5-6-1-0" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop2206-5-21-0-1" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="radialGradient104944" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6792"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6794" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6796" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient104946" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + id="linearGradient6799"> + <stop + id="stop6801" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop6803" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient6805" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + id="linearGradient6807"> + <stop + id="stop6809" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop6811" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="linearGradient6813" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient6815"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6817" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6819" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="radialGradient6821" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6823"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6825" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6827" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="linearGradient6829" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient6831"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6833" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6835" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="radialGradient6837" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6839"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6841" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6843" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="linearGradient6845" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient6847"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6849" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6851" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="radialGradient6853" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6855"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6857" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6859" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="linearGradient6861" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient6863"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6865" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6867" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="radialGradient6869" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6871"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6873" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6875" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient6877" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + id="linearGradient6879"> + <stop + id="stop6881" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop6883" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient6885" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + id="linearGradient6887"> + <stop + id="stop6889" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop6891" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="linearGradient6893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient6895"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6897" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6899" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="radialGradient6901" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6903"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6905" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6907" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="linearGradient6909" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient6911"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6913" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6915" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="radialGradient6917" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6919"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6921" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6923" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="linearGradient6925" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient6927"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6929" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6931" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="radialGradient6933" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6935"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6937" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6939" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="linearGradient6941" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient6943"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6945" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6947" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="radialGradient6949" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6951"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6953" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6955" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient6957" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + id="linearGradient6959"> + <stop + id="stop6961" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop6963" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient6965" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + id="linearGradient6967"> + <stop + id="stop6969" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop6971" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="linearGradient6973" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient6975"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6977" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6979" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="radialGradient6981" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6983"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6985" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6987" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="linearGradient6989" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient6991"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop6993" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop6995" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="radialGradient6997" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient6999"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop7001" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop7003" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="linearGradient7005" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient7007"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop7009" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop7011" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="radialGradient7013" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient7015"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop7017" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop7019" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="linearGradient7021" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <linearGradient + id="linearGradient7023"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop7025" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop7027" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="radialGradient7029" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + id="linearGradient7031"> + <stop + offset="0" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + id="stop7033" /> + <stop + offset="1" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + id="stop7035" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient7037" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + id="linearGradient7039"> + <stop + id="stop7041" + style="stop-color: rgb(121, 121, 121); stop-opacity: 1;" + offset="0" /> + <stop + id="stop7043" + style="stop-color: rgb(203, 203, 203); stop-opacity: 1;" + offset="1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="linearGradient14934" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-53" + id="radialGradient14936" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="linearGradient14938" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-51" + id="radialGradient14940" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="linearGradient14942" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-7" + id="radialGradient14944" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="linearGradient14946" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-87" + id="radialGradient14948" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient14960" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19" + id="radialGradient14962" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14964" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14966" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14968" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14970" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14972" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14974" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14976" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14978" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14980" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14982" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14984" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14986" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14988" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14990" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14992" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14994" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14996" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient14998" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient15000" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient15002" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient15004" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient15006" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient15008" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient15010" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4068-4" + id="linearGradient15012" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.003627,0.996386)" + spreadMethod="reflect" + x1="145.52031" + y1="993.39124" + x2="191.89183" + y2="1061.9722" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5178-3" + id="radialGradient15014" + gradientUnits="userSpaceOnUse" + cx="384.69696" + cy="571.95715" + fx="384.69696" + fy="571.95715" + r="24.998358" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-19-1" + id="radialGradient15022" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="linearGradient15024" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,2.7721412,177.55089,360.10086)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-31" + id="radialGradient15026" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.7721412,0,0,4.3122209,343.74329,-552.89392)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-95" + id="linearGradient15028" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-95" + id="radialGradient15030" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient15032" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="linearGradient15034" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="radialGradient15036" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="linearGradient15038" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="radialGradient15040" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="linearGradient15042" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="radialGradient15044" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="linearGradient15046" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="radialGradient15048" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient15050" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient16536" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="linearGradient16538" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-5-4-2" + id="radialGradient16540" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="linearGradient16542" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-8-3-0" + id="radialGradient16544" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="linearGradient16546" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-9-8-0" + id="radialGradient16548" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="linearGradient16550" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-153,-176.36218)" + x1="175" + y1="207.36218" + x2="195" + y2="207.36218" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-1-93-3-2" + id="radialGradient16552" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.555556,-93.049086,-505.7086)" + cx="109" + cy="349.86218" + fx="109" + fy="349.86218" + r="4.5" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2202-2-1-25" + id="radialGradient16554" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(3.4620994,1.6838767,-1.3244276,2.7230693,24.214335,-863.95328)" + cx="97.48214" + cy="265.86209" + fx="97.48214" + fy="265.86209" + r="3" /> + <inkscape:perspective + id="perspective16564" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <filter + inkscape:collect="always" + id="filter5401"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="26.597254" + id="feGaussianBlur5403" /> + </filter> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.7" + inkscape:cx="200.23028" + inkscape:cy="680.6443" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + borderlayer="true" + inkscape:window-width="1325" + inkscape:window-height="958" + inkscape:window-x="289" + inkscape:window-y="44" + inkscape:window-maximized="0" /> + <metadata + id="metadata7747"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + <cc:license + rdf:resource="" /> + <dc:creator> + <cc:Agent> + <dc:title>David Pravec <alekibango@danix.org></dc:title> + </cc:Agent> + </dc:creator> + <dc:rights> + <cc:Agent> + <dc:title>released under terms of Apache License</dc:title> + </cc:Agent> + </dc:rights> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="Layer"> + <rect + style="opacity:1;fill:#fffbff;fill-opacity:1;stroke:#808080;stroke-width:1.92965995999999995;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter5401)" + id="rect4606" + width="720.59534" + height="1052.5549" + x="7.3978581" + y="4.8459768" /> + </g> + <g + inkscape:label="Vrstva 1" + inkscape:groupmode="layer" + id="layer1" + style="display:inline"> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="145.14323" + y="24.228884" + id="text40315"><tspan + sodipodi:role="line" + id="tspan40317" + x="145.14323" + y="24.228884" + style="font-weight:bold">C) More computers, but still only 1 cluster,</tspan><tspan + sodipodi:role="line" + x="145.14323" + y="36.728882" + id="tspan40319" + style="font-weight:bold">not distributed geographically</tspan></text> + <g + transform="matrix(0.96760451,0,0,0.96760451,-73.224015,-53.928306)" + id="g27482"> + <path + id="path27117-4" + d="m 738.35469,914.58244 60.1019,-30.62352" + style="fill:none;stroke:#808080;stroke-width:2.16065431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 532.25111,996.69188 478.6698,1023.993" + id="path32493" /> + <path + id="path32495" + d="m 405.72169,932.61984 -53.58133,27.30109" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 279.19222,868.5478 -53.58134,27.30108" + id="path32497" /> + <path + id="path32499" + d="M 152.66277,804.47575 99.081434,831.77684" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + id="path32501" + d="M 477.68954,1024.0781 98.420334,831.26468" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:nodetypes="cc" /> + <path + sodipodi:nodetypes="cc" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 487.64197,1117.5452 218.34365,981.27825" + id="path36366" /> + <path + id="path31410" + d="M 618.80039,800.81053 388.38639,683.59107" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:nodetypes="cc" /> + <g + transform="translate(-1.9553878,0.27934112)" + id="g92765"> + <path + id="path31406" + d="m 443.70447,656.64984 -53.58134,27.30109" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 466.14451,668.13188 -53.58134,27.30109" + id="path31408" /> + <path + id="path31634" + d="M 488.58463,679.61391 435.00328,706.915" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 511.02467,691.09594 -53.58134,27.30109" + id="path31636" /> + </g> + <g + transform="matrix(0.38524834,0,0,0.38524834,1.9170441,-0.21929845)" + id="g31422"> + <g + id="g3346-3" + transform="translate(45.388822,1591.2158)"> + <g + id="g117421-5" + transform="translate(897.38434,-46.491083)"> + <g + id="g117423-9" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path117425-2" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path117427-6" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path117429-7" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g117431-5"> + <path + id="path117433-6" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117435-3" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117437-1" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient104830);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path117439-7" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path117441-9" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path117443-5" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path117445-2" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path117447-8" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path117449-9" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path117451-2" /> + <path + sodipodi:nodetypes="ccccc" + id="path117453-8" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient104832);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path117455-2" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path117457-0" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path117459-5" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path117461-4" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path117463-1" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path117465-0" /> + </g> + </g> + </g> + <g + inkscape:label="Calque 1" + id="g109152-0" + transform="matrix(0.2766711,-0.1383356,0,0.2555605,1099.9201,-86.84348)" + style="fill:#00ff00;fill-opacity:1"> + <path + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 174.71965,639.58466 c -29.19719,0 -52.90625,13.34326 -52.90625,29.78125 l 0,119.125 c 0,16.43799 23.70907,29.78125 52.90625,29.78125 29.19719,-10e-6 52.90625,-13.34324 52.90625,-29.78125 l 0,-119.125 -0.0312,0 c 0,-16.43799 -23.67781,-29.78125 -52.875,-29.78125 z" + id="path109154-2" /> + <path + sodipodi:type="arc" + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:2.93746948;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path109156-5" + sodipodi:cx="184.11563" + sodipodi:cy="698.03149" + sodipodi:rx="30.68594" + sodipodi:ry="17.716536" + d="m 214.80157,698.03149 c 0,9.78458 -13.73856,17.71654 -30.68594,17.71654 -16.94738,0 -30.68594,-7.93196 -30.68594,-17.71654 0,-9.78457 13.73856,-17.71653 30.68594,-17.71653 16.94738,0 30.68594,7.93196 30.68594,17.71653 z" + transform="matrix(1.6638767,0,0,1.6225174,-131.61326,-463.20234)" /> + </g> + </g> + <g + id="g3346-1" + transform="translate(105.4361,1621.5028)"> + <g + id="g117421-9" + transform="translate(897.38434,-46.491083)"> + <g + id="g117423-8" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path117425-5" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path117427-7" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path117429-3" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g117431-54"> + <path + id="path117433-9" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117435-8" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117437-4" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient104834);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path117439-9" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path117441-3" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path117443-2" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path117445-4" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path117447-9" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path117449-4" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path117451-8" /> + <path + sodipodi:nodetypes="ccccc" + id="path117453-9" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient104836);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path117455-3" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path117457-3" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path117459-2" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path117461-9" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path117463-7" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path117465-3" /> + </g> + </g> + </g> + <g + inkscape:label="Calque 1" + id="g109152-2" + transform="matrix(0.2766711,-0.1383356,0,0.2555605,1099.9201,-86.84348)" + style="fill:#00ff00;fill-opacity:1"> + <path + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 174.71965,639.58466 c -29.19719,0 -52.90625,13.34326 -52.90625,29.78125 l 0,119.125 c 0,16.43799 23.70907,29.78125 52.90625,29.78125 29.19719,-10e-6 52.90625,-13.34324 52.90625,-29.78125 l 0,-119.125 -0.0312,0 c 0,-16.43799 -23.67781,-29.78125 -52.875,-29.78125 z" + id="path109154-5" /> + <path + sodipodi:type="arc" + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:2.93746948;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path109156-53" + sodipodi:cx="184.11563" + sodipodi:cy="698.03149" + sodipodi:rx="30.68594" + sodipodi:ry="17.716536" + d="m 214.80157,698.03149 c 0,9.78458 -13.73856,17.71654 -30.68594,17.71654 -16.94738,0 -30.68594,-7.93196 -30.68594,-17.71654 0,-9.78457 13.73856,-17.71653 30.68594,-17.71653 16.94738,0 30.68594,7.93196 30.68594,17.71653 z" + transform="matrix(1.6638767,0,0,1.6225174,-131.61326,-463.20234)" /> + </g> + </g> + <g + id="g3346-0" + transform="translate(167.06359,1653.3699)"> + <g + id="g117421-6" + transform="translate(897.38434,-46.491083)"> + <g + id="g117423-6" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path117425-3" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path117427-8" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path117429-1" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g117431-3"> + <path + id="path117433-4" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117435-1" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117437-48" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient104838);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path117439-6" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path117441-8" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path117443-7" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path117445-5" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path117447-1" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path117449-93" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path117451-83" /> + <path + sodipodi:nodetypes="ccccc" + id="path117453-94" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient104840);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path117455-25" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path117457-9" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path117459-4" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path117461-1" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path117463-8" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path117465-4" /> + </g> + </g> + </g> + <g + inkscape:label="Calque 1" + id="g109152-1" + transform="matrix(0.2766711,-0.1383356,0,0.2555605,1099.9201,-86.84348)" + style="fill:#00ff00;fill-opacity:1"> + <path + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 174.71965,639.58466 c -29.19719,0 -52.90625,13.34326 -52.90625,29.78125 l 0,119.125 c 0,16.43799 23.70907,29.78125 52.90625,29.78125 29.19719,-10e-6 52.90625,-13.34324 52.90625,-29.78125 l 0,-119.125 -0.0312,0 c 0,-16.43799 -23.67781,-29.78125 -52.875,-29.78125 z" + id="path109154-7" /> + <path + sodipodi:type="arc" + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:2.93746948;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path109156-7" + sodipodi:cx="184.11563" + sodipodi:cy="698.03149" + sodipodi:rx="30.68594" + sodipodi:ry="17.716536" + d="m 214.80157,698.03149 c 0,9.78458 -13.73856,17.71654 -30.68594,17.71654 -16.94738,0 -30.68594,-7.93196 -30.68594,-17.71654 0,-9.78457 13.73856,-17.71653 30.68594,-17.71653 16.94738,0 30.68594,7.93196 30.68594,17.71653 z" + transform="matrix(1.6638767,0,0,1.6225174,-131.61326,-463.20234)" /> + </g> + </g> + <g + id="g3346-03" + transform="translate(228.69107,1685.2371)"> + <g + id="g117421-1" + transform="translate(897.38434,-46.491083)"> + <g + id="g117423-1" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path117425-6" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path117427-2" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path117429-6" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g117431-6"> + <path + id="path117433-68" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117435-37" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117437-5" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient104842);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path117439-4" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path117441-6" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path117443-1" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path117445-7" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path117447-3" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path117449-8" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path117451-9" /> + <path + sodipodi:nodetypes="ccccc" + id="path117453-99" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient104844);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path117455-9" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path117457-8" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path117459-6" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path117461-3" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path117463-88" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path117465-6" /> + </g> + </g> + </g> + <g + inkscape:label="Calque 1" + id="g109152-6" + transform="matrix(0.2766711,-0.1383356,0,0.2555605,1099.9201,-86.84348)" + style="fill:#00ff00;fill-opacity:1"> + <path + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 174.71965,639.58466 c -29.19719,0 -52.90625,13.34326 -52.90625,29.78125 l 0,119.125 c 0,16.43799 23.70907,29.78125 52.90625,29.78125 29.19719,-10e-6 52.90625,-13.34324 52.90625,-29.78125 l 0,-119.125 -0.0312,0 c 0,-16.43799 -23.67781,-29.78125 -52.875,-29.78125 z" + id="path109154-8" /> + <path + sodipodi:type="arc" + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:2.93746948;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path109156-8" + sodipodi:cx="184.11563" + sodipodi:cy="698.03149" + sodipodi:rx="30.68594" + sodipodi:ry="17.716536" + d="m 214.80157,698.03149 c 0,9.78458 -13.73856,17.71654 -30.68594,17.71654 -16.94738,0 -30.68594,-7.93196 -30.68594,-17.71654 0,-9.78457 13.73856,-17.71653 30.68594,-17.71653 16.94738,0 30.68594,7.93196 30.68594,17.71653 z" + transform="matrix(1.6638767,0,0,1.6225174,-131.61326,-463.20234)" /> + </g> + </g> + </g> + <g + id="g92776"> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 578.38131,725.14266 -53.58134,27.30108" + id="path31688" /> + <path + id="path31690" + d="m 601.64743,737.31493 -53.58134,27.30108" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 624.91356,749.4872 -53.58134,27.30108" + id="path31692" /> + <path + id="path31694" + d="m 648.17965,761.65948 -53.58134,27.30108" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 671.26968,773.91981 618.04053,801.0448" + id="path31696" + sodipodi:nodetypes="cc" /> + </g> + <g + transform="matrix(0.38524834,0,0,0.38524834,155.17354,602.47061)" + id="g3925-3"> + <g + id="g108584-1" + transform="translate(59.882331,-420.31793)"> + <g + id="g92198-5"> + <path + id="path5361-5" + d="m 1005.3987,644.36812 55.4428,-27.72141 55.4429,27.72141 -55.4429,27.72142 -55.4428,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path5363-3" + d="m 1005.3987,644.36812 0,83.16424 55.4428,27.72141 0,-83.16423 -55.4428,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path5365-3" + d="m 1060.8415,755.25377 55.4429,-27.72141 0,-83.16424 -55.4429,27.72142 0,83.16423 z" + style="fill:url(#linearGradient104846);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 1060.8415,615.08738 -0.6064,0.34652 -55.4428,27.72141 -0.7797,0.34652 0,0.86629 0,83.16424 0,0.86629 0.7797,0.34652 55.4428,27.72141 0.6064,0.34652 0.6064,-0.34652 55.4429,-27.72141 0.7796,-0.34652 0,-0.86629 0,-83.16424 0,-0.86629 -0.7796,-0.34652 -55.4429,-27.72141 -0.6064,-0.34652 z m 0,3.11866 54.0568,27.02838 0,81.43165 -54.0568,27.02837 -54.0567,-27.02837 0,-81.43165 54.0567,-27.02838 z" + id="path5391-6" /> + <path + style="fill:url(#pattern6042-6);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1010.0335,651.21095 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4979-5" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#pattern6040-9);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1022.9003,658.59748 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4981-4" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#pattern6038-2);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1035.7672,665.26918 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4983-9" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 1048.3958,671.70261 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4985-3" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path4977-8" + d="m 1048.3958,671.70261 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6036-5);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4987-5" + d="m 1010.0335,689.81151 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6034-1);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4989-8" + d="m 1022.9003,697.19804 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6032-6);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4991-6" + d="m 1035.7672,703.86974 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6030-0);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:url(#pattern6028-4);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1048.3958,710.30317 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4993-0" + sodipodi:nodetypes="ccccc" /> + </g> + </g> + <g + transform="matrix(0.4481573,-0.2240787,0,0.6402247,1001.8024,-178.48439)" + id="g108970-7"> + <path + d="m 314.09476,861.04125 c -1.56438,0.834 -3.6901,0.50384 -4.68956,-1.58568 -0.84011,-1.93879 -15.12073,-31.80949 -15.51636,-32.75301 -1.17184,-2.57186 -0.21709,-4.29384 1.44804,-5.1975 2.29126,-1.26473 21.81453,-11.77888 23.51292,-12.64626 1.86955,-1.02115 3.89506,-0.88867 5.13133,1.65883 0.9779,2.05018 14.86956,31.16397 15.69988,32.85344 0.87451,1.81637 0.0508,3.97006 -1.72579,4.83701 -1.32383,0.66683 -22.9908,12.34832 -23.86046,12.83317 z" + id="path108972-9" + style="font-size:12px;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.74380612" /> + <path + d="m 314.23273,847.2469 c -1.75078,-0.007 -3.50603,-1.32081 -3.50687,-3.66398 0.0771,-2.13226 0.0716,-35.62533 0.12093,-36.65668 0.051,-2.85603 1.63653,-3.93391 3.50687,-3.94111 2.5827,-0.0289 24.47747,-0.0411 26.36202,0 2.10274,-0.0139 3.85286,1.07587 3.8697,3.94111 -0.002,2.29773 -0.0205,34.9291 -2e-5,36.8343 0.006,2.03958 -1.64681,3.56538 -3.60097,3.48636 -1.46498,-0.0403 -25.76932,-0.0153 -26.75166,0 z" + id="path108974-5" + style="font-size:12px;fill:#ffffeb;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.743806" /> + <path + d="m 322.93888,855.54573 c -1.47013,-1.00866 -2.27836,-3.12041 -1.08622,-5.09293 1.15034,-1.7504 18.19628,-29.94194 18.7628,-30.78168 1.49688,-2.37446 3.37999,-2.37319 4.95778,-1.30763 2.18836,1.45544 20.62163,13.98988 22.18679,15.10424 1.77679,1.19305 2.69491,3.113 1.25047,5.53408 -1.17108,1.93287 -17.79882,29.38525 -18.75145,31.00043 -1.03344,1.71987 -3.20105,2.05714 -4.80547,0.87102 -1.21244,-0.8733 -21.68017,-14.77752 -22.5147,-15.32753 z" + id="path108976-7" + style="font-size:12px;fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.743806" /> + </g> + </g> + <g + transform="matrix(0.38524834,0,0,0.38524834,179.01425,614.60464)" + id="g3925-5"> + <g + id="g108584-0" + transform="translate(59.882331,-420.31793)"> + <g + id="g92198-1"> + <path + id="path5361-58" + d="m 1005.3987,644.36812 55.4428,-27.72141 55.4429,27.72141 -55.4429,27.72142 -55.4428,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path5363-6" + d="m 1005.3987,644.36812 0,83.16424 55.4428,27.72141 0,-83.16423 -55.4428,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path5365-0" + d="m 1060.8415,755.25377 55.4429,-27.72141 0,-83.16424 -55.4429,27.72142 0,83.16423 z" + style="fill:url(#linearGradient104848);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 1060.8415,615.08738 -0.6064,0.34652 -55.4428,27.72141 -0.7797,0.34652 0,0.86629 0,83.16424 0,0.86629 0.7797,0.34652 55.4428,27.72141 0.6064,0.34652 0.6064,-0.34652 55.4429,-27.72141 0.7796,-0.34652 0,-0.86629 0,-83.16424 0,-0.86629 -0.7796,-0.34652 -55.4429,-27.72141 -0.6064,-0.34652 z m 0,3.11866 54.0568,27.02838 0,81.43165 -54.0568,27.02837 -54.0567,-27.02837 0,-81.43165 54.0567,-27.02838 z" + id="path5391-1" /> + <path + style="fill:url(#pattern6042-3);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1010.0335,651.21095 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4979-0" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#pattern6040-4);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1022.9003,658.59748 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4981-7" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#pattern6038-8);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1035.7672,665.26918 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4983-1" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 1048.3958,671.70261 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4985-7" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path4977-0" + d="m 1048.3958,671.70261 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6036-0);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4987-3" + d="m 1010.0335,689.81151 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6034-4);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4989-9" + d="m 1022.9003,697.19804 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6032-9);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4991-8" + d="m 1035.7672,703.86974 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6030-4);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:url(#pattern6028-1);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1048.3958,710.30317 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4993-6" + sodipodi:nodetypes="ccccc" /> + </g> + </g> + <g + transform="matrix(0.4481573,-0.2240787,0,0.6402247,1001.8024,-178.48439)" + id="g108970-5"> + <path + d="m 314.09476,861.04125 c -1.56438,0.834 -3.6901,0.50384 -4.68956,-1.58568 -0.84011,-1.93879 -15.12073,-31.80949 -15.51636,-32.75301 -1.17184,-2.57186 -0.21709,-4.29384 1.44804,-5.1975 2.29126,-1.26473 21.81453,-11.77888 23.51292,-12.64626 1.86955,-1.02115 3.89506,-0.88867 5.13133,1.65883 0.9779,2.05018 14.86956,31.16397 15.69988,32.85344 0.87451,1.81637 0.0508,3.97006 -1.72579,4.83701 -1.32383,0.66683 -22.9908,12.34832 -23.86046,12.83317 z" + id="path108972-1" + style="font-size:12px;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.74380612" /> + <path + d="m 314.23273,847.2469 c -1.75078,-0.007 -3.50603,-1.32081 -3.50687,-3.66398 0.0771,-2.13226 0.0716,-35.62533 0.12093,-36.65668 0.051,-2.85603 1.63653,-3.93391 3.50687,-3.94111 2.5827,-0.0289 24.47747,-0.0411 26.36202,0 2.10274,-0.0139 3.85286,1.07587 3.8697,3.94111 -0.002,2.29773 -0.0205,34.9291 -2e-5,36.8343 0.006,2.03958 -1.64681,3.56538 -3.60097,3.48636 -1.46498,-0.0403 -25.76932,-0.0153 -26.75166,0 z" + id="path108974-4" + style="font-size:12px;fill:#ffffeb;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.743806" /> + <path + d="m 322.93888,855.54573 c -1.47013,-1.00866 -2.27836,-3.12041 -1.08622,-5.09293 1.15034,-1.7504 18.19628,-29.94194 18.7628,-30.78168 1.49688,-2.37446 3.37999,-2.37319 4.95778,-1.30763 2.18836,1.45544 20.62163,13.98988 22.18679,15.10424 1.77679,1.19305 2.69491,3.113 1.25047,5.53408 -1.17108,1.93287 -17.79882,29.38525 -18.75145,31.00043 -1.03344,1.71987 -3.20105,2.05714 -4.80547,0.87102 -1.21244,-0.8733 -21.68017,-14.77752 -22.5147,-15.32753 z" + id="path108976-5" + style="font-size:12px;fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.743806" /> + </g> + </g> + <g + transform="matrix(0.38524834,0,0,0.38524834,202.85484,626.73869)" + id="g3925-1"> + <g + id="g108584-7" + transform="translate(59.882331,-420.31793)"> + <g + id="g92198-4"> + <path + id="path5361-2" + d="m 1005.3987,644.36812 55.4428,-27.72141 55.4429,27.72141 -55.4429,27.72142 -55.4428,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path5363-7" + d="m 1005.3987,644.36812 0,83.16424 55.4428,27.72141 0,-83.16423 -55.4428,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path5365-5" + d="m 1060.8415,755.25377 55.4429,-27.72141 0,-83.16424 -55.4429,27.72142 0,83.16423 z" + style="fill:url(#linearGradient104850);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 1060.8415,615.08738 -0.6064,0.34652 -55.4428,27.72141 -0.7797,0.34652 0,0.86629 0,83.16424 0,0.86629 0.7797,0.34652 55.4428,27.72141 0.6064,0.34652 0.6064,-0.34652 55.4429,-27.72141 0.7796,-0.34652 0,-0.86629 0,-83.16424 0,-0.86629 -0.7796,-0.34652 -55.4429,-27.72141 -0.6064,-0.34652 z m 0,3.11866 54.0568,27.02838 0,81.43165 -54.0568,27.02837 -54.0567,-27.02837 0,-81.43165 54.0567,-27.02838 z" + id="path5391-5" /> + <path + style="fill:url(#pattern6042-0);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1010.0335,651.21095 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4979-7" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#pattern6040-7);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1022.9003,658.59748 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4981-1" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#pattern6038-27);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1035.7672,665.26918 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4983-3" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 1048.3958,671.70261 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4985-77" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path4977-85" + d="m 1048.3958,671.70261 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6036-2);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4987-6" + d="m 1010.0335,689.81151 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6034-5);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4989-5" + d="m 1022.9003,697.19804 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6032-3);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4991-7" + d="m 1035.7672,703.86974 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6030-42);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:url(#pattern6028-0);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1048.3958,710.30317 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4993-4" + sodipodi:nodetypes="ccccc" /> + </g> + </g> + <g + transform="matrix(0.4481573,-0.2240787,0,0.6402247,1001.8024,-178.48439)" + id="g108970-1"> + <path + d="m 314.09476,861.04125 c -1.56438,0.834 -3.6901,0.50384 -4.68956,-1.58568 -0.84011,-1.93879 -15.12073,-31.80949 -15.51636,-32.75301 -1.17184,-2.57186 -0.21709,-4.29384 1.44804,-5.1975 2.29126,-1.26473 21.81453,-11.77888 23.51292,-12.64626 1.86955,-1.02115 3.89506,-0.88867 5.13133,1.65883 0.9779,2.05018 14.86956,31.16397 15.69988,32.85344 0.87451,1.81637 0.0508,3.97006 -1.72579,4.83701 -1.32383,0.66683 -22.9908,12.34832 -23.86046,12.83317 z" + id="path108972-2" + style="font-size:12px;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.74380612" /> + <path + d="m 314.23273,847.2469 c -1.75078,-0.007 -3.50603,-1.32081 -3.50687,-3.66398 0.0771,-2.13226 0.0716,-35.62533 0.12093,-36.65668 0.051,-2.85603 1.63653,-3.93391 3.50687,-3.94111 2.5827,-0.0289 24.47747,-0.0411 26.36202,0 2.10274,-0.0139 3.85286,1.07587 3.8697,3.94111 -0.002,2.29773 -0.0205,34.9291 -2e-5,36.8343 0.006,2.03958 -1.64681,3.56538 -3.60097,3.48636 -1.46498,-0.0403 -25.76932,-0.0153 -26.75166,0 z" + id="path108974-46" + style="font-size:12px;fill:#ffffeb;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.743806" /> + <path + d="m 322.93888,855.54573 c -1.47013,-1.00866 -2.27836,-3.12041 -1.08622,-5.09293 1.15034,-1.7504 18.19628,-29.94194 18.7628,-30.78168 1.49688,-2.37446 3.37999,-2.37319 4.95778,-1.30763 2.18836,1.45544 20.62163,13.98988 22.18679,15.10424 1.77679,1.19305 2.69491,3.113 1.25047,5.53408 -1.17108,1.93287 -17.79882,29.38525 -18.75145,31.00043 -1.03344,1.71987 -3.20105,2.05714 -4.80547,0.87102 -1.21244,-0.8733 -21.68017,-14.77752 -22.5147,-15.32753 z" + id="path108976-1" + style="font-size:12px;fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.743806" /> + </g> + </g> + <g + transform="matrix(0.38524834,0,0,0.38524834,227.30424,638.87277)" + id="g3925-4"> + <g + id="g108584-5" + transform="translate(58.302139,-420.31793)"> + <g + id="g92198-0"> + <path + id="path5361-29" + d="m 1005.3987,644.36812 55.4428,-27.72141 55.4429,27.72141 -55.4429,27.72142 -55.4428,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path5363-5" + d="m 1005.3987,644.36812 0,83.16424 55.4428,27.72141 0,-83.16423 -55.4428,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path5365-7" + d="m 1060.8415,755.25377 55.4429,-27.72141 0,-83.16424 -55.4429,27.72142 0,83.16423 z" + style="fill:url(#linearGradient104852);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 1060.8415,615.08738 -0.6064,0.34652 -55.4428,27.72141 -0.7797,0.34652 0,0.86629 0,83.16424 0,0.86629 0.7797,0.34652 55.4428,27.72141 0.6064,0.34652 0.6064,-0.34652 55.4429,-27.72141 0.7796,-0.34652 0,-0.86629 0,-83.16424 0,-0.86629 -0.7796,-0.34652 -55.4429,-27.72141 -0.6064,-0.34652 z m 0,3.11866 54.0568,27.02838 0,81.43165 -54.0568,27.02837 -54.0567,-27.02837 0,-81.43165 54.0567,-27.02838 z" + id="path5391-4" /> + <path + style="fill:url(#pattern6042-7);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1010.0335,651.21095 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4979-2" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#pattern6040-5);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1022.9003,658.59748 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4981-2" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#pattern6038-6);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1035.7672,665.26918 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4983-19" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 1048.3958,671.70261 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4985-6" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path4977-1" + d="m 1048.3958,671.70261 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6036-8);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4987-1" + d="m 1010.0335,689.81151 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6034-0);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4989-7" + d="m 1022.9003,697.19804 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6032-4);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4991-80" + d="m 1035.7672,703.86974 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6030-5);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:url(#pattern6028-7);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1048.3958,710.30317 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4993-66" + sodipodi:nodetypes="ccccc" /> + </g> + </g> + <g + transform="matrix(0.4481573,-0.2240787,0,0.6402247,1001.8024,-178.48439)" + id="g108970-3"> + <path + d="m 314.09476,861.04125 c -1.56438,0.834 -3.6901,0.50384 -4.68956,-1.58568 -0.84011,-1.93879 -15.12073,-31.80949 -15.51636,-32.75301 -1.17184,-2.57186 -0.21709,-4.29384 1.44804,-5.1975 2.29126,-1.26473 21.81453,-11.77888 23.51292,-12.64626 1.86955,-1.02115 3.89506,-0.88867 5.13133,1.65883 0.9779,2.05018 14.86956,31.16397 15.69988,32.85344 0.87451,1.81637 0.0508,3.97006 -1.72579,4.83701 -1.32383,0.66683 -22.9908,12.34832 -23.86046,12.83317 z" + id="path108972-7" + style="font-size:12px;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.74380612" /> + <path + d="m 314.23273,847.2469 c -1.75078,-0.007 -3.50603,-1.32081 -3.50687,-3.66398 0.0771,-2.13226 0.0716,-35.62533 0.12093,-36.65668 0.051,-2.85603 1.63653,-3.93391 3.50687,-3.94111 2.5827,-0.0289 24.47747,-0.0411 26.36202,0 2.10274,-0.0139 3.85286,1.07587 3.8697,3.94111 -0.002,2.29773 -0.0205,34.9291 -2e-5,36.8343 0.006,2.03958 -1.64681,3.56538 -3.60097,3.48636 -1.46498,-0.0403 -25.76932,-0.0153 -26.75166,0 z" + id="path108974-1" + style="font-size:12px;fill:#ffffeb;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.743806" /> + <path + d="m 322.93888,855.54573 c -1.47013,-1.00866 -2.27836,-3.12041 -1.08622,-5.09293 1.15034,-1.7504 18.19628,-29.94194 18.7628,-30.78168 1.49688,-2.37446 3.37999,-2.37319 4.95778,-1.30763 2.18836,1.45544 20.62163,13.98988 22.18679,15.10424 1.77679,1.19305 2.69491,3.113 1.25047,5.53408 -1.17108,1.93287 -17.79882,29.38525 -18.75145,31.00043 -1.03344,1.71987 -3.20105,2.05714 -4.80547,0.87102 -1.21244,-0.8733 -21.68017,-14.77752 -22.5147,-15.32753 z" + id="path108976-3" + style="font-size:12px;fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.743806" /> + </g> + </g> + <g + transform="matrix(0.38524834,0,0,0.38524834,250.53613,651.0068)" + id="g3925-54"> + <g + id="g108584-02" + transform="translate(59.882331,-420.31793)"> + <g + id="g92198-47"> + <path + id="path5361-4" + d="m 1005.3987,644.36812 55.4428,-27.72141 55.4429,27.72141 -55.4429,27.72142 -55.4428,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path5363-2" + d="m 1005.3987,644.36812 0,83.16424 55.4428,27.72141 0,-83.16423 -55.4428,-27.72142 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path5365-6" + d="m 1060.8415,755.25377 55.4429,-27.72141 0,-83.16424 -55.4429,27.72142 0,83.16423 z" + style="fill:url(#linearGradient104854);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 1060.8415,615.08738 -0.6064,0.34652 -55.4428,27.72141 -0.7797,0.34652 0,0.86629 0,83.16424 0,0.86629 0.7797,0.34652 55.4428,27.72141 0.6064,0.34652 0.6064,-0.34652 55.4429,-27.72141 0.7796,-0.34652 0,-0.86629 0,-83.16424 0,-0.86629 -0.7796,-0.34652 -55.4429,-27.72141 -0.6064,-0.34652 z m 0,3.11866 54.0568,27.02838 0,81.43165 -54.0568,27.02837 -54.0567,-27.02837 0,-81.43165 54.0567,-27.02838 z" + id="path5391-3" /> + <path + style="fill:url(#pattern6042-2);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1010.0335,651.21095 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4979-9" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#pattern6040-43);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1022.9003,658.59748 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4981-0" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#pattern6038-7);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1035.7672,665.26918 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4983-6" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 1048.3958,671.70261 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4985-39" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path4977-6" + d="m 1048.3958,671.70261 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6036-83);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4987-8" + d="m 1010.0335,689.81151 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6034-16);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4989-79" + d="m 1022.9003,697.19804 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6032-92);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccc" + id="path4991-68" + d="m 1035.7672,703.86974 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + style="fill:url(#pattern6030-6);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:url(#pattern6028-2);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 1048.3958,710.30317 0,32.47914 8.3164,4.39648 0,-32.7174 -8.3164,-4.15822 z" + id="path4993-04" + sodipodi:nodetypes="ccccc" /> + </g> + </g> + <g + transform="matrix(0.4481573,-0.2240787,0,0.6402247,1001.8024,-178.48439)" + id="g108970-2"> + <path + d="m 314.09476,861.04125 c -1.56438,0.834 -3.6901,0.50384 -4.68956,-1.58568 -0.84011,-1.93879 -15.12073,-31.80949 -15.51636,-32.75301 -1.17184,-2.57186 -0.21709,-4.29384 1.44804,-5.1975 2.29126,-1.26473 21.81453,-11.77888 23.51292,-12.64626 1.86955,-1.02115 3.89506,-0.88867 5.13133,1.65883 0.9779,2.05018 14.86956,31.16397 15.69988,32.85344 0.87451,1.81637 0.0508,3.97006 -1.72579,4.83701 -1.32383,0.66683 -22.9908,12.34832 -23.86046,12.83317 z" + id="path108972-0" + style="font-size:12px;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.74380612" /> + <path + d="m 314.23273,847.2469 c -1.75078,-0.007 -3.50603,-1.32081 -3.50687,-3.66398 0.0771,-2.13226 0.0716,-35.62533 0.12093,-36.65668 0.051,-2.85603 1.63653,-3.93391 3.50687,-3.94111 2.5827,-0.0289 24.47747,-0.0411 26.36202,0 2.10274,-0.0139 3.85286,1.07587 3.8697,3.94111 -0.002,2.29773 -0.0205,34.9291 -2e-5,36.8343 0.006,2.03958 -1.64681,3.56538 -3.60097,3.48636 -1.46498,-0.0403 -25.76932,-0.0153 -26.75166,0 z" + id="path108974-8" + style="font-size:12px;fill:#ffffeb;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.743806" /> + <path + d="m 322.93888,855.54573 c -1.47013,-1.00866 -2.27836,-3.12041 -1.08622,-5.09293 1.15034,-1.7504 18.19628,-29.94194 18.7628,-30.78168 1.49688,-2.37446 3.37999,-2.37319 4.95778,-1.30763 2.18836,1.45544 20.62163,13.98988 22.18679,15.10424 1.77679,1.19305 2.69491,3.113 1.25047,5.53408 -1.17108,1.93287 -17.79882,29.38525 -18.75145,31.00043 -1.03344,1.71987 -3.20105,2.05714 -4.80547,0.87102 -1.21244,-0.8733 -21.68017,-14.77752 -22.5147,-15.32753 z" + id="path108976-18" + style="font-size:12px;fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:#005800;stroke-width:1.743806" /> + </g> + </g> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 226.42238,966.71583 53.58135,-27.3011" + id="path32503" /> + <path + id="path29436-1" + d="M 325.99984,687.25962 463.42976,757.4159" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:nodetypes="cc" /> + <path + id="path29430" + d="m 285.13466,729.79622 53.58132,-27.30108" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + id="path29432-6" + d="m 449.34827,770.11285 53.58134,-27.30109" + style="fill:none;stroke:#808080;stroke-width:1.926;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 410.54673,794.05451 53.58133,-27.30108" + id="path29324-0" /> + <path + id="path29432" + d="m 535.95881,858.31276 53.58134,-27.30109" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 661.3709,922.57103 53.58134,-27.30108" + id="path29434" /> + <path + sodipodi:nodetypes="cc" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 337.70005,702.46435 819.51686,948.23104" + id="path29436" /> + <g + transform="matrix(0.38524834,0,0,0.38524834,476.30036,510.44216)" + id="g3259-9"> + <g + transform="matrix(6.5383417,0,0,6.5383417,364.86909,935.55835)" + inkscape:label="Calque 1" + id="g118215-8"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path118217-0" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path118219-3" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path118221-1" /> + <g + transform="translate(-68.205597,-63.743549)" + id="g118223-5"> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + id="path118225-7" /> + <path + sodipodi:nodetypes="ccccc" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + id="path118227-7" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + id="path118229-7" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#radialGradient104856);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + id="path118231-0" + sodipodi:nodetypes="ccccc" /> + </g> + </g> + <g + transform="matrix(0.6363961,0.3181981,-0.6363961,0.3181981,-697.62009,289.09977)" + id="g2662-9"> + <path + id="path2664-8" + d="m 1044.4209,-4.5996044 0,78.9062504 78.9063,0 0,-78.9062504 -78.9063,0 z m 39.4688,2.46875 c 20.4177,0 37,16.5823004 37,37.0000004 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 -10e-5,-20.41771 16.5823,-37.0000004 37,-37.0000004 z" + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" /> + <g + id="g2666-0" + style="fill:#00ffff;stroke:#ffffff" + transform="translate(705.44117,-218.9829)"> + <path + id="path2668-3" + d="m 378.53666,218.814 -6.22099,11.28987 1.97176,0 0,18.4037 8.49847,0 0,-18.4037 1.95647,0 -6.20571,-11.28987 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 378.53666,288.85884 -6.22099,-11.28987 1.97176,0 0,-18.4037 8.49847,0 0,18.4037 1.95647,0 -6.20571,11.28987 z" + id="path2670-1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 343.41044,253.56675 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + id="path2672-4" /> + <path + id="path2674-8" + d="m 413.45528,253.56675 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + </g> + </g> + <path + sodipodi:nodetypes="cc" + id="path27123" + d="m 742.14931,988.34183 77.31228,-39.64335" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <g + id="g32453" + transform="matrix(0.38524834,0,0,0.38524834,303.1066,676.24416)"> + <g + id="g32455" + inkscape:label="Calque 1" + transform="matrix(6.5383417,0,0,6.5383417,364.86909,935.55835)"> + <path + id="path32457" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path32459" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path32461" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g32463" + transform="translate(-68.205597,-63.743549)"> + <path + id="path32465" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path32467" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path32469" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path32471" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + style="fill:url(#radialGradient104858);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + <g + id="g32473" + transform="matrix(0.6363961,0.3181981,-0.6363961,0.3181981,-697.62009,289.09977)"> + <path + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" + d="m 1044.4209,-4.5996044 0,78.9062504 78.9063,0 0,-78.9062504 -78.9063,0 z m 39.4688,2.46875 c 20.4177,0 37,16.5823004 37,37.0000004 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 -10e-5,-20.41771 16.5823,-37.0000004 37,-37.0000004 z" + id="path32475" /> + <g + transform="translate(705.44117,-218.9829)" + style="fill:#00ffff;stroke:#ffffff" + id="g32477"> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 378.53666,218.814 -6.22099,11.28987 1.97176,0 0,18.4037 8.49847,0 0,-18.4037 1.95647,0 -6.20571,-11.28987 z" + id="path32479" /> + <path + id="path32481" + d="m 378.53666,288.85884 -6.22099,-11.28987 1.97176,0 0,-18.4037 8.49847,0 0,18.4037 1.95647,0 -6.20571,11.28987 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + id="path32483" + d="m 343.41044,253.56675 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 413.45528,253.56675 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + id="path32485" /> + </g> + </g> + </g> + <g + id="g32288" + transform="matrix(0.87584947,0,0,0.87584947,-199.57545,837.53626)"> + <g + id="g32290"> + <path + d="m 452.22752,154.79534 c -1.32987,4.3593 0.97442,13.06343 4.32672,7.29809 0.55883,-4.21566 0.16853,-13.66849 -4.32672,-7.29809 z" + id="path32292" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 459.05645,154.87353 c -5.73123,-1.99396 -4.37255,6.82514 -3.10169,8.88804 4.41472,0.3139 8.88448,0.68282 7.08957,-5.21292 -0.15325,-2.39014 -1.62637,-3.78967 -3.98788,-3.67512 z" + id="path32294" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 461.48045,154.95173 c -1.09246,1.9721 -0.88144,8.20841 3.07563,8.75771 7.13327,0.55239 -1.24277,-5.48505 3.0235,-5.57782 1.36821,-3.25204 -5.37175,-7.28408 -6.09913,-3.17989 z" + id="path32296" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 469.14346,154.84748 c -6.26267,0.075 -4.66384,10.71977 1.4292,8.95932 4.83425,0.31308 3.44625,-9.88021 -1.4292,-8.95932 z" + id="path32298" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 468.85674,155.68154 c -5.85015,2.68836 -2.79296,6.6586 2.86712,4.84803 3.28424,0.8454 -0.45596,-6.36406 -2.86712,-4.84803 z" + id="path32300" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 475.63355,154.84748 c -5.82517,-1.97942 -4.54812,6.74301 -3.23202,8.91409 4.84187,0.18324 3.39963,-5.16968 5.70816,-6.35977 0.24428,-2.37476 -0.19418,-2.73428 -2.47614,-2.55432 z" + id="path32302" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 479.49112,154.87353 c -5.77442,-2.02369 -4.43922,6.79664 -3.15383,8.88804 4.41473,0.3139 8.88448,0.68282 7.08958,-5.21292 -0.15836,-2.36396 -1.59101,-3.77955 -3.93575,-3.67512 z" + id="path32304" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 485.56417,154.84748 c -6.19598,0.15033 -4.65067,10.675 1.42942,8.96143 4.93021,0.35507 3.48048,-9.89643 -1.42942,-8.96143 z" + id="path32306" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 485.30352,155.68154 c -5.85015,2.68836 -2.79297,6.6586 2.86711,4.84803 3.28424,0.8454 -0.45595,-6.36406 -2.86711,-4.84803 z" + id="path32308" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 488.0403,154.95173 c -1.06389,1.96915 -0.92086,8.22865 3.04957,8.75771 7.16539,0.57531 -1.21095,-5.48429 3.04956,-5.57782 1.3682,-3.25204 -5.37175,-7.28408 -6.09913,-3.17989 z" + id="path32310" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32312" + inkscape:tile-cx="150.57283" + inkscape:tile-cy="1057.5979" + inkscape:tile-h="104.60061" + inkscape:tile-w="105.36077" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104860);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.179335,0,0,0.149728,502.1893,-24.02897)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32314" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104862);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(0.284001,0,0,0.193224,407.7236,-73.15871)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32316" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104864);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(0.340554,0,0,0.231701,396.3144,-88.95173)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32318" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104866);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(0.249954,0,0,0.170059,406.7992,-32.10751)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32320" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104868);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(0.260403,0,0,0.177168,412.2819,-25.25605)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32322" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104870);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.104126,-0.150834,-0.146719,0.07084417,668.335,91.43843)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32324" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104872);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.154671,-0.224051,-0.217939,0.105233,738.2325,88.88709)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32326" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104874);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.138006,-0.19991,-0.194457,0.09389457,722.8067,97.77468)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32328" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104876);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.117791,-0.170629,-0.165973,0.08014087,677.6847,122.0894)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32330" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104878);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.09614486,-0.139271,-0.135472,0.06541328,635.5166,142.1226)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32332" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104880);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.164683,-0.238552,0.232045,-0.112044,265.1906,314.0698)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32334" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104882);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.172846,-0.250377,0.243546,-0.117597,239.7257,330.3731)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32336" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104884);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.177232,-0.256733,0.249729,-0.120583,225.1178,318.3329)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32338" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104886);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.166524,-0.241221,0.23464,-0.113297,227.7161,329.1711)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32340" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104888);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.112183,-0.162505,0.158072,-0.07632533,314.1776,290.1886)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32342" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104890);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.11826,0.171307,0.166634,0.08045988,311.5686,16.07786)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32344" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104892);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.0943583,0.136684,0.132956,0.06419815,331.8395,50.2111)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32346" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104894);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.114364,0.165662,0.161143,0.07780872,322.2702,30.08746)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32348" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104896);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.140702,0.203815,0.198255,0.09572832,286.7172,18.15027)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32350" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104898);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.162185,0.234935,0.228526,0.110345,259.9411,6.05945)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32352" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104900);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.160583,0.232613,-0.226269,-0.109254,748.0707,211.5833)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32354" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104902);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.12628,0.182922,-0.177934,-0.08591606,697.8146,196.7379)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32356" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104904);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.137748,0.199537,-0.194093,-0.09371803,714.1281,221.8225)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32358" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104906);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.120979,0.175247,-0.170466,-0.08231039,662.6019,207.1803)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path32360" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient104908);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.14434,0.209086,-0.203383,-0.09820396,735.5011,232.5166)" /> + </g> + <path + d="m 409.69532,571.95715 c 0,13.80622 -11.19215,24.99836 -24.99836,24.99836 -13.80621,0 -24.99836,-11.19214 -24.99836,-24.99836 0,-13.80621 11.19215,-24.99835 24.99836,-24.99835 13.80621,0 24.99836,11.19214 24.99836,24.99835 z" + id="path32362" + sodipodi:cx="384.69696" + sodipodi:cy="571.95715" + sodipodi:rx="24.998358" + sodipodi:ry="24.998358" + sodipodi:type="arc" + style="fill:url(#radialGradient104910);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.155532,0,0,1.155532,26.16756,-503.197)" /> + <text + id="text32364" + style="font-size:10.00881386px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#9f0021;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="469.55161" + xml:space="preserve" + y="161.44913"><tspan + id="tspan32366" + sodipodi:role="line" + x="469.55161" + y="161.44913">Internet</tspan></text> + </g> + <text + id="text32505" + y="620.82263" + x="542.62994" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + y="620.82263" + x="542.62994" + id="tspan32507" + sodipodi:role="line">HA Database</tspan><tspan + id="tspan40323" + y="633.32263" + x="542.62994" + sodipodi:role="line" /></text> + <text + id="text32509" + y="666.54858" + x="708.54053" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + y="666.54858" + x="708.54053" + id="tspan32511" + sodipodi:role="line">HA storage</tspan><tspan + id="tspan40321" + y="679.04858" + x="708.54053" + sodipodi:role="line">(SAN, SheepDog ?)</tspan></text> + <text + id="text35139" + y="683.30566" + x="176.33803" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + y="683.30566" + x="177.92982" + id="tspan35141" + sodipodi:role="line">Diskless servers </tspan><tspan + id="tspan40139" + y="695.80566" + x="176.33803" + sodipodi:role="line">running</tspan><tspan + id="tspan40137" + y="708.30566" + x="176.33803" + sodipodi:role="line"> virtual guests</tspan></text> + <g + transform="matrix(0.24965474,0,0,0.24965474,35.709234,628.79112)" + id="g3408-9"> + <g + id="g117789-2" + transform="translate(910.08874,75.719118)"> + <g + id="g117791-7" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path117793-4" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path117795-0" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path117797-3" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g117799-8"> + <path + id="path117801-4" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path117803-4" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path117805-7" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient104912);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path117807-5" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path117809-3" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path117811-8" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path117813-7" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path117815-2" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path117817-2" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path117819-7" /> + <path + sodipodi:nodetypes="ccccc" + id="path117821-9" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient104914);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path117823-6" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path117825-6" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path117827-4" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path117829-2" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path117831-1" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path117833-4" /> + </g> + </g> + </g> + <path + id="path117855-7" + d="m 1162.9818,171.48314 c -0.6741,0.33705 -1.3556,0.72418 -2.0094,1.15981 l -0.1629,0.81846 0,0.34911 0.3259,3.40575 -3.4213,3.02948 -0.9775,-2.84717 -0.1086,-0.25601 -0.3801,-0.31421 c -1.2465,1.38745 -2.403,2.96448 -3.4756,4.64702 l 0.1086,0.64391 0.1086,0.25601 1.5477,2.05781 -2.5252,4.87005 -1.9821,-1.21995 -0.2173,-0.0465 -0.4887,0.0892 c -0.8024,1.93355 -1.5015,3.93523 -2.0365,5.98332 l 0.353,0.36657 0.2172,0.0465 2.3352,0.22887 -0.9232,5.34909 -2.4981,0.78357 -0.2444,0.12218 -0.5159,0.49068 c -0.076,0.97201 -0.1086,1.96181 -0.1086,2.92475 0,0.96297 0.033,1.8815 0.1086,2.77735 l 0.5159,-0.0252 0.2444,-0.12218 2.4981,-1.71451 0.9232,4.46471 -2.3352,2.52521 -0.2172,0.30256 -0.3258,0.70598 c 0.5378,1.51081 1.2313,2.81882 2.0364,3.94685 l 0.4616,-0.38596 0.2173,-0.30256 1.9821,-3.20209 2.5252,2.34484 -1.5477,3.64429 -0.1086,0.36463 -0.1086,0.75251 c 1.0633,0.60459 2.2142,1.00228 3.4484,1.14625 l 0.4073,-0.70792 0.1086,-0.36462 0.9775,-3.78588 3.4213,-0.39177 -0.3259,3.69278 0,0.38789 0.1629,0.61677 c 0.6538,-0.21809 1.3353,-0.51246 2.0094,-0.8495 0.674,-0.33703 1.3284,-0.7106 1.9821,-1.14624 l 0.1629,-0.77967 0,-0.38789 -0.3258,-3.36696 3.4484,-3.04306 0.9504,2.82195 0.1357,0.24244 0.3802,0.3142 c 1.246,-1.39144 2.4039,-2.96071 3.4755,-4.64701 l -0.1086,-0.60513 -0.1358,-0.24243 -1.5477,-2.09659 2.5253,-4.87005 2.0093,1.20636 0.2172,0.0853 0.4616,-0.0756 c 0.8053,-1.93359 1.4986,-3.93425 2.0365,-5.98332 l -0.353,-0.36656 -0.2173,-0.0853 -2.308,-0.20365 0.9232,-5.3879 2.471,-0.76998 0.2715,-0.13576 0.4887,-0.47711 c 0.076,-0.97198 0.1086,-1.92301 0.1086,-2.88597 0,-0.96294 -0.032,-1.92028 -0.1086,-2.81613 l -0.4887,0.0117 -0.2715,0.13576 -2.471,1.70092 -0.9232,-4.4259 2.308,-2.55043 0.2173,-0.26376 0.353,-0.75835 c -0.5328,-1.49679 -1.214,-2.80035 -2.0094,-3.92164 l -0.4887,0.39953 -0.2172,0.26376 -2.0093,3.21568 -2.5253,-2.34484 1.5477,-3.60551 0.1358,-0.37821 0.1086,-0.71372 c -1.0714,-0.61452 -2.2297,-1.02602 -3.4755,-1.17145 l -0.3802,0.65555 -0.1357,0.37819 -0.9504,3.8111 -3.4484,0.40535 0.3258,-3.73157 0,-0.34911 -0.1629,-0.65556 c -0.6537,0.21813 -1.3081,0.4989 -1.9821,0.83593 z m 0,11.13266 c 5.1162,-2.5581 9.2591,1.28891 9.2591,8.59776 0,7.30887 -4.1429,15.33755 -9.2591,17.89564 -5.1162,2.55808 -9.2863,-1.31411 -9.2863,-8.62295 0,-7.30884 4.1701,-15.31235 9.2863,-17.87045 z" + style="fill:url(#linearGradient104916);fill-opacity:1;stroke:#000000;stroke-width:1.03852296" /> + </g> + <g + transform="matrix(0.38524834,0,0,0.38524834,753.78404,653.08086)" + id="g3259-9-0"> + <g + transform="matrix(6.5383417,0,0,6.5383417,364.86909,935.55835)" + inkscape:label="Calque 1" + id="g118215-8-4"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path118217-0-3" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path118219-3-8" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path118221-1-6" /> + <g + transform="translate(-68.205597,-63.743549)" + id="g118223-5-1"> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + id="path118225-7-9" /> + <path + sodipodi:nodetypes="ccccc" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + id="path118227-7-8" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + id="path118229-7-9" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#radialGradient104918);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + id="path118231-0-0" + sodipodi:nodetypes="ccccc" /> + </g> + </g> + <g + transform="matrix(0.6363961,0.3181981,-0.6363961,0.3181981,-697.62009,289.09977)" + id="g2662-9-8"> + <path + id="path2664-8-0" + d="m 1044.4209,-4.5996044 0,78.9062504 78.9063,0 0,-78.9062504 -78.9063,0 z m 39.4688,2.46875 c 20.4177,0 37,16.5823004 37,37.0000004 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 -10e-5,-20.41771 16.5823,-37.0000004 37,-37.0000004 z" + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" /> + <g + id="g2666-0-5" + style="fill:#00ffff;stroke:#ffffff" + transform="translate(705.44117,-218.9829)"> + <path + id="path2668-3-0" + d="m 378.53666,218.814 -6.22099,11.28987 1.97176,0 0,18.4037 8.49847,0 0,-18.4037 1.95647,0 -6.20571,-11.28987 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 378.53666,288.85884 -6.22099,-11.28987 1.97176,0 0,-18.4037 8.49847,0 0,18.4037 1.95647,0 -6.20571,11.28987 z" + id="path2670-1-5" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 343.41044,253.56675 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + id="path2672-4-0" /> + <path + id="path2674-8-8" + d="m 413.45528,253.56675 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + </g> + </g> + <path + sodipodi:nodetypes="cc" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 487.391,1117.5952 729.80147,994.37212" + id="path36364" /> + <g + transform="matrix(0.38241385,0,0,0.38241385,625.80509,774.48224)" + id="g3513-6"> + <g + transform="translate(-369.48339,-385.43051)" + id="g3767-8"> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 607.23277,879.49528 55.44283,-27.72141 55.44282,27.72141 -55.44282,27.72142 -55.44283,-27.72142 z" + id="path3769-7" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 607.23277,879.49528 0,83.16424 55.44283,27.72141 0,-83.16423 -55.44283,-27.72142 z" + id="path3771-8" /> + <path + style="fill:url(#linearGradient104920);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 662.6756,990.38093 55.44282,-27.72141 0,-83.16424 -55.44282,27.72142 0,83.16423 z" + id="path3773-3" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#radialGradient104922);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 634.81813,937.76977 22.17713,11.08857 0,24.94927 -22.17713,-11.08856 0,-24.94928 z" + id="path3775-5" + sodipodi:nodetypes="ccccc" /> + <path + id="path3777-7" + d="m 633.56811,935.45788 0,2.25237 0,24.94927 0,0.86629 0.77967,0.34652 22.17713,11.08857 1.99247,1.03955 0,-2.25237 0,-24.94927 0,-0.86629 -0.77966,-0.34652 -22.17713,-11.08856 -1.99248,-1.03956 z m 2.77214,4.50473 19.40499,9.7025 0,21.83061 -19.40499,-9.70249 0,-21.83062 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path3779-7" + d="m 611.39098,891.10362 0,2.25237 0,66.53139 0,0.86629 0.77967,0.34652 5.54428,2.77214 1.99248,1.03955 0,-2.25236 0,-66.53139 0,-0.86629 -0.77967,-0.34652 -5.54428,-2.77214 -1.99248,-1.03956 z m 2.77215,4.50473 2.77214,1.38607 0,63.41273 -2.77214,-1.38607 0,-63.41273 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path3781-1" + d="m 621.09348,895.26184 0,69.65004 8.31642,4.15822 0,-69.65005 -8.31642,-4.15821 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path3783-5" + d="m 633.56811,899.42005 0,2.25236 0,27.72141 0,0.8663 0.77967,0.34652 11.08856,5.54428 1.99248,1.03955 0,-2.25236 0,-27.72141 0,-0.8663 -0.77966,-0.34652 -11.08857,-5.54428 -1.99248,-1.03955 z m 2.77214,4.50473 8.31643,4.15821 0,24.60275 -8.31643,-4.15821 0,-24.60275 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path3785-64" + d="m 650.20096,907.73647 0,2.25237 0,30.49355 0,0.86629 0.77967,0.34652 5.54428,2.77214 1.99247,1.03956 0,-2.25237 0,-30.49355 0,-0.8663 -0.77966,-0.34651 -5.54428,-2.77215 -1.99248,-1.03955 z m 2.77214,4.50473 2.77214,1.38607 0,27.3749 -2.77214,-1.38607 0,-27.3749 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path3787-3" + d="m 662.6756,850.21454 -0.60641,0.34652 -55.44282,27.72141 -0.77967,0.34652 0,0.86629 0,83.16424 0,0.86629 0.77967,0.34652 55.44282,27.72141 0.60641,0.34652 0.6064,-0.34652 55.44283,-27.72141 0.77966,-0.34652 0,-0.86629 0,-83.16424 0,-0.86629 -0.77966,-0.34652 -55.44283,-27.72141 -0.6064,-0.34652 z m 0,3.11866 54.05675,27.02838 0,81.43165 -54.05675,27.02837 -54.05676,-27.02837 0,-81.43165 54.05676,-27.02838 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <rect + style="opacity:0.5;fill:url(#pattern118687-0);fill-opacity:1;stroke:none" + id="rect3789-22" + width="47.62381" + height="45.980042" + x="747.37006" + y="1269.7253" + rx="0" + ry="0" + transform="matrix(0.8944272,-0.4472136,0,1,0,0)" /> + </g> + <g + id="g3863-52" + transform="matrix(0.6363961,-0.3181981,-0.6363961,-0.3181981,-304.10649,883.79115)"> + <path + id="path3865-0" + d="m 1042.8959,100.2653 0,78.90625 78.9063,0 0,-78.90625 -78.9063,0 z m 39.4688,2.46875 c 20.4177,0 37,16.5823 37,37 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 0,-20.41771 16.5823,-37 37,-37 z" + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" /> + <g + style="fill:#00ffff;stroke:#ffffff" + transform="translate(606.95622,-331.6564)" + id="g3867-7"> + <path + sodipodi:type="star" + style="fill:#00ffff;fill-opacity:1;stroke:#ffffff;stroke-linecap:butt;stroke-linejoin:miter" + id="path3869-55" + sodipodi:sides="3" + sodipodi:cx="241.13728" + sodipodi:cy="609.1156" + sodipodi:r1="15.395656" + sodipodi:r2="7.6978278" + sodipodi:arg1="0" + sodipodi:arg2="1.0471976" + inkscape:flatsided="false" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 256.53294,609.1156 -11.54674,6.66652 -11.54674,6.66651 0,-13.33303 0,-13.33303 11.54674,6.66652 11.54674,6.66651 z" + transform="translate(212.65401,-137.99186)" /> + <rect + style="fill:#00ffff;fill-opacity:1;stroke:#ffffff;stroke-linecap:butt;stroke-linejoin:miter" + id="rect3871-8" + width="7.6689839" + height="34.386734" + x="471.7662" + y="454.18146" /> + <path + transform="matrix(-1,0,0,1,738.13162,-137.99186)" + d="m 256.53294,609.1156 -11.54674,6.66652 -11.54674,6.66651 0,-13.33303 0,-13.33303 11.54674,6.66652 11.54674,6.66651 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="false" + sodipodi:arg2="1.0471976" + sodipodi:arg1="0" + sodipodi:r2="7.6978278" + sodipodi:r1="15.395656" + sodipodi:cy="609.1156" + sodipodi:cx="241.13728" + sodipodi:sides="3" + id="path3873-8" + style="fill:#00ffff;fill-opacity:1;stroke:#ffffff;stroke-linecap:butt;stroke-linejoin:miter" + sodipodi:type="star" /> + </g> + </g> + </g> + <text + id="text37203" + y="1019.5519" + x="740.2865" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + id="tspan37207" + y="1019.5519" + x="740.2865" + sodipodi:role="line">FW/VPN</tspan><tspan + id="tspan37215" + y="1032.0519" + x="740.2865" + sodipodi:role="line">giving access to</tspan><tspan + id="tspan37209" + y="1044.5519" + x="740.2865" + sodipodi:role="line">cloud administrators</tspan></text> + <text + id="text35280" + y="635.03723" + x="317.2081" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + y="635.03723" + x="317.2081" + id="tspan35282" + sodipodi:role="line">PXE</tspan><tspan + id="tspan35284" + y="647.53723" + x="317.2081" + sodipodi:role="line">Boot server</tspan></text> + <g + transform="matrix(0.39640924,0,0,0.39640924,641.89734,821.20523)" + id="g3462-0"> + <g + id="g108629-6" + transform="translate(134.05913,35.984128)"> + <g + id="g4883-79" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path4885-5" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path4887-6" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path4889-5" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g4891-9"> + <path + id="path4893-1" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path4895-5" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path4897-2" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient104924);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path4899-6" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path4901-5" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path4903-7" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path4905-5" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path4907-3" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path4909-1" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path4911-20" /> + <path + sodipodi:nodetypes="ccccc" + id="path4913-13" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient104926);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path4915-3" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path4917-3" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path4919-4" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path4921-8" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path4923-2" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path4925-9" /> + </g> + </g> + </g> + <g + transform="translate(15.21711,1.7214477)" + id="g3159-2"> + <rect + transform="matrix(0.8944272,-0.4472136,0,1,0,0)" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.75346398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect109160-4" + width="36.695312" + height="35.799278" + x="395.43951" + y="330.15076" + ry="8.8706169" /> + <path + sodipodi:nodetypes="ccccc" + id="path109162-5" + d="m 372.22665,145.64754 -0.13558,32.8959 -2.71818,1.81754 0,-33.0536 2.85376,-1.65984 z" + style="fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path109164-04" + d="m 385.06359,155.06606 0.16889,4.18009 -30.14532,15.26938 0.34578,-4.66405 29.63065,-14.78542 z" + style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="cccccccccccccccccccccc" + id="path109166-3" + d="m 373.89476,146.06666 0.18935,0.85117 2.46154,10.52408 8.33137,-6.09926 0.22711,2.41718 -8.55848,6.65757 -0.94674,0.61318 -0.37871,-1.43183 -1.70413,-7.38993 -2.65089,23.5191 -0.18936,2.39483 -1.32544,-2.17115 -5.68048,-9.30487 -9.13434,3.64409 0.25777,-2.59705 8.68723,-3.52121 0.56805,-0.42199 0.56804,0.93049 4.73373,7.75407 2.84024,-25.91394 0,-0.541 1.70414,0.0865 z" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + <text + id="text81085" + y="841.72638" + x="782.9314" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + y="841.72638" + x="782.9314" + id="tspan81087" + sodipodi:role="line">Monitoring</tspan></text> + <g + transform="translate(-748.20118,35.875359)" + id="g95384"> + <path + id="path14972" + d="m 872.99052,751.77872 80.99826,41.26416" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:nodetypes="cc" /> + <path + id="path14036-6" + d="m 993.06325,743.40092 53.58135,-27.30108" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 966.37299,729.633 53.58131,-27.30109" + id="path14038-4" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 926.45966,779.63802 53.58133,-27.30109" + id="path3533-0-9-9" /> + <path + id="path14040-8" + d="m 1019.7535,757.16885 53.5813,-27.30108" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + id="path13103-4" + d="m 899.81312,765.75453 53.58134,-27.30108" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 953.5252,793.2422 53.5813,-27.30108" + id="path3533-0-7" /> + <path + id="path13105-2" + d="m 873.44593,751.73134 53.58134,-27.30108" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <g + transform="matrix(0.38524834,0,0,0.38524834,864.78502,532.73899)" + id="g20121-8"> + <g + transform="matrix(6.5383417,0,0,6.5383417,488.78696,875.42775)" + inkscape:label="Calque 1" + id="g20123-2"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path20125-8" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path20127-8" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path20129-7" /> + <g + transform="translate(-68.205597,-63.743549)" + id="g20131-0"> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + id="path20133-1" /> + <path + sodipodi:nodetypes="ccccc" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + id="path20135-5" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + id="path20137-0" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#radialGradient16536);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + id="path20139-8" + sodipodi:nodetypes="ccccc" /> + </g> + </g> + <g + id="g20141-0" + transform="matrix(0.6363961,-0.3181981,-0.6363961,-0.3181981,-338.72869,1082.8342)"> + <path + id="path20143-7" + d="m 1081.1367,402.39569 0,78.90625 78.9062,0 0,-78.90625 -78.9062,0 z m 39.4687,2.46875 c 20.4177,0 37,16.5823 37,37 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 0,-20.41771 16.5823,-37 37,-37 z" + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" /> + <g + style="fill:#00ffff;stroke:#ffffff" + transform="translate(456.4439,-26.889185)" + id="g20145-1"> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 660.00267,458.32498 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + id="path20147-5" /> + <path + id="path20149-1" + d="m 668.28911,465.32717 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + id="path20151-3" + d="m 660.00267,472.20199 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 668.28911,479.13574 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + id="path20153-3" /> + </g> + </g> + </g> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 939.68273,715.86503 53.58134,-27.30109" + id="path14042-7" /> + <g + id="g95180"> + <g + id="g11976-3-4" + transform="matrix(0.38524834,0,0,0.38524834,-61.179222,752.04337)"> + <g + id="g11978-3-4" + transform="translate(2350.6149,-222.65428)"> + <g + id="g11980-8-0" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path11982-9-5" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path11984-5-6" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path11986-5-0" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g11988-3-0"> + <path + id="path11990-8-4" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path11992-6-0" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path11994-0-3" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient16538);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path11996-3-2" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path11998-3-0" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path12000-6-8" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path12002-1-6" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path12004-8-9" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path12006-7-9" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path12008-0-2" /> + <path + sodipodi:nodetypes="ccccc" + id="path12010-5-3" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient16540);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path12012-1-5" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path12014-1-4" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path12016-0-8" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path12018-3-1" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path12020-0-0" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path12022-0-7" /> + </g> + </g> + </g> + <g + transform="matrix(0.7,-0.35,0,1,2334.3228,-284.85697)" + id="g12024-4-2"> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12026-5-4" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="293.20496" /> + <rect + y="293.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect12028-4-9" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12030-2-9" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="293.20496" /> + <rect + y="293.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect12032-4-2" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12034-9-3" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="293.20496" /> + <rect + y="303.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect12036-9-6" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12038-9-6" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="303.20496" /> + <rect + y="303.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect12040-4-7" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12042-9-7" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="303.20496" /> + <rect + y="303.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect12044-8-4" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12046-1-6" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="313.20496" /> + <rect + y="313.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect12048-6-9" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12050-3-6" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="313.20496" /> + <rect + y="313.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect12052-9-0" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12054-3-9" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="313.20496" /> + <rect + y="323.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect12056-3-9" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12058-4-5" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="323.20496" /> + <rect + y="323.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect12060-6-1" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12062-1-7" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="323.20496" /> + <rect + y="323.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect12064-5-3" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12066-6-0" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="333.20496" /> + <rect + y="333.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect12068-1-8" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12070-7-5" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="333.20496" /> + <rect + y="333.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect12072-2-4" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12074-2-3" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="333.20496" /> + </g> + </g> + <g + id="g11976-37-9" + transform="matrix(0.38524834,0,0,0.38524834,-34.001281,765.86687)"> + <g + id="g11978-7-4" + transform="translate(2350.6149,-222.65428)"> + <g + id="g11980-2-6" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path11982-3-2" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path11984-7-3" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path11986-2-8" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g11988-5-6"> + <path + id="path11990-3-2" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path11992-7-7" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path11994-6-0" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient16542);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path11996-8-7" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path11998-1-6" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path12000-3-7" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path12002-6-4" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path12004-4-3" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path12006-0-1" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path12008-3-2" /> + <path + sodipodi:nodetypes="ccccc" + id="path12010-58-4" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient16544);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path12012-5-7" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path12014-0-5" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path12016-9-5" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path12018-9-8" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path12020-8-0" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path12022-02-7" /> + </g> + </g> + </g> + <g + transform="matrix(0.7,-0.35,0,1,2334.3228,-284.85697)" + id="g12024-49-7"> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12026-0-3" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="293.20496" /> + <rect + y="293.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect12028-1-7" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12030-20-7" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="293.20496" /> + <rect + y="293.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect12032-0-9" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12034-6-3" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="293.20496" /> + <rect + y="303.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect12036-3-2" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12038-90-0" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="303.20496" /> + <rect + y="303.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect12040-8-7" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12042-3-8" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="303.20496" /> + <rect + y="303.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect12044-87-2" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12046-3-0" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="313.20496" /> + <rect + y="313.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect12048-1-7" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12050-0-1" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="313.20496" /> + <rect + y="313.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect12052-0-4" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12054-5-6" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="313.20496" /> + <rect + y="323.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect12056-0-1" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12058-3-1" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="323.20496" /> + <rect + y="323.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect12060-1-2" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12062-8-8" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="323.20496" /> + <rect + y="323.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect12064-0-8" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12066-1-7" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="333.20496" /> + <rect + y="333.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect12068-7-1" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12070-9-0" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="333.20496" /> + <rect + y="333.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect12072-1-1" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12074-0-0" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="333.20496" /> + </g> + </g> + <g + id="g11976-0-7" + transform="matrix(0.38524834,0,0,0.38524834,-6.8233912,779.69043)"> + <g + id="g11978-30-9" + transform="translate(2350.6149,-222.65428)"> + <g + id="g11980-3-0" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path11982-37-7" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path11984-9-6" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path11986-4-9" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g11988-9-3"> + <path + id="path11990-9-3" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path11992-1-6" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path11994-9-4" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient16546);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path11996-4-9" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path11998-2-8" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path12000-0-4" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path12002-65-6" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path12004-9-9" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path12006-5-9" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path12008-6-7" /> + <path + sodipodi:nodetypes="ccccc" + id="path12010-1-8" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient16548);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path12012-14-0" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path12014-3-1" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path12016-7-4" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path12018-2-3" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path12020-7-5" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path12022-3-9" /> + </g> + </g> + </g> + <g + transform="matrix(0.7,-0.35,0,1,2334.3228,-284.85697)" + id="g12024-3-4"> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12026-9-3" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="293.20496" /> + <rect + y="293.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect12028-2-8" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12030-4-5" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="293.20496" /> + <rect + y="293.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect12032-44-5" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12034-99-2" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="293.20496" /> + <rect + y="303.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect12036-38-8" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12038-3-3" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="303.20496" /> + <rect + y="303.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect12040-2-1" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12042-95-8" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="303.20496" /> + <rect + y="303.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect12044-4-2" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12046-39-7" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="313.20496" /> + <rect + y="313.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect12048-4-0" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12050-9-5" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="313.20496" /> + <rect + y="313.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect12052-5-2" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12054-57-6" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="313.20496" /> + <rect + y="323.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect12056-39-1" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12058-0-1" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="323.20496" /> + <rect + y="323.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect12060-7-7" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12062-2-8" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="323.20496" /> + <rect + y="323.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect12064-7-8" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12066-2-6" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="333.20496" /> + <rect + y="333.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect12068-9-7" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12070-0-7" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="333.20496" /> + <rect + y="333.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect12072-5-4" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12074-04-9" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="333.20496" /> + </g> + </g> + <g + id="g11976-8-0" + transform="matrix(0.38524834,0,0,0.38524834,20.354516,793.51394)"> + <g + id="g11978-8-0" + transform="translate(2350.6149,-222.65428)"> + <g + id="g11980-7-2" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path11982-0-7" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path11984-52-1" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path11986-7-6" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g11988-91-2"> + <path + id="path11990-96-0" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path11992-3-4" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path11994-68-8" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient16550);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path11996-46-2" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path11998-6-2" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path12000-7-3" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path12002-2-3" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path12004-7-2" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path12006-4-7" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path12008-1-2" /> + <path + sodipodi:nodetypes="ccccc" + id="path12010-0-4" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient16552);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path12012-0-5" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path12014-6-4" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path12016-4-1" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path12018-4-6" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path12020-3-8" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path12022-7-0" /> + </g> + </g> + </g> + <g + transform="matrix(0.7,-0.35,0,1,2334.3228,-284.85697)" + id="g12024-34-4"> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12026-7-8" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="293.20496" /> + <rect + y="293.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect12028-21-8" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12030-7-3" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="293.20496" /> + <rect + y="293.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect12032-9-5" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12034-5-2" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="293.20496" /> + <rect + y="303.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect12036-6-4" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12038-8-7" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="303.20496" /> + <rect + y="303.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect12040-9-4" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12042-5-7" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="303.20496" /> + <rect + y="303.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect12044-5-5" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12046-2-6" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="313.20496" /> + <rect + y="313.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect12048-15-5" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12050-99-7" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="313.20496" /> + <rect + y="313.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect12052-1-6" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12054-6-9" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="313.20496" /> + <rect + y="323.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect12056-2-7" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12058-1-0" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="323.20496" /> + <rect + y="323.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect12060-0-3" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12062-5-2" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="323.20496" /> + <rect + y="323.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect12064-3-3" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12066-21-8" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="333.20496" /> + <rect + y="333.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect12068-97-0" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12070-6-5" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="333.20496" /> + <rect + y="333.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect12072-8-2" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect12074-20-5" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="333.20496" /> + </g> + </g> + </g> + <path + id="path14972-4" + d="m 993.20143,688.65267 80.25197,41.01585" + style="fill:none;stroke:#808080;stroke-width:1.926;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:nodetypes="cc" /> + <g + id="g3279-2-1" + transform="matrix(0.38524834,0,0,0.38524834,984.84554,467.7792)"> + <g + id="g118255-9-1" + inkscape:label="Calque 1" + transform="matrix(6.5383417,0,0,6.5383417,488.78696,875.42775)"> + <path + id="path118257-7-5" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path118259-0-8" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path118261-3-9" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g118263-7-3" + transform="translate(-68.205597,-63.743549)"> + <path + id="path118265-2-3" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path118267-3-6" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path118269-5-7" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path118271-1-8" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + style="fill:url(#radialGradient16554);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + <g + transform="matrix(0.6363961,-0.3181981,-0.6363961,-0.3181981,-338.72869,1082.8342)" + id="g3697-7-6"> + <path + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" + d="m 1081.1367,402.39569 0,78.90625 78.9062,0 0,-78.90625 -78.9062,0 z m 39.4687,2.46875 c 20.4177,0 37,16.5823 37,37 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 0,-20.41771 16.5823,-37 37,-37 z" + id="path3699-89-2" /> + <g + id="g3701-4-5" + transform="translate(456.4439,-26.889185)" + style="fill:#00ffff;stroke:#ffffff"> + <path + id="path3703-1-1" + d="m 660.00267,458.32498 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 668.28911,465.32717 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + id="path3705-6-0" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 660.00267,472.20199 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + id="path3707-4-0" /> + <path + id="path3709-3-0" + d="m 668.28911,479.13574 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + </g> + </g> + </g> + <use + height="1052.3622" + width="744.09448" + transform="translate(126.63464,64.434701)" + id="use95651" + xlink:href="#g95384" + y="0" + x="0" /> + <use + height="1052.3622" + width="744.09448" + transform="translate(126.63461,64.434641)" + id="use95653" + xlink:href="#use95651" + y="0" + x="0" /> + <use + height="1052.3622" + width="744.09448" + transform="translate(126.63467,64.434708)" + id="use95655" + xlink:href="#use95653" + y="0" + x="0" /> + </g> + <text + xml:space="preserve" + style="font-size:9.67604542px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="87.091499" + y="542.59528" + id="text6070"><tspan + sodipodi:role="line" + x="87.091499" + y="542.59528" + id="tspan6076" + style="font-weight:bold">C2) using diskless nodes</tspan></text> + <flowRoot + xml:space="preserve" + id="flowRoot13580" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><flowRegion + id="flowRegion13582"><rect + id="rect13584" + width="828.32507" + height="466.69049" + x="-67.680222" + y="554.35699" /></flowRegion><flowPara + id="flowPara13586" /></flowRoot> <text + xml:space="preserve" + style="font-size:9.67604542px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="779.40326" + y="714.73633" + id="text13588"><tspan + sodipodi:role="line" + id="tspan13590" + x="779.40326" + y="714.73633">t</tspan></text> + <path + id="path13594" + d="M 633.15472,309.98105 691.30959,280.3496" + style="fill:none;stroke:#808080;stroke-width:2.0906589;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.86384022;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 433.72797,389.43052 381.88245,415.8472" + id="path13596" /> + <path + id="path13598" + d="M 311.29753,327.43412 259.452,353.85078" + style="fill:none;stroke:#808080;stroke-width:1.86384022;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.86384022;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 188.86705,265.43773 137.0215,291.85438" + id="path13600" /> + <path + id="path13602" + d="M 66.43658,203.44132 14.591037,229.85798" + style="fill:none;stroke:#808080;stroke-width:1.86384022;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + id="path13604" + d="M 380.93395,415.92955 13.951354,229.36241" + style="fill:none;stroke:#808080;stroke-width:1.86384022;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:nodetypes="cc" /> + <path + sodipodi:nodetypes="cc" + style="fill:none;stroke:#808080;stroke-width:1.86384022;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 390.56396,506.36873 129.9897,374.51622" + id="path13606" /> + <g + transform="matrix(0.96760451,0,0,0.96760451,-83.172647,-574.70275)" + id="g13610"> + <path + id="path13612" + d="m 443.70447,656.64984 -53.58134,27.30109" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 466.14451,668.13188 -53.58134,27.30109" + id="path13614" /> + <path + id="path13616" + d="M 488.58463,679.61391 435.00328,706.915" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 511.02467,691.09594 -53.58134,27.30109" + id="path13618" /> + </g> + <g + transform="matrix(0.37276803,0,0,0.37276803,-79.425664,-575.18523)" + id="g13620"> + <g + id="g13622" + transform="translate(45.388822,1591.2158)"> + <g + id="g13624" + transform="translate(897.38434,-46.491083)"> + <g + id="g13626" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path13628" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path13630" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path13632" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g13634"> + <path + id="path13636" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path13638" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path13640" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient14934);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path13642" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path13644" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path13646" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path13648" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path13650" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path13652" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path13654" /> + <path + sodipodi:nodetypes="ccccc" + id="path13656" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient14936);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path13658" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path13660" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path13662" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path13664" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path13666" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path13668" /> + </g> + </g> + </g> + <g + inkscape:label="Calque 1" + id="g13670" + transform="matrix(0.2766711,-0.1383356,0,0.2555605,1099.9201,-86.84348)" + style="fill:#00ff00;fill-opacity:1"> + <path + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 174.71965,639.58466 c -29.19719,0 -52.90625,13.34326 -52.90625,29.78125 l 0,119.125 c 0,16.43799 23.70907,29.78125 52.90625,29.78125 29.19719,-10e-6 52.90625,-13.34324 52.90625,-29.78125 l 0,-119.125 -0.0312,0 c 0,-16.43799 -23.67781,-29.78125 -52.875,-29.78125 z" + id="path13672" /> + <path + sodipodi:type="arc" + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:2.93746948;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path13674" + sodipodi:cx="184.11563" + sodipodi:cy="698.03149" + sodipodi:rx="30.68594" + sodipodi:ry="17.716536" + d="m 214.80157,698.03149 c 0,9.78458 -13.73856,17.71654 -30.68594,17.71654 -16.94738,0 -30.68594,-7.93196 -30.68594,-17.71654 0,-9.78457 13.73856,-17.71653 30.68594,-17.71653 16.94738,0 30.68594,7.93196 30.68594,17.71653 z" + transform="matrix(1.6638767,0,0,1.6225174,-131.61326,-463.20234)" /> + </g> + </g> + <g + id="g13676" + transform="translate(105.4361,1621.5028)"> + <g + id="g13678" + transform="translate(897.38434,-46.491083)"> + <g + id="g13680" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path13682" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path13684" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path13686" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g13688"> + <path + id="path13690" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path13692" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path13694" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient14938);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path13696" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path13698" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path13700" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path13702" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path13704" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path13706" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path13708" /> + <path + sodipodi:nodetypes="ccccc" + id="path13710" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient14940);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path13712" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path13714" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path13716" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path13718" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path13720" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path13722" /> + </g> + </g> + </g> + <g + inkscape:label="Calque 1" + id="g13724" + transform="matrix(0.2766711,-0.1383356,0,0.2555605,1099.9201,-86.84348)" + style="fill:#00ff00;fill-opacity:1"> + <path + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 174.71965,639.58466 c -29.19719,0 -52.90625,13.34326 -52.90625,29.78125 l 0,119.125 c 0,16.43799 23.70907,29.78125 52.90625,29.78125 29.19719,-10e-6 52.90625,-13.34324 52.90625,-29.78125 l 0,-119.125 -0.0312,0 c 0,-16.43799 -23.67781,-29.78125 -52.875,-29.78125 z" + id="path13726" /> + <path + sodipodi:type="arc" + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:2.93746948;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path13728" + sodipodi:cx="184.11563" + sodipodi:cy="698.03149" + sodipodi:rx="30.68594" + sodipodi:ry="17.716536" + d="m 214.80157,698.03149 c 0,9.78458 -13.73856,17.71654 -30.68594,17.71654 -16.94738,0 -30.68594,-7.93196 -30.68594,-17.71654 0,-9.78457 13.73856,-17.71653 30.68594,-17.71653 16.94738,0 30.68594,7.93196 30.68594,17.71653 z" + transform="matrix(1.6638767,0,0,1.6225174,-131.61326,-463.20234)" /> + </g> + </g> + <g + id="g13730" + transform="translate(167.06359,1653.3699)"> + <g + id="g13732" + transform="translate(897.38434,-46.491083)"> + <g + id="g13734" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path13736" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path13738" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path13740" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g13742"> + <path + id="path13744" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path13746" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path13748" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient14942);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path13750" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path13752" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path13754" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path13756" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path13758" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path13760" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path13762" /> + <path + sodipodi:nodetypes="ccccc" + id="path13764" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient14944);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path13766" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path13768" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path13770" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path13772" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path13774" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path13776" /> + </g> + </g> + </g> + <g + inkscape:label="Calque 1" + id="g13778" + transform="matrix(0.2766711,-0.1383356,0,0.2555605,1099.9201,-86.84348)" + style="fill:#00ff00;fill-opacity:1"> + <path + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 174.71965,639.58466 c -29.19719,0 -52.90625,13.34326 -52.90625,29.78125 l 0,119.125 c 0,16.43799 23.70907,29.78125 52.90625,29.78125 29.19719,-10e-6 52.90625,-13.34324 52.90625,-29.78125 l 0,-119.125 -0.0312,0 c 0,-16.43799 -23.67781,-29.78125 -52.875,-29.78125 z" + id="path13780" /> + <path + sodipodi:type="arc" + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:2.93746948;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path13782" + sodipodi:cx="184.11563" + sodipodi:cy="698.03149" + sodipodi:rx="30.68594" + sodipodi:ry="17.716536" + d="m 214.80157,698.03149 c 0,9.78458 -13.73856,17.71654 -30.68594,17.71654 -16.94738,0 -30.68594,-7.93196 -30.68594,-17.71654 0,-9.78457 13.73856,-17.71653 30.68594,-17.71653 16.94738,0 30.68594,7.93196 30.68594,17.71653 z" + transform="matrix(1.6638767,0,0,1.6225174,-131.61326,-463.20234)" /> + </g> + </g> + <g + id="g13784" + transform="translate(228.69107,1685.2371)"> + <g + id="g13786" + transform="translate(897.38434,-46.491083)"> + <g + id="g13788" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path13790" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path13792" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path13794" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g13796"> + <path + id="path13798" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path13800" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path13802" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient14946);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path13804" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path13806" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path13808" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path13810" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path13812" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path13814" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path13816" /> + <path + sodipodi:nodetypes="ccccc" + id="path13818" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient14948);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path13820" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path13822" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path13824" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path13826" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path13828" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path13830" /> + </g> + </g> + </g> + <g + inkscape:label="Calque 1" + id="g13832" + transform="matrix(0.2766711,-0.1383356,0,0.2555605,1099.9201,-86.84348)" + style="fill:#00ff00;fill-opacity:1"> + <path + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 174.71965,639.58466 c -29.19719,0 -52.90625,13.34326 -52.90625,29.78125 l 0,119.125 c 0,16.43799 23.70907,29.78125 52.90625,29.78125 29.19719,-10e-6 52.90625,-13.34324 52.90625,-29.78125 l 0,-119.125 -0.0312,0 c 0,-16.43799 -23.67781,-29.78125 -52.875,-29.78125 z" + id="path13834" /> + <path + sodipodi:type="arc" + style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:2.93746948;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path13836" + sodipodi:cx="184.11563" + sodipodi:cy="698.03149" + sodipodi:rx="30.68594" + sodipodi:ry="17.716536" + d="m 214.80157,698.03149 c 0,9.78458 -13.73856,17.71654 -30.68594,17.71654 -16.94738,0 -30.68594,-7.93196 -30.68594,-17.71654 0,-9.78457 13.73856,-17.71653 30.68594,-17.71653 16.94738,0 30.68594,7.93196 30.68594,17.71653 z" + transform="matrix(1.6638767,0,0,1.6225174,-131.61326,-463.20234)" /> + </g> + </g> + </g> + <path + style="fill:none;stroke:#808080;stroke-width:1.86384022;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 137.80671,360.42556 51.84556,-26.41667" + id="path14050" /> + <path + id="path14054" + d="m 194.61698,131.18107 51.84553,-26.41664" + style="fill:none;stroke:#808080;stroke-width:1.86384022;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + id="path14056" + d="m 353.51081,170.19163 51.84554,-26.41666" + style="fill:none;stroke:#808080;stroke-width:1.86360633;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.86384022;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 315.96626,193.35769 367.8118,166.94104" + id="path14058" /> + <path + id="path14060" + d="M 437.31556,255.53426 489.1611,229.1176" + style="fill:none;stroke:#808080;stroke-width:1.86384022;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.86384022;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 558.66486,317.71085 610.51041,291.2942" + id="path14062" /> + <path + sodipodi:nodetypes="cc" + style="fill:none;stroke:#808080;stroke-width:1.86384022;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 245.47949,104.73463 711.6876,342.53959" + id="path14064" /> + <g + transform="matrix(0.37276803,0,0,0.37276803,379.58977,-81.066902)" + id="g14066"> + <g + transform="matrix(6.5383417,0,0,6.5383417,364.86909,935.55835)" + inkscape:label="Calque 1" + id="g14068"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path14070" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path14072" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path14074" /> + <g + transform="translate(-68.205597,-63.743549)" + id="g14076"> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + id="path14078" /> + <path + sodipodi:nodetypes="ccccc" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + id="path14080" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + id="path14082" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#radialGradient14960);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + id="path14084" + sodipodi:nodetypes="ccccc" /> + </g> + </g> + <g + transform="matrix(0.6363961,0.3181981,-0.6363961,0.3181981,-697.62009,289.09977)" + id="g14086"> + <path + id="path14088" + d="m 1044.4209,-4.5996044 0,78.9062504 78.9063,0 0,-78.9062504 -78.9063,0 z m 39.4688,2.46875 c 20.4177,0 37,16.5823004 37,37.0000004 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 -10e-5,-20.41771 16.5823,-37.0000004 37,-37.0000004 z" + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" /> + <g + id="g14090" + style="fill:#00ffff;stroke:#ffffff" + transform="translate(705.44117,-218.9829)"> + <path + id="path14092" + d="m 378.53666,218.814 -6.22099,11.28987 1.97176,0 0,18.4037 8.49847,0 0,-18.4037 1.95647,0 -6.20571,-11.28987 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 378.53666,288.85884 -6.22099,-11.28987 1.97176,0 0,-18.4037 8.49847,0 0,18.4037 1.95647,0 -6.20571,11.28987 z" + id="path14094" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 343.41044,253.56675 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + id="path14096" /> + <path + id="path14098" + d="m 413.45528,253.56675 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + </g> + </g> + <path + sodipodi:nodetypes="cc" + id="path14100" + d="m 636.82641,381.35097 74.80771,-38.35908" + style="fill:none;stroke:#808080;stroke-width:1.86384022;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <g + id="g14102" + transform="matrix(0.37276803,0,0,0.37276803,212.00671,79.36386)"> + <g + id="g14104" + inkscape:label="Calque 1" + transform="matrix(6.5383417,0,0,6.5383417,364.86909,935.55835)"> + <path + id="path14106" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path14108" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path14110" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g14112" + transform="translate(-68.205597,-63.743549)"> + <path + id="path14114" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path14116" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path14118" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path14120" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + style="fill:url(#radialGradient14962);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + <g + id="g14122" + transform="matrix(0.6363961,0.3181981,-0.6363961,0.3181981,-697.62009,289.09977)"> + <path + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" + d="m 1044.4209,-4.5996044 0,78.9062504 78.9063,0 0,-78.9062504 -78.9063,0 z m 39.4688,2.46875 c 20.4177,0 37,16.5823004 37,37.0000004 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 -10e-5,-20.41771 16.5823,-37.0000004 37,-37.0000004 z" + id="path14124" /> + <g + transform="translate(705.44117,-218.9829)" + style="fill:#00ffff;stroke:#ffffff" + id="g14126"> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 378.53666,218.814 -6.22099,11.28987 1.97176,0 0,18.4037 8.49847,0 0,-18.4037 1.95647,0 -6.20571,-11.28987 z" + id="path14128" /> + <path + id="path14130" + d="m 378.53666,288.85884 -6.22099,-11.28987 1.97176,0 0,-18.4037 8.49847,0 0,18.4037 1.95647,0 -6.20571,11.28987 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + id="path14132" + d="m 343.41044,253.56675 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 413.45528,253.56675 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + id="path14134" /> + </g> + </g> + </g> + <g + id="g14136" + transform="matrix(0.84747589,0,0,0.84747589,-274.39071,235.43082)"> + <g + id="g14138"> + <path + d="m 452.22752,154.79534 c -1.32987,4.3593 0.97442,13.06343 4.32672,7.29809 0.55883,-4.21566 0.16853,-13.66849 -4.32672,-7.29809 z" + id="path14140" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 459.05645,154.87353 c -5.73123,-1.99396 -4.37255,6.82514 -3.10169,8.88804 4.41472,0.3139 8.88448,0.68282 7.08957,-5.21292 -0.15325,-2.39014 -1.62637,-3.78967 -3.98788,-3.67512 z" + id="path14142" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 461.48045,154.95173 c -1.09246,1.9721 -0.88144,8.20841 3.07563,8.75771 7.13327,0.55239 -1.24277,-5.48505 3.0235,-5.57782 1.36821,-3.25204 -5.37175,-7.28408 -6.09913,-3.17989 z" + id="path14144" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 469.14346,154.84748 c -6.26267,0.075 -4.66384,10.71977 1.4292,8.95932 4.83425,0.31308 3.44625,-9.88021 -1.4292,-8.95932 z" + id="path14146" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 468.85674,155.68154 c -5.85015,2.68836 -2.79296,6.6586 2.86712,4.84803 3.28424,0.8454 -0.45596,-6.36406 -2.86712,-4.84803 z" + id="path14148" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 475.63355,154.84748 c -5.82517,-1.97942 -4.54812,6.74301 -3.23202,8.91409 4.84187,0.18324 3.39963,-5.16968 5.70816,-6.35977 0.24428,-2.37476 -0.19418,-2.73428 -2.47614,-2.55432 z" + id="path14150" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 479.49112,154.87353 c -5.77442,-2.02369 -4.43922,6.79664 -3.15383,8.88804 4.41473,0.3139 8.88448,0.68282 7.08958,-5.21292 -0.15836,-2.36396 -1.59101,-3.77955 -3.93575,-3.67512 z" + id="path14152" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 485.56417,154.84748 c -6.19598,0.15033 -4.65067,10.675 1.42942,8.96143 4.93021,0.35507 3.48048,-9.89643 -1.42942,-8.96143 z" + id="path14154" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 485.30352,155.68154 c -5.85015,2.68836 -2.79297,6.6586 2.86711,4.84803 3.28424,0.8454 -0.45595,-6.36406 -2.86711,-4.84803 z" + id="path14156" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 488.0403,154.95173 c -1.06389,1.96915 -0.92086,8.22865 3.04957,8.75771 7.16539,0.57531 -1.21095,-5.48429 3.04956,-5.57782 1.3682,-3.25204 -5.37175,-7.28408 -6.09913,-3.17989 z" + id="path14158" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:0.17777776;fill:#313235;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14160" + inkscape:tile-cx="150.57283" + inkscape:tile-cy="1057.5979" + inkscape:tile-h="104.60061" + inkscape:tile-w="105.36077" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14964);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.179335,0,0,0.149728,502.1893,-24.02897)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14162" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14966);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(0.284001,0,0,0.193224,407.7236,-73.15871)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14164" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14968);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(0.340554,0,0,0.231701,396.3144,-88.95173)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14166" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14970);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(0.249954,0,0,0.170059,406.7992,-32.10751)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14168" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14972);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(0.260403,0,0,0.177168,412.2819,-25.25605)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14170" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14974);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.104126,-0.150834,-0.146719,0.07084417,668.335,91.43843)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14172" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14976);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.154671,-0.224051,-0.217939,0.105233,738.2325,88.88709)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14174" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14978);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.138006,-0.19991,-0.194457,0.09389457,722.8067,97.77468)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14176" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14980);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.117791,-0.170629,-0.165973,0.08014087,677.6847,122.0894)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14178" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14982);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.09614486,-0.139271,-0.135472,0.06541328,635.5166,142.1226)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14180" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14984);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.164683,-0.238552,0.232045,-0.112044,265.1906,314.0698)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14182" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14986);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.172846,-0.250377,0.243546,-0.117597,239.7257,330.3731)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14184" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14988);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.177232,-0.256733,0.249729,-0.120583,225.1178,318.3329)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14186" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14990);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.166524,-0.241221,0.23464,-0.113297,227.7161,329.1711)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14188" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14992);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.112183,-0.162505,0.158072,-0.07632533,314.1776,290.1886)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14190" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14994);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.11826,0.171307,0.166634,0.08045988,311.5686,16.07786)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14192" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14996);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.0943583,0.136684,0.132956,0.06419815,331.8395,50.2111)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14194" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient14998);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.114364,0.165662,0.161143,0.07780872,322.2702,30.08746)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14196" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient15000);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.140702,0.203815,0.198255,0.09572832,286.7172,18.15027)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14198" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient15002);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.162185,0.234935,0.228526,0.110345,259.9411,6.05945)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14200" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient15004);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.160583,0.232613,-0.226269,-0.109254,748.0707,211.5833)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14202" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient15006);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.12628,0.182922,-0.177934,-0.08591606,697.8146,196.7379)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14204" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient15008);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.137748,0.199537,-0.194093,-0.09371803,714.1281,221.8225)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14206" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient15010);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.120979,0.175247,-0.170466,-0.08231039,662.6019,207.1803)" /> + <path + d="m 200.40415,1074.4789 c -9.38924,27.3323 -39.31505,41.9316 -66.84118,32.6085 -27.52613,-9.3231 -42.228996,-39.0382 -32.83977,-66.3705 9.38924,-27.3323 39.31505,-41.93159 66.84118,-32.6085 24.96138,8.4544 39.77465,33.9403 34.65958,59.6308" + id="path14208" + sodipodi:cx="150.56367" + sodipodi:cy="1057.5979" + sodipodi:end="6.478369" + sodipodi:open="true" + sodipodi:rx="52.660198" + sodipodi:ry="52.289352" + sodipodi:start="0.32872637" + sodipodi:type="arc" + style="opacity:0.17777776;fill:url(#linearGradient15012);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(-0.14434,0.209086,-0.203383,-0.09820396,735.5011,232.5166)" /> + </g> + <path + d="m 409.69532,571.95715 c 0,13.80622 -11.19215,24.99836 -24.99836,24.99836 -13.80621,0 -24.99836,-11.19214 -24.99836,-24.99836 0,-13.80621 11.19215,-24.99835 24.99836,-24.99835 13.80621,0 24.99836,11.19214 24.99836,24.99835 z" + id="path14210" + sodipodi:cx="384.69696" + sodipodi:cy="571.95715" + sodipodi:rx="24.998358" + sodipodi:ry="24.998358" + sodipodi:type="arc" + style="fill:url(#radialGradient15014);fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.155532,0,0,1.155532,26.16756,-503.197)" /> + <text + id="text14212" + style="font-size:10.00881386px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#9f0021;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="469.55161" + xml:space="preserve" + y="161.44913"><tspan + id="tspan14214" + sodipodi:role="line" + x="469.55161" + y="161.44913">Internet</tspan></text> + </g> + <text + id="text14216" + y="25.73774" + x="469.02438" + style="font-size:9.67604542px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + id="tspan14220" + y="25.73774" + x="469.02438" + sodipodi:role="line">HA Database for</tspan><tspan + y="37.832798" + x="469.02438" + sodipodi:role="line" + id="tspan16599">OpenStack Compute</tspan></text> + <text + id="text14228" + y="86.196609" + x="89.344864" + style="font-size:9.67604542px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + id="tspan14232" + y="86.196609" + x="89.344864" + sodipodi:role="line">Servers running</tspan><tspan + y="98.291664" + x="89.344864" + sodipodi:role="line" + id="tspan16603"> virtual guests</tspan></text> + <g + transform="matrix(0.37276803,0,0,0.37276803,648.08423,56.950946)" + id="g14286"> + <g + transform="matrix(6.5383417,0,0,6.5383417,364.86909,935.55835)" + inkscape:label="Calque 1" + id="g14288"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path14290" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path14292" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path14294" /> + <g + transform="translate(-68.205597,-63.743549)" + id="g14296"> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + id="path14298" /> + <path + sodipodi:nodetypes="ccccc" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + id="path14300" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + id="path14302" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#radialGradient15022);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + id="path14304" + sodipodi:nodetypes="ccccc" /> + </g> + </g> + <g + transform="matrix(0.6363961,0.3181981,-0.6363961,0.3181981,-697.62009,289.09977)" + id="g14306"> + <path + id="path14308" + d="m 1044.4209,-4.5996044 0,78.9062504 78.9063,0 0,-78.9062504 -78.9063,0 z m 39.4688,2.46875 c 20.4177,0 37,16.5823004 37,37.0000004 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 -10e-5,-20.41771 16.5823,-37.0000004 37,-37.0000004 z" + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" /> + <g + id="g14310" + style="fill:#00ffff;stroke:#ffffff" + transform="translate(705.44117,-218.9829)"> + <path + id="path14312" + d="m 378.53666,218.814 -6.22099,11.28987 1.97176,0 0,18.4037 8.49847,0 0,-18.4037 1.95647,0 -6.20571,-11.28987 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 378.53666,288.85884 -6.22099,-11.28987 1.97176,0 0,-18.4037 8.49847,0 0,18.4037 1.95647,0 -6.20571,11.28987 z" + id="path14314" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 343.41044,253.56675 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + id="path14316" /> + <path + id="path14318" + d="m 413.45528,253.56675 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + </g> + </g> + <path + sodipodi:nodetypes="cc" + style="fill:none;stroke:#808080;stroke-width:1.86384022;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 390.32112,506.41711 624.87859,387.18591" + id="path14320" /> + <g + transform="matrix(0.37002536,0,0,0.37002536,524.25122,174.41947)" + id="g14322"> + <g + transform="translate(-369.48339,-385.43051)" + id="g14324"> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 607.23277,879.49528 55.44283,-27.72141 55.44282,27.72141 -55.44282,27.72142 -55.44283,-27.72142 z" + id="path14326" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 607.23277,879.49528 0,83.16424 55.44283,27.72141 0,-83.16423 -55.44283,-27.72142 z" + id="path14328" /> + <path + style="fill:url(#linearGradient15024);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 662.6756,990.38093 55.44282,-27.72141 0,-83.16424 -55.44282,27.72142 0,83.16423 z" + id="path14330" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#radialGradient15026);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 634.81813,937.76977 22.17713,11.08857 0,24.94927 -22.17713,-11.08856 0,-24.94928 z" + id="path14332" + sodipodi:nodetypes="ccccc" /> + <path + id="path14334" + d="m 633.56811,935.45788 0,2.25237 0,24.94927 0,0.86629 0.77967,0.34652 22.17713,11.08857 1.99247,1.03955 0,-2.25237 0,-24.94927 0,-0.86629 -0.77966,-0.34652 -22.17713,-11.08856 -1.99248,-1.03956 z m 2.77214,4.50473 19.40499,9.7025 0,21.83061 -19.40499,-9.70249 0,-21.83062 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path14336" + d="m 611.39098,891.10362 0,2.25237 0,66.53139 0,0.86629 0.77967,0.34652 5.54428,2.77214 1.99248,1.03955 0,-2.25236 0,-66.53139 0,-0.86629 -0.77967,-0.34652 -5.54428,-2.77214 -1.99248,-1.03956 z m 2.77215,4.50473 2.77214,1.38607 0,63.41273 -2.77214,-1.38607 0,-63.41273 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path14338" + d="m 621.09348,895.26184 0,69.65004 8.31642,4.15822 0,-69.65005 -8.31642,-4.15821 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path14340" + d="m 633.56811,899.42005 0,2.25236 0,27.72141 0,0.8663 0.77967,0.34652 11.08856,5.54428 1.99248,1.03955 0,-2.25236 0,-27.72141 0,-0.8663 -0.77966,-0.34652 -11.08857,-5.54428 -1.99248,-1.03955 z m 2.77214,4.50473 8.31643,4.15821 0,24.60275 -8.31643,-4.15821 0,-24.60275 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path14342" + d="m 650.20096,907.73647 0,2.25237 0,30.49355 0,0.86629 0.77967,0.34652 5.54428,2.77214 1.99247,1.03956 0,-2.25237 0,-30.49355 0,-0.8663 -0.77966,-0.34651 -5.54428,-2.77215 -1.99248,-1.03955 z m 2.77214,4.50473 2.77214,1.38607 0,27.3749 -2.77214,-1.38607 0,-27.3749 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path14344" + d="m 662.6756,850.21454 -0.60641,0.34652 -55.44282,27.72141 -0.77967,0.34652 0,0.86629 0,83.16424 0,0.86629 0.77967,0.34652 55.44282,27.72141 0.60641,0.34652 0.6064,-0.34652 55.44283,-27.72141 0.77966,-0.34652 0,-0.86629 0,-83.16424 0,-0.86629 -0.77966,-0.34652 -55.44283,-27.72141 -0.6064,-0.34652 z m 0,3.11866 54.05675,27.02838 0,81.43165 -54.05675,27.02837 -54.05676,-27.02837 0,-81.43165 54.05676,-27.02838 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <rect + style="opacity:0.5;fill:url(#pattern118687-0);fill-opacity:1;stroke:none" + id="rect14346" + width="47.62381" + height="45.980042" + x="747.37006" + y="1269.7253" + rx="0" + ry="0" + transform="matrix(0.8944272,-0.4472136,0,1,0,0)" /> + </g> + <g + id="g14348" + transform="matrix(0.6363961,-0.3181981,-0.6363961,-0.3181981,-304.10649,883.79115)"> + <path + id="path14350" + d="m 1042.8959,100.2653 0,78.90625 78.9063,0 0,-78.90625 -78.9063,0 z m 39.4688,2.46875 c 20.4177,0 37,16.5823 37,37 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 0,-20.41771 16.5823,-37 37,-37 z" + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" /> + <g + style="fill:#00ffff;stroke:#ffffff" + transform="translate(606.95622,-331.6564)" + id="g14352"> + <path + sodipodi:type="star" + style="fill:#00ffff;fill-opacity:1;stroke:#ffffff;stroke-linecap:butt;stroke-linejoin:miter" + id="path14354" + sodipodi:sides="3" + sodipodi:cx="241.13728" + sodipodi:cy="609.1156" + sodipodi:r1="15.395656" + sodipodi:r2="7.6978278" + sodipodi:arg1="0" + sodipodi:arg2="1.0471976" + inkscape:flatsided="false" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 256.53294,609.1156 -11.54674,6.66652 -11.54674,6.66651 0,-13.33303 0,-13.33303 11.54674,6.66652 11.54674,6.66651 z" + transform="translate(212.65401,-137.99186)" /> + <rect + style="fill:#00ffff;fill-opacity:1;stroke:#ffffff;stroke-linecap:butt;stroke-linejoin:miter" + id="rect14356" + width="7.6689839" + height="34.386734" + x="471.7662" + y="454.18146" /> + <path + transform="matrix(-1,0,0,1,738.13162,-137.99186)" + d="m 256.53294,609.1156 -11.54674,6.66652 -11.54674,6.66651 0,-13.33303 0,-13.33303 11.54674,6.66652 11.54674,6.66651 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="false" + sodipodi:arg2="1.0471976" + sodipodi:arg1="0" + sodipodi:r2="7.6978278" + sodipodi:r1="15.395656" + sodipodi:cy="609.1156" + sodipodi:cx="241.13728" + sodipodi:sides="3" + id="path14358" + style="fill:#00ffff;fill-opacity:1;stroke:#ffffff;stroke-linecap:butt;stroke-linejoin:miter" + sodipodi:type="star" /> + </g> + </g> + </g> + <text + id="text14360" + y="411.54996" + x="635.02393" + style="font-size:9.67604542px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + id="tspan14362" + y="411.54996" + x="635.02393" + sodipodi:role="line">FW/VPN</tspan><tspan + id="tspan14364" + y="423.64502" + x="635.02393" + sodipodi:role="line">giving access to</tspan><tspan + id="tspan14366" + y="435.74008" + x="635.02393" + sodipodi:role="line">cloud administrators</tspan></text> + <g + transform="matrix(0.38356737,0,0,0.38356737,539.82216,219.62884)" + id="g14374"> + <g + id="g14376" + transform="translate(134.05913,35.984128)"> + <g + id="g14378" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path14380" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path14382" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path14384" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g14386"> + <path + id="path14388" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path14390" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path14392" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient15028);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path14394" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path14396" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path14398" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path14400" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path14402" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path14404" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path14406" /> + <path + sodipodi:nodetypes="ccccc" + id="path14408" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient15030);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path14410" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path14412" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path14414" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path14416" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path14418" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path14420" /> + </g> + </g> + </g> + <g + transform="translate(15.21711,1.7214477)" + id="g14422"> + <rect + transform="matrix(0.8944272,-0.4472136,0,1,0,0)" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.75346398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14424" + width="36.695312" + height="35.799278" + x="395.43951" + y="330.15076" + ry="8.8706169" /> + <path + sodipodi:nodetypes="ccccc" + id="path14426" + d="m 372.22665,145.64754 -0.13558,32.8959 -2.71818,1.81754 0,-33.0536 2.85376,-1.65984 z" + style="fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path14428" + d="m 385.06359,155.06606 0.16889,4.18009 -30.14532,15.26938 0.34578,-4.66405 29.63065,-14.78542 z" + style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="cccccccccccccccccccccc" + id="path14430" + d="m 373.89476,146.06666 0.18935,0.85117 2.46154,10.52408 8.33137,-6.09926 0.22711,2.41718 -8.55848,6.65757 -0.94674,0.61318 -0.37871,-1.43183 -1.70413,-7.38993 -2.65089,23.5191 -0.18936,2.39483 -1.32544,-2.17115 -5.68048,-9.30487 -9.13434,3.64409 0.25777,-2.59705 8.68723,-3.52121 0.56805,-0.42199 0.56804,0.93049 4.73373,7.75407 2.84024,-25.91394 0,-0.541 1.70414,0.0865 z" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + <text + id="text14432" + y="239.4852" + x="676.28735" + style="font-size:9.67604542px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + xml:space="preserve"><tspan + y="239.4852" + x="676.28735" + id="tspan14434" + sodipodi:role="line">Monitoring</tspan></text> + <g + transform="matrix(0.96760451,0,0,0.96760451,-805.24344,-540.25988)" + id="g14436"> + <path + id="path14438" + d="m 872.99052,751.77872 80.99826,41.26416" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:nodetypes="cc" /> + <path + id="path14440" + d="m 993.06325,743.40092 53.58135,-27.30108" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 966.37299,729.633 53.58131,-27.30109" + id="path14442" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 926.45966,779.63802 53.58133,-27.30109" + id="path14444" /> + <path + id="path14446" + d="m 1019.7535,757.16885 53.5813,-27.30108" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + id="path14448" + d="m 899.81312,765.75453 53.58134,-27.30108" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 953.5252,793.2422 53.5813,-27.30108" + id="path14450" /> + <path + id="path14452" + d="m 873.44593,751.73134 53.58134,-27.30108" + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <g + transform="matrix(0.38524834,0,0,0.38524834,864.78502,532.73899)" + id="g14454"> + <g + transform="matrix(6.5383417,0,0,6.5383417,488.78696,875.42775)" + inkscape:label="Calque 1" + id="g14456"> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path14458" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path14460" /> + <path + style="fill:#888888;fill-opacity:1;stroke:none" + d="" + id="path14462" /> + <g + transform="translate(-68.205597,-63.743549)" + id="g14464"> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + id="path14466" /> + <path + sodipodi:nodetypes="ccccc" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + id="path14468" /> + <path + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + id="path14470" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:url(#radialGradient15032);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + id="path14472" + sodipodi:nodetypes="ccccc" /> + </g> + </g> + <g + id="g14474" + transform="matrix(0.6363961,-0.3181981,-0.6363961,-0.3181981,-338.72869,1082.8342)"> + <path + id="path14476" + d="m 1081.1367,402.39569 0,78.90625 78.9062,0 0,-78.90625 -78.9062,0 z m 39.4687,2.46875 c 20.4177,0 37,16.5823 37,37 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 0,-20.41771 16.5823,-37 37,-37 z" + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" /> + <g + style="fill:#00ffff;stroke:#ffffff" + transform="translate(456.4439,-26.889185)" + id="g14478"> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 660.00267,458.32498 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + id="path14480" /> + <path + id="path14482" + d="m 668.28911,465.32717 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + id="path14484" + d="m 660.00267,472.20199 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 668.28911,479.13574 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + id="path14486" /> + </g> + </g> + </g> + <path + style="fill:none;stroke:#808080;stroke-width:1.92624176;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 939.68273,715.86503 53.58134,-27.30109" + id="path14488" /> + <g + id="g14490"> + <g + id="g14492" + transform="matrix(0.38524834,0,0,0.38524834,-61.179222,752.04337)"> + <g + id="g14494" + transform="translate(2350.6149,-222.65428)"> + <g + id="g14496" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path14498" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path14500" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path14502" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g14504"> + <path + id="path14506" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path14508" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path14510" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient15034);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path14512" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path14514" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path14516" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path14518" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path14520" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path14522" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path14524" /> + <path + sodipodi:nodetypes="ccccc" + id="path14526" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient15036);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path14528" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path14530" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path14532" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path14534" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path14536" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path14538" /> + </g> + </g> + </g> + <g + transform="matrix(0.7,-0.35,0,1,2334.3228,-284.85697)" + id="g14540"> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14542" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="293.20496" /> + <rect + y="293.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect14544" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14546" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="293.20496" /> + <rect + y="293.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect14548" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14550" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="293.20496" /> + <rect + y="303.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect14552" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14554" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="303.20496" /> + <rect + y="303.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect14556" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14558" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="303.20496" /> + <rect + y="303.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect14560" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14562" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="313.20496" /> + <rect + y="313.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect14564" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14566" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="313.20496" /> + <rect + y="313.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect14568" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14570" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="313.20496" /> + <rect + y="323.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect14572" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14574" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="323.20496" /> + <rect + y="323.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect14576" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14578" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="323.20496" /> + <rect + y="323.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect14580" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14582" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="333.20496" /> + <rect + y="333.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect14584" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14586" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="333.20496" /> + <rect + y="333.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect14588" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14590" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="333.20496" /> + </g> + </g> + <g + id="g14592" + transform="matrix(0.38524834,0,0,0.38524834,-34.001281,765.86687)"> + <g + id="g14594" + transform="translate(2350.6149,-222.65428)"> + <g + id="g14596" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path14598" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path14600" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path14602" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g14604"> + <path + id="path14606" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path14608" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path14610" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient15038);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path14612" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path14614" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path14616" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path14618" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path14620" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path14622" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path14624" /> + <path + sodipodi:nodetypes="ccccc" + id="path14626" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient15040);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path14628" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path14630" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path14632" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path14634" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path14636" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path14638" /> + </g> + </g> + </g> + <g + transform="matrix(0.7,-0.35,0,1,2334.3228,-284.85697)" + id="g14640"> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14642" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="293.20496" /> + <rect + y="293.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect14644" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14646" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="293.20496" /> + <rect + y="293.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect14648" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14650" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="293.20496" /> + <rect + y="303.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect14652" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14654" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="303.20496" /> + <rect + y="303.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect14656" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14658" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="303.20496" /> + <rect + y="303.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect14660" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14662" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="313.20496" /> + <rect + y="313.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect14664" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14666" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="313.20496" /> + <rect + y="313.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect14668" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14670" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="313.20496" /> + <rect + y="323.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect14672" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14674" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="323.20496" /> + <rect + y="323.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect14676" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14678" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="323.20496" /> + <rect + y="323.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect14680" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14682" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="333.20496" /> + <rect + y="333.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect14684" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14686" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="333.20496" /> + <rect + y="333.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect14688" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14690" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="333.20496" /> + </g> + </g> + <g + id="g14692" + transform="matrix(0.38524834,0,0,0.38524834,-6.8233912,779.69043)"> + <g + id="g14694" + transform="translate(2350.6149,-222.65428)"> + <g + id="g14696" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path14698" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path14700" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path14702" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g14704"> + <path + id="path14706" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path14708" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path14710" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient15042);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path14712" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path14714" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path14716" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path14718" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path14720" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path14722" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path14724" /> + <path + sodipodi:nodetypes="ccccc" + id="path14726" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient15044);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path14728" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path14730" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path14732" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path14734" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path14736" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path14738" /> + </g> + </g> + </g> + <g + transform="matrix(0.7,-0.35,0,1,2334.3228,-284.85697)" + id="g14740"> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14742" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="293.20496" /> + <rect + y="293.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect14744" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14746" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="293.20496" /> + <rect + y="293.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect14748" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14750" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="293.20496" /> + <rect + y="303.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect14752" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14754" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="303.20496" /> + <rect + y="303.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect14756" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14758" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="303.20496" /> + <rect + y="303.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect14760" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14762" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="313.20496" /> + <rect + y="313.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect14764" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14766" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="313.20496" /> + <rect + y="313.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect14768" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14770" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="313.20496" /> + <rect + y="323.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect14772" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14774" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="323.20496" /> + <rect + y="323.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect14776" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14778" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="323.20496" /> + <rect + y="323.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect14780" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14782" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="333.20496" /> + <rect + y="333.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect14784" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14786" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="333.20496" /> + <rect + y="333.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect14788" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14790" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="333.20496" /> + </g> + </g> + <g + id="g14792" + transform="matrix(0.38524834,0,0,0.38524834,20.354516,793.51394)"> + <g + id="g14794" + transform="translate(2350.6149,-222.65428)"> + <g + id="g14796" + inkscape:label="Calque 1" + transform="matrix(2.7721412,0,0,2.7721412,162.13246,32.470516)"> + <path + id="path14798" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path14800" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path14802" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g14804"> + <path + id="path14806" + d="M 2,11 22,1 42,11 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path14808" + d="M 2,11 2,41 22,51 22,21 2,11 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path14810" + d="M 22,51 42,41 42,11 22,21 22,51 z" + style="fill:url(#linearGradient15046);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 22,2.4375 18.875,4 22,5.5625 25.125,4 22,2.4375 z" + id="path14812" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 26,4.4375 -0.21875,0.125 -2,1 L 22.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 29.125,6 28.21875,5.5625 l -2,-1 L 26,4.4375 z M 26,5.5625 26.90625,6 26,6.4375 25.09375,6 26,5.5625 z" + id="path14814" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 30,6.4375 26.875,8 30,9.5625 33.125,8 30,6.4375 z" + id="path14816" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 34,8.4375 -0.21875,0.125 -2,1 L 30.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 37.125,10 36.21875,9.5625 l -2,-1 L 34,8.4375 z M 34,9.5625 34.90625,10 34,10.4375 33.09375,10 34,9.5625 z" + id="path14818" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="M 14,6.4375 10.875,8 14,9.5625 17.125,8 14,6.4375 z" + id="path14820" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 18,4.4375 -0.21875,0.125 -2,1 L 14.875,6 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 21.125,6 20.21875,5.5625 l -2,-1 L 18,4.4375 z M 18,5.5625 18.90625,6 18,6.4375 17.09375,6 18,5.5625 z" + id="path14822" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 10,8.4375 -0.21875,0.125 -2,1 L 6.875,10 l 0.90625,0.4375 2,1 0.21875,0.125 0.21875,-0.125 2,-1 L 13.125,10 12.21875,9.5625 l -2,-1 L 10,8.4375 z M 10,9.5625 10.90625,10 10,10.4375 9.09375,10 10,9.5625 z" + id="path14824" /> + <path + sodipodi:nodetypes="ccccc" + id="path14826" + d="m 11.95092,32.021472 8,4 0,9.000001 -8,-4 0,-9.000001 z" + style="fill:url(#radialGradient15048);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,31.1875 0,0.8125 0,9 0,0.3125 0.28125,0.125 8,4 0.71875,0.375 0,-0.8125 0,-9 0,-0.3125 -0.28125,-0.125 -8,-4 L 11.5,31.1875 z m 1,1.625 7,3.5 0,7.875 -7,-3.5 0,-7.875 z" + id="path14828" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 3.5,15.1875 0,0.8125 0,24 0,0.3125 0.28125,0.125 2,1 L 6.5,41.8125 6.5,41 l 0,-24 0,-0.3125 -0.28125,-0.125 -2,-1 L 3.5,15.1875 z m 1,1.625 1,0.5 0,22.875 -1,-0.5 0,-22.875 z" + id="path14830" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 7,16.6875 0,25.125 3,1.5 0,-25.125 -3,-1.5 z" + id="path14832" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 11.5,18.1875 0,0.8125 0,10 0,0.3125 0.28125,0.125 4,2 0.71875,0.375 0,-0.8125 0,-10 0,-0.3125 -0.28125,-0.125 -4,-2 L 11.5,18.1875 z m 1,1.625 3,1.5 0,8.875 -3,-1.5 0,-8.875 z" + id="path14834" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 17.5,21.1875 0,0.8125 0,11 0,0.3125 0.28125,0.125 2,1 0.71875,0.375 0,-0.8125 0,-11 0,-0.3125 -0.28125,-0.125 -2,-1 L 17.5,21.1875 z m 1,1.625 1,0.5 0,9.875 -1,-0.5 0,-9.875 z" + id="path14836" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 22,0.4375 -0.21875,0.125 -20,10 L 1.5,10.6875 1.5,11 l 0,30 0,0.3125 0.28125,0.125 20,10 0.21875,0.125 0.21875,-0.125 20,-10 0.28125,-0.125 0,-0.3125 0,-30 0,-0.3125 -0.28125,-0.125 -20,-10 L 22,0.4375 z m 0,1.125 19.5,9.75 0,29.375 -19.5,9.75 -19.5,-9.75 0,-29.375 19.5,-9.75 z" + id="path14838" /> + </g> + </g> + </g> + <g + transform="matrix(0.7,-0.35,0,1,2334.3228,-284.85697)" + id="g14840"> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14842" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="293.20496" /> + <rect + y="293.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect14844" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14846" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="293.20496" /> + <rect + y="293.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect14848" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14850" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="293.20496" /> + <rect + y="303.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect14852" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14854" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="303.20496" /> + <rect + y="303.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect14856" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14858" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="303.20496" /> + <rect + y="303.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect14860" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14862" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="313.20496" /> + <rect + y="313.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect14864" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14866" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="313.20496" /> + <rect + y="313.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect14868" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14870" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="313.20496" /> + <rect + y="323.20496" + x="358.0549" + height="9.7841024" + width="9.7841024" + id="rect14872" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14874" + width="9.7841024" + height="9.7841024" + x="368.0549" + y="323.20496" /> + <rect + y="323.20496" + x="378.0549" + height="9.7841024" + width="9.7841024" + id="rect14876" + style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14878" + width="9.7841024" + height="9.7841024" + x="388.0549" + y="323.20496" /> + <rect + y="323.20496" + x="398.0549" + height="9.7841024" + width="9.7841024" + id="rect14880" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14882" + width="9.7841024" + height="9.7841024" + x="358.0549" + y="333.20496" /> + <rect + y="333.20496" + x="368.0549" + height="9.7841024" + width="9.7841024" + id="rect14884" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14886" + width="9.7841024" + height="9.7841024" + x="378.0549" + y="333.20496" /> + <rect + y="333.20496" + x="388.0549" + height="9.7841024" + width="9.7841024" + id="rect14888" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <rect + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.21589765px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect14890" + width="9.7841024" + height="9.7841024" + x="398.0549" + y="333.20496" /> + </g> + </g> + </g> + <path + id="path14892" + d="m 993.20143,688.65267 80.25197,41.01585" + style="fill:none;stroke:#808080;stroke-width:1.926;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:nodetypes="cc" /> + <g + id="g14894" + transform="matrix(0.38524834,0,0,0.38524834,984.84554,467.7792)"> + <g + id="g14896" + inkscape:label="Calque 1" + transform="matrix(6.5383417,0,0,6.5383417,488.78696,875.42775)"> + <path + id="path14898" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path14900" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <path + id="path14902" + d="" + style="fill:#888888;fill-opacity:1;stroke:none" /> + <g + id="g14904" + transform="translate(-68.205597,-63.743549)"> + <path + id="path14906" + d="m 7.6108945,14.642423 -0.3365653,0.168282 -8.07756781,4.038784 -0.33656529,0.168283 0,0.420707 0,4.038784 0,0.420706 0.33656529,0.168283 8.07756781,4.038784 0.3365653,0.168282 0.2944947,-0.168282 8.0775678,-4.038784 0.378636,-0.168283 0,-0.420706 0,-4.038784 0,-0.420707 -0.378636,-0.168283 -8.0775678,-4.038784 -0.2944947,-0.168282 z m 0,1.514544 7.4044375,3.702218 0,3.197371 -7.4044375,3.702218 -7.40443714,-3.702218 0,-3.197371 7.40443714,-3.702218 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + id="path14908" + d="M -0.48215529,19.441925 7.5954125,15.403141 15.67298,19.441925 7.5954125,23.480709 -0.48215529,19.441925 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" + sodipodi:nodetypes="ccccc" /> + <path + sodipodi:nodetypes="ccccc" + id="path14910" + d="m -0.48215529,19.441925 0,4.038784 8.07756779,4.038784 0,-4.038784 -8.07756779,-4.038784 z" + style="fill:#888888;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + sodipodi:nodetypes="ccccc" + id="path14912" + d="m 15.67298,19.441925 0,4.038784 -8.0775675,4.038784 0,-4.038784 8.0775675,-4.038784 z" + style="fill:url(#radialGradient15050);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + </g> + </g> + <g + transform="matrix(0.6363961,-0.3181981,-0.6363961,-0.3181981,-338.72869,1082.8342)" + id="g14914"> + <path + style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:1.0990597;stroke-linecap:butt;stroke-linejoin:miter" + d="m 1081.1367,402.39569 0,78.90625 78.9062,0 0,-78.90625 -78.9062,0 z m 39.4687,2.46875 c 20.4177,0 37,16.5823 37,37 0,20.4177 -16.5823,36.96875 -37,36.96875 -20.4177,0 -37,-16.55105 -37,-36.96875 0,-20.41771 16.5823,-37 37,-37 z" + id="path14916" /> + <g + id="g14918" + transform="translate(456.4439,-26.889185)" + style="fill:#00ffff;stroke:#ffffff"> + <path + id="path14920" + d="m 660.00267,458.32498 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 668.28911,465.32717 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + id="path14922" /> + <path + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 660.00267,472.20199 11.28987,6.22099 0,-1.97176 18.4037,0 0,-8.49847 -18.4037,0 0,-1.95647 -11.28987,6.20571 z" + id="path14924" /> + <path + id="path14926" + d="m 668.28911,479.13574 -11.28987,6.22099 0,-1.97176 -18.4037,0 0,-8.49847 18.4037,0 0,-1.95647 11.28987,6.20571 z" + style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.6164543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + </g> + </g> + </g> + <use + height="1052.3622" + width="744.09448" + transform="matrix(0.96760451,0,0,0.96760451,41.251644,-512.62573)" + id="use14928" + xlink:href="#g95384" + y="0" + x="0" /> + <use + height="1052.3622" + width="744.09448" + transform="matrix(0.96760451,0,0,0.96760451,41.251615,-512.62579)" + id="use14930" + xlink:href="#use95651" + y="0" + x="0" /> + <use + height="1052.3622" + width="744.09448" + transform="matrix(0.96760451,0,0,0.96760451,41.251673,-512.62572)" + id="use14932" + xlink:href="#use95653" + y="0" + x="0" /> + <path + sodipodi:nodetypes="cc" + style="fill:none;stroke:#808080;stroke-width:1.86360633;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 406.29099,143.32618 295.25689,86.594941" + id="path15722" /> + <text + xml:space="preserve" + style="font-size:9.67604542px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="82.531303" + y="55.793667" + id="text6070-0"><tspan + sodipodi:role="line" + x="82.531303" + y="55.793667" + id="tspan6076-6" + style="font-weight:bold">C1) Nodes with disks</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans" + x="72.839729" + y="1036.6479" + id="text16591"><tspan + sodipodi:role="line" + id="tspan16593" + x="72.839729" + y="1036.6479">TODO: image store ?</tspan><tspan + sodipodi:role="line" + x="74.431526" + y="1049.1479" + id="tspan16595">multicluster... </tspan></text> + </g> +</svg> diff --git a/doc/source/images/NOVA_clouds_C1_C2.svg.png b/doc/source/images/NOVA_clouds_C1_C2.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..f7526bd1f8872913c6c5f8ddbe99c8d098ef9d3c GIT binary patch literal 448574 zcmd43g<F(eyFLsS79avr5{iP9bV!OIjUe6K-5pAbv~(jd0wN$GDJ|XI-Q8W^HSfFk z{{0J|htJ_N%y7rL*SfB=)&xj@5JtaGcpn7?1zl7`PzD9%<|GQr?N4{_z)u7*UPi$` zw`|{u%H4%OZg=&*!0UTfBFeTXD39%s|DjG9kUGH+3GCi0*~wZO*g0z3=%Y9~I=(ix zFtydyw$guXX=9kM#Z3qwqDFp*-`>v1(gsCP+re0mOxi}<L0^}QTiZ<E)L2K`!qD=q zp0<Ut6Y`gMKM3_*prDYUhzjz{IVEmPI?CY+pV#ivOIDCcq8fiq(|M1DB`5u>fPI5d zcbk>5Q3+d>CBT@lQpYkYOUZ~$E?x-*7w6HcQaHx(ar5P5u;TCc?vhiEyvt4)7I8_F zRaVDw&IStlR~M&DxA-6Z?_Z~FIX;Km|NH9Et=XEWiaCE1`5bLs-F?RO=Xbrx{^#$t zi>Rn*hGE9d?%R`WY;1NW)2r$7V*hubM^{8ADSI(q7U3GN|KBf>ez{w5`~S{1dlQSl z^nZ`%Mdn8KeC5gio!SRe@Ydx2oy}|K^OscB|95oWM_6_b{_ov-wC7$H|94paledCB zbpJm&=`2rptKQQC9uX^%o#wo+|GC@iNB_N1AIBFFtvfsm;`2X(S10q?lQoiykId-2 zEdO&W|8ozX!~1m(`PEggs9)>U``in9`sUk$YwPoq|BlpuhiIpS`hE%JheVO?WS)R8 zU&x+4`>fsI$7r)4vW1wyuKUjzUtr2!kKiIl(8u$^``<jCvu=4Bm10Sp_OTq+&(F@z zZr#3(MMCny*q93C`}gl<6%|Z&E7CHuviI)Zt?h5ec4T*a(xv$&(|=i*m*_tic!hn1 z#WN|D!mHmtMAva@f<Z1EtT*N5?BnY%x^C#s`#{xI^&;e~s^r&TO`gH(9)ecAI+BQy zJ#y&1W^nY-W%bhWu?NX@pdJ%JfM~!AikC9d(mMq?vLSOt%nlbLj<458iwxn%-x3oq zy7U*9mcGSCwp6(uM@IYm`fHn72If}Lg_7{x&}u8D8W|gBa$eIzA>na(VZMK{-Rl1s zn~0ov`|9$1TTVei;Yo7{>Ab%@-*3B98HbID-LAuP+shRAt+~}hkDIY+Y0p=Sa_^@3 zT&sV**GKq<HO;YR3MU4K*?LaU50f;cpn$Q`aeJu`Aug5@1s{I*?%mGeVPjWUNP%wi z-l$=UHQynx`FJTJN|?sW%bRyj`5tm|?xgJWx>j6DoiLkhWZ7WuKft43h`gryJLcS* z?uw~!Rrc-uG+o*{rMjl_RDI)v*49?k1=Nl!o^yn~rpM*W=F8BV(p4_@6hR3)$=yqy z-4T>hzl%z5lC9W1A~EOYweZylONx+`k$D`a9Jj4DG)wMJz+(4kY;0_Sr`0vH&|zz; zHP%{}ftB?o^I?7k?vp3qA|r2+@%%N^Hw=%A6jX3{f}*dl-^X?x;1_}%0;iWRU&3&u z{|FWl7mv7_u8=pqgZ}j3gFdgvMQldK3u<FImrNTCyO(G8U(>0hh)8~DoS3+%il)Ed zdgW5GOc&eyXMH$Jwe)oag=Bqg?WdU;trCk#vA`#E_`Gf$aC?co?kXm+IqH>c8X6k- z1O(P||L*0fm3svSK4|bmCx7|Ux3>1}ScxT#OEt1g%+^c@qgQNGOd;|eHIsQ<{epwh z1Mz5o7<9(Jc=>X+sKLLmkO@Vlyfm#^*ZsA>`jTC(F$`|i$5Vd{(&um95SW^pS~O2L zUHe?qly<kb&v#97;mb4D*Vn%@Ru>h$2e+G*oei_SE?qdZrKO|xdx>{(XM;axd5jGv zktxx`hYzPtI5QB4@Z|6iXI9&v@;N_>^NNcjGZtQmiHZF#`Xc~;R1_5ygg$=6LQzps zSy)^Qk4_fqBxFUH!`fkFVG$G-&YbX|rlvMBF@XvGR!8RfpAFORKYmb{D=H~{k)Zg` zA+9c%<mKfNsrgx1U%b3-tP)ajJMa0xX=v$a8JU=5IBVefw6(Qm=)#SE&(5Y&_n({7 z(V5rj?dz)_YKj(%nxgyN*4jF2yd`U9ZidijiVK3fL}6iN{rK@CRq3zdV!4W;9mU_O z*)lKX<TaBS_D*(nw<fB*3&I&;ePm^2Nz2H*v$nSO)h{oxTGSpA_*8oKu<GmFnPQF# zx~!}$!oIPwF)}(jEiW&mqJlFnE-ou4C#F)WTlV60*3X~Rlc9K?!qj~=mYya9S)Zpr z@_k6+JyckJ7SSpqDfyC_CSommusx}LA19@Md0Xmz`&*Ao%c+Whyu8;XY$b3gSp@}( zNzYI9Y47gezn`(55tfuBsp3NDP~xz%x=J-T+t}TbJ6_7b%-Yb?vy<DUdcuLjGro`4 zrFg%DMlnx9MC5MFYxQ^H;(?s@YgS7g1YJp7{s{?0DIRB3$6J#E@CLQ~Pvje~HU55q z(YIe4nB5pHO5}3HfQF4Iwtc@-r8RY9%%$XVB=cJHJw=4|{*WY$C5-U5Xgpk8>*X!t z4bw52OO2Zo74Cu5e)1Zpj&~N~gjWexQC8MgbhNd<AMl(#yDT`uT;muxZDtu#3#hKg zsv(!lmhlzErf}a_gQj$m?ly3+XSwXzUS!zaGcfQ17PG(|%(_3mG&ldE%{aD5QI%~C z7U7{Jlv;SC7ZRIrNvo((Bf_uG#`9bBm`sL$s#}aFCO-8G!T*~4odlhby|%CEu`8M@ zB30|GW7TNgw7)=Hm_j1{leN6=*}?kFw`OXzx!fw+dIo~znL_yS_<h5b^rNGr`M>6` zZk`tu7S-2}-Jmq2?8xm<E_3=`>~WZ%!^p&(X0RF0F<@I;JMzgl5Kk-^3-vQ996UWY zzw>8`!pFwq`$rf@EM|RS|1tzQ9XEpz!7rZ-J#jniRFo+{KiU>h)l6s;iaOm4on~NQ zOSQPHh*gcl#>Y7sX0@|>3vZGtTuRRtwrj^^D_rIad4;HRroo|mumn&=#Kh8Uhr96c ziF$sE3Iyd4_J6lULqx7s9IhijGU04%Z7~}J#XrYG<-LW)YpA=8aFs$If~~TaKY8G~ zJ8X@ewwazW-M)SM;ZvqZ5hfHPqvNw{TVf_A)MPcDU)P;3n-1^C(4ARek@FIvzV+~^ zF77g{l=5wUP=zlB%@}UKzIF6oLOdIO9D()qm3#Hc-UEsc$#+}&b8+=gN%meI=)97b z$dQIoz$D>5QC<FNwLQhdyLuI1ciBnXVbu5Q-YnK^ADesCIr5TgpWQ_EcX_%T9b?_r zFWo|aSr96_r;J4m<n-J5B%a4?TQIcyli#*AR5DW(F8@V}%4S(8U*>i-8dhS$u*#L@ zhC~!$8$2<%IN1-SpPZ^4K{0nXFF7@HT`epwW|>f_)YdY43zwcPpZO#zm>T;L{-<sS zQWe*d=%YVHrO2lNt>y;Vnix)}TD-Q2g;)axdT)MO_irixU8n?ar((aC<?~(dF_#>b zz+<2JwEel1({h$i3f95Q3@WlEN?r3tMn*Fj_r0ia+zts3$5K{S&iL^|Mn=X9UMwvw z;p5|nrKCu~C_`ILbJ!eHQdNzBWeh)n+95Xn1P4cCJU%Xt(P>9ZD46iQi3;^5XK_PS zaAn`L&g|sE^0I8HhkBlR&5vSk-e<}1ys7o4KXE(RWi7w0LA}&aJvvGnH|{AzCE4UQ z8Ysq6aZwpCl@6s-Eftv_wA5MJh`T5_3T2-nS?GQg{xRJ0Pq)9#(gp!?cKZ3<8B!P` zt>lEZe9b}nCzFd??P_Oxbv7U=SH1kO`&ekuI_qZb;rj4&)<&K8o&EW4zCw?A7Xyie zx~1F%MrP)8&zdXRE02P{5^~|tg`MyQC`*iPD^^{a9NkeXG<MsANh>Wzh_{y=qs+Jb zZ}tDMCkhG<c0Sr5NU=NjsSI%3J=n<*J|;1nDvY~CJCapVX{&Qbqxq#NZS@FVXa4#X zMCibZKg09s*Du;^cKh>?O^GC4+)q*!ZtoV`qDG4xG54Qz2q-GX#Pu6eN3lCjskt1j zv_j7>ceo_PIDGn>p)^&t`NK)djv-(ziDV9Cs`n+(PMjYsG1~kS!8joyV`h#(^+vNg zK2o={x7TzHmXwqvV6h5gd0ndOA0n5dfF85-8V3)rzeq|dPf+uFxved<|9?~Nu5awm zaBliPTrk^FmXnjqD2%@T{nXstoYQeF2zrs}aPG@j9A8S3%?Y@T7(z+;mM(nv#d!W% zHeCDg9TKlIyNy`Enrv+p$BX0CrFM1PbWgt|VmFakSIB*1d-Tx6#N;6X_bn7x*Yo?O zDWzH@y^85^3>G)Ky1FtlGOXqn?m@G)vRDc-eW3V`-Y*S-@OAXGL@_fnYw7O3R$V?$ z>+6$oIbN4^66Bzupm<2a5u4r|Vgo28snUUB$s|Yyv#a{@{CB=__YA-HXtgevYKevR zK+DIn%JLYRN~vvLB_*Y>`1rPDcUOEyvs*xH)GFNW;o{=*5?`&lzCrUP_YltTd+I-i zaj-rfdVaiJV{38=RnYp`!3~~@<5YO83kwU6o<5cU7{F>ev=H$+#p+<>Bg)zFdT2=r zn<OFoY@Iin-PTxKP|(8)yRCPw`9~M!TT-xq1=J;zg4fxpi4BkNilEh}!82T0U6Yr? zoh5zSTf}2o$DKD__Myt<FqXymaYaQ15~pKfeTE)vVPPSId6+Gm$zii_*M5DdaeSOe zTwEN%w7Ic?&*Q@4xHS=8VsB+tJ3g)&??gvS`w(tPO<kRU+lj&0*!b3+JAHWqToWo4 z1y)z@diO6$ORW2aIPEtC-)f=Ub9@|G*i1bqJ^p#Uch4{)Q!1r!yO!6WBbk4qlOx)# zbRjq-E;jN+Xu9%R&O`Wer9TJLmN#X;AO|?&PUyi$?=4rVJ(6yKOw|tKV}BMuZ+EJ) zQ_;}4>Wk5T3JJkT7Yfm7Y{NZRne?WVN@j4L(*vv$RZ{7B&Fdff^p4i(H+>0w_Rj!& z9!frJ?d~>&;zoPvkzMQ#3<a-CqZS$_3YWvyjK!Qf3k%E1QGz8xZi{igX~wlB=HTGK zhH4%KS<e9A#>U6n&>TfahWs!hP(0`<HJ-dvBd~XG0f<MX!}eV1v?mRo-Sug6%0m*C zSPggASvUfqtNPb|+Io6|`sr=lu162ABd!*2q)l=;^yis#`C$@;<W$l?0Zhc;kPO}8 z(QtN0H5nP4Io9-u@!EQm(jDGphj#0Z70f}DX}3dkfLL;+zq(EzEWh!b<sQz{OxO1I zlTlU}%q@Ft{a!3P`LfY$)y2rvxE~>l_d_b_YK*fgC^?xVTsvHb<|1wT2^8Va>=+X+ zha2zt`B4qKlE2F!#LT9CpGJ*mX14dE>oXC^cm71euj<n^qPHY!e4XxMD~-|zhlf#Z zoQ_u$)0{PU>KK)@hennvH34}kcKSyhqtI7AI5@Dm9&gLX_os?QQU6m5<QEX|E-T}B z{+yh{;X=umzZ7ccd~=B5*5C49m$r1|e!*JX9?tXcD@!(i7Zf<tFQ@MGuce^;{!{RB zODM7U!rUdCI!)vr9Su!-p@+VU-Fn?Gf})JWX^;I}9J}k{J<9C5wPV(ri16^w0RC)i zk^`fopCAy3jx)C>swL*L!-F-{h~di0a@)C)02@zNA5XupUYo5El)8F)J~cHpeP#>r zX_&k=R~OC`6BGE%1`mORx^ISkCS)~XaM(}+66gcR1VT(kODka<a_c=|MNSS4xp2q} zM#hh~rb+o>nQ}R7Y8{760{$;>ZZ~*Br*zPCzP`S`zq%upo$)aMD<xR#Vq_OOm@VfF z3lOl`~hiHSL#?6n3lbF$RRnQE@CXaE!?)>tJs2xI74Saey}%p=S1?r~s1C4oOo za&=DoS^q`8SLph!?d`fNU%ubEbw_%#kdrU>EFe0M4%NA7aM-qH=`48N$jE4>x5+z2 z@iHhN;2sKAIMy$va<4GvXMoIm+Ny9X9XIYQVEcOjzB(a3Oi%s&DP)tYaLr#H*JG$T zh^XPp`~0J#;_}3)ZAUy~;4^Rk8OMQ80B$ybS^<sDo;ObSS444p8zpqJbtUl$Pgd9~ zmwFJR6S3)Kc2BqKVc+6EVL!=QUHrP+<G4NLzFG3sf26OkkKJP=nZx5blxVfTc3AfI z_D!M0nidJFrIw<6l`Jt*@c?dL60)19S@66?vYt;w3&AL4Qj~`Wdl{ld6hQ>+LMo)# zM6%kG7L(s%#=pCxA$B#tHr;Bp#<h33TK<>u&xWV^>x@YF(4zD>DmFH@oV<Lt35Df= z6QeIis;~G1lz3KiieO`L2{E}bA&Ll5K0dy@Q+b@>+o`VkTP(&yKGjq12z_>oSKYMJ zRjQ5%#tvPf(C-epW6*?|jaJBLf6*C@{(KqpTGJ(cz9uVMR(6#+gJT(pWA>~tzja=B z=<+33^~Ibxbn8>yO;Wqnq1%8M4>tONZ72VgEw>cgJ@u;LWsi=ImXVs+Uq|I0a}pWO zgvC;;iH?R#z-;m`K0Y2sC){*6zrb*t1VtzW|Mcp^+%=U49#qqe;tP9pOBAMs<D%l? zVzr8kg@A~Hf`ZvE(^zLN$BiBJK_#2xj~$uw($ZeATek6ygNV~GI2lFJ8PBk8>-<{- zYKO)3)#X{>r*l#fiim>iS`R`tW090A_g4{7jLv&{E=L=!m*>YH<>ecDdkZEmNXWM9 z@)Yw);GtQv3QhO)JffqcdrC~4tx<LH=m8NC5&S>Zt5;-{l>W~I{1{vgjQaZe7wQ~M z*>BvqIko!tI>tBgUfpq6{y~14sq@Otv*JI00KMpqglU_N9yu7#-FH7fKoX?GG5NPw z4~xuNnI6w$kCwWUvg=svbe8V<jbJqh%?$Mg^WVHP>p75;n^1CN?^IABPf1kA?YXPN z*0bkKUbh3EydpMS45cxi$YO+oo{BIP=X6+og>Eh@FRy=9x-VK5SKHel+}hEhH`Za? zSKV(Q(U2X0T`;UuPUsv}cN0x~{SGFP1kf8^Rd){eITqzn<)8$Pyn0*p5<LRqF~?NR z6ps_q!%WBgDM6w4eL0r&E_U1eBaI9yWyPri%NTw8?+p|vc)8rZR6K6PNFk=xEWF6g zFCe>HU(+hQxoXj0fetV-k;gH5CQJ(vmme4y2+KI)24kbQ1>L#IA_ccI0gNUbwC=Mv z+R9*&V)+2yTVrK4wWpFv@y{b#Gte&anv+3~p}y4IodF%8@pBbg&(M&9%C(#2R^WMK zQ==Hw(c+rEwy1+cN#9L3wZscUX67OrZ28so^_wEYLc7<)0hLsI%O^fg*~5(;0}>j3 z$$x_kyOUAF5);*4TX|O3&77t-^}X{@2mN5QO1E^NFfSGVb?T1Jwh>(8L{NDvXfhnm zYcF`m-S1Z6x9yQe7kPGjeEs@0gE6!-DWS$@j=s^E`X5{hUqW0w)$RJPwpC86I^|3_ z{2I#21Wa)fR6JMjZ=yZS(46*wMTKoc;lt{gH`_BSurXE?$e7+FGQ25J^>ytO?W`=p z8k#LqTA&K^*mbPynaQu6mGn|(W@f(QgsBBOA(9}1K==_MhHJd#d)(Sr51JGXqF^OI zJwIOxD6}0P`E&BN&c9O=<!=IZ1K_h*kML`MbSB)rk1-dc={Z}f>EU{6cz&Iq^!YRD zxx+Ti@o`J_kG-&)jT!Ezr>8!N_fU~jiCQu5qG_4@FW*;2q)f03HI{>ulL?j!!fyN9 zx5pQkm)4Gsh67n2Ur<oktPM~BX4u)=`^li?L3DI<G%`MpO-kCm+Mfw!HPik42%m@u z`|;!Y#y~u(*RPjG3UtfL%Ng}r9#L&h<fP-#sjC(Oh#LE2ew>`wcI^k8<Q2k7ktNY^ zekm9LDLy=%3di-X*j-%?z|zEAc5XSk#-IrOF_Hha-D+5936t#;OQ>Xia@9zgC@;=? zDJe`?wQy09O!GL{86bbA<>pFulkkjI8M4zv=Z2LS5Bv^~JS~A9aI&$Z-CfNCc!}S{ zitg2`xAO8))$V6vpR4EWQ~dn=R@T?kfBX<SwwOe97FY(#5K#Vv++ESLbcKtM-Mpj8 zo+ygK;I^|sZb>v7AWWId;ap9BTV})Rt36W`52dS{Xc#0~4Nd4WOK(9ntGV7gui?zq z0DVr<eIV6!YQlMAwA3G9asO(>hadu0KagNxdUkB_R4VVE6Rrk+z`8Y@t9qOpQUIl* z!hTbT=2!tYuQcCS%KHqx4CqT>jb@Mp1v$qHC6`SlxJON8kLDxd-u`}acJ`P_S4U=p z0ep~e{sGZ4+aDDY(Gu}JKinQpk<FAssx(L~#F5Xk(6*3@np&qLi}7G<FkvO9H<8o* zYvVNi51YldjVT(b^R>bG%iC<&6p~u?W%qtfmyv|=y?RB0G3NRQIX%p#3y485WHXzP zw(#WP;aMBX7Kh@}?y1xT%9EA(tQhbWMi5hJXab2V9T@cca6lj|bJ!&G%)5?|y~<B6 zKkGj9OiN39H!l>tI`W;Ik&zK3pm%O=++-<?C7@}b+)BRhwz-i@KtSMjHkw&hRwjaN zRnFpAS6hp6^X5$ucRJxzCmyTEPQ|-gP#fE$X6K%JexjnK)oc1iz`?=MQ)793|K`=G zW=9hMV3??O+e1k}Pg=UVqSvNj&7goFq1B~m`}@xy`89nf#n+wc8P>zhhTVEi#RSOb z1Y8O5vc~yZ6+0u`LW$X=*YwBJ9e=3RRGkmi!Vigtfwa>dUQJXwh9cTyK=8|p9J~Ar z9msZd?`1uCJpro$PL=B+1uI>Y7-1AXo1K#HdGWDHcb7WXsqJJ6K&svG?V6}@1GoW3 zu%>!@!(S&=TD{p|Dz%t?&dcu+`gHwGT6(&Gh6ahI$NozTy2+J+0_@2O2VDS}+@Ljk zSECWI+2Mm~>Lcu9`)~Vh^JR!4$MIVgm-vIYs;4dl%LZNfe--M_5qJM1I|s)S$^14q zHf~*Pk9p&E!T`c9i^;&35Mr)E-DZpr$=t2ww#)cTdUqozs;)<4aqHOM+S#$J59h-p zh^??+@2hfkJldM1K@?%)Gkoez7mf%EBlFs>F`hpQ7OQb&EMVkdvx~e+`Sz{8RhDvf zI=^OMXRID^n~2@gZ9TOT4${#fk&Vhp%N=CQ{3G0k?>3hz*Zl_%5YJxI+X6`};!Q!S z9Ux{R1>*3y@5RBY;_R!2P!%R7CqyMAZY`j9%u@u-1DVO*rRU;GfTuJtFrZZK_R_XG zz5z6^)#*~c2ujHxfNW$a{e`(O5xP`24qfcmtBx+Pw_ZfL`WgWu{K>wb%k3YO0` z4X;U$xt7-3+Ex_Mu0(*;)m$6}7JpDwR1~wl4d5Oh<?`&W2V3v*=x{Op@csceT#j4G zSx<K*sWtn2#=QjOk}I8dJ0D}T8yXri8!hv-#%?aqUw;CV=6P;WVWG>a2k^MLreLCr zy>a>zv*U1sI)xzB<o(m9AmcOv>5k>H%q!Lex+|vJG3^Uf0s{l1@7Dx8Sz6UX39-zB zt?f?0KV=C{F~Hq=5Vm+f6>`Od{Ptq5vbu#Bf&G3+=4^#QSKga^yyV8~pTx^`YB!Jx zmRbw{bPYvhj#~MisjF;yTAI@SG9g0W#l^+#v@zzBP4|34#ul5S#Rny)SeElDuyArb zRp@d_nO%ZdJT_Mf(u45Xyd+iGsG_t@b;V2bCSgQkS-Q#)rtSB=w?LAi={&>Oo4V*t z7rH4uUBGM3GyeGL<Bmeyc9c_T?_*?vPNCy{NX!`ddxzl;2Ei-3YvVzwf!uwEU`1SO zlQ|!F!XOS|*0xA#rl?e}HOq^|-EqX;-dh~jl*yJs#N3(e{~<BI)R_R4C>cG0?YDNs z-(5qfrt~~rJ#_+aTsB@Q=Bw*p{M!X}#0L;J6?!O#<JHq@f48V3W)_ynweNr^TCm8K zOSO{@xLmaIxlIiw<LxDq7^9|#FJ5=np!B4Ac*hK_n)4OapJO{Rhrk07t2>IMl8x+Z zN?^APsjlWlMMVXR!gjffIGNWSX$MY;cONAf4P;?KCjh@Deq=-mBtECJ11hLCPR`Dv z$_gNHWPk@VQEu!1=@ZIdPM6uS`Y7*njOyNtSM}}YqZHfsG)vs#ihqHq1!g6;)6UEv z0{L#PEzd-l*K5Q1n6-1;c>Ms^t79*3lX+qX>J$#dfcpIG^6V%g`N2@0YR&;SiU`l@ z{eXY~ne?qa+;(f@t>>&)q`Wq<Max}c<3~{ap~XFRVT?5A9XHw<OB`5`0|?&>iu#et zuRhz6@hlm{eMjsle+-HVQRy}t*Mep>q@@(sc5%9|Pqt04K2Y7iUUIE9XVHX(hbIhB z5a_tk;*?lC?Sj|=Zaj;rmw-8%PF~|*CN0?xD|5~M>UuN;*kD@}Q}01%Asm0Or?6_f z+#PO3iJDF=#KCT>a6f(?dk*xY??4Y&Oh$kvN~N?>HdQ1z;qj>Rm<;}WU-Y9>gGh~n z;^kvp-1ja*oKKdXK&_W19CzD1W6e{q6oL+WxHg!s+;7lV;g3oB*qxQI+|4uMf3pB# zp{ojtij=b-Zh)<k4xNpI)%wOv-=a8DK5fXm0}FLyv=VKbe@gDBTtK~{uaCyVsJ;$O z34eNO>Ny}CFi6IWQ(s}yg3*$toc^Ql5W42`HL=J(>$l0(j!>=~x2E{TWdngu_e_+R zN0Q`cjRzj*K$WBERV=e#f8u=V%wlgMmhKmv5vf^|?qRn+8hoU&`NsKTK|J3Q^r61~ zerS}9T|*&&oJn}yM4&XaNm|9k#UYonwT%tZvjXiO6;!=n1BBN*vjR{rgg{Rzx4$oy z%>4`sDNG!rEYqGseQ^+0UX`kYP670SETYwDw$BT^t+YHrs>%M5G9@M^CI--FH6~pm zBO^ty^H_~17NWNIJwSTJdq*D@8!7VV=OFyjJL93fb@n`HZo%c{<t)whgQkkkJ2Rh) zY1!Eo#Wo$xXMf@_<Xzdb0;)h*r#A`u3Re}A+}EDfmT5cQ2VRP}=b%9W!t~0D(W<3j z!jO5-@bL0fmFtTM(YM0F!Y(7XPHzbaUxaAs>%SKtj!t~z>IXCv2_pu7$|DIE6ZJPA zpIcwWzgmNssms%BQ&R+Fj~qmKXjlV|zv$7UoKAM00atxa^(LV0EXvx-DphozqR({- zH+un{h~-~P%NO-ZM@Flbw;=wW_LUOeCH32Wrs;CH+4$FaAFhX<ePG5J=;cJ2wf7S` zl?!37&9DEOo3U|meT#~0%b!Vh_xJYB@^{@_qK}pOw|MvQ<HtsQ8Lc!#@z;2Zi;Le) zQ&nF#2=?|Txlt0((9oC+W;dQ#&&M&E`}JM@SsyZJTcE<Nc0DWQ^Oz51^%N<J@#dZ( z;jv)hsW_Y|)m%_!16K$tdk}BcInq!ZCQ-i!q+|Z+sp*~Nt^{#0vHJ;Z7lR|F>J9PJ zo~KEmLm^;ZeMqsJ8#^@B`(bcnX0SI9Xv9B_!1tP(npa)cXs+*W2*9$u9~1pL=*$c! zosUQoc!{?^y20?4dL&MyG}y1Aq5&)~UbC~~0d*Jjd#?i(UD7{ZB97&~$;ut4i<4dP z8cU%N!T?aK+oNeC^4h)LKloDhBoMj+*wO<(RRhfvN_%TGJ&~sT{8jTC_ql_FX%S>t zg5X;As?SaCIyUuOzA1#XJ!Sn`Z{M%;At~F1uHv%hc4O-Kw9(o@w%J%=z`A0dIBNAy z3e;K*SQo#PEB$=9_C#Gk^4%-QISf4-UFqK8*=P@5A;PWheS2b+j9C#J9L&hZL_x>1 z8C7@87YC{l$i@8W-|nzmPU)TO%py&c#Ka)5SivUL-Wmp@^74A>#Y#1_Oz508+gm&c zMbjI!;AWw@V?HKOxJnwSx!ffxs)?0sxPuPR@dXqMLPA2MFtjS0DK21vyh%WIeb8;a z1iXxA`)*ugU&-_k6X1%%11l&g`~l{T*<^9lc8o{2RE}qwZD!Z4JGcA#{=DR`;}_#E z1^@J;Vw%z9PgXG6>nm$Y4}^k(6WE#7_m$oH7O~$62pA9jBB(sx_>qz7b8uis$YT69 zGbD-Or_R6f{pGBW>37hMNKnEwwvCOnz6cXxZe>m_A8n5Rn+~FPL{D|=QJ0ewjImHJ zvpapPvH6z+`Uc6Q>u=NZ*Wf-Nb20VTKA!45bbmFk(fJ)=P63?2{SZRw=0wD1t~C(* z5ucEd2`IxVzqnKR!h#;)-8P<{2c%Q`{H1AzQo_P$*yPwU{j%4rb)_)gu&@N>C8J=i zdU<&%RXXHye=_Mo!NkNwre83k4G+G|sOCW{0}$Oake%K4BHh{9Sq-BS=|@2E5$P6D zY>WQrbg+U2#s$>YpK25mCMG{wmV-dx1luV#E>51KcWLrpWg?GjG=L>tLsQ{{K_kR4 z6SV<XcXxLT)9xJhT)EZkjSn9_D9M-333Z^aMrpy(U}pTtD*FQM`6D<0HUe|ditj$W zpP^CZ!ZBpK0A;^VX&uCY=g*(Fw0Ad5b|$GD{fRts-<d&O?n)u&AtyGaF$IVjrJ;EA z7aZj@2s=df%EOAW68U}5_ItUT6+#z@Xm4;0Fz$mnUHXXs___>60`viCP)T*geQRC< z2Lr>ImX@}yGlTx_H4E<T$@`pRocKi7MXuHMc6L_3C{uQFB;c4<45}q&vsahr1NoXM zFo!;ZIM|iU6X@%EJD8C5IVY#et?B;+W3YHg?K}qp27E#V<mC_l6iGa&&jCZNs<>I; z(Us)h-hPXCtAMa7+P=vWWXu#f&M%r%fiMvJb4Er-$w({JLNsW1cQ@Q?v)cU}(9}zK za$kaiA}Q7%+`nJn-yZ?4$YWyS&R$*N-O(-b|3<1#ME;wpy6ApIOZ$tVVYzXJ3zl8_ z?P*R<&Vj=G_aCjXy7!W;L05)rN8p$#<|qWioe$-zHbW>R>c|s@6=*Ic9bK@+WX0^l zf}o(F&)xq<RmidUk836%p7e^2rg5YN-`(APZ*Q-qqfPKOE;v=ZBi7r~HB#21j6(83 zNc9-Z={_!D^IzuFPrHv85#XcBsrh{W{0!(i*p%0=pd(~VNTJsD)$buz=fJOD;B9}e zD6D9F=iu0V1AxKaNvm!#%b$Nfy7jJjI5>g^1{4sg5z9xHg_%Hps=)-h)AjC*s;X*2 zJgdn!&9H7Taqgm{>u*n0fo&^RR{|RO=g*(vn(?HhqzpP@`IVIL>+0$td2;Km%U~RU z!|Lkl7cXAS%+A&o8~1<t`t|YuWXb%i&fFF1(eQAd{sVUuq4>6nE_3Mvxa<Y`2^W_$ z!lA^CT~i?{_NG+^-8D#Q6uci>sFCbbnd<%y@VVXQF+P;joUx6KO-MB5>_kahny#1R znoU*2f#v7;`ax<xWfHuj3l`Bf;_o#DB*glvWF_v(g|8O<&^5GdJ`tUt9xsU4ektA@ zQb~Z;GHqyTXeoUC`Eq*P`W8PwMFbW$cEj3W&S-@_jj=H<+8}5{FQ&zX)YXY|))YwX zwr+rd3B5TG<aSI_o`sG$W{DKuq!iC90&;TlA0Lv$hV#_R?N%StDEuO0V|xNW1culS zN9-LO)F1k#e6Tf{AR0l@o1;h%t52yw=Qhy&*x1<Lp4T28SEq&pgM)Ew=7c=1NB_37 zNWq}R=e6P3y@%T^_MdEGeI+)}B<U!9&1F6RwD&_IP6=ZetM-u*d@x}x4?mRw%^JEW z_X{EB?3>EDB--pRv(|lxj$Xh(KP`K}8}yXt8(`_9&8cI4*9~8GL(P5?_{D)d`Ey;x z_m8FkH{T=Xa`-nq921B~zjv@I3tGj_!9fNfMzQgw<z-v?MG}}HaycrSRUxNC5F;9E zi>H)IK_<$aoH*dgXJlr|)_Ay|9d9E&Oh^dAY<~nm8T>a^lYvwq0PqPwQ=P#?>{%LB zoSg~nhEo_19v~?VATjB5A@q&S&DNF{q|h82i~lP(7gi+(e0r%ZiUwSa^Wh^mJUl$l zgVv|8YI}Nm-bzYtdXqFChtUJsiarmj4gmWPNaz8o$xDdN{Jn=|ca09zR767J-^fVp zS;!&Mn1*Zth#*xHG1nl1mp^j(TztT?VYazrH2<usZ~+_<Jv}{?y#qt&aVU01)88jd zMR9a=bU9qNXjwN*B3)VUe$wR;Uh?FsnYf~&qS~9+H;^9uMJ<`YhKP2jtFLb;gEUxJ zCML~V519H)%*+A7f$w2efq`@H4R$?D?Kp5qA}A!D1O7lm^S7}NYt=)#LOH{EeaL=6 zqXe!sQWV|T*s#jll(vYIx2Ne!<nflExQR?;0MUYZ)AP%i`R!GFOzI37<gx?+v%(#G zd_DOFy7y=P&q}eXGlN|@^`^?<P?A2NB_e0C6s8oibwa@f*%f)NVs#f6&Sm;UN>(~t zE>$iF!$l<|ekka?95^3Q8i(sou*u%sy|<gl<%uEwKpd<LE5Q4(G(cL?g02KfNwA(i zUD#p)v1-W@0V_ikA~rD%uOn>ud?A_EkrUSsu|P!RD7*_}0iFV9^pogBZu@WWtdN0# zfB;e7VX`w5768t6X46=JB8{Cv*0eI-l6k$z1>zaVu@RApK2TqBCsaSSS3iNUS{BVm zBxHq7WMpjo5qJ#reT}ozJdu{TM+nm!d)*^I93V=|Vmh{gSblyN7h-MS`MvKXzOlU% zhG`3R?IrlzhK7b?e@y+sI7Q|f4G&Le&ei+7{uCGgF8;kRo9?ftXYh!CARr|r1;@<Q z)iwS5cYZA`GB^}6qE%u(&ZOJ)5b}ucq@^Dz=4&9}_&|8I4GezBRTmX8!;E+dS-i0! z5VU3+{L{0uMd5>B#>)saKz+QDuXA*J#~qRRVQCH#2%d2e^x{|^Q#P<nPeO<0ho?RD zTMJ);4S>4m*SaVk(_bVk1tQVuTswX2`JoyRv*}YM7z?nVv4{zf;BDF{1xEGBYmJt? z$x0Ei5AS4Uu|fKByIdT$JghoNu>)xgvNk#^Vc$tBsiCuON8PQs_TwA6s9V!ilm*oS zaG#)hz>QR(o<7MBqHcJDbgvCkBCtjAa}_0}-@4-%W5pH?kQ4n99C&*M5|l8v?vQPZ zYLpL;p_onl4F_FDgn7WDZ!y9K(;ewNU)NrNT`3)@c&iq|F3N}f)QC-}OwO@~VcpAa zAFM<ekp3m49SA;E?mE74TVMc21xeAwrLN95b|;UbsO5F$P6C1mnZE)gDLgnwxG|nT zKomAh5q2LDk0Y)<S(j<5RS$?!B7R6b2hudkY*^&Bx@Xhg6huNkh&ogGa_<tRwsqSz z4j#SwKi4pJ0P$kWh4%dlpf2C31%-Q;WI+;)aum=OLAo$5Uq4L)d#)FvajU3pV`K4< zMnskhq%L`|^YLx+8LxGlppC69!rgRqcn;*3fm~U|F@wGVQL$!LR#yG>AGvmGuRK|& zLF6RZ9liVY>%wt%uAwS2n*p5{NX7iVa*8czoa(N2QJTXA^9Z{u4IURp$XT<QjiuUQ zKswZHx*}<+%H<{l{4nH%xDMbNu-rcT9F;%Rl%XlK$2%pEPcGRW34vIsq-5~>2Tyhv z@icGz)>*voR&w5x=|~C%AFUP!DUL(`IV5eO+l)q1pY?|KBBvXeBztL1!GyL~9nN-k zb{eiyIL%6>+Qdnm4s&JG)+n!iG>~l-89HQra~Rx)<ueR!IB?U3#ztQdasaPHy42zt zFGF95Rb-{4oA30t1QP<*d<1j_5HJ<<)Mih1=b@m^tgL(~EoBGi6R8npWxaxMDvGo2 z4A9|w4<BZjkC${LzKIYHC8=VH1wRj=Tx7uU=FRR*-OcQYogJ%HE<wiGc%71c0%n62 zB9yDTy5r50agH}!jAktiL%GWSkSGHbp?^@;3+qMHGoQCuw>gv%BHnD4Bebk#DK%Ca zCK;ex%q?qrAW7-=%M}k*SUVU=TwzgBjZKF{z_B|3wY_n<c(u;<>%95SBp~8>jW!<S z&Ve0G;h<Fyv|&rNW{7u!KdGam^G-<U4l;VOP~{72n1YWl<@3!uHdfR8YN}=5ARUzY z-Mgi;a}k{M`GJ4;!qEH@*vxeL{UmXJeByE1`LxQM38Aj9p!zwOPeVxKv&?VVa2SAs zrEXTF6!XB4KFo^dGj{U_28#|36wor!pnRjOaSg?+Y3W=jc5ADs5Q1Q_)3`w&%WHpT znlEl<M$6^yAjZD~I3LmEJDhEz5G6^(CW`qQyID#PPTi6GM%9B34f6$Lowu*1K(Sz4 z-hadGa_~h;*u4$z9%&rRMF!yD;Pm|F7jQ5e{~Q;GOxx%497P(-LdrYc<#5eRtp;n` zV@mCARcf&$s5ebPqykX%_iK`*<eYFI;56fKVJ;L*aJ$7-8{TW^&y-q)glhG<`>xSE zKeP-1KTKr438~x%$WqA2$@u^?a@ZaT2L1y<Vfx%@AgZy@BsD!xSz&TH{n?-USAhLu zLX3=>`zsg=veMGE2g-}vy}%AvhBHY$^G+k6Vugo?*Dc%f(wC}hNt1zkD>=>UPDMwj z4_4G-$;UD*Tkr66VPs=PW|&-?EkcOj2tgPJMOsnOu+>rg%l*(fiwpITb7Eml%@okC zlqxMYO}G8)BU@!rz!J@1Y4Yrz;z2ps=*1={PiKEE{%FeY`CZLww>SP6#NQ~Wy{|E= zWfyd-b8}Q{m>QME#UB84gb*(5s+fnp0B+Zp$7WN12_Us#+~ENF6ta;gB&6r$sOBX? z@JYwQA|yV3j0nx<=g*(e;eo+;`})53%|8P_v;pej#f2NJ(^y{jGd_oo<HY<WklWtW zT<#GK<|u-o<nQ5rzS}NUvjf3U5vdrdm2$BD9kxe1p}r9Sn1t#`?T7)?pd*Pr24WC# zY`XD%PoD!=_;qTF4wX@F!pGWef0JEoogS7x2uUDXBm$mF&CJYX5j2HnghH$G_X}7S z))SgjS}Txyvc_)eh4>$ZR8j{3o2WH8$SIE5n-UzYGC*2E{}i(w(UFgr3yL+V=T$-d zA-KwAPaWbSnx*;x7C=y-;P-E>1H<&u>cf1YT_3J{9f>><9yiYlw0dtK48MZ3GFq&U z4VUP~cE)VbmD~!f80X28!oB9GpcAuO@P=6P<=#4dKtS;9IbwRArzJt3CYp*>EEnQ1 z@CY-mmzS5B&6`-LY-z|CKDD%n{OF7YXRANsP8u+MNT9ue&@Iz)&Ko^_eR(HI*za<c zEhu%&1-84vc3u^r3+ufDQK+Vmz*Zh;l|{<z$bA4gIYkzooREuz%>KXr_K1N2Ik37` zN7E@)-Af*WGSV5(su@R!=fWuGGIMUd7|OvOk%>9<bARn#Ke)6E3=CvI3n6UT3uzss zmDTFFhvo(7eGWzyFdZ!&ou&%f^ksFio%yNIu>R_?xbgO2vV-~f$H78sfGZFU5~-@q zPs`8m{-RBufil$J5CJM0%3kXjPMs}!B_Vk4x>{N&Ev{Y=;PFQwUIJDf{f$SbBnZat zYG3&SC|=Rke`#ctlv?77_T>6^b(@iKCRFF22|8Z%C?H6|NF#kW$dlf~xYzVI{tcPu z-S)ONkW=`4eSJ}WUAoi#`0+z7Un9xjb!Q7~C%CxnOrJl;$_IvXZ7zbyT&1*bqU{2K zsZ^7D6|61bFM7QVCx!?GY-4IqZw}4y4}+(W%<Y`UvXyU<RB`e90?qgm#D0i=D{aLi zof(OEh5!Hpqotmt5Hf_Y_fIReD%daZU&TQ?v-<-TZj~*i^A9iJr(l%p!4icY5Uv>( z3WyPsUW)+n=&SJPe{L(0LIs8WHcB<tJP(%X^`=psrOv?+nJ#<Ef5H_M6l7&@|MJBP zK`}nCx01dEl|+{uBwM~e`U*z|8ZIIwMF~19*nrrN9=(Mw9ugAr@F@o}Edz2w28j_Y zQ#e;MY!fJVJ7s$I?3t3Xa+O`lAv@4@KiIPZQ(}H^vHcbr8l=BMVq);_+_?iUY*+hU zLSmJHk?}k9L12}aq=Wl(u+@uiwtH;4oqY`bDMMKAybvTQZb8+)bsNok<Af3P75u}| zS4SI@0=C0T|I~uNtNby6N!;6${S0t&Z>AzC+^W$~8UcHnrIvw#kf7czWWbTtbU?4C zmS3&fji6a5WI=Bs6>uqtZAukxR3L|?O6Bt|`eCq|jNJW1AsMe_U_x=}&b{UN6l}nU z=nvn34cJAOSWfJk02S*-Pr0d~#bkBkNUyGS)@ChW?kK-ED3MW7jJiV)K`VUYu%P5? z`QXixXAnrYjeUKE6P)(;r|Fsid?n*q>(YbKs$7nA4(W47|G44-F4^-t>v>>yI4ZWO z@@E&kzA1Ot)&6|UU_v(J1|cDIqFGqse`@lh3UfR(_qjk$Op9`*K_b$xqzaEnu)3zy zT~VENKL!6m4<=&0voJsFd9`R*9lwtY6BQZTjffC<5cA}d+p89+SH_U^0wp@ta=ZG3 z<S1&o-INj6;5Jg&!VXA1CkCtJThp$IY3ub4jZBEF>>^b@GSwB@xQ{J8S>t(~8xj?F zsEC=RLtC7bOAIje8_5ne_}^XIH5Xl>eAh@1HS<Ht-1zCVOuhwA8hJW`ep(R<Mr1Y0 zv`?A`ToOJ3L3l(2d9b>o6Yq$tx@DEu^H{$c7p!Ewlt=jk;~Dst7GTN#F&Wfw?j+^& zpheh>jg5%4Lt;15%i=vTK(JUwQz2h_>8H(5+Xzkb$|z8dWw&+B4ixF5=A7URD{E`i zh+IA?tPU@3``+9?L;zx-zmaBAd=P8E2NUlnj@@v!tniugM`Vf>!jKtu4@;vhP{c5q z%DbuaLg%=16moyE9I4KN2@2K?dYpuxyQHhh&@ZaV<IM7WsbkM6*nj|e8yyI*6d#(2 zLx3M_rRxzK(b*dR_;|uxl|O0k1D~i>*ooe+_D3fY+8pz|l<cNIxh}S)Gyj#NDyt;d z0+bU8M1c5vd3(3EwSDv2gqCg%NgH?#T^s?4Wu#09D#dTx<qsVl9r$c!_>gJdKEw@z z=o;)m>`Qz902E&i+ogw)#RFmJ7RUvONlBxBOz~WgHlC4@eL@D<Y?mbJ8yfgrc9On* zdk2|<qoc*p9N4Cm8=NcCZ4JI&sgC7$c#2R~v*wlj`G&6Qyqq5>6`I|Htw$T9RNe6e z99m?h^OpOdO2x7}lAu67LoN94R{){9!l8>N0rL<7dy?;<0fF)T$+YbghpW;cV!kIZ zsz^~CR>J%D?|p$wp!6I@<PH4Jc{XUgN$Sap56B_{crs+~kzvxOJPwh-gshj3h>c_8 zpU29xG{Ke#2CW_Bw#9#=Gevz*8R;R7Fl0(8q<%P04bX7;%Qn_2>ki46@Hi}}vKe<e z(J)D1lMp6E_c=?pzu2Rjs+5{^O67Qb+d^7v2$vhsU#OBYA-xk{$+ir@&1AHuBBB<o zxC;9<8xVb9myt+2(u+~;E<qx{PpDHjvtZW<1Y&23r1)I*<B)qKaGqCP5Ob&8xtbFQ ze?9}g&9|nznt$yICR`fJhK8#Q)=%F`hwnWl!MbYur25@3G}-5tUzjzYH@Lt$Fu^6v zf>?~>(=g~C93g{P3fP)dYmVzjbT&3N3x}mq!<xNo$@_1sxv8iE03$56NwdgtYi2G} znsedVU?>+zoE;y`%2I@+ydqvcb$LNaSyK|;01=C|Y>p+*hj9{3uwSpOs!j5vKPXB2 z4C~)zh;5i`AfiKUz7G^*6<1B{xVpr<ui>nBey?Eenc+JP7fh6&a@o%>-7cH#fwaAz zzTWxhb<>N0$*D#B7`+Ognx~j5FEBY-qZ~)R(eO-?WDj>aE;;#irzwgjYu3h8B@rwW zS!_y+=E<h(EIyZtMOoEpWalk_;4>uG??q6cFzAeYDLqrWUtbAgR_)|uQa9gqB4o{A zQHt5vFafBPG2!T-Z=vL2P6E*$ytk9h(&>>(M|uMT1BoQgD45M65m+EZM1#Jpt)*29 zv6Yc(cP?OhKR}FlNWzVejU91JXvHV>F|V?ci^sLi-xyi>Nl8fyi;A)#^y!U;8QnLk zuBI0I#+HJ|<shuD%io=IgH_nM1_yPi{p!OKZ@avSnVsqCkAdGCgI$5JBNyfLDFs-f z5AnI*o`FXz3Qw=t-FA6NtU-~G)lASyu<YQP-oTR|!kbsZm)5_QTVO|%@^7O$n(jJ) z4k;c-RIH}M89(*qL08KtXG_a(qZF0BHGxaOqW1{IrKdb@2MAR5mYQ^pL-!k25F16* zs)2&WmOE~BxF&C`40$lv9(e<dQ(wURGB>RtKot=5RgQW%J=p)iRyOkoQlNoSa+UYx z%iV7g5m8(6qN1%_QB=rHwiGTEd|{}UXuknt!UVH2Ulhy4NE-QLh(~65TOnxi2(qiN zod%hkHVw@Ki8Mi;?-#XVa%BP+G*6^EHs$?yb+U-v{}Q97gaibY`l?_qz;F$1ZC_!- z234)%Em}|{3)eE`kzzJT0J_>1b$<5rr0wUN=}jT^*BN}2ACgfPFvWN(TANQDRws~K zMn(#3(LkK+<0!>*c5$+SAZ_)<lK4f)X>XCM6zr_=0p|;PDgl$(UGF;>^&K5SkhO5w z9Bn+L8P1-UMgu(;_Mrp>L{LKT<f3VtG=)u{Fw8%%^nbGeAfy?>jrsWdN5n^qfd|^h zHg)+InWI=;UA0@8_zd_l72;@s6tuOqC(7OZr+8fV4=3_PB_$gH<8G-}78$1eWk-B$ z5GuB@eAyX70*d~~uC8*C13H-Pf7xvL>%N!V1XzRQcCd|mX(2lz|0!isa`Fe*OgQjU z{=u|BHOfPRgFUiK$%h9dEyv<DF<nK_f5FYc0vGf;{i@i?xQ;Ewd?KW#6T&lPpt^85 zZeQf;X8-)jWL+<4;K`T(hA-sYcUHehO=n+u?KpC$NbX<!S_XX8(9j@2)v3fdpxYKn z1>`D*MjV6@aJGAXDKo!TuMmWFMM6S?YjOVl6@{8<U&cMq<G}D{wp;1B-~SD_&au*A zlf(6hcHFI`z`lRzT1g!p9i5S#o$@(Tnp(6t$feoY*#kMMQYuGtJ8`gBS6!u`nE#MW zh$fObyhwPY@l-J%%vXIuDr81~u<Jp-!`{KQJ<*UT&mw(WXXho~(H1xD&$Zq86ITQL zu=hvuw{Rxj-oA~ary0pY^Jl=)INK;XTbb(hC^(#X=3{Ad-^Bfvl1;zf_<F<Z0kz4N zm)Bf<bwkHCrpH7q3PSKVXa4f4^UM_Uax&Ke$9}n??!O1*U(_D88m74U0qVb*Lip;B z?CY4}(~i^h%w#vQ_~@m<@tiuFF7-r25<Q{J^r1<O@Y|%@^ous-P3JPxt}@Dpu1O|; z;^8i`Klr};ZrwSy{$fJ>lPAheQqotKyt9aVhgW>mu#~bMPYPlNfLq5^vQ-QGBS$g6 z&}jEL1Vx-&TKX@Z9u^&-vaGc72N5$r0dNdTRTpSc>$y_da(nynDaPX^bg<liojRiz z8Fp50D~O6AzQI{}6V3@DG?M<Ik-EQa#vpdKT}tTdUz<tQ(r`Y--547ySRYn58!4Xs zymgu2JpJ2Q{7|E)si{fu6946&{na`tX0sIrl%ZVBW^wvzL5PR04}4^npr@w~JtP{k z<v!#9-G?=2m|@NLqgtg$a46qp>~Lmv7bcAd+=HwN*-CR1UthVbAz<<^D%g!HctZWT zrlsd4=bNLJ%(iC|U`)WqBwe9@4~@4E;z@49ZfB3lT^jz+{25P0wTCv8JKSt3YPPQA z$Lc$KdcufR9cR|(#epw8AjgAR)G&XO#1O<7neO%q)^+4S0SH8f@k41mB3*E{2E9=S zHSh49FEEc48#kPxuPYar+_tPbRq$TCX1?IF+nR`zOkn>mlf5!rN=oW^vg<w_;hKG^ z0TOM|fj^?-+#vbj_MUGzJ;ToKXE0V6;JV=qyZ>q_ul5d`d_yCuQT%TC8wFiG@`+wp zUvCGO1-#H-wjZ+P#GX}r*DwV_<L2(}yj8v&&uTUNL;BUqWF<SfP>>Nr2OJ1%h4c#u z0!>Cqk>pf=Plpl+E5*2J^FO#molbWlZF$1xY1eC>#7Yiq!pGFa;vy0~O8-o^tE>7# z&^4;6L_|c$UNMNw*EG2)yuH*0{vQTD0qm`UBpw`H)YS3q;ns7oH6OYgyaKq5gNtiS zE4VbfRR@aMcDd1HY_IN#!&K=*C!J5l7^3bJl8J(C;W$H<O8M4mxeDUsWfN+X8S1jB zF8|ao>YR*u&opuI@F*`6ZC)S^i3)ol4z9;*k~U(6b{_lm39K5Xy1MDR$*4}QuC@mw zy_}vo=je)fxA>hRza($fXiX{Z#~u%I2kQntq3w&!xqW>-`z=<&!-JRIVybqktGY|0 z3-+=GZ^=7suYNc~*yX8Jd6^Tbg0vBL)Wj0Z)Zm99z;kfyTLxRJ-q@}^1mdhW*-}67 zued8r2V%q3*GK1^!wF2z_hl)hvP<a<`@2joNC+Q)t(ZGr4{`CpQS8sxu{6wQ{M!xE zV@kTm5^PlmP@k5W*$m2;N~Q;&CLh(#kb%B_<5zteCBpK^oK?kM86)@#mUPB}8gE&& zt{+K@U_>gZsHDNZCc3AN^bkmpaMg_;NCq;yUxRs#mb&}$-=9hv#$Lw0A%4GH^n${| zz7=9CTYGZe*U6BcVk%-PFf~;)tc&rgzu}>B7=cp^p>IlaMg`ld&!LzDPMW5!&KK=L zr0mE;irfCwbUpmz(!RF7T4c8?1420<c!=>-ddvEA4zCRTQBBg#iO$y<+>^I&8}y)8 zAu5i3;%YKk!8%@IHorAl`6{Z-h4ckSiQ_NZB>E+fIy~E&EZL!d|86xOg(Qk`Awx#% zRZ{#$_ok+%UPXz8JS}(ZPE*N+9Y6350&52tylp_|e_l(zl|=k}>?`ps$#pK9a-`ap z3uJY--9bF4NYSH32D+A(*V1EqO{SJsJ3ai|RXont8-b9&C@?=~3nAuff~fn)S00wC zL<wvscTSkt+-Ujo&*NYSkd-LaWjO>YN`HGLUN_JAQz0QC<hM*LuV)r$=?hF<&$xfX zpzOUaxB?X*JT|rkWU+u)LR2}ve|OjMng+gP`y4(XujTucT1y5f#A!2lc%={VATWlu zDQ|OoT^qS|6uB>pbV2H5#R?KZ_0=Qpw83gWcTe{=Jd@vp-p4P6sk13%dT$+1A=6!5 zy@Kg_{WOS#D}Ix!q`$~e3XVDg;r}O3o}8SXVKK6LC0DsT?xXjiOmX_=8~9{yZlfN= zkL$f@G_p4@;~@GlzqHl_TP9kw@PtGKme3AJ-<|}{f>UU7eq<gzdnV08xV7mxy%cP0 z3COGQz_|Z(#XEFoZ}<5tmM<Xge3zpR7$<GcS{B|_8qviZP=Gkp((`wY%nU3n1F?oj zWO_`aJj<@E|7vSfl~eB1;M@;x)V*5aKc*W5JGr%YHCca6)%skc>&hXz=eM+r^U=Fp zg@~|N*q(q(oXE+r8YODqw!XGzLK~()3i0>g+Xp6rP@v(G1N<w|fQ0p_)x&kLx*(j& z)ik!B8=#-g->;Nh)YyJ6Yqoj_^Sn7EiHjr3;XW)G*pqoxYk&WpxOC2-%t>_n;_-z1 zcLV_;;ap#%ubBMHMcl<#IQMbx--g{Y`knD>t1`_pp~&yZsjypp2Pgt|G3$@+>0{El zm6{BGHCHV`?hC~DM>;dt7zj^Rx3Lh{UdZG2?K_MIao^1*im{H9w`esh)Xp}*_kVV1 zL>>5q{`sLG^_ZAB>`Kgdw7fna_$TU*kUMz_5!IzDm;0Dq$@WASgv;N+1;e+CfRpiy zal;*s`}7N6?d(DWd{GS)0pY&yFBI}rS|Q<bx)zw<(%#<hL{{lxe%OLIIdLj1EZjNV zjUsvR_qfYdNm(J^hF5Rr5m<+!oQXa)DV|k1PBnXbG(LVlg>d;YAsJdDV_^Z<6niPN z*Qh`F$Ynz_3K?vkA-xr|6D10%L|UF#nD;QgyO#ccG+hTcmu=tH7DYuVLZvj3$P7g# zBZQ}HNs+y?sU%4vLb9_$M%lY0vSshR_uk_>?|Q%YI69u^c{A?+bzj$SoagyFuL)X< z%2ywr<+e{c$^jcvquunn>7SUt_L1tew5QDppCkJ@I0c1v30!`K1ej!6FHU4LoG0`F z&x)QW$B4?gcF?iJyVO>O(d)$M5Ww<_!tHzJ_L5SNZOD=50EJ26+@H0hd$YN<d3Me- zS`6$1yi`awN!Hfa{8v`$m~9`+21qk9Qk**416U0}`_4JW@73BbFReKLx&6ewGKkN+ zouBS>w5?F6Rb7yv*+($pY7Co~IHIbo9=l2G7B-9VAGP6LWOb%~psnxnMznWRPeeq7 z7-_z7W5=mSr(~N1Ehmna`LPXFhlxN~$AQ<6VU_E!(1A*#sI@f!xzo$bYo_|=B1XkA z&OT*dCU9s$!6`QkMX<$9xB98!Ub(^U!B>MfZwWzL!@+9TCUCE+p}zjq7xfP}rOo{+ zRVR2;MOpo*1o>22(!Ql_=B=u`cRD#e-%UYgn8f;-;w#4qEl#Trm<M?XE`9DWo39tZ z-f-{Cwj5PE{Q(mw9P{&8*|v343o{L*<&HUQr$wXrDC;XKDkgcI;jq<x=d^J8v9)}( ziQjDcN3^ol?q5CjY|Assd0I1}fK{1MBUZh;i8{l~qy^hzFg>d9BK~E}*RxR{Ok4Z7 zer5e?dX%QJWN1+Rk%FF2M(M8j9g}y|X;mRY#H==<tSBma`Ho4n=BuVC8q}s7>*N$3 zZIsEjixa1Kcruy`{@F><zxwB~MF~d$YJ^JQo{jvbMOTWCnm&FvWe{p~)wXy6W&+;o zo@~zJ<TR}Npm&y)^`cJWx14w*8*>sp^NSZR_*zvvAS1`lF0ZH<u8*S$4i08Hke45{ zIW7{f{#m^vC})-C0ESa(4ut*n|6=&o(&`3*w40~rK4jq0vCC}EM!l`noo9*?>VJ}V z?p)c4*)2I4g{y{!3Djw9s#%4=aK)sg8c16qih;~$7m_p-ivEK37%V8k$Mp&c@kmX* z3~8KfGo$0$epOXf7(89CB0lI;A~O~n;uFqo5Eldn24eDS7rOO89+Ry&B{?}cBYOn6 zt1i3TrHmd_R+kRJTk#6;D+|iDj7YLyo_W-es9uHT9NF87sbxYl)Yhhg5uv1%lnA5F zJVJ7$*O;K8rx$l84Uz*8byKrdLV%N5|E}{?;;DsU!s_eAPW+YeOrKcY$V&ReD#v^A zQw|OeHHTcFBhzn9bLTZ1*vH5y4IUw=@x$N;%@Cccpl|$r0|SE9^Yim_!(DY-g6{G? z>@4-YE0u5BPo{1+y~8MPnHlsPVJWtoiusnZ$~kJX7}31gSn-w#NswKcDsKUlkGH0a zGJ9WENMml=2Eg^A#fbdQJ%_&|`wdq|ZlhwBdhBceR{|Gy>Q(Sx7q-tXfF{xn+aKUH zAy@9Fr4@%(eR8uvD2CZCU8i;@xGgTjwpUn?o0J)uZ+VC0jr{Q+H_)Vpk2coU|3qQb zYH8?g!6ZTU9jo$av?2bekb}xd^F&<?)$ZN9@fKYmi~y%Hy5|)4#fx3eG-}^}{koxf zdP}6NYhofBlyFA{?LMHN1~+q<{lWGieoJP6O;{!wxGte)tD9{<s_ahKbO}rRZ)=Tc zAPYjAn&Gg{_vg=_wYgeplvsjuqsX|XOH&#>Jw2p*_SBJf;#sd+EZsflgLlHI-~pC% zKx?3_Jg;QFd{nln^7rris|(}UA;K*yamwk204{H7WZ%SyC+GV$f9+t6fpY)f{WG?P zt<kWu@bI9-)Bf%^l?vqffsu;KEjFVKEDZ^&glbac<(}gwPCUoZLBm?k%@>3-TsNcW z9yXM-`(D@p8zs4~r&l)gC*1#v^(A;;RG1p<+O<nXMWrdzEShsICrUtuK93Mr)zrjt zT*&?}?ru|4lZ=wAxXsNhPW^S9j0<WxAEX7BUyP0E-+X(tq|lWLW($L$JTTwbJvj-^ zCGV#F<=l1*f1IIyZM$=#MYl97BV*s;!>=G7EL#59VaU(V4_PXTf|GbuXpxc!1}{Ho z$|O#Y$8np#hJRrUSdm@`Dd)ypX%OOC(hMY^G6PJ3DDS?ntqw=|2<EdOKP)UPB=BG? z_6Hu5PdBF$zkDg|=wQI1m6VkHd?vBWX21e4c|`Cy3e#lENj0e;zEku1FuU*v;mu(= zp+Yc8G4f3<EeB|6OWz#fK!?&bH(a~4veGj$(lQjP8uBr73~PQ8gP%B2D|5pl*sVM^ zb7zQCfd=+-z3$mA(d*ZZ@zVdy5^}vYrvHVzdHm!+K8x2WDV#uRZ^Cv8=7+LV+2+Gu z@)H{DTwGeeJ&$AQ_M`K`BnJc&VV^(W(rmIeF=2;h7GhQj4MGD2EK4dxFrNKQ4lG)B zkRO6*!5RA~F=vJhM-r^Ezt8!5H7NRC0$!Jqk@4<ulZ`3t>|}IwbR_!NH*ZcdF>Ql{ z5prTtG%q+Iz0n~K5V<70In2Hl%`y8J#$B#0wNm|yo3!_}wb4K4UVr%T<m_NoG`{e~ z%a;!{HJzY<CUbu7OiuGaUw=)e^-i)E&s9i&Thk2UEGsSDD+0L9#+umOlT>S!4FE}E zhlq)bpI~Kui^qOEXO6coBvbW76D`aoje_mi39npTHHK><X$9Kbvn~BvWRiK5$EO4q zlQVM`M)W9C-ErogSIb}jYxekJCpG}0F$QfZVX>!$kWn5Y#0Z>U$72MGq$6c&cIOPW z`DlZ?YW5S8>7E-mJs9Fm1o7b^(0)lluVnNzL7;DSs{1Dj+n%wpHkFE9v6DZ_%E%#V zMR)$Ev9ZyLM<xJ~?Ao<!k~WVHB<4=j!VXZcAq^!7X@QefgzzFhBris*;E%$?%h%o2 z6>5So_`2*KtDK^utA?HkYMt=umc#-38-tZWyBX;nszxD#k%44ak~tje_?l@tZbQ!i zKM6gj25h{I{?%K2f!FIko<Y}QwVAuPX)16#CN%V^Wryvqr|45U&31IO+dfIw9Hc-_ zv9hR%b6oz2@jJ-?!M#sQyqRl%#B2-TGCE=CcogH8Xl@qrEHI)?)N~LLepo0<$!|M^ z5Rf06lN0#*H5vA>6M`-z(fVx}cgQ-C%LpQ}@Ao?`J#R^7&Fau==)1+vf82bBQ%imS z(Iv%PTlYr&*?KQj#OS&91~=B!d~(sFRH94087V79{_T;r_H1)o)#oo?9yYvDMA+cG z=l$1|PulwAT{a=qu=!VozO*V)?K^t)vBDWRIca{U+7@vM);mSjb)GQv>S?R+kExB; zt<%6{<^W58|3#Cnjfv{{gY!2%=-th@wX@8}3m{sG=uPenCjOf_k8k?f#OZN!+Sxq+ zVy{OM44;Fe5abGTj0V^z1FZY{21t_hmoM2^&E20<s9^B=S>ocqSaHQcZE<#+D&`So zvj$T28cANEYr(gCwP<aCuM>=T2JAUJLOwazgr*T^`5>?`tXXMU8DO9AFJJb+08Vga zhza!QbtK+SyV<>n+6D{3JwhV!cbU9PWX@2tw7<V8cZND+(YP2cJCSc?l`>%1@Eo)2 zEf$Z9KmBr3$a}zxK5cM5Ceho+r@kQmZ`RII%86brtv_$IY9j|(48%9+23+xvnA5Ui zQewWP{e68GLpMnrR>!%eB7<V(Jn*t=3dJO??UADAcc?pTJPJ?PY~VMVuJe{&kI#Fx zMi8H4ZD~|b)6xu{ji^1Zql&@N<5K2l&bjhz!(+a<v^2IkfdIyjojZR%vRYM1NgNHA zY35NJn6<SvBF=#Td;r}SBwERl0j<YUm2TrJu>IOH?6)b$<qLiq)$l6oHy>?rznc{g zcfU_LIY*s^f8aQ~zJ7gzg=H@S4+iM5-LA3vdB1;ONLl81U!zYL#rU_OW#W@FoMq{# z6);%gL@>U{#Whg)hpK#4mtit*ot4g^<7&;1lQC^<0S+4LE%R13R$K~=vrNIej+u&` z#1PVAZkh_~Af$y~lyYN#U}(7gK~JBn`Ebh)Gd;5$`&>oL78YI1-8Q{zsK1?@j-T#k z&c)}b#Q5f+Z<xVab+^<W<T%e^W4-vG-s5BA`cyCF?!Dx{>T0N!cPT$#-D%eMc>U+W z{N)Kc?4+)W^p5RaP;Aak4PDFMSdX~$!`^AQ`;SxK`-cENKU}swl&n?N(=e`Vw>0fi zzWGFu1XzElizp?&`E#wrzRZ(e2??qull_(WA(P7vkihwAiwe5=#2@U)>o_XTBOhJf zV4&=O8M7a`RqGE}HMSL8OuiKEZcn#WWGk=L(EZ#-jBiJ&Z#v)+eiVl|?D-D8)ZvXb z<FS@j4Gqm_wrrMp%2VwEt-xrj6?}Yr&?(B^xpNI;P>`;Goxh`|CiUpiDM3LLD~*$3 zY=RB)IM!)*(;fyqGOHL+lHeAVrAljWYm*806)ZM0HC>v>o;=KFekOlyh8*Swk5G}I zwo5YZ7S3B9pi@dWyj?g)y0S2Se%>yBp-AtcmR8!7Dp4#IFjd#uAKM@y2@htBWEZ7d zs+EqpEhz~npySADot5i^%fO_fLsPYeeoKz)Vuz#0;Kr;<&@7>Fao%aNQm%ua?yhHf zkAi{kR!#RwG_+Qu73ser6W70b7?l-3es8GlUb@q9j@*f>zjC?nELbID{mI|n(pO4| zg*hnr8i)<E)Q8`27_c79wS3%}AW-FD72KAi($m|UX)}M0VS>S;WuR~9`iQGMiiM@V zaOqdB?#I!d%Lv$j5_yifL6p#}m8>Y?ZVf^MLp$%l9DUN;oM$(UHVpw4Nl>X3G#1m) zX#3fe2`#Rfjddi`ISW7Y4yOVFuMk}huQ)M*cjBmPw(z_+esv^Si^#CAv_(DDJ*9<( zx6-hw6*h{R1#3VUc6?p<7JpDt#*_)c7lUNLAejW1YPL6aTL8{V1zx#^rC`pz6mw@0 zC%1ZEs*<~S<R?_(njbP{W3I!!5-_^_x&Lx!BN=yK1Hgz=d^S`sIY%xxO*BoBtG}f` zr9!v0tzuj3&nIX>J<s<cZidRnA#}l-EXiTr22QN6(RT6h5PCCX%(xt4Rrw7uegq$e z8K6tsfqii5feqn)c0oNe@P-@Bbd4JuyI#>3zD{<W=<Q*dDUYQsA*#iJ-0CUZ<TL_{ z0}>dCEwYT>pZtEFEngUIA~5j=-h79jHc}zHs;cU`w9_WjIkR`?A3S8VpV^NXb3r-p z4JH==S!CKwpNp22{==P;cvE0k59K~8Iw#qfhl>gA7uF1qhd8XAC1JFi+wv6h3Sc%b zJa%g@*YvCKIl7+SDR{@Ib=%rDl(jvGu1Lj6kjCklq`<hUXQ6mY*Lc5sUY<ixW4^$u zL6l_h)~DETZy9+jr<sZ`GnnJVnDkBU$NwS4R;5O=xAIq>@$^=VtL;2CQhbJjo~N+K zd2!;%u3NlbTd!g={IGy7XW1dP-Zp=;E2|;emrLQsA^yyEWK>S^K<4&LmCE|LxV9_{ zats9ruU9482@aYOKg8>XN2Q$&1ZW-d=X~bWZ@-HF{Mo8+8#iI15n{h^q&3|rIw>is z<C3rC1)YHUw5-9_Z_74${ieJ@{1#D~#cyG^c#FIMDI&>g`T^>m3d{$SQc!3Wy*UEb zK#{C>zFh*98ZR#|iYS=+xW4*4v8)Dm0f|VvbX0C4d%%t8U9aq6q0K@{V;MJSk!O4n zubjTq^ALG<NP35z8*1{|Kc^Y*$S8!GOpF<6KN~q_q^-T{szUz7&=t3GpSXJ&cKw$~ z0Q6Va){0=P<|ws_kpK!M@QYj88?xRwT3?aLePAOcMS+mujMPTQZBUr&$KPNOe`K{s z!Tt1d>XE~TtF!MJh1!^W%UCzrbA*#XeQPF3j{i9BZo@cI3vNay<!XiQ1P!ao=kzg{ zI7Ei%B{YA~^RRld9hAXXTdKEOM{bh7X36KNI}cULs?S)$ilRm;`VS=Z(EMeZ=SU2) z&N+S&!q84Q0_g`u|38lR9T$F$t(tM4$BB9>L_z0Q@{o2@U<AX0JXTYo)Ok=fAh*TJ zRnELUWsuzJ)xOeA!S9E>H&*?Q7+zD5zlAp?vu<qB{O!>jMj<#5FYG&dv>e^%*R(XP z>7HLGRYOn(Lyd)3!eO;GUCe&*;#FyBk75SfH~t*j571CTDYG;XV6?QcI*Imx87-2- z`pVY_^<+o+d1prS5?@ad4F+f2Ax5={`c^k}%gxf*`Zz1wg;s(+8ASdZ8IQ~*rg*k? zwMCl5{f26PAHZKCw6f&u|KZWr(%N~o!TkcVeVnatqRR4mPRx;;FYCuEelH1}jEaud zYtU3u^+1{bj{L+Q2zhuqWB)skW-7yEd?))?_A%FvpQyr?G=5Pc_Hqo?^3JCTaGrcG zvfD)=)#f02wCzi~h#}jy4W4u7&PQC@8?*eaNrufGUG&`S`k{|;>y~91zJ#(ER=A5+ zH!ho*nO&;oXm-3Wgfpcz>s#?<#pK|M&B}!(!)Nkvb)@hS|Mj)E_`}@DNw6ih!)=uY z{Ji!9oXY72r)-QkLACh+Ff#5=Ut!#bI%e{&ib`A8wu%+(@;*~uGUu&m^3f~-`Uj%h zXSyu1y8|j%Bq^?D&mrv)dtc(ayS{J1k-(cHM^kBKW7Dv_*#7PN0kT+^pnHLd-y2eN z4ykyT^`{s$27jBmWIAh#HUmEn)JAif0Ui2(&=7>r_w@8}CMGAyolMqOELzfys$T79 zLPvQY^%I6ZUT)d8lMo=upF4=H$8_nE7rIig5P!c)T>LKt0+jIncakXS5UB?bPMmjC z5$p51Rpdce6~NJH7s?_`6xCtuN_NLnF+K5CHl}Z&BEZVVdZs=nQ6W?JlpIr3&mRmn zmFqdGl{L=h`@Xad;kSI7IOte0Ad)Hb|5|{Nkh>C(u$zgQSrTvuTv>bN)I(k)p{CG_ zxhFYj;NxJ}#D8Xmn#-`|cVJcAwxmQ4HqflwckJ9^44>2vkbJ%yN$*1%^$b({2S*7F zKC<@7=##bKqLlD_mAa;}Wfvv=b$F1fr)?B`Ow}_sHogz>y{rPJFrPS$C!Cez_`-kj zm?vDkSyl6{Lr{;gF)Q24Ig2_KD$@XxFQSUS9`C9<XS*PZhlE0!;`<v#4uyOT0rUX& zosHuw7Bq2p6AJ)BmQbDM2z8w2GJzezpEKG}Tm-AyUgYN1{_$x?j^MmS=!!=1=@5Hi zR6*hDhbxeOwqCuaaV`8%E!Fn!PLW92KQVHr0snm9Hc|^u^OKE<9i-9I(E+Q0mm3Bs zWN2vU)(_<{8BQHQtuw-`ejJV)c6Sq0noqhtgF=t&^y$;Xi-7C63|a~S%!rA_1P_GE z#&8PmVwqHUpr<PVzk*z|0y+s+KLYdyO4OET768p%%wD05C8osO1zH$tqsu17iXiXg zaoo59nK;k^NPDhgaf&?{{RCU#$cZ_B&kbfkEV9i|IlW~Rl0qg0e@bZJ5>)wFRWgpv z+qpP9f7P8ohp=(Uy7ZxrvIO?cHLJtuFtU{!4ab_YoWv5PdNA)M>AqyYIo?A4%3feo z?|}D#$W9N`GdOUd|1|qvy}LSpadc+J6sY@U8=c8wus1euXGi5Y-)8e<Crzz76U_(t zA(s0;K8*x7PPAtw_qZG+A-plQgB<`za8H4FaluI7wiU|iq08ytzV#Fz6uJbn$h`Fp zW#Z3p8z}Kz$53reZY-+0kAma5B=Eq-X?&u$oj_k-ySbT|nin)Q_<nzSbvP$KL`XdH z+mFUwJGb`?cZ-4iRSQ|+!_K_2sNcS$pH>9weWSdMmv_3uo2YVK1pe5<bEwH)-4dJD zJ)c+JkvDKZd$^S1AZz7VOP-sj!*Out#Bk%ABLXj*jj9?*m!J?Bu8nFua)&T?gZ&;m z5Rb{c)wkHFQIh@zK>eY@niNovh6x#neWRS|ogyw2znYtm_=r0LIzabCPfxFN?Q&+$ zaIgk}H34-p0eD2rgu+iG@~qTt7R*Uw{<mj%SPWZI-C_9@T5ZBGC4>?4#f0=aF3wFj z?6I-o5@Sg}bf0OFNuNCfnz<u)QG>r-TNzC({PimgE?=E__R|Xs1K4vHR5E024g;kT z0n)^wRep?}9nSsKsLb6wJfwphJAK4Y!NCRSmJ6IE0C()BpeXt`^C_O&CA02-^uPh( z>({qqUU&eF#lz{EUpYJrH#!2BnTZjd=cYtSFLck%#qeofm_4tL&1;Oln8GC;$pjFN z8>jY>u2rM_M9cFDEz+HOX|5jyMmq$)sM}8;MAZSHU80!i`8XXjqlypRAN%n2O2?)N zwp^zDAQvdUE<_REyYtGYy-O6*wdhwLESQY9T!t2by_&mg{%m4+csNu2EQAah#tU0_ zyY5!WwAsNV!UX)%czlBFd-*VjwcYpLwS`tA>Vq_Ye#Y+-XtQbK-~@n3mCp8-u<<`* zxB6t<wUx$2JhEoVOG{T*T+)0G$-<NR#d!I1Vp5U=EAyk6#Z=2`AZJqlUezf5(TH+t z!*-Ixx~I>U!oqGrsH$gTqVk8xE*&%x8x9+iffx5bWiS*V`EW(&lGCoez6`J7rR)z< z7lZ5)h=7I(hLCm2tq5O+`*WLZmW0{7K$`%M>C&sZ^MCSGZCQh}Z$U8Ioc>K`u$sb% z&B(ob0-!@Sm_w6|F>ArKC6T*dRIb4!5ZfbXp+yh%x$#6BFROZ<igt?J)vF}qEvZa= zd>?_zZbt}ux#x&5DsIoRenfDn5bm7wxeY(l*jSYIM0~)OyD4z&@wtCQz-=23U6;v^ znT?1Z*m7J}RoJ>98)wL8GJ~yEne>6Z!`P0f22k%uLQYR|K|L=}!jDy_4!FfH$O=r% z%^#M3VBfxddt3VY<!*kcY)ebU@5U?rGRj|%x-)?E1Ud~M*;OF8fKls3{)FF6e%O3q zKS2Y$U|ziS!tnD(sQKjZTU+Txo2tdJKeNG!`6j(PO;&rSX6M5<HP<H<8!GDKE7^e~ z=zLycR78rjs_xo3>Rs~CVn7PKTH{&m$B%z&YIxKu6QKtE+`J*>6SnzrWri;GMYodN zi7NOgYDxt-Ic<Zb6zwBgewBP!C!3EniLI=AG>&!EJ)@AKk01_+fbE?A)FklCRz7vR z4FwlXThXJf{9Lj2crE;?$p4Y=B&<<ySrk~pM;2iEE`)7>!@4<@9UZ~A;lmUnMdF|j zhB!(=#7XFsvFZ+I!fauqN+@Xd?R$#Z1i&NFsImjESRYVTZD-Dw5(&1O5i{(_DS^Uc zbZ;lLfPnd-(=>q$WAvs)Rf;6@PfT40wjHhEsEJGp3JIw~B1LggJ=B~BHwa*~zu;xS zu32O}RDGP{=wDn`Mxf?<XJ>v#@OTl?{wxoMoCdK0rX$8h4W3l+N5%OfdSEnib3=ce zbZVnafMeekjc*uQc2Ef4Lr@2f9-_?VLT7N03_BlNZ6p(2Lfd(}#mUYPghZW669X)& z>{7z;@<dxEM|XGk(&{SraNq=Bv*9gI)6>(b^T3i_E*1C^Uy4p{dVc=YnKQ4jqp(^O z2#vp9?4|+_Uz3X(&C7y`oI{SoeBK;Zo`huutp-2PV{jT6ei~{_WW*j)$uNF~66>A6 zKcPOu$o+S`-H)|Fo}MIAem|cWh({j42Lr|ff-(Y%MzU7y*i!-m^yK8^IzLjYt7XpG zZKe#I_PwB7Ky=x`mzDpKC2Xt3FaDBJkH55ZuR3`M-tUj~kzHDt`@;YH^Gj@=-Xiy2 zh=}2V#i7@5A?wNbYYZ@ZrzL`Rnj35O#w1qb?oJGL0dl!y)N!RwcU~kwN>f+26bv$o zY2P$w6^#C)sHKey?##5^#ZeAZa=(HnF#W?Yc?zTiNl6!Ta&z&u%oq@Y;jWB|ie&Ly zdTVqG%^(v8t3tHbSLUzGmUF<``|@%wjybTkEkv~dR6jg4lmwK{PD%zzSk|H22EhA{ z&<S4?z-#}UdgsEr#@XJ2;^~2M?#oe8e+ezke`Lj)9<jL}x%o|3Do@tY<<YgUeg%l0 zv()1T&9LIf=(hJil+mm}lE7iyb(OHW0Gn{RV6m^n+x6|+0gynH_Iur0a+i>v^jlI~ zfyYC;KRq?&*}$`fFoGh)x=j<c(H=!DC-IXb(X-ab%vjG3gkg&5>6UFn7!^#u@Dv|Y zl<=1T&5n~*9>7hBA^^9r;0_(12F;ju2{nGZ(+raO#^(ZwjaVo8_my?4Co<bL?%_Am zUoz~>6X-4W7{t(BO@s37Yw>sG)YOPlc{n<R8RHk=D3ie%owcK+<9Y*801Bq+hm8ir zJUED@<`f+&j4TvXj4xWqVosHSv|$MZYO;RS1`!CuKB)4E+dz2u`8&=2RJ(*d2^GZ9 z0Z79Jg|#`4M?Z^Sa5$`4?c7Uy9jt3|+J6MIvZ^<2|CikAzSG^*@eb>3GSCNK$EBo4 zWrrZ@lEB9W-my2o^6$7fw<5o;uq7%3)YJ$AJ1LI-rct;15qixDU8Y85ATQ#E7kphV zH(Su*juX!xPIPK2)YS?K31Q0<C}t4rxoo=<ZpX+IEY|(5C#I$+PV#KmqtgQ}#E~vV zJW}*NfxmZVO>LqR;KAf8j61(4`<<4e4{XYJ6aw0ZfzP~v*GlnG-@bX_FrT$*)IY_A zmmh4^vwLBz8MpAz{VpwiFxK>yGF5;QdL4=5Ym*05=v(<8v^MynY7{RMXI$wdsQ4xA zf7H@aqg;&qQE7q7jivRz{z0)~{wHI<q38Nz5LpJr=l58~dzU4a66mwa0JvlBBQ}-{ zm=_v3^agtv1p^V~&|1yA)Vz$6r%FTbcsAiel)H7nA;UWaLFt0gpU6j%5I(+2`r9e* zhKPg+VJv{HM@r;-C<@;N1e~YmhBN1Hp;v~g*<wG#9TjGrI0siXT#Wu7NqdbPMj-xd zY{-DSz;OISyeSP@lU#nmbwl$_riRHjAC(&c0UkG(o+Md*FQ|DAr0(@=x9d#=qW$qb zDY3Q%`EQlt2OhSF;rE&>PN)uNxPINeWdp~-GR~6qn|HW3b)L}D&^8B^^<EM3&U5Ix zI)IkE_q|JLmax0k!=|gUyd3TohXn+3`3AojDQ-)#T1rb!{#jo4=2OoJv}iZ}{yGM- z|9woKlv<rahFAR%V%D&uING|lb*Q^RM00=AOK??R?S@Tt;=Z<Yw-y(>;Pt@0peDlX zgC4_H&XkMI;Y1AyLbYpj)GZ{WbN#2~+t*w^6;yfH_3Z3iVXzTjdv3QsjaW|?@&BE= zZXoaYg{S!WmH8U7EcDjw*G(q7H~gO86Y0*@Vt4}bAmSUw1t9L=&N75ZK!sH_Oy<^k zyT<Zi-;#%pZd0m?iY1r_=CztS2J6@eRGP$DvrY_%8_agU{TE(#xF(osoq0l^xWuhO z_}_1497pp~IOfrfC{)7^LD<^LQg`>nGv5X$N9qQO&Pm59!6@b^xY^FOKc6HqHZjpa z&uzCd9F5@26$@$eGnDE`6)4qVwH?t3;|CN;l&7p11?>(aQ$R1kn8Av~1$&oL$hru} zCB*rDgcV3pU~_XvTmBh!o^t2a`GD741|OO2P>F;mMoSy2vHE2C{O@W1w@!@1xUvgR zdz^zqjt?k{ixH!`jqQS=SJJwu)LW@9YZ|9WI@#8Ob8@bnpt*720Br$qBVtLwnk;@1 zf!q%jyWr-U8AAITU?;k%N-dWp@e9eiZXd}~PSyRDr17&U9Y586{vc6WKrTY5k_c}L z;CH?bRV5`FIIVcO7jaJ;x)WGa|3vO4``NIgp*qTj(I8TGIr=7Poz^2AXH<K<nY=ZD zRz%DA*zm;PyYn{B_$9)KkoDyoy(2a3SQWb*`=Rk>Is=1oEuG@R-BczfPrBPT^UAzV zNdSJob?Y%H!~iHNy>O=sw1`1F{(ygd?d?qk0o+j@V-k?gh>$Pb-S?vA#11=a#r<dq zJHpD!sv1l-+FDj;Blse@SGUPebmW#rO86O@oA)8xK(J4B^yrtb$5f%y!fC<q0A!zM z&YjbhZ-=`GF|-RGdulRg(pKyjVYh#RjU~~Hj}AT`G7cw1sr$Sg9vZ4Hj-%{As{Qjv zXMqd#_E#Y-p|2)iEeaNErG?xf3n7NaSXge`xT~->lIG*F%Yy~zjEs!VdZH2vmp@0B zI;5-_BYzGIJG}IYF~Nh$EaGMma5@2Fw2NMTe#O2l${@I7sPgn|vLLO=g#Ryu7xN7o zhFUlYgW!q&?GukZ{|<0|D%Q8K@R#v&>7(HfsAchl!@c#Qn(WEGvPMf!%;B)~0+nSj z+%oyb-<S2vF2(Qe#1zBQ@-n+t`C-hv1*EtmY1l0^YcDM=?L)DNO+fexRaCe`%hs9y zd{;zx_|Le+yi$~pw0k-+jfQb^nY&6ab8`i_la01w>hq;|<cZOnzJC|6fa!l3*61v* zg!!<}u99JOjW0_6+%R5$r(hoV#I*aPBlr02@@G5vX}epCilRCi*Vyffi;8A?+}NNC zE5IiFm|_pM4n6BTPtT{2v21K?;Kjif>!c6jyg`j#1B6mV*u|u~cWa=hB~%TF!ZwQ& zEb)C5p|#>JXnvs=5B-wzX6}vozc3`~`!CFPmV%pj)y()4mH-i&C?n@)hMaL2kk6Hq zEZnK64;Mab+E!RtREHWBwODRq41FGy`_OnDhkq_=(91fl9rla3Pbm8)Bx<PJYnrrM zVf}$3<+63tX86acAYb2?2<9k!zNln=ld4+8hdRT$qUZMIZy9B_|F3jnNg3=M^TO2& z@IHC>_AE8ol{SH?#c2XJ*`d7HxP8|SREVfRPIGe31tUT>S)%;|YI?hc88J-Fs(S~a zmqH)9-0!E(V?MMGG~Jc?IypcC`|0W1BO3MJ`~#Uz?&V*cnbGyK0Y_d5dMOhv6M>(> zf<{lT^`r$6E4ThD?XL8oB)UDep-@w~me=$_I4m?;SsH;Fv#9z%8ZNtIwt~x`snC)< zuNU`EaApl=gF!((n=IBUtEebuZOx0x4DDd+mjo7V(8>k4`_#Oh2b5sYF@(yW3z%zJ zoL!r(g7aWGmWT0-xu37E7evo#Lk4ZKZCjZ<kCb&$Tu<<L*kL=1K&(^XOFZ4C*1yo= z5dk#ifbB6~Ii2VTgH+^tbj{mWc073au&#hbpVrcB;(+C`x4;^n@4@J1CIo5GwNl*Y z?6_0GbK!qy*w~^|Qm8TM=PfNL246CqY1AYlWSs~>6*W<`Ai?3DZ43-Pf6fMl0NQDx z^%bgvz6UREJG|}i(~p~-S@CRZDGR3s?KXc#>87EuoMIz{llbSYl8TB`6IYMMoR*7B z!eF-X_<(q*<9(;r8|&?T1O4B?CCN%heUgoNx|v@!kpLUX9aNfBAQSZF0w<$n`OW?Q zQmz#8Y_i<2fJe|PM281z95wA$ZtirKmf$E;039dp-Smq0+gtXmnD)%)r#a7awDkRn z-!J|D&jF`4O~*Bdx6urZq+!5A4^Z!W;UA+&o}Q#bOn+>4Ie>|bG6`u{$=ZK--)EB$ zFeWdyyKw3)C4iLwSHhv7J#+p%gbIKr(GUs)EF&Or%u~6TuDf(YuXv#~ZBPB<gLWjG zoaZ*K$jGlRA`9$$5q0A4YE*v$%gtjvMI!3Kh}uk?Z=z>RSmx?J7}K&eWktc7<LX+N z)!U=|GtraDPnH}8^C#Q5?Hb?gTRLB-dl?0;tcN8m!E{q;GgSx@8WoR?!jxr_b`?V! zLnqn0@7{}N6t+ul%i7{vQNxJ@)UEz6--q2mE;$gguL>p}D9PWywVbH)?|OP4aZoAA z;&wEIQ5cehg!yrsHYiO}GSY(5Z_|s4RC$XNt!3GhdJA@oGh;VUQH#DkdR&NYlP&!o z>Q%7hJ|IoVfXD-OtNFTX_k6|KQ>P;NjE%ObOx{T%A>FkhI$v$}Hx&y1+piU|Fd=o? zy^A-{RDtQm6YxKH4!HLHeGdGUh^q@vpy>yq`?Zp5(|&yGOxW=-+HPA|={?le4!;}6 z`1ppUza;bCM5H?u_wK!peqoK=hHb~r@sar&Pks;DBDqyCN1B)TrAu!Aq)#7jfL(Gq zK>6-{V8njmprb*g6r>x)W9}-r@2_3E;>5!#;|VPI#*nwiVL@}A{c=o0y`7@rZQzw? z>1XtwrwWH%4U-9tkKg<BA3~X_vXM^OfjQo*{o&6~)1C?4d3Ou{XNm#eiiUsde)C_Q z6?Tq=<<#-B&v3mYHcv$F_|caAM-RWr4YDUsOBe<@`p$~y-HV79TKQEUr&N^@EC43q z!W}P9&(P^mSm>0N5*rN)Q3Ad>lZl)r9w|%Kds~dz`wn;_L|Y&MzY2PO3{2mXmpA6> zy<pdI^%->+$Nh^*1J76qFE`S~Q~%DQ%zHmSiQ_2O<oOJZw55&jU&Q02s`P%8!S59- z5j!e=W$t%dv>A<dnqg}xIx-{^V(=SYZ!l@E?$X1z!f8PRI0f40={|31$k;B->z?-! ze=i<M{X0Mwn9k$+*n@-s5h=0&NfTLeqkjdZ_ML;V$99r_vPqqh_|AHaVra{S9UCiW z?EY>IXw~(21MNNx<^F+by9Nv%fKzv<b+EL5$qxeCUyY^~EKX<5?fu)sc7Scabvz{k zcOe?;=}8!0y@(R<@9}|5W9HpM3g)8`85s(E8)w=EA$#d=Y|o#WaO`~4UEpj!Qs;_` zQnzm1ibH^8>WrRQFXv{A{DJ-Zuff|CX1>rU_h7CIq0klFf8A_+e0+Ofm@=zhZ+G`K zI0*AX(nEYaH?};hq#doXBvf7hg>E$t<$Ef<m0|tQG?u$S=oM-E=Hx7!&|vOjXE?6% z$arGeFW+*O@Kje;OjpX%apX5>Nm(u)i#|^(+zX3PFT0ceOCr;>$Loq(UUq%I&-Y}g z>3O^!A08p%=<VYhGFMP%)R^D~l;_(Rf>!M=jIlG2+e(sk;=b2UNU|uYFY4BvAq?~0 zzGXgtUc$y*IPCjBVcy%Lyux@*7-lc5s`7xDT5neu1Wix8DcSOYD?n?H8U#qXD@1L? z>1Jjg_;JqR&4`-8-*<EEgt=U<K<TF78slXCq9Be&L~p9g?gl_Fr{Q@Db{U0;STQba zc?X6M7|i*5iJ{@~P9P02h*ndYC?jwW@~y4N&%;gFQyC_+I{{b2pofW`?ZSok1J$Y- zR$BmCN#4G_1vVkkp-Cjf4;>k4uvNb-APGDO-iP5(?*gqtX-3<~cJ?ehC;xz0MNkA> z0#xu0gjdjh07$dwaQbMQZ#qv#AIQ1*%6|BlUj*AjL@D_H06ZgHtS}+f)ZARJ1Agi( zs`4ldd0~PMfFWhdN&-5hXar`mF#NU}lk*bipKpCWRFf$|oL1OU69PAiqkLDdU3+G} zb|=3II2T^A=ATbDFa!Gx&=~Go{DluWl5;amraIfw=*pEV5mWR~i-S`Dw3mVgTe z)hHk3h<iu~BT_6rX$_1m+uGaVAXR6Tahy1^j@&b=G|PkN_OZJ4yRCt#csa1bkEw0R z<b%@3nerrU=$e>J#Uji%`d!&(YtFNE4@|st^b~@SvKUtyr3xk1e<o(~a#lMnx4>UU zV~WG+>(^wBYR_v5%}T_;P0ZN$=$)6K8*8!DmsZ%km}byfg#0j6lS&TRl$FLDc~euf zr@z1Ar2TEsR4@g@ATw163F9F))pFbzNxElu-I>J}y2NSdz_t*oT36@YX89l7;+<F+ z)EKtE+-^Eub0fyig_VA(E1dGNX6MVNT_jnV7EFeYf#we78SLfDb`&JAP%JJicu|$V zcGOnXw(UyW(5iwuDoJLa&J=5^LtKYm>?Qq~6@QuFxA-#6b(bhHZNU@<%_wFl%U2B< zaIu`%)^z909Y2E^ie5}pF*F}r(f%xd4tca-ZE`TVw~=19Ya_dT5D@n}tBdc{E!STA z#~i`Yc~IhYs&9}xC))D%QZNieG0;z3H<L3}K)$w^ziBYD;N$0KHq~_vnk^APf>3~g zwua6$;u0LA^=C%^s#<?yC_ZLGmL2!%F-!ZGLw!jwDOVOl1}}1~+P|99HWOmPkl38W zFhOENM>$P7bDC#pG3<q2Lqc~Weg1)?)O!dS@cFy(U76Y;+m3<Vg52Qvu*?CH{TwIY zpnLK>a9s`#f=&KlqM6a>C^qs(E!&Xg-|R5e)3D7W;!7WlwWLCJ%P;aZPS9_LhcvF2 zgX<s0peq<TC^B{HY`rkYSvJT9D(Giu^scX3<Fp+%vn<1FP<r8>!955sQMW^ia7mxU z{j2w#=7TUSSnqZZ=laURk|yC#c-A}GGax_$qis2>3)zzP_U9ln9dy06cYN{$X+ika zNLiD$LX!o?CTTT?VDmQMEMOh8GR;?&_0L)e;TVFK-bceIig^+9wMmB%jr9Uzpby%z zNR2@lGK0YF85&ZU)YDzGV-&D?4=F6Oksm?{Zcxx#p6UOho*#^tgb3}178CIWUYbcy z#+A^i1gy2-+&rJU=o&n+xwtTvF2?u%MXJx`kjiCh>??dQ<{))&{NS0G^N)oj=Lh`) z@&_Z4eYxC9=X%HcS#}uWI+B}Ixr>X-rg{!)PRN5Q+1V&f73fnx5_~M~g)mu2PtJ(x zGY<ZLEkH&FVU{f1GZ|O*a-Q6KEB8~}@=T~IAen^Xr2sc52Zy!(Y<Gezz;VT`JK`QQ zanm7yox@8@R~N2N{^1d_se7z%V1Q*NE}uXSTvVANeD-k1E8N41pKfd;MiEI|4p7`t zQ7H%a{v5F#Y{?I&otrTbR#yWlzg#SRbg*?t=QoShyJw994hLLZD)~X!KTW7+Z?ZT& zHh>P7Dq3o)y<oEGn}Hj3284u%*Xo1@1y|?CMf(bFG3Q-+2Tbb(6O-b%hr4mVv+mSo z5VrtH*)fF@?69Ka9wUDH8X#;~3i`6COKonf^BQ-N5aKHIfso|91jIW1ES(D1+hKMQ zXF`u~^nzO><N;qbdUw7Q;tm`Pwx@uP6mek*_FR+W{e1b3!ourJQw<cwBru>VY%L3@ zzY~X9&mXUS&XY1yq3)-}b=5@xHg)z~vz+MpvR@4pAm_;1lp`Z?y~m|FAra7Ypc3D4 zYv(n0`Q;1c<$YBNRE-F!s3_00kTAQ(3$i*t1U3XXR_KY}i}%});xP3B<s)g!vk!Pe zG0vHnQO}B8TqYM+j}h4$W6u<TngHm$bm_!*wx<jU0-OyAOZ*c2K{wF|8g^!~&~xCg zs@e8&-%EEaw2!UVt*MOIpDy$kvoxAIk4iF3dV%fs+$!CV6{TyRZLj+uAPOrEq+qH; zhl=p)F?UD_h>AcTa5J3yug;HwWM8w0X^!fM>q7}HDy-TNcc%C^yj0DfD5(8Owaa!F zW-lwh97&JrSHq^fM3%^N5=9oz?hA^p~Gdr6>+BXk&Zr6=Jh+k8LBQRR388gbr` z%I;bZq5iHgr#%i@7lRpsF=we)HwtvPB+n<_WDMWGc$9YIVk!(#a0Mf-1b2r40*RQ5 zw^9TPcmkg%1Dhg4<DDXpM>jPmE5qXwCe}BFsyv^0@;*FqoND*Us{_`RyQ|N=ruvj7 zRo|+c_&7ebK5a2A?OtnrtC}r;dx(+_eZCS4*$JgxU3>gRz4jeA5OosY%uwkWIJ>%S z`S+Hs*S4PCz54Z#UP&cx^<4FK_H1mn%};kD=k@0;EdEtxL!+mxbEWCk&FHTyt8j+) z87tTC(WF^0<KyS|4)VVZ%M|R`Doe-8D#vNFvvzQ=OSW6C=iSgZH9Zji=hct<-|t@} zgrf%O?L`3Jmr%eiVelx@a0EJA<IML;r@D`K(>R7<{g0JbuWkNzI5aeG6TCWa2Cup; z(SkaTy%pS0vK(Vws8eL36r4K7wlRMLcT7b353OvQr&&)~f7?3Qg{8FH+|@Z)L}&PZ z!L<w?hWU#Q4x28Wa&pQ{xp^sH>SE7NG}qBy)=EBtKF(D3QUa@ALpT3<4ma=9(&CNH z3msgsi~p(DT-K6%a+eG3&z0pmZ_v?S?Tep0amc9EnkRj3T>2x*DQ9YiT;J9)fI1^6 zC@6D6uW@?Gw^&SEQfc3{lw}zXHUoQC%TC*SWS_v9scfc>E_X0>GM&}XxS}m*R?AzJ z38`aV-o)sYynYi|FWHDem3%{iQ_iRC780wb)Osq)*z(JXKbWawHFs0gxa5D)Us86e zVRRnLa`foYr6TUUAAl^terB$P7e>jEdRus-NmKV9B@l|nlkBw>F-JxOY!|1-5`%vM z;`{UG4y3?U8#9WAIo<MdiNrYd#)iX8!@$>vC0=s$RW!WQe_R+b3?($43S*s&@rG8b z+0ERN%JBw`ne_Z+77w9m9<dlPFy@fDzw}6_<V&TXq4Aqln~dIEmitI~nJS6%srUNn z%#G1TY5p>MK^V=gHL`8EWl!XhyZsW@m%L!vZr%8%Q>Ycw9ZOb?#dd?;ll$lyZwuRP zrL-SBp0;5SSD}00g<dmip{6wZfckf?$V?9(J$x7V;f-wO#f@ej*zD>CwT#TU;EFnL z|KQB2V7a)c@Y%9Ka}Y&LEKctu-s_}q{}D5l>(FkaGq4IUiuuBYH<*`D`|3Z5i!qo_ zpJw-$JiKS;o109~*um~7D2Sewl@&e79eH`qRqn~H{aUAVGIfACmv77yoPl0L!BR}m zrRLVw@Q(PR`xlKrt#221_JWse9Ag&oQO1oN$`XUu53<CwWMpS5UpBMut>=!)-Jna% zGwDdg=+JDs-)7O~`ts&u{*IT62maQkiF&w9%vxGZW4Du&)7--RfkU)UejNGWr*5;H z(<`+0gL1heypym(#04R7i7cvF)NUnN$6L7br*G#iyBmq;PYx%k1?Qd9^{Kb*uwPXj z&cBzSU|l)Suu=K*%36?1yjr-NW9Ge$;MK|F=gyH`+n116nIIMSJ-11ReY7$DG#6jP z%l|5ZHCc+A;+o4`7uY;lR8k)A_aFAB*&8-ng2DPbdi8g!065>eskAeuBnCQ|swJi9 zpNps&;tMP>j@8}WP?p42Cu7E3uEhaV5`BaQC+(lnd62tUmx$@I++yn>l3(*=YloJn zor)bVt~L@geF-`z%tN48eAcf)voVJmVJW^7`e{6TeBVwy7#Nhz&d%<gm~c>BOi51{ zI&Iuq+K_Mb=)r@nlczeyR;*|yjT}Qfo;W-l{kFaP<NM%`QaAo{PKkb^Z}*0t-%>_J zR#HtW_&=&&%Mq#Z2UG9f)>Dq-9KeUL(dE-QtK&y4Jos%^AR3%F{wpFnN_{HD%}p`= z3H@k8f_K3p&Q#>o_`AMq_Vxlw<C%<y)XCg_J^%IKhd!4kR{;CrJy2(sYbDR6D&E`i znvVK{nQ9T6<Fo{r3GGb=q658r`-S0;flrOsXB%3LAg=u_yBYa-;qfi8;Pr%z=f_k6 zg~PgBi-Yg$>b{O0IY;)I{4hOzWOTX<q6H1ee|g?miIvc5-?t$=Z<XQ(6w26j^wWfg zR7~>*u^Oi@^ZL9=d84@3YmmHibE#P9Fe9U=PxJ$rN2)KkT=Fj;@xyL5&1}=vZ;&L( z-?D7f2i$$?=V^ym-rluis_FzJmUm1z{k~bu*_eo^h?cB9*Y;J0%AC0+CUyL{;Ir4U zWMppSFxrZSiYvX-KHzEOmd~dD(WuftJP*F<vxP1NBku)w=upLuo1^#Q`eL{sxfpm> z?CiscM=F2zS!*phOs+3ljr}P;%)pRF)(+R$vG#15@IO4^U2J}3sI*YVV{arWT)@8o zyO>KYqv-Jdz8Y#J{_LA{3HRg%Gk2Tu&*#m>Y(y>)=utn6W>`ZBNbX#nxz_=&GjV6a zGg3al`M-s~#Tve^iia}ZtmW7VKNrzgJqJ;!DxMP2NJ10e@;-tZ8eN)l$pP~!|MwrR z-?cdeiE*B8Y9K|Y@yK?HrxO!~n1lz9a5enTeNI}omca6dmvAMc6O1pRVnmUP#epgb zeJdoDkx{xd$q3zJG|ifJouqdH$y!{Vj)yMAZ8h`oPbue|STD(i2)A<RBcu=6LwZ>4 z?cH|&fH2ll?DLWPYD#M2Vv4(WIz8(>{dTq`AaVbJqrwhqf@NF%nj`XpI~X|m_PXz) zi)06R`#|`F;;<s<`qqeq<_0`e)b|zMgJe5!W9UO|t=2W(ZQHhry^`*#;O-=bQW4~! zjdPNU)&!{6BG3%U9KLt9T7(kRahW@J$1C6r-rnAT?r>$n*YtEhtsJ%@l(UKP>$KUy z?apJ3moCUfPmGR?i#uoug8YQJOw|xi1}?Nyv!DM@TtdRt-4)~UOEr0C|L%3^7ZZwe z<!m88px-HGw6$w#eDn6LxX_hy-%f!|eo1C3q4jBL?eUMvkF2Z?L*?~VUwYpmQV2av zlg-3#OGV;6etUfhkr<J4Z9O$V`HDVotjfVH65A5Q1?*3+Ru6F=eav&r9dyKjo&&!t z%Yzq|el15OCQ{yhHg8tiZ`#w_Q&Lj?qrSfWWxf5`ix)j(XU;vbPjS<BSl+{yxAciR z&yPj<=Dm9~xY&Y|n_D@T4LXX`A$DG<MmcHsD#iPL`EtQ9YnT~oqOYK*F@np_pM4}G zAlT1O6m}UX(y)ZRlap1T2P2Nmy6Nca_hBVNF_75wK_ShkwX%Y{{Yv&~>EA^0{FZR? zZ;Y?r^CREvN=D_))rk?mv@2YCiv~tU#rH3kx6EtFNeb_ATw7<%T#gDbP<?%jH2F8I z_OXL&<Z92JJNqf;+fnb5LZm<*(>c=fC+>!p-sv73w7fCV+1crlcC~C{+iGO99Lg6J z{iD2!ycwBUs_$0S3~B|m_02EvHuGj=t9FPTx>xGX-S!)QtU9LFyPPO%8XAg#zr=Th z<FMbp4O?9x`D9oFz%3Y{HysSJJU~tTA~$#ajR^Ns81A4t#whd=w%bO!x;^pf9mI{F zF9={t<L;|!0g*#)&S7E4q3VtIO*^t@C*CzGoi@kG^%|klX!Xf~ftNq-hsI>O9^8Na zLtx;;2M?bA_;C#t2)+t?qz71_h2U6M*D+XO*38e@2>iWGrSfgHXSGByFW2EcgpK4> ze>cKyQE_pkKQuV|5o9A*Lljs2g&yvqq^y0C<BqSMouJXzH5A5;(bzjELZNy^GSbx4 z+(SX}z{rSgJQ|~?5!3gXkmJp?*ghX4^)p1^`ckGYij3g=%US;Jy-U2jVzXgdL<w{7 z$PG0q2Eh)&WYc^+aEh~%?x=3$zH_+dc;86(1pE2Luc^bq95%N(t(&c_tjawGa}<`i zXx#^Mpbqf#^}UHr1G?~Ws#1y)i~8nDqxIB}U5N_u@U_TUoyZ1-|N5`KqdeBl=*@wX zCSoQz^9#y%H7V^@w`|M~Ztni>Tbwq9Beg}!;{E*8LKk=b`d*1OU*p<%?rD^Akx^+c z2R9e3YcADhZ2nl?qOh8pnzQba9;qiKDcRLM{$skgc#D<e>gsmq9VUpxUco+<Gd^W8 z9rpx!vn(Als6rwIaR*;wH(gg5N50)lUGql%e|xE5A*WgYK>p@U&=VPR|Z*41>z z6|P{xU<|nJW>aTVvspehJilo*$he)2a-h<vt;8U`^X5{iF-hL0(`0RPbBUag^=rhy z;FW1PlC?4akp0w$3Y|I~JaIGgx8;Ni4hM|#4n(1Do1LFmAGGzb^XQ9ssKfOQ?}lw{ zeg`nHo1G<jiFWJV-5O8qbKHdTr?ho-^^hrKN$uydJxphd0%)#xG0-yf{PYmIGRWKb zMeV1rOS<vs?exlk@Agr2Mj7vL{sr5nk7MMG5P<2oXZfHC)#)TQy|nb8i_qF}?hY#^ zK#pzJgD~Bg$WB&jMOV07pXl&QPFldZ<ne>mwDGaHwqh3U&J$Y+BJJY&LdnHFC1@tH z2L;s}XDuc&R~blvfHdW4@}p+2%}dPr6c}D1Iz7#MxeTVTRuC!3$;s;QwmpYz0Cmw? zmy1x>s?d@kU+ToCNqPo`foDcS-)n_zK1MsvaiW3H&w14QW^(UTXa1^DX=&MGff{ir zWDoireAurQRw}oDKf@2lwK1Wlm72Q^iOQ6Lx^vs6W+d2VmxHU~ef=!W&8LcmHs6W3 zyFhD}YLk16bT$O}i!LwkS^1o#xicS@@nS#)Lg`fz&24}5K9y8d{;K_HcC(T0$dRzn zjHe^^^{Cy%dgH?Hdi!}7Bi1F<g{%CBph-=AP)1dAJuvRm-FJRLF3?2ojSCR4&a_?| z$yA@-?AUNbdT-Pn;6Hh?FJ}^P0C8JRV4x%v4odM)?&|WI_K`v<bsxky3hGz>L;&f2 zy+3UAK$~Od`q~P2epGI55K8He<w5>0Dqp=anlf}cXUBKtv+S5iJa_CENv@j5&A2c_ zM|#3#ZzT3eZaP*Qp@(64f(a!A(CudPR%W8ft6JJf%%A4#%owG6^X9E_((o~y`Rg}s zezmPKynFr2cW@%<9S-EEvQVC>PgxW8p@D&YMu}_gs}q?X-@kt^+t|SSUPMU!YVz~u zw@cru4?T`)Rd@OIfOvrUT_Z&P<33NrojyC6%Ron$td!uO)K_{7Rojl)#UkjPcKq5Q z|KB}Dfx*&)=kN4?j-Wg}m_0phf}$$sbL@RnQ!ijR;DT|ZdhcwNV1D0}s;a<jy_z=G z=rAl}BGS_C{tdF-vHP$_7bumbv~DsR<;^ooZw~3G*{)yCv)D{$T?&pUjF8ByY8H*P z%Ud;@u<a83mi*0C<;d>9l`Tb&In`3gZ4mn)z0SyXY}VKQuP#<1Ytwas%5H92l$!d` zEzOCE3Dh<uQv;($Gp(D;EJvD;fO4Ih^9c66yDhK+1dS@=SdV4Z=38~aRSEoX>jCX5 z&mbTBA0M}0`w#+gK*pn97E~eO^*S*|pNsXmk`uKUQ!P?u{ibULm=UvyRQ4%$t9Qvs zRqY#vWHY8SQ;W0d_2K2Qh@U5}Z2j*ond7GObRa53S-(||5Dq(Qp4g)Yp?GyxH|r4S zq#^5swA4=punIY&;~Kk#g~dO~$vq#^cE2IzMMt+y>kY?@d0*w2FR>4cZTVT3R+6*7 zfSHYpbRr?9gy$SG3vJXZ1mhBgKylA{M>`fQGORO@B<5|5ycyk#8$57*^v9rGxXdg! zV%254i}7kyYqWru{(p7n)Ye<$a^^O33t|13Ir(f=At3({Tq)j@ozhBf9+_W`wVU~G z898P~D1VbN57$ESw3#ccbup2WfAEW@NpCl$YgTN2Y>u00=y3FqWWFUnVKn(_a^|4; zLj6RtZh}Rs$Fb}hDVOS*Qq#D>J>+{ueBw@AJXZa(zJeiFO&T>~WPc=wO(pqdl>k<| zDtTpPx)8gW-4NpxUU&POLsaZfn5%!P2;iD+>h+jjqVh=YUfJuHQ^hL467;&13`rHS zkHpSkz0qp0-O_4_pEA606iXJ8ZsU=gn_H(J6`AVnm!4-Qwy3=S>vP8SCDFB&Om#VB zWxaaN@wxTR&J97zwoMX%)@zfDn~fu*ly;+A)U1Yg%$UyJl9qsB&K<{42B3<t0{bi^ zBdsfb4m?mqbY$<)&>8zAPxz;b>FlO6YI`Lc6M^4__S@Hmg%BLQ@1yRpUZgMAnmt9o zjfu2ituMDQpd#HMDm$AlRqD2!84)%I_5FA6-F?F+?tx<0CA$CkviIzCq86^Y(!&l# z=zj^XLmyou`VaK-;$;$NS=eqQHcIsVxb_1L3*;*5Q|rk`^57|4NeJ3SM4bMLf}Y=Y zo#^-b-Q4VdJKdniTUw}FdC`8<tJ85(U=g<*KHt3LSd(0{rOAAh86S$2jQqi`*n?k` zvnxjggluL+ktTy4g_Yg9CDpZXJH2Yj0YOQX-x9iwYx=?$@;84@S}%p+)`CD1OT#=W zT)u?acUKjvlKDneBMWx|bK&Ribkz-d4LW9R>w1&bEN)}j>Hp!w{aX3}1=^JNm%r-$ zRt+et+UV8ZzBBmaFRQ+64;eXSr)ZDUmJYL0O3HwIq>o=X@#f&2^Gnmxj^(rYwrblA zuVoa$_{FqwAbY9OsgqaRF%3h|_jO1lat0i|If1|>$P_bf%<M|pp>)=G7YljMhV8^4 z{;2PJ*81?$9R-!&jGL1l*sf=d*~nFj>@7Qs(<jy&ZfslhuWTG&Gjd#|Ln%ySKj}(! z+G@W3-f}PF<}2B-hsc$6^7XF_`v?M{;<v-Jo4P`myvx{VgSz&pO@dB)dpmS-lG)PP z@$v4^?ZufD<iFmvF}@`$D|@Li!BNrO(!!#<zyFbi+7grnR0M*OnH4lEVrps0-AmOA zhc~sk4XtGVg@q?TkDoWEpCK){r_B{$J<DixiJko#rt~-`Fr=X*PCFbkEKBLST!7D` zrYLns3|He()mR~qBC3@A^leSbYSz5u|M_!l=;w%6h{-xvut2eG&9;@b9G&&6u~q)d z42*Qe&z;c|qIiS%c;WTpsWNScvs#37bbG*Z->meR^K9F$59KlEtgOVL2<;v1Efd{b zc}0w=j<=@Grp~J;Tj*dh?kcq^0Y6DeOBL6|DMWYd`7zMu&%nDhE?(ZV&ebSWb=uG= z{8t&Hd5GqDNr_l&Y}}a(XCIoI%hN8-&WiYiKe$o&`n+l9tn(!P)|`(XCFH*VX!eq{ zz41e7tayjj>|QJ+;_6@}|HMfFmiC56&~!<T0tfw^sw<Te;#q|1_qSx#NnUpAmV>-$ zrZ(y}*G!)MM>;=0eTwb0G@tc@ynv4%KV?OIeEw-G49+4<V6u&L7Pk<n{nF?uE&<*c z_1`?8K}exLaQy3J2b@J*D8m|JhGFMlbcjt&^2tpu*WIpXeA32u>2d``?&G_1<$}8{ z+cY!V>B&!`oRu_qfgf9FQHZ>J=@K!0O2XF@RmRBYdajt!pQ?-~zt1k{5xAvUrGJ>R z`Cs3sfiJJ7NKX_n@idw5bC(jal;%cFZ#T1in%d{kJ3!9DDh2-;6+Pw(h>4H8aqqLH z@nad<#hE$2gTnXX)%G2)e(+T$JO7ZuGv6OS*g|U2pXQ8RY51b1Sv%Nf)q69b{jbfM z)<2c2Mx~p|5i#U(1Z%XM0OJq}3W`JQBym?JI;z57g{n`&OWeLHT&SyW3}dOjgnLlj zZLO?41A-*VKYrLjmA1&(gx*ZT(J`NMqI=?+)Dw!Yf4-9U@DdxRTX)}IiQNb8yEo!b zoV)ZIi1lMK&bh@!4$douE{yiKH12fAbkPZ{{%Cyg)i|`9<m1-8xC-EX5xgvZSCpRO zVqU<ZiR+&;TbQ30(}c>b?_vKw8ry!MroS2|=YNuy`)IN#g*Ns@%9gxLH2RL9)NpEd zEw1Uip6IGoF>?8?M98k4yPBrEDF8eDE(^{*)v?!oFYzP`xVRn;JT)~7&Ig3)D7ikJ zt;QTYlY3@HhNri`h@HyXf9eGU9z#m*Ob8cMX7M74E+ZxA@wQOl-8g#@kr5Tyvtfy+ zz<FkT;Cawcn1qa%B}@-<YeMwD_$0?A;g-ue(Hrs)>+WSaAjazkeZ*PQDQ|98)a^-= z5q^v&td1|W{>U)8L<07G@0oHx`2U#t4sfjdHtcqqT3TkQgp@)?MpQ_dm5~tHgzT-d z5|U(PRYI~88QCFwuZ){y@4flXzn=H|zUO$K_c-2q(|!NP@4Bw@Jg@V-Lwra58-%JS zUI8s>|4Y;1n3m%D`nT)`tVeOb-rjqAv+r6}3jG(S3s^Zk(0$O&-7Q>Kg#yzZ7~|?z zLPwS59+p6B#chQi(^$AEDE`snKzFHr`$fA{Dt_ams5y`-v-cwGR93k0xwQmtn_wcx z#Dy;a(}RJX6AfH!{I{L0(%#Ze7s#V9h5^4}yLd5=W`;(rRP6e`!0j+20T6cT=V>X0 zdpA{Yp1=cZYGyIv<*@1q5%9-S>HXQf%Rj~hNG+XUz)!OA`2elnI+a(J<o5`#D<Hq~ zo-FsjiQ49#A}+Pu3$7?dpwC6~^IXK7diNeHUKGy+G|4}Ld6#WhJ|#_6Y<hY6`;>c$ zI#7e)k8e&wqx)$><5`(h&lj>iJGQ=$NZASqv~}Y000&MX8M2h`-*X02RCdHYj>F%G zGYak|A|g7>g+f;AUpZh`C2y1>aj6gg0K)e2mOEq2*#h-TH@mya3Z#3!$Peb2{+_!` zt1BFLudZRG$6l`Hfv)|<<DPH*{AFZhpDQQ$7a@EA&zz~bUAjjbFy3!(*#T@EDYsw6 z1q*Nd!rf?m`?!gb5go8hAbK_IQpEj@f68|4yF3FUS^o2grXfZ~<`1zScRS|MdAd5g zd?>vKU7%%+UhE6`yq7O1qIj+hu}@FWvf?Eb3A4Sfdb2C~(cAd^g=&-rLqkak*}b?A zZ{PY#-B*5Dqy24>t`Ihq_#BsNFCD&3HqzgJHSUhd{4Z6Va{PMz-@EvA`ET0Zdt%lJ zR6SSX5kJROSD_EX>G$}{zn$xUlW+{s0FH>g>@-(n>S`^%dVTo7?7;tx)dsKxu8iod zn~#cJuW0kvpR=m~gxJttnA^DltCp8zCnwRn;=GItg@gE;H*bYBt<QkhxExDtv+RrK zQ?ml^xXT4MG4`X!pV~jWM!T{e0AE>|S*kg#JwV&<UzEk0^{b*pqv8w4N!zL?_`R%m zSzv;62X$j-=SAW@PF-LiSD{s*l(igyimm#Pwl;6`Sx-h^u>%JWl!#U31F&^zAmqOJ zDK~~;wWul>2vp?bm*@F^ga~|P0u$I>ZYFeRIVa~hf-34q6K=@8|97Y={}Bfyf&maP z)6Qf)Q`5I76<=oWDVQazfS$**=yy&*tzhtc{5me@vU$(;PZynq1ce@KY6)zCeziG~ zhj^XRF1uAD)cQFq2geN!v(v=O39zsmmk15pbtjPrzC1u~mUL%7FxOrrD#+5}B3_z` zd0XwgR2Ns*8j8VYxlHopmfcTbA5}5vv5DXAe_8;JzZ!jA0|PqUJL6{N=E51PrO=qV z7j6pXN#;F&`BiW%73{V3AFT6>4>E}|rmBp(_eN+GS@Z0pFgnLq^k$}iEGu`<i~>Vk zBkiX7rSQ^pYuZg@{#r&x`yPMr`<-#0vAk6MlG-D+l8RE0YVET#6xz}44zhMNNq;q4 zv-ydyxo`cahhD-(tZ#VFTz?Ucfu2<<J#A6`nMZsN5$+hC*a82D=j!lr&4NLvz;^~` zxZzhFTuuczEkT#>TEVscoo4m*jpgov>$?nTe(P86hgy>SXH28O0CPK^vXAx*5Li`= zTwJJ+XBnEO9^alrzK0Yz%y->C?8GE@L)7TS$jgJ8vA8Xs5(UqMhxqFLA;&5c+cf?+ z+uz~4Fc(bJ-ux77v;v{o3aZZT8sGg8KX7>wPsqu=?ueMi1=5O`id#4-KokmqmH?|0 zc~m1aY%*#9(dzT8KWlFe`jp(RQiobO**b?fGjHvT{u2LnFrJ1$)y!!yk|kRUtY0Hd zFXA05w<79~>2d2N>j;Dua2h8YW5B*~-XFbM0*E##8CfA6E5>b(g2z>8QmN4LgO0#! z6A%q3y`G1NWq(ryGC@>a;xxEFtX3*D&J_O}J%4;{W71D}A^(g?#2HIL8vnQtCuYg@ zFB$77z8#<3bk6h^QTQ;&`t0*(y-+aQf)n)Yd6r0=KA2oR-K98kg0%&nfr>#-RU3d! zgMYLUCLGI~O+lkoH|8geh&SiF5|3UAaUGu<X}DF}d0slY`>3bz6U`V_25KH#GMvI% za#8HP!^5}DH80~f0J@-*wb1bJ^137cKok^KgNNoilE9Q?YZ(fjut>Q=`F{sA4$zyo zZUUWNeLmJSG(#M1veKF<n}qZQh$qfzVW_-14j#%&TZ0F`P-gSC`I+sIdr_mUK1BL% zyhQzdDwDLf_bH$i_f@*HWO4-nmo3*E=NQj3`n_to|HJa)Li$3R`PAccyB?&{X@0LN z#<|#|T6Xirtz7-fbq(##06@mnX?+`fr$dGdid(k>%UASgdhj$Th!Qg`rmZ@G>Z<W^ zR<H}-zNJc~B<$oeGhc3@r8?#*{8H>C$XrU1S2W)5K5gB;)dYCmo1hTp%HQkeaaM!l zH3i_dHmgP22(lgb{4x2PnRhOxufKnoj-Q_f<q7%?EL3(y)AASkIgpGCuZ-=?U%+4U zzVVCBm5wu>*wOd)_7fD7*-69`##UZNA6rc^&@7iMx$_~qk^Y97znXn7=|A+k6^QIb z2^#1he!bqff)2Xrc2oY`;Zmkj-1XE!UD~7jM8U>@`A<E&-Xc0FobvO(V06aEEhlHu zB8FIB_R4#BHKD0{WW-ZAJZUG%i+{2|)}n(VJ{HXkv;{$iB;Eu+<?qyn*H9#Df1mW^ z=HYpR52$PWMgG~w-Fxhw(3phGSd}MT#HrDP#e9SAoz8*UK(WK?svFu*dvYVDI7y!M zxMyuMmbL&R{nTY6UK{zV*ZY;<<4sTaF}t&he{Pst6@JC-?Ck6t_CeMHtIo<DBmyW( zU0yo8Kf5mt8#MMy0y#a-{>l$+ZG-Pg$IQ1lEPGtJOu885uL>|PSuV5b%fMSO(BH-y zz{mo85Qkh;dsj;RNJ4>H(gr&JGB+<z1_tKs@ByZjJ6nDo2qM~3;0LnZcykDC18^su z@KQX7IOApT2_H(hj`Z2jP>oQJ$TXXqm~@A&Ei<H~r1aUTV3(e>+{+pG?%jbd8yc=F z`eBdbUB;%U6Vw4$Q74#2Q->zpU|5p;Sfj&LZFF@f35dSa{Fbk5UvHTFw8~XW8VBTw z?jY$n+zc5wulP6j!*sOw2VOfmGB*0-(JcFjJC!xbX^_)x-eKSOm{`03%)4Xf&X4dw z#HuVZPyxu8nwyK2-GvDie0KGl6E}v}h{C%R|HLYOe}&<U7_A7T<0|`upj{}bmc9N} zMpY|w@0qJ1#xSz5&>Eq(=$rtq+uJYdAif8yzCY$xZS-vnDV0N&WACSwMhg7IXG|Va z$(+}p(?YYqIqJA;L{wz*LTUvXnP)Q5-xTbo-0Ds;$li!oyZ4u=sHnJqWT;RrsTyd) zjeA=UF7CjtOW|6KNdW4dRWo5_vO|SN0;7<176B2VgI*#ZE-oqAL2F36ZcDI5b>lwI z`rh=Z3jLV7OsJ-W*(l^<pza^B9+giwK20p!7Zhyv6n0cjU=R?XO>Qa2)>m{~99pEk zj(NE+DVXKI8-z^%h9V8sD8fZgt#@gVhg6>G>bf1KSG8-+kJxWquO91l$*K{BA8GT- zfF%3lb|#L_uMOoEhAJ11hq$;DZPU4pR%e}X^_w?g-<6S>DLqur&cS)}5#G^Hry^c^ z`<=)LsoG3Th8f3Ax2{iyPr&g1?fIJoO~b!lY)hB1TTjo_+Y<FZ4NWRNEq$RW*opT$ z*M(K6AFGQ)xG-4NPM_<rA$H6Gje**PkIi*B5Mj}SrYEIIx!@t|gYgtpJK3(K0b0Ha zdXn9Br$}b~jKmPDI`LrJX=z6Nu!_d6B`oM^@2phX6cX@S)Lb~V|Bb`e7ZFQSr26_p z4IB-?!O?D>{I4fTGA<OOlw}|ux_r6QLUX((=FP9%-RY603yjNrtfK<!VZ^1bsMzBv zd=1MRfU`hlVWkYtx>$8mP%<$!J%l|DD4_{PR{fIBh4}%6aa2tx5L~08qR2>cd2)MN zwXRTSkE|_gy-PLFfR-xFxXT8T5RA1M)<c>qJD%)7>2lXpk;?<Pi;lkLlL1W-I=inK zZ-~yWsOZxZfR?CFn56aPL)Kpte=(;~D|id!So_V+qT~gZ{gQO0B0@%qzZxex*i;w= zs7yZ~;p2RXiBZV1PHA{ERkxJ0@#M*q@;UY^++~$F=0mBE>}uUkfAT07vwj)NVJZld zJcQ3s?3{k}DxmT=EsOJ5&a!i)ze?!LI3GK^Q>xUh$4YVca-P-|-%qdT+`LKEJcZiu zQG(_L3?sDxT(2J6LzsgpN9wMOdIRf4R=RyC_=(l5|GUt)-KzPD0TL<ObaSi@rLTS6 z*@`Y2kM>lJ2raxJ&$H0-i^Gxr$dO`k&UVw1GO?)0$oZz6)zcNWVOZJ#9#jCP{9M*- z`S?nAlzllKg}?8bMSi!oy5j|dAlct8ZXn;hv4XSiyT&f!n;AdJi^>U$P*URZ@=6v> zC^j+LH|E3egz{LPj@l-lEIxYoBXwh=5(!ZZ$XU7A)i0Xhe`F*(`!>^|<m1_{uC9z{ zncina{vO;t5WsN}HRw-Q*OL|!W!EH?9=8j63S{op27n`i=;jo|nMXLCh<*?UKSo;V z2lqXQaSERL7%vbnkg94%v=?*_JjmKj>RVK=T)ylF${*-S35Z=n5y~tVuMV#cwA}A& zw6Pk6;w_o!u`J{1;qe}3&q)6<HkSFa@wH~2WZ2Y5PtR#*Lryu)Q2W7wt(4iB8JU=+ z*=co))RGd<8688LhbriA8#m?r7$(D)3^UxaSroP9)8E{%<}2g5;-;g2>SII?a}(d+ z;oDXZs2*?JXliZK?Xb+X*I|`yJE+fFdr5$f4;?xpbx-NET_-GN<&$;yq;scRS}Avg z@u|*Ib6amgV`L+e$({;T1y1>!w?z-NclT{{%)9yz00+3M!wZ`>(BqpnZ+iUSBV4!t zgUzeJo6Rt^Itd~hVU5JDLd0Jbq}vh_%BIH_B92p2`)bNz+5g(($1EV3VNXt&rNMq& z5Jd>~W#4~KWmV@}NE(vk#42+1>|3!ml44!3TG+y}D`P(8{Gn7@ySGIz$l6?76;$L! zE%k<O#9!vaBDkX$`9UQm+3suS&ws9~i&ja06A>5JywY=ly@Jlx%hOZ(uFQ3!pJRG~ zdi$%aq`<~)PA>jl8V~s8aG+*9-BnIt=P(-qDuB8K?<Fgs%7cge58siM#u)gfsKDPf zy!2jDy+ic>&O!Y@!K2*y+U%31dI^aGufz$~*vZ-X$y~dI&zm;{&xpDQwKfEq-q=O9 zwyteyaVt?jiLF~?$zc})18z-hlcu4e*FR1Y1+ccJX5&-jxq^ViWrjb*ix)3)ft10M z`wccCf#DN$+JztUn~c+g1NsB3(!IW+3#4^eyh!UXc@aC#xzUdj4*WTYhcglqCLDcW zML$Q!b>X=_H}Sx@BT}{RidHLr<cvjo;YWeBz`@M1NDjKE{k@u_tDT#FY}=kAQ-L2o zk;Y}(q*5gyb7x|5rqDuvciA}WhF8M$-XgC$`7a5r3^te=w2AgBS#)V7u_hYQw)3^i z_Sw3+xO`-;pIF^KR`<J+iRHA{gJUHl-`ge72)c*-v|nAo8jkxXr&G3ewgY@EWnkxo z!@U7rN-N5_qmjn~$RFE&ZUO_qDFf69@E-6Q)yqK`xudLAIF#CzEH6wPj@q(*&QqPJ z90;WcllnsPB?F{V%P9+WqX&`7CJdjBd-rZ&(TB-bw^1wgLa*ufDU?rm3EhB5uA`$b ztcwaf>!(jn@YDHf*J^H%zTg*gf2gN_Y)nM)y~f(JmBwP_LWVcK-p+V1jC32Lflw2) zkU|td(7WkOsQghOEtMGyn$|hZ$$XuIFPm~V=()S!{G6~R#!=Q|Ed1yZ<16<^-@Uxp zL)m#sT^6k$?A*06)_TKqW_r@&f^Dz1ZB;d7KVba#7dIOTa~R>4YCWT?ekrgadB;@i zGndU6!xklGZ$5$t(O>nxeU#M9`E$IiJUn8mPfnokmt8Y-r#MTTKdhWDdU{NL4pe8s z0Hju?4iYr2hei*7H%W?%x7Z%*FVr2!TX}}Z#k*!d3JRy8&>Wn`>)n>hA0_;g>jcg= z$4s#h{Aqa72XAOpvDvoK_E@S-s{V%o_ryJ&57~|9UQx$#nd=LiA+3RGWjT?Hi#1-V zdZ4d(b=+t+lp^)s%*?#(T{`~~uE4j~7rxwcnw|an^~=t>BXjTGlv#C!+HiF_FkNq@ z^xQ(r_p(4`H9yZ^`AsMTR_el5=c8=rK8z{Xm}EQ0l;N<$BJ4LFmX*ybwP{gN4A6DN zDr5;ejafa+D02DOw0`C`V_%#2&MUv@z4k#SgL)CYR_pFEmi`M*cSDTqqtpON784p; z!sNz;-;{h0`3L5D={t&#?1u0Cr^-pM>gU0Ehzo5$)k>05UhNtFj<+umwMwFy|FO6U z+nhd$f5c4V(y`E%md|#!M~%!PS{r<??cKXPKUKx(?xqUkw&~waHPVwqLla9U_2;5K zCE7GFiRH)}Fl`<k7^0s^t~$zR|0Tw(;T^~FlnZ6-D5LY(+LFNDbtx3RobV*Uf!fV= zaE6b$u?hrKXb#Q-&#u2@S=8wA|H1Oah@JOA5N(<6T+@B$u{sBTt2FmJTZtaOOP7bu z)V(pq<OPPptZ?eU+rqiEPp$T6OOEx0z6;LRzEo*>CL8j>Y#%#Z$ljfDmiB1BYKN-> zL(;;VuKNUqxJMO7u#haw&Cf8?yCdPE^KLWoY-i9~ZBe?u#j&pZ?b7s2hy_({Wu4DK zM#dk<kKGJ+bY!=mo9OPRrqUjt?H#&yEzQd#QC;nMTBStM?rn>;wawHN8WgF9{X_J2 zYxcu2UykxUVjO(etI1zlrM2vly+PQ<X73GQwYB9bCxe!g&SO9T7FKBOF9^+TqQ{Wq z?n#el)-GkKnqm;rMQF^t9*-G@=SDpRz=aj(-x+tiHnp|4r4JMZ{VFZzNx2cZT7Q^m zUIzz<Uf@q-L_#seR7{)}O;r0c`ra?>%jV<deL?1xt9|KX(-2|3nP%BJik-h4hdI)Z z`KBWfl(t!y#V!Bo%b~LtpT75b(cSL#X=g|XZnC9ebZwB1DFN>1*3=W0v&X3Q@psh+ zNzcP8E03P97L}MN^r#OU=H=75CDB{=`Rrc%{i!3*#79Q(;_Noe3f(UtV4!Uf*<Rwt zFDJJ=Jlt=f(-k-~#7!Nok&F2)D&Kr2n*2y)WrlygzVK?H@nW+0?-o^4bIrovDL<#@ zrWzFul@>XL0yweQ4!{B=h;&NAOSF|3ulq*_dP5$Mb&mCU0cg5z=@fU1;yjV1sA!l$ zEC)cuxc&IvhhS$q<isB<vFw;YqpE&uh4J5%IC;H4w4hgQ-W)^RxpTX-l&hNOo1+u? z99u@%3Q{3q#cp9*W@dPUuABIatUp~g7+&-L<eR+8dil~r$T$35Dr1`*1uP=E>koBd zxZIqVH!LC1D<w*H@YO5Xgdy(k2WDVF`ZLUa95{Bf?ucsZ#<aMs5T|#?BL|11U7Vys z0)8!(`LoRz+ADIpJMW=&C`S<2*=P5Be75W+_u=F9Xk`dv<zXjY%s9q#9yQ6Y%zYHk zog3=!EDBY=6twqG*J$PTy7Ky6yS#)x(4A&<c1qjA6vM;_0#9Gx13K#t>pm7NyGr$Z zmZwQ=YmC@=B=M)-j_)MvD_E%@WVDy5)gb`}O+VW(OwV}2E!N}Q;R}Zu-~@}A!uO2O z9F??+N)>7_(tG-xn$!1X18+pQk|uP{5W^jF9f3S8)N*nMAc@e>N@$plQBnORt*wwC zQM?`}tKvP**WQxKEEh{)!vZQf3h7m*z{<u4`a35+s_ngdH~3&SxwDf|8!1d9Bm`~K zADKJXvO}nQ5j|^d{etwJeCpZeU)Qebw0(1<R#lyLs3|Yk(tWwdmAqSk=Vg2D21+L8 zmNt@Cbol1*8nWE}t-8q@oNwN&9qT!~OOTpce|V(ZWz=BzHa=r5EhwhzA4sH`Ll=&U zA$nW%)BmL_v<(gWD!!9WX)EkQ$BE7V)bsb!Hh_d2{jnl}u1*SLBdx9`lry!HGC-ZZ z*YWdS3T|teb?EC39wmAVIz(d8anEhOVu)X=4JIR@<=e7t%cV;^`JL6B9tGwOYtaV3 z$OR@@p-_-jU5Y?Cs9b5(W{3815{G)Z?mU(&{&5COTcw^tdI(hd+>FYiZ~W4|nc0~? zn{5+5zi?s8pPT=9<A=q{Ok0{3c~@LqKt=}H>i9JpGYc&>qkS6MXZL(3RW2c9sd+Z! zomzKS!FAcYtP6!L4&56@Mm#DKY0!C$L4w9o=66%o=9(mVQ_A;8>_?CKm&NhOxmVkb zz&Vc|)X?9b>i<9~;e;ka>e$p_>-oBKADV&Zep_3J!w4w{^F`F8_c()7WGevaVMU~N zVAp^6q-CQn)jHIAJ`APn1)fqUghQ@a)V8(VMmP%k76j@lW{v7P83NhyTfCrQr2TsJ z+3KyGSdm@14A<^rs8V6;11eOC$@j;~Z0j&7hcq~YvwZk>iu>2EmuRf}PXJB%922ut z+SLlU_J7i5!Q<rrle3K1X75i10zGzj{`|MSBtw$v!GVT`*rkvATYnx=`lPXK^Il>4 zN=>%e!)4KlN(ycRKX;tDU=+4XXU}f+;>8(L8=He|9hG>H8dFo%s)vsGmqk3v!+~_z z{l*r9jT@k__{x@i^QM?Le>D(SfP&+tLkWq5jF^f7`e)){dJ53EZOYSz*uA(P1I^3U zbv=ZL!i{79Xv;1m;VI#N*9x$-$qN+sx=3-f#8A*MNCbCg&2`YDk49v<lJEG);NVN_ zzMxwGO<c*PPriHiIAR7S^S0AI1owo74~c%*)*pu(HY}Pds4dzAalL`l^#EbmfF*}F zzP>l$zKWmx9x0-5=$+^f_cHFxeRj;%5HOUL26tgZVQouuZg7b6&=o7;`SZ+=EOeO) z-P}we@tEoh>*l$%>FI}XM~y2MlRs-C0(y*ZGe|tl7>|h3kYQpJm5AhGbUVFyGw%Z> z@ec3s{+WXwCF)0b9Tm42cCl~Yz8y*|0Oo}D8Z9QY*8pa_e$~)}fdSXmHP&Z1B;&k` z?Ec}OD|2m<xAb<|aM*C$|KZx^xDh-&F4{4jW1r4MsbN?hk|F4A)sBN7Y-r$KqzWUy z2NvySFcKiV7=cqtOH1btI~gM92BwB^v<lCRT6#09Z-^)_80jfEk6?j5$!tg##&6?u zb6VK$|J<MpOAFH4>Rfb8%p({EBbgeON|nqBKTc-NI+F9hR?bA<30alY7@x!Z<^LfD zKj-Ju?lyhR)xcXzh(>DXx^w}Z&@!L>G~qtJ(zi5LoDk*ude;2S;Ghxa_whpG<y#!l zQc}s*9Iiq_+KL&6`X-)?@*6!J?!9*Vwg=l{;ibu4TMe%A%*pMOP{d-4-aWmWlH&e; zXM=8^*-Op;^Fx8_3#bObz-04hAIS-L$cDp<7qB|j|EAh280v<l$3A?Db;9Wmc0`(~ z&}*F{7{BM{aHG$=jx7x|zdF7)d?&ubou+Ij3Cy=;noV_G>oqN{zSGVl)K|>MCyHr- z4G;lHFx<fz3dCXo&kXj{^GKvHI0zw*D1UWjX#p#BXfj~xxv3g*Z)|eMDl5XO0uykU z{URd<t-pWOWfPPuo^9Sv<gq91NNO{#V<AirD@P@Yin7~Es1n&X+#6jUinaZ^c8WhY zeCt;B-z`ZDES?`fo!aU1hHQ9PT}P7Ky|{RS=IFzlDzx#B9&rUH$=QjW*Q##`^cfwU zwzj?mk|QjNq1gYtMs=a{`$~yXuIB5%^Ms3vi;i+XI<^pK^S!E1P31`ZW8gQjDw(06 zfn&PoQ4;??tP><O5~x^Xr;}}jp0Z|wlGFnB`QPk3IH-nJpvv4q_=(QNmSZia&YY_3 zCv9JUd1HYONrL|eA8R#|(v&STuMB1*{(L-!I<Rh2;W>n6H{FB**CP5}GYUj60@Vmy z9H$(O&G1D$RLximbyyivd17v^3Ewe@Sru92cJJKz$BiNMA%N6cJp^8qn>8tkz}T9w z8<uofJctt!RYZ)91mi8$;!0}x#$w^()&u>v=Ums)a&l-@I;E91VyScZ=B;icQ8HJd zoZuw?pbD<zo?L@7`0s$XV$*x~qP1lWxkzc2A^5x3ar@0L3DEPu^-ezi>Df%j$kfV# z_A=){BXjfKjF~3yK);)U(i<B%qAFbswe{aaLX9xQ6Bn+K1F0d1nOxB10GS25^Muig z@n!LWYMo4|TD>8yv;W^tr;4eW$2uISa^QnaC~|OYms&}YDJi}%VY}6}gwsnCuJXAH z1>bAb)syPfuxxXTD%gs164G1#)%i#8beo!T83E)lkOJZAb(~yXODMwFBbUhJlv;<| zh{b(eq%%n4z$r6cd+S2Y>J1Bnr+D{2H0Z*f$X93u=(E*C;gNL6IPrSrl#dOz)d(0d z*&5aia>?H>4XwYs*VX0HX#Wd^^IB~+-V-_*y8$*n|J|zKu)JkQN(#Oh>vZ7(WA{Si z5`lAA`P`r3e9Q!<c?D*azsi4Im-`$ZnYs-y_v+$GJ?&?#z4-+XQ$fF~uk^)eBh(xa z2uqWsykw&yfNemlGQ8My9%_%0lFAd8d1Tl9RRse!qMc92&cf;lY1I=>FsrL`Id%2* zPMF_dQ_>f*fE55N|CXa3kdsfruk$O6ff)6*)YYpS8k}Jrn9!t1U1IhdurRQDd>Y{F zn$zdd;RBsHcX*d|R>zm6d7U#pH#6e#Gf7JwbDt9ua@6{4TYp1Fkey4<LoKeM0SsGT zrrF?%M0vKZu!!){zxCVMqqM$jeZ9ME`itKrQgPpT-=G*uN=|*kwtzs1SIod}K_>7y zCV~F{5#hvF*OQG?HLKU1Z5k7~^Bz|1PciVBkN&=?Dt!VF-Svc5hg+rA=e<p!bm)K% z0YTbtG}s&qwH)9xt)5cf4gQDTV;Go+g;tF=JG!c0-t@~e2@X9-PXh!c=2@ewr-yVK zC>5e97v%Vi5p=vCjvRnWI5;@q)8z`LWguf@WaP)<U<`_8XK$}C0%N@R7taFB*JgjW z^;kA4*2Gqt-<kfsH{7c~Md8^rZB}k-6uy0r1ES8|#)C_iJXfom6I%YK1yIrUTe3Z| zguvQ57TbHkGupmR97dN=Gx)8ZvmRS~|C>qH!Sil7*`wg;0D@Qh_((q4dJja*;J<e7 z*;4~fbCx{yj?~?&1kWBW+nRBgIB5cWa7A)K6kGQA%E_ndA5%=#53I4ll^_mPI8@83 zW+o@!xj#z1Z(pw6T)PPTqQ<i3XowylV<^76gdq&Q|4tj5C531eBul-1eHF%D!0)oN z`H4L%h&-`;)74=!77-sWF=(ERT$}8*l`(J#$qx(WFcaJo5lPo8-pgZWdsgD+iL?~o z`QP^w<&W|*(}lGJ+Gb?6MhU#&X44M4V2NOr@yY2wsfq^lSC}bLz(L>P=Ky9W)LBsN zVJssy+Hh#xz6S7|_J|~`#s3pwT)G6GE!x%&l1rrsA>0B#{oj0R@{+85S97FzkoM!p zJ+K|j>emA$+>)Yq1gjNz5KN!$-M#x13(FpumT74*z`cXGyHHmd8(+fo!lwMyJ{nyd zdU04T`}p}08YfVSus=0go_~S`XVHJD61C^79z1B{?ph+RS`+*|W*=b(d%(|kzc636 zVel{8(LdDv;m-l!R;v8rT`hqp7KLu{S8)c}Y3A~;koN4^gV>`7-hGhRblm#UV%w_u zfAtE#@FHsTXxtr(Im3N15K9t}N#a0Y-2>f<jM@RD`9QHP16eFCHbLzrk5B`HJ97Qe zdK^Ij%SqD<MgW`HtlL3)ANO=Yt|TH*9V+!<S4GFo9SGA)5GT;D3r5H&HC~#$bsCMU zMjuGf|C}W?H6y=$Tm8o7{}}?<i70^;H|V%cnnEm;k{0pxff;mGcU^<|=p9%q!D$c6 zcyi}#uY{(2Un=jkn_XyS+tU)|z;XF9(RfxjH=oTC;6K0mlGoK}WMXEbr?PeIQ*!db z6p0G7DVPfgY*|6+rmis)y0^aNV@G=T;+x`sVz7TJ=Xd9>3>qk|5T%eGGnI<i@O~W@ zBq^^QfT^B10)pT~nRtMLf=GEWGBLqYa%ZqcVN`*IvGG?=rsYev#l<RI8{$!Kq@?yi zwYxkZ>5%cq3|h7qMT^26tHrInb3=U~xId!dMHCh@O?H*(2Rgg#gpd^yWUa$(={}K> zXFBWWY^Fwn78V><3935YawR{d5DkuD$AUOo9uSB`YlT9C(g&>z1c%<C@9Z1++YX)& zf!rAi5P-d_4zr_IvIi$e*XD<UhqD--IlbQUb^8u=L#nfjdLf^0#KojG-jAtORjkg8 z>rQ>uYM^)T(2ZRN>Q3c8d^>JFy(-^wVoE)9WoffX`Lhjy`=+h=X{^YO^x0OKUCp<0 zNT`}gC&n@+Mm6Z5;NG38-=6=b@YXNUvWF#qPW#(@A>cwIg%`>ETQ=0+PgyO-!_m>9 zjD^gj)G5L-Szj}17nc?Y$UfPfZD&t9b#<Q)R@<-`e`F?QM&C+rSJ`Gic-%ojM|k1b zqBLU3pmIR(mA|)_!_5d8$5%Z*ftG9<%f)bv>cSZNr|^i%Ul6gP5i$muGne<)Q*}Dd z@$Y-47$66g;h*>!izj0)HWL%G8!OqJ%b9<5`!=b-68B-P&jBar0;ni|&R@5m^$GKS z7yKn5fTzLs<=T%a+HHR~`&+rJe;F&7F;=VB{>-UeGpkH{aK1QSjV!&*rB^d*E9tgg z;MgTF0Ex-piKWxhs+jm_&7mbllmnB?{<kQyiwkC2p0$EoT<b2`H2*V<u$GZivGes; zu@5XN65gNcT&9Z)*Jjt$PW*drmZ#296%fjBo4)c&S<IosN8kc;e(Id_u7Q!Eh`6kZ z&NFZaqY$o5A6r<rYm(a}t$e;(wN5b1fn?>--l6;|i*I_49A3azbXpdAzL^flAZXzz zCFLV^Q}xn{wl8{LTBgg-@GmX1ZMe*r>_*~Sxzb3=wy!*%@98==^F1Lf?5oL+zTs9H zQWM{k;bEh_)%Ep1L-}loL_xaJU(U{j#jUQi9V^$~z2flp@xP|0$czS1T|*0m-EFl8 zCu^9)FJ3;p=D~6ZtH^)<_8Ik$pI8Y%q0_t6xR08GZ@}A`xUAz!bo_B-cR<KULi&)J znhL|6>c-mVqnl2bPgOu-1L2FXun3^YQ0ZpiWCXAbNX#cBq{799bG&?wm(8%trhR5; zzQDwxQ^0V=6)Qaou7=Uqb;ku|qv{4IBaiVK2=(*ZFLR;rL_|mL;5t~^q?GeYV5LhE zLh@aemq;4trj&%cy@idZOmxPywJa?I+7&VxnOIIT^1FTh_1TJ>TQGo-=;HUI1>_TG z3Fj5)mp@rP*_KH(k1wk2oNEV6A+jwmOX2}<OeJ6+JUwlS_2Q}pvwx<^&vA%pf&afS zP&$V<B{4bqk)?V--iJI!hi3jKf3|SiuL(OQQXf4kN_ZTCwEq$l59by~nCn$o&C?t^ zCMbI<96Pbhdd&9A-Lyz;7lBd(Jp<cb(!ncl!?H^GR!MF|+-w=0KAHvM-2#h(D$d2t z-PJpIIcAQDZ0ba=z*A(fV{p4JVZRr525;3@lQ{|X!b=#;+;)2%ii!4@!ktLpnhuTk zKn@A-)5!vQglmLO4jfy*V~-hx<|yFjwF7fqsKcriQuvS&`_61Wl~<#Lj6OH;Q4~xA z;cs^exfb>HcX5taTD_9^*p1*4#HAtzs1gCNeH^wnER#g^4;rq&j+2bryU-ld`HC$x z)aBH=j!-bmO5ML-y6eJ^-0JFm8{k8C{rdGp&5C#2yVmJc-$T;(m30%zIq;2KM{UU9 z#HrvLBH5PAXMel-r^Me4SUqPWYwgzfE6KaMCCWzPj>0`R;qWe_Zq>b<G-uATzJTHt zE<KSm%3Hf+<dbZ-GW#XGUwz1zzL0KeVF4_BL9Oq|ub1kdPDSoJeEbY(puwRrdKfpY zY@elUYuiP>i{bP|joP4;e~&SsN(wmAc@bkMLZ^`wi$fks=g1H!4C8gHej`P*QW&oO zMu#;Uc2RIt*4ERbXJ<c@a-VM?y{(&>1d~%Dkqhf+QC;8)4`Sg9tpNa*x}Dfet8&0m zh#l-?&5GkN9^F7Rn~dkrUk-?pje(KpOPD^7W-l3_`bt_`FM5<#!o8Oe@O_H?`9ARV zn2buTOzrsnzY(-S6`^AjzN2m$J>4qZHmOy6TeZeoBwmQq<*<egzSG6V$DZw!T$cTG z7~?;kiGUdvR|LsWFzxO0&5k?n@4v2OM~!C#Qu$gEsVYjvRtzaAj3tat+gz0s-E&y^ zHcxJx)L5t=P7sV~*rb)c-FcfUw7w^^<<=2h9HMs4UlSAQU`34Pz-~TNqIlHJR$?jf zcJ^@a1bzuvC$7vRyn`4=VT%WACm$C>WPl+Nxx9Qgo;hTI#mWX@bYW#<3wL-=>nwD! zC(&-YUpiI4MMzck1SZ;T8h@+!=BR*teTs<KPf2-8R`&4ry;N7D>blTc19gIva#U=r z$Mfd|e3&-)B_@(88;$~4HA9O)xoic(^9;-BJrLsfR9Z#uX(}okDlRKE<DtfzsR1AI zI|i>ck;OgJq%5gs`_X<zET+Nu{pbd>88atW7oRt$WD}g6MNWF}JAOb+)QAl7B!&b! zFZj$r;<+$i=f(J%0(&rGMpENFp@ZL`9PRX~TG<czQmEy!TiL3GArK#=UVhR2vRlFm zwDK7aZVD}izA~;WMB^<#kJXz^)V!9jF@$0t9cs7U-rlLj-vlO!Y2w+ljoEWqV+8mF zD`kXe)VmtNE*%b{go)&6UVxhZeP#j~K1zA4u8D-`ubQ_7=6CKKM4m|mbjo!4UZ}F3 zp2%`9?J97M{_^D{6Vpq*_;eTKRpI`Sk&(T}#e>@xv5t<XQCnB{V@Ae1#Cq;>F(lMH zR*W}J-@r&Z*!Qhj?;@bsb2AD&5p%5V<L%AOFW?@1z|9F|&wRA41lB%J2Q28J!RvDw zGNikB!u!WE@80^b^kbk6uR$u)9L0D}9{>LriDdag`JX#f#Gl1J-MFv;<oEJi_u3nk z07+dLrf1BXF3jD%@VV>Z=Bni?Hrr{E*EDlU!rF`(jm`8${F`)(CL2uoYl^bZv0vCf zf7<zAzbG0%;3EE}{Obii;=qTcou}~L&v$zfp1~X(zK{S67I0owAuV{Vz0<=Y1Gaqq z@r6xfb8+$>qo!PmY_(Es-CFQH#+@0TF*Gz(=O3B}n`QV!?8%=+=L{twvH5|0ZeTLV zdeT%^cS3r39Uy2uJ!YggBkjR>aaxCnQo&h=Y2ci~*DYvF9UKJE7Gh)o*ZPyA>A|CY z*$ykMD#WC8_3Bf54F~VOlQKScCKP))!%0oiE{4%}#c&(L99FqKJw0=Wy;hA)jsDtj z+IyiRv=dRot%2g4BZcE5eNy5>bWyUx@uyCnd%o_#vhyev)hF<k<lh|#gAAP#9V7uh z7>zz2a8BRG(z=$GqA*uZC266hf{>>ApR@Jy@Q{LLSK&sWVDsK_ayl07Jr)*oR(5v8 zGdiD&<>s9lFq*r4dpEXv=@=MXQ4#U9?k-J7M!k_)$ZxTqPlCExxuzD79S6q_Hl2lq z`OvW`XGBtJ;T)n4p~lgN*tEW!wUrBS6WFGj3Gu)YWy@y}WZ@^tXPUF<HO3Nd<3uh1 zqSl@e_6-LPs3nr>u)2F?G>tF;MW;PKoLmLt>WgP39lD&4pqaQVzfg(f3&aGWIwl#k z^Mu+imvAdeXUfk*sR^&otpQ6WVBkX17nV4E+I(XLY~;dgq?Dy4%)~j++T8TG^|Q28 zw=v-~nMnz>^8x)wPtu>nZu3>yQ^eVY<G5pO-0rZ|`I9WCJvFlX3}VvXp4rtJ>VCK@ z%Zlx>oQh{{-NDR9#Zt>lq}|xj|KU0|#bH0K*ei11_&6RTlSS))bw%~<yLTBoDotHN z2fhTevf-jELr6+@=8Owo{^OLCH?hy3`)o4+V}#CO3~dnTC@$U(wHwA~V(T13`3X#7 zSRBk=9Awtj)y1h<(Ar9gIdyPw5ZRb?Pwgolgx5eBHKUXeA;Wll`yORUn+edKNya^5 zpp>+=wTa^z5os5>xL&|92w-h}RUt$r*kpvz1_*Wc2UnVtmoFd2F^$5PmPVMII94Y} zoy9Ztv$63oZfN=K3ixG3W`&2~%y8sZ>L03)zVl<DH|WPy<rQuA;|6J6+n|#ut_c@u z$uMIE?g4}s>wa(@#yI>Q9*DTxP^m(|1bD=}V;jzNS)gnO4j#M)<6KnxN5I|d8yW@@ zT01%<Zk7a|(P>h)VZr(r%6T$yD2SjS@C8SjXVNIBz~p-XTHyi#>!S_=4uCxSdD<gL zoDM@Q-@iT{x=dr=ulnFYZ|YDQy6h8zC(e<}zp|B*Kw|{26u-v9rOahOn1N7Z+3ZqO z0yA0iX<xC4`+skgmmV#zsDQE>PL#M@q9A<{KTjB{Y+o{w)C!P9b)6r0B+%n6Li-_p zwET%89*O;vlVu*fb5wguN~T*|KKO`Aaq)aCDgQb8>dI^R`<H@)ZYdk=by({oVPBs9 zB(GXy>q{(IeLZ=sRiLGE;$ZO%=LWyUb3IF(_F<S}q+3oBwYJU_R<U+|2erOD$b;bs zj{D{1K7qalIhE5eh=GOu)MVL(@VbF{^cIyY-`k99UVTmFPdzuGd}(MwUQyAc-K;6; zNw+XeYjq3^h%*ZwF-T=teF6X-BOgEnG|OR=Gm<#Ah&Te^AL3Y22PoF(EkYw0UIV3Q zK7`v7laoAsR@l43YA!NTokK#}-)0_bZD~2-E2fZP$_OVS{=Oz^Dk``(6xP<h0j}5> zuT=KPi_gV5Vk_ln`_+e{bYt0b@q*nST8^tM#3#gQl_@F`&TOCK;(IXV1^6_K?3yr| z>wMKZ+KF}Eri6W8?lJ+rwCb6W`&CjF_=HVBFhCMe)z9LhspPO_4?yj9qK^%9dPC+q zx<)KWy?3Xgt-?eK^0pb|OqmPO3$@I4UB($i+?=%{%7C|TrL4!Yf~O~iY#J+gs98Jv zT>qr^C0;QloARVQcJ#Q~RC3V7#FT0sTM*PtVY9Zl;tOAGm917NCU;IwlcKWxElsM( zM^y_#DCLLEM(6(R$V7^~^;gLQ(}NrnB5vB}AUW^&20X{zxR@FsL>9kJK{ejzZ>o$a z*Tq_6sA$p3z>2wV#M=HMii0h32I}kU`^$bgK7S4){XUGr*U$T73N1&vTlzp`5KKJj zkk$<id~IFb4s!CahL_3E_fTHehnu)3?kQej93l`PctAj?Y`>skZDVs06Arp}!b-{8 zTToWEF}7-fKWt*$4$w?R$xI|+IDD#z;SxLhbuBrD@e0>D7#RJLE#9BWbokDlx?B95 zf@%8zu)(NGo+3-k;Zqp=zJ8V*T<!~5yKVi6^ngp{Sb9~H#^2MSp?zCMN<3T*OH8U% zEl74}J1iZa`76IOZ%IceHa5Yav~Vo)Qg;6#Dk&aj+$};>mwl1KPNU4tKda-U&LVjX zY~m#Bot~7jd{0Cq+3FH$4Y4H^u+X+r=o^GNw1L5S;E~INayjp0==4C*p@pk&Y#b~w zN7?|8>%~OynWexeqXZIueEarxC?O}*W;9((xr4|^+CUg2yFSJwN@F)Ijj$!O;;;ZW zYPcsy6ddRW^I$UG%VMjdTftJH-lu8u=kJac!kWuG)f~GuY?m(!ODOL>t#KMk$3!M; z-?LYa9HxQ+C~CKx5=9KDAoea3xB2o>;-nx|g?;<W4yB^z3{T&l)}YHZ<`o=oEv?l) z)^tM4*wcLU@WJeJA|gpXWyiiHsW#_7mo_n3X?l^)-G0mOz2&Oa@Mw-hX_q3Anx!BC z)f%w;#V6oHYTwlTJiNX?5x@Y$ggkg2!Nwnnm*@*4WKMXCRu7m$GCS_BviuzG9Lf$W zGw#YUsY&L_eaE3C#?xd4^!EIHgE-k3tD(5>;Jer7t1cwEwb_hi4Yz*xT3od5u<YKm z4OsQ`^eIfQ@82)5ByTe^GwT72i;$rpIJr-ORJp{<>j85maKun=ZtNT#<=2_Fp9`^2 zph(v3=;M|{@hT~)`Y<5xV_yzzrr}}?)-Q_N+JeKyMTp<PlZzhU>(^w=IA>0re-_|- z@hGLcA!mL*#!Cq}8YRW3F`hdQeFc@TSRq6KgozX&B_F?Fm!P25Z}C@jnrEkfYE5b0 zPss9P($eD1$PhhuL91bPg{!Lbr<*+`r5HUucZ&A@xFF6)bDfSJE8Voamlvw~oD5-7 zOlVxrGCkDR7IoNT!D&$|b6A<v;=i^h?0LdNEms3v*0I&N8trOr_B*<XJ{PLAGAm}S z!p832`f-nm0-KPFqn$nz<Kvz2nWG=W!#6`e_V6K{prGKLjs(6Vz-rP)Qd?oxLu@C& zs>LyA^TG7Y%w*MqZB)Zlmi=9>pTERsoD{OK5xK%`#SKL8x`3vdnh@#_EW#4MeXI9c zVwoy145alGIbKpy_8~mk5e?|9`p5@}D$x$2_4}bFx8Q7e0fT0vdh7}Q%QOn!9xuP_ zgqN=?CAmr31gqdPL5zUP-)?p}=bN{3G*xTs+!R)%Jkih~PtEtzSSZ1L;43ZF-@#?u z4R=FBsa|@hkNHS`v>X>KT3wK|o3|h6@khQP-K9%1Yh%yQAxD?&T5B`@cb(wtvNN(l zw?;Pw#UCdinrqn4!4L4un2h}glceH3&3jq@Tr}RH$;;PGO{{>!e$K-q_=*VDNer?V zddpZd4e`7h)roV4%r$v>c#x6rDn_04lr_2GR0-`7&>C*j`PcU4&CLP*pS2HkU$DI` z|I}dv^1G;bO<xBuQ%QvJSD@im8CfOtT>k)&;N;5D=d5zbrAV``Xh6Lncn>T?0>E@} z+(Z09#I4}PMW*c~%MPo8*+}tkN;WJw$L7Ph@|0*DJi=2r)_!#F{nqrrajuhYuQ7Mh z=FJf6ibYI*G<hp}O1`j2rfX2l%X80)xjDOn!i1>o;WAJn1u1&m^KB;00^=LPq2;;; z+f(S-;h{ti9~07Q@AseauR{Du{}u<&0E7ANBoTEjocmyZ<biKTzS@s)Dp_Jc#Xms# z!lmTHWpt8Kl`T2R&OAaFj)ld>%h358f6LVKoV+b6Q_?3W>=x?XN&xyX@PDTY8N`R0 z-{(?1i<QrQzUVmfx3>=k!x1S*?jb64%x}Ek1PEEm&!3Ky*yj|Tn3SYC(x8XUxc66O zug<IzxB-S=5K9LS9~Tx=+li$oAD58`9AArO&6nlQiZZhFd|9?V_0(A1$!z=HaWzwR z&%Jv)J9Cxe{DR_Q$zs0<Sq(Q^^=atp-7+y{&wTF4&Gn&F-Ohxq_6yVPXPNv9PHoNd zJHx}Jv*-T=j;|y*T%4UO8(!9BaK7O@WnM`*RMC<7K!UOH7<uKL)83-fDqx}l0z<gx zegk(Eu#ezYH-8bwY3NL%d==B6TVC#h{v<NJWv5mj|G9IAH7)cpK0kMSo|O3QD)LqC zO0ekbrQGLV?!Q*bTxzwPRIC8$`00R=W1x|dd?(!`6_uky?<)q-47L)-6ct;KDam2v zKX6D0xfa0P{!;v{X=)O|5Eo`Y!MOFtR=i6G4p152SY2bX&1`A;{bc3$&`l4?Q-B75 zDWMhn_1nMD&|yw-aA;`8L4}u(PhoM1RF`4SQmA4<&nX?9c7oach08X_p$v+{lOAF> zf_x5!!PhUyd;i+~)ZMNTx6+{-+QiH(Elx&?Oile(^fQt9?2E;Og4F$qsmVS)#a`XE z%V~KtcW#M|>l$hett~lBZ{I=}xG#IVvc1*s_DVv>A{aouKjR1)Gcz;p>4mK61GtO; zr5;Rk%S0c-B|<+q)1F)GV1SPBE>no{js%T}UG%}B4K@M0Hur8mOI4LqRnshA@uyI? zUY8MVAO3*&eRF$mB0DvWcOTm>wiW)R0jH6QDuZ5-I{|@#6N@S;eb1I?I^`%GI1;)t z6LP$MJm=LVuRrcIGU59peUbINw<sC;9tL)<w=mEEzO;MyZo<#tm88XM%>Va|fBy*M zI8Vl=iY#`|A%mX{g}w|93#ZU09ogO5y$Q-02BXcNi;Gw*s*1N;=9jtC*VNd8v5YG! z`q4Gyj#UPWVBVXef*Yw%oY3F1`%`27Ca#02O=ji??%Z*lSY7Fh)1SOz_2zw%FjIbh z^)oWkI$&_jP26|aRmf2QIrFa0cVnTcroG*+rVqmy${inibhMoKeyXaf&k*`XAbdFD z^!0gD8VcG(*)8mNw~wihGWwR@6u65~t_~YGGSS51aKP<wp@;Dp&^O6#fj7U${TNNq z3Sw1tx+%7aBb%QWJXdgNvOXoV!;5#4EN68l;ikBFPn<<ZK4-2!niMBAi`*eoxw#v{ z92U3})<(=`n?e^liHo>vM>m7O;toz_hwdM?8~nv0uHU#mQRnJVYS#21>Vn+Z=xA>^ zHSNTl!%F)@+H|^eht}qs1VnG&{FIouFGK<xSqyG#^V=gMA`X!p1Q>q&sN~jbjf&{` z*mN)TTjxp%18>q}N&#-$qXM2TDUTn|*Ed|O?s(On^eA?;Klesd_fkj*Z>A0B6T=)& zY4M61-w!y`Tw2a#r^)uc@Z+i7wauD2^IJDxyQXh%&gSlaKJuz8>j>${ddGKOBGyzz z7!_%m6th-L8@5F6usRinezwVC*g#iT?cu|RwSCSmE};r1+L9a*r|hJM$_~H^<CwQt z1TK7kPUJUN%j#W)&BL;HFtj*Bju#t$F%YnGq9KWYMf#x@={mYe7-TwnUqru*Wkr>* zz5rETA`Au(zq8D<`{ALJp(Bv1D%*|RBT#hIY~mhZ7KQC}U1Ov0{rkt!c52=j!R`2? zvbNe39BWIycP{}`nTe<5$+}EzldhDgWXqm4C0>ZEOYgATup%vtHqF%B?CVHQ>-hLM zfu%SItlhdqE0`95EL13fks9BL&~Op7Uc(Y%A4!#?KdPP#jD$?iP_VF^^C?SrFxuzy z?)Y6kz71!C-jNND4w)7_{GS$}h?#Lmkju8W#jh?l#8Z#9w;zpZ_*}&kFUjCtO}p>u z$e2S_?dyH-Xl#Kfe&EhY|F_b23~iz?9$MbXZV}7Q?Cq8?AD=G>TYXPXLgPjNCt%EB zB9F${b=Atx&+mcFNXjV&1|LKlgV-to!Bq&<s$ix`#S4!=^5Jk7%57Y=Ar65MZoW@o z%?$}8fq{WYx+@=i$FH(z^!(sr*!Pr_B#7H^{-rMt#!O621)XXe1Snj9)fN0vRBg}u zaiI;ol_E^Oe=_TjQ1iHmxXcuPQ}U3FL61r4DO`|4TIPKA?Ah{klt6>)2wYC>_Ss`c z=m~_@=t>FaQ|KK!Iwog53g!^PuzL0rs1u_bbntgh%Se-0<5b&=Dw=HFp!@M;_}PSW zQHg1<Q71vawq!hJCWaC0p<4{Jk*fDQ1rl>>LxV5kcIOvr!qrcos_q<<tUBd;qJoAd zR$KSoUnZB^$WB_at}+jaIDM-iKdr0!#Il%Jzq?zPBL(y4q{Q44tgnN-Xmhj+Ql5C; z@((?jwsH8cu`D~s{_pVT&(2={Rpip4(?&;(K3i0+p}W{nUS2+5QXtT^O50IIX_%cy zyEZN22(PcO6%RnPCa-*wAWbDBL6fA8-Dp?|?`g9hii3ZzDsRd5`1HS+cj&!%^MUV{ zASPhUVeJaSZUNa=_FGGDmHsi_wQIghi*>btcJ*~a_To!umG&cD9wG+ZdLV7bcqQUw z>pD7KT|b$JU}QAocbOVINTlm{Pk>`%|9et!;cY=GTzCP`5wckV0tKl93g<W&A#|vp z-oJlJeAIXSW~Qc6ND&3CE{{lDh&~QcP>3@V03-SixL6q&9Xtt|=i6I$Y#wN>QeJYs zef#zc>|^sVy@MPYoApG?17|fB#qWvg69?cEFroa%E<K8gY;h`snk6nRr;CnZ=dLOz zLjeKnGt=GL(=(^DK9hwfTnP%RsBiR}4LEAPeLLlF%ihtUg6I_Au5A8Ta+*_(wQnjl z%CtEzH*!A6T=?n6*0r?hL-ytBaVmo=>A{`w0Q(koWV`PHGwri7(bF#lCWMF^beISA z^ELdcplLz}^~5~%$MoFr_zL8UQwZ=*MhYLJMM!E2-?In&Q|T8}vV(id{D+9=u-YTO zn|IK|r*t5A0tTVoh=D@HHs&(Ss!+ym6cQ5pg*@4c3h|r^$11ldfmyuEREWzD$Rsu{ zPK%u(`fllggwtp5?gY^gMUiS^Y;1|gp4)8j5GD)aZ72lc7930kFM*ku7R3L3Lhu?` z5Y%{iBwOQE#1lfO_H=ZjSCb_9W)8s@_sH)5k8v}q%fnCsba>t1c}^`GOYCpnzW({8 z{~n>PfcXt3{kv0)9ls|J-?H<26Z-B|)5(M~zI%f2zmJs<Cb~Lyf9lF?DRA^^jPLP7 zM3;8HI0u$a>#@W`%6qn=#Ubh*A7AuoHmJy@v{%#iU69q}kc(cJhwE4ZWqjPg=$W*n z{mJ=4D>G)faymNfEDD=!52n%%jOLk}ZbAO95EBK%wso%Q^hxZruwS&r;?G(yxx;e7 zw*m`6!Hob!1wU{(FpNLhxKU|-iMA)gKT@D6BZKGNyLY0uZWW+*(%Isekz9LT_r7j` z3k#({_6aN*g+fY3MhKb}{<{cp1v>}YB_Jq}p5u*#Rn>Rgin2O)@1*_kB8#L*#qL`( zfJ|UCi-`a+#eqQp!<LtqhaX@i;UBj&@*U9FNj|<1aE7(0{eT*=@bT8qkC<UmNAO3t zdD#s{M<E;aPYBCcf5BY07hh#buMcd7jxV>U=%_Z7mwSN6lr4^p#8?Lm2DlRu#6mJ$ zSt_q^e9O+uceuA=b62Lu*YT_iC!Sdg2<Sd{97s;??p4Y(TCff?w-Va47Gl&rl<{oi z0kK;%6*XrREo4#4+iUX?yG;djnS-2s@skX{soCka(wCV-L(;QzZ2CGSu26q=*G4q& z-Fv`xnM+`FIA2%&D2DB3r#mb^nb!O92ge~0dWds>d0s@IH``_`$b3G#_njV8O&{^{ z1H#{xjeT*X|K8EtV160k7BG5TBv_;#bu#3tOB<5W)z<Fp%yUHA8xa?e<$EK|vGD-4 z-H+%W9kyY?x@F&wE=809&|1~w`yNw224w)K$9BHUb(?Bye*SY<qy&eApnB%wQbB&O zV%2cKZ3_hRAm=Xv3Wo~-P;21AxR-r)!@qu!!7Y_{;_tylK3K~)3A}ju^5n&f`w`Xq z!{5@!?~Qq(pN1lCB8)8B2DyMS!WjyAj3(a(&WZ%R`pWx|8}CM+KHEO0GF7$t?6KJK zm0p(buchThGm<VAMMf?sChc#{6U6a8ynS0W%@r5jog3v_e!p~(JzT|oh3%o9dt0NQ zy`rLrT-={rZ+hFn&{z5OZ_|F?r_mkDRg*#vy1MCc5m6%d={f6nf(XQ$(Q23#LVCPP zt=Q2nBraa@Eq~6|28PQ3(ucUa6i<57d5c2v+xM0-w#2WjbG*FIxL^+_p5=V>NWw-& ztT@vb$Kx75>lo;SvfJK@kbzAQaKrcM5mxtAGeKknF0QMsRoh3LC<ql23a>$cvLN0B zd*=*f)+1HdAZKOPq%;e5fj4j8R-YMcfZo9e3A!-RO`B;{O#1c>oq_Aimu%uSFjSb? z(}dVv@a4!ldkM7(VZs>JWRiV>;y*OPz${qsT3UgpD|ee^!24V}86TM$o5x$bjCoY% zD_?m<-9KO4*L+cJcC2`Hh>!0`g2<u^N=;hap5MO{H+!68;XbfGZ%A1=ID1idlVot` zv&PG}mzJhg72kTVoBZ^^t$^Yoh#JiO!1A9wG3(M2SUQG)OML7pG$w(V8Eb26&mYb1 zYekxCdY20&v04Mdh>eWo#W#CYK|uj=Y)aES*O*<&tQfcWRob3EapJ_!q9PeZMS^cm z$eKOg^uS~f)NhN$!PMCex*S+tq7rywi%W`_NuossjBW=UYFZt5B$Stqz1pA^7taq1 z%;%AdBGaV5)CVXcR-d3{Kj|w*r1jv0*wzHJ^3Tc~sTf@c?Q-XKgm#1kHbsRcjubpL zF|KbGQhofmf<sQ}nyo(XR_CpE8}349ti#oun|EzHcBjtJvuw7>Oc!|cU|*zOEyCd> z#ijOr^<|zI?9a_i@lABx{^V`hMZOq?UiG_Y&g_;~G<jIKQ^L}!X1ME_o7j!<iEjN^ z!`#nNlz^<Q^Gj3LGkl*LS-DkbJ@o|XdrOz$a>0F?#9-R?HF~^!drB)YHv(fWE*WSO zR-Y1&zI)PJG;K6v2;Xr%)f;NY#qliAaHyAPM>0CMU)5vK8)o3P*2*|_U<Y#R025C9 z)=Q|tF^Ldge0QyicN}S%VFSPUXtMFpVOKfKxEc9$JyTTzQGf^Ezo#R_qJWjIK@))2 z93u8dnwl=R&#;|+M0>%;BA~j<lBr057w!mZy1HTr)XNK9fd3aF3}<5S=qU3}{5%Ni zX}mIXth|Mrw97dzj-^S-h8kMIza^8OTO2em=tB*GUDmdg)%Y^L8-mqAN3+NHr9^H? z?_c`U9X&S}Rni&+*rJ?bC;oG;sAzhP;~tZA;JZt@nneNW+~Jy<XUofva&U^!`>HYc zAFOHqmBk<_D8~@KbL#=OzrjIP-8SDZOs_|1<}YK}e<Lv^S{Q^{-VXRD>Dc{Fm2bJa zV4F?0iuFK*j_Vk<;buqMuf%Y}_ynjLqFq4xLZpvp2>U3I(W#({5E%&R=?k&SdOW8N zxaB43fNg_&&OR!t+eC4*m2{Sf3jg@=`GuV2Hy{ondQJmTmz0{?2pHnhrCR^zTAG?) z!3`l*QwK5@<Ucn)YXVLSwa?0gYLrCCNe&JQj0KaElV>6RJn4;;;r|d}hEU7rc(DvM z=0`^dB4c81(H<|F>)w?wgdtGej3>V3yO+m~uFT@RXWj`{0#!Uh9!TJUYqJ~X`dztq zn}~?Feb!gL_Ir<$cAh7y{1mbmwqE}rB?XVHCpt-jeFN?s1(!HDLZs(usHm>Pnpau* zRYXKjY%f1ehObypV6AY<akuMO-rOdqWJa;Du%J)M4neDIKbJ{T)zrKk(-h>1cc0+m zv22qM9>%UF{3nP=oDIan7noh*di3}yj!#cRT<Wv7l(U8noqgEu!2%Tj<kS?A@d$^F zzl4H|kI$}>RA4#3jR?!W;IOa@b^$<BjMi4>?jV~PMos?_w4hoJK&XP0SjCQ3<3iUl z*aZ4OS7&l7*}fcgY`)nNyZINo%eQp>DY8*YdlzIv%DWcK#cUf^W!c<OZMyrOBJ<|( z@I}46z_ELGbo|Z$0%LCbJr#Un{X*rp5zh}+*a%Mz=v@2zKik_THK{=tBtOWOvZwN3 z!Ca7GR>|6Om&2Joq-)pKRksQXZYe1oRr=O0l<_&wI>$SY<!py(&i%MXSAz(d=(TYz z9i0;Ffw)4gA9VR~M!)M1@=1Y!3EoIGgyli8MeKh`M8{5|@r}a8!dq#OH6!a7sRcfg zc)<=GK77)r#Bz0^uV%n>5enfaG^wD$yaZOcAfZMs@>C8kaK9;!UCF|mgsMRZ=1+5T zE9CUq@Y?1e0kF+@ie-wwD&6SI!l9P*mSA2p838mL!l=z^a)ru`LEO(-l_0<XVAQFu zQIWB{Y$BUo+)~zq!R!y*V?3;F`j62xx{kQ@{Pl^uFS)z<;QyiOyTiHe-?uAml{83J zQ7W^@UUwoRqmVt4nT(9GX(&p_h-4)sTehrhGCm<8dt_wq&2xV0_j{h>xsT)f&wYH4 z8}HY;uJby_)5UVDzmUUFFdVjl9S}_=iBl+-VhrYE&c^lS)LC9@#c%Rkl5EqHzI*O! zxAU0X(>InFcp=Uj*l1sf9AUcJm%aqSX9ygu`%?(y^=Yp#2H+famtp)D-6%U+roDKZ zrz5pPBr&fp3uOwX-;xk*#_%3MZ%0J_PoI7a{{%#Ga7edBm=yGBfF6(P2r$!V*`k3j zS~4~Tk(o1FQ%+mHANA#eZBw`!n|_I5)PzA&voFzIDxWzhx5X;hwiYgPSy6qbx5>7c z{u~;_9dOgqvY_LaRDErksr_5O)T^`hxgz;t&gq3613eiH;1oXn2dU0ocb}{UAPV}N z^c6onE>^(r7$xnUCVLyu8bV}&_?&Q`$m85REuYx(K_w9*>az0ko$v&skNoB#nB{%a zJ8S5JZ~hP9FaZ03*rOQ1Kuuuy64vPqlTLS&5lCGi5fawM0HZ*E7uG(^UUIv5P3*_d zZsOn!b=99LbbM;G8SiimSU=|OQ8_&H%{fTlcaI6#b(Tp{+Y`}@lKd{Km!Dp}YC>S% zMNd{o$$U-}rZ3Kk-5<)eh;7+WYw2eB23s^NVG>e4y#MqFSLH@7hEVa+@jFxYh6T6M zlJzWgyKrC@OHCc>;6U4}*-D;sv%_S14k^7P?;F*=w-`S4sLJbeI-Q=K%>?)D7s^jm z;v}M5WaE|Aem6C?U$Jmy_n<E3PXo>AEoM>}kv4qU^Y~PqvYgyOcw~bi>X2vx3U9@) zUr5kSDb{mXtgo&45~x6tz%h>)-bx=@!PjmsI=O%0?76G%lh^-CY*8#Mez!w?JE(OV zxfuam04a9vsdwgBum!d#caJbuPEA6|Rh07`#Vg*se}EUjrP12D)XNW=1iCkB@~3~~ z6&o2`e(6zlzN<^|j6Ypi*hjmaZLt{0OTh2tWb*De8r;9RsyTvFnzaG_TTg$#@^>`Q zc(alCSKNK@{FH1J(N^TH`h`4)yj7*cxCV!~ofR&t=PfV0#T`kjN=20cvRFUv%vdmJ z_-ynamT6N<$;(76E&U}a_ee0<5*Wkft2Tda;0eW~ywz6_N>FH-P41685lX25tMuNz zdqh?#1~6$^S%o7ul_c3H+W|wZUOIX-;O-vF)-Ca7iHfA|GOh1#?|xU;vd`*nS10AW zZEg;2+3y&`;ozs}r2g{96Hm}mYftOt=f{P1u510F{<ENuPFMVzxPRDdq0|<tCl`;C z_mRUz_;qk()kk9<ZU1TEnI4af{6K~EnerRLpG!^peX}&!K<On8+IQ=%c`U8J)-_*m zad7&N`20M%=!8Fs1b@=wRT3iL-_ems4?{UnL!V8jP4A-2j`inyyo?OHGwAc;A{<}( z`yas*!LeL0v-DT*5Nh#dAEvW7@(131B08WG;o<M$h3_V}Hg~Dn8?%wQbzQPgZyEyK z2f{s!QVr9x-rPJIP<yeAORodHIK1Kd{Q7p$XFIJq*3=RP{@d98G$Wg_ltD^fwz8pN zl9O=b@PXJfaX9ot#=HRmp+v@XfxEMifv@UOIo3;&Co0bYV1)UZ;c!EEW_I=t<I+W# zV^pQ`Y`z2xL8#ICI~U*+h5Abko|r_2?2_$R6(U2y3ufXJvMvcy=TJ{~Pw(e+EnZnN zYfpa$6UxytJAHjdR9;fCO*SVd!PT*D)wcT#sFepUHV^|7BS^ZtyQR(?!Qq}Sagym% zF!xXq%$Em?2a~rdf<r(W?!|70VOp?!q@|?ZX1;((oAT}3UZ{`78KN>WY~+XUivW3C zW?wKgu-&=x-nqnMf|%!L;P8X)6ZiSxgQN!;&tBNIXYHAK3di07MSrF0?oc_`D<Yv0 z?U#r9oYEOfdP7^rVXqdjp%&MCQ&Y1RdQpIlB;sv<eHm*d+$Z^orvc-{QGpFPhtJ;L z2c>7Ep_gMD*>;&7ZW-Z`Q!yXXpY)iohF@9M$ud0-OC6xW8E#vy8#X9k(H897vqwo+ zR{_sGUP-uzJqfie3IQ5+BIzL^4&RDs%7tkkJd0vJeoQxQNubhIh->kiDW)3Nk8}n0 z{|cbZ#sZ46wCrq=VWV&MA$hpE@URiXi3kH?tZZz6yz0>dyKK0SikQI+2V)ZDsZ^f5 z9pEp;oQdll9I*{CKEJm)AS|#hI~f_!qFa@kmc<o_${A*L*8Ozz*D`@{Xh<O3hh)#8 zG`lGsmo^@_v|`^5Z_Nvl>yc;J=McC2sXF()T^T>@WBkGjXaocV=k;-I<Bm8&d%UpM z*WjJ({5O+_u0;W}FK6-ATH?7!RZnQo7gAq#1x*k6;6zO+YJ<8p=3<;w7{467d-pE9 zc%~6k=pP#DbuBui(WBcleJ`EU)}^|OW+F?|Wn=-+i^C=kgfwDjiA)89!MryI28tE% z)3JqcHjFlRpG!+iyN#*_x(zrZk1W-5D1-9_*E)D_J-aqn?{~lCaS8Eb^p9Ip8K2wB z)!f`{^O3To#L;#n7ygJ~I(<ap3zh;wz*%8kkj+nuN!Zb<|Ifp#S4q(F0m{LU9eWqF zWN_JM+bJU(fBX;!krc)eyMu{eM~hiihe7L<4-f6xbE1-4eY+cy1enUt9?sz09Z;JY zXUFcH>Kv>Z7@09kd+gZdQ5&Y`QwSCVj9wM(D<Xp@{_$fa{v&c;Id-SdDagAar0paw zbudQ{mfGFA)iTeqTkZDa_=fo~D~#v>qtC|<K$_(|-zbSaM<i{L!<a`g{<7KwI#J)Q zZ{J=*QiN!4fP-kQ!J3A-V(gf0>l58}qG=OE1xP2!(nzM)1qGf6e<Me$vVC7^9d!Nv zs;{da3zX^X?9=NLTCCOwHh7vP@bhSh+<0v_@4&RnL-mzqnWc77da@2Qu3tj}m?yXT zHr8k3b?@LBzoD(zdP8!f#8K?3n6#WsMadPj-^7>LeFbFs%d~>7udsnMG&JY+DJUq) zlYR6b)S0>rPg(|mO<A<spE&n?s^;A?))wZ5MB~b+sK*ePz4Y?pSk=(eD-^%BINi}B z?-oJi{!MikCaGsUNB{P8+U3Hc%F_J&4M@fy#KJ(_8CZycfx(HSN5J)vsp#YPV=pL) z0{I_#I7mrJ0d|Z`PJ)`~g3ALaKM~YPWtEIo9IYZ*CxJ;oMVU(<_qU_&Ug$E<{f`1* zkzw!37s?X%ZJ{tq{5i>L@Qjm3G(RNCMZNh@&p;1vgB`0H!V{r6;ojRp*15E;*!fQ| zD{Rf(!pHux#;?#n`$dukl?6E+g}n70&c%m|HX9xPn!Q%od3*?nllKn@E~`=MVJ&$V z5<;FM;L~>NbF;wKstmXKGGGHRZ1le&wv}b<Nh)THPZZ<BW@th~kqS}I3!X6(7uQh` zL9unLY;Av}W=3=!uqXm^e-=i8#A_JG65(e}Zk|6)xG{U`@9%%2%ph#JoSl~TwWjd} z3IP~Nur8+w!~P065{AbOcf0x2ItTj&`ByR!Bq;5(PqE5^47gtEoN(`Bj~9`=U6{Y9 zh_pw%rE>hvzEjN+YAPbG4G)Q5VsX4tRU@3kOaUgR1n<@!DMc~=&GK#NPr<2OySH@o zIJtzPSW}>n=du4Ca};?F1sPe-TJyQ~=l*|0Am@kS*{R~#mg_^U#U+FuU&ysHh%+N0 zAt2;oipvp}1d%mXde`OC@K7i|2)hz1UC@xfR#gpuXl;DoH<uMz)(}E4#7#uQcmEOW z1rRta2hjEA&7R9Y1yM?V<?rk0?4&{9F*M)&EzYJt^)wS(IJ1opNayZ!ip<k(R6Kv| zALM=K`(=xGf+De%8b2#=mQ*zYwWWasCvzgpK}YhPyLLlVCXlSN6ZSvjU0J~&`Wc9l zt3q`rjuS;dA^}c*5B3Au;1CTTDAq2qqN}x?om%wSaT@89BfZs27VC8I=QUo8=KVo@ zs1e=a=*G<wt>S+y(mg9{A+RTuc=7C|#IbTf)CM-q)#lGke;H_rA5{Gg^R8Ik?0Jar zb2wdKa|7)wLGp{>RKd|$F%Wh`t=m_ez5e2yekf0f?=2=twYr=BFs0hRe?Pk;?Jf70 zS-z>^Ej>rj=33-W@DPEThK8X5U(q3`oI9;+*^u?N@olMm+Wd}L>5G7KL>gphTA|Z{ z;&4}SI$wjTL_woXBPOIr!nZaGt{X%wb{R@2(E6%i4H#AwaY}1Hs)g#8hRVtfE*wvm zbL|(Mvpk4j3kM4)N%mwBFa>xLT#IfTA+%fE<<CgI%cQqvhIwk|dSR%vycAQ;so<v` zhdwl#AfY5W;mb>65ng`wwxJ>S0Q67zNTrx+M#e@*KL!8ir0?ZFRiG!l(4msMqt$OW zOX8`K{4qV@i2CQc_iNc6`Fn_^_VS)>H&k?Zehc@^3F{(`5+h%P!J{C34pbC#n|Ivz z+H$QJIYY*uJpS3)>D(ZbS5>w&J)P$2I|m3s3_Tq`OAo~m1q8e5g^Tu737nEO6K;7f z^4(?PSQMc4#6_W{ZSjR73ViW{J+VcUg_ZULf>+eeH?(?vC2|4-Gx;YZ4%1T-Cd2b# zSZxHRDRdt&ghulG47zKm2@Zs<M9lYYkfqPmcxMQZI5VJFvM3x?dFr+XP8Zx%Aa{0- zv%LHl0o5Xpv@ibI(joyJn8zXdCSUA|&z#n0rT6vJD+&UNza@7Z*dg>`f2yDplfEvm zUom@px3BK;jF;NFlkaXVTR^5mh!D<rmm?D^#{A}kGBYUA&@s;ucMkLoa}an>S5jN{ z4h&p{<OWq*hGTO3$ixJZ*oxO4F@cre-mn<Ej0c0r6t8^r<Vjh3dp?M+wb!Ma->W1p zv>Y0sZQm{=EJSquwhZZ!NNq&bVZ1f0F0wLy)OEhs*M62#p&!j;+}ttuQQ{B~Q;??F zCL1U6GjZW|k@H%xBy0AV0@cK5DWdB~Yb&a-RJT`odHiI;(}$@eJ3T$B)-Rt1L)>^H zdF)_9fim-(O(ya21T~OZUC!kw{|yT;a~Zyhwl`-pti?((KCs$T%KxZ;ae$m57&5rI zs)K)XoudElD~J?uqN?Zi^sY!zx}xiFUZpAO=;(l$BsMClFYKbIHXd`(3B;mM<sSg` z62nsndx<tLH2l`?$(lK{_+HbYJ?p#CfvOjFo1Hm(7964~R0o)fmQ)xT4c{8G6)@mb zdN{FvsLM{0$meZ#Fui>8A0zSNr-%3LY>4r=zqi+NIC{^d6)rqY<`ej+8TjUZxc~x3 z=;#`HHfMM@5obLe;NiwlnsdJ<JeBe>{Cwa96r4$U1(BNhMV%7TclV)8E=SNY5D1YD z-1$H{*`K;Hp_O%37r}$D8X!<aT7UJg|4oXs@m0J3D;=bY$T)dY-nz+dZuuCo<0DzC z;i!&FEmjbnL<%t!JJ6RkGauJ2H092>n=HD$jDP(fQ-IZU?-h`+Rz{xsR!b4SHnvz* zPF;mMK_&5Kyz;-OT-R=}YTVu3r=QZVKO)*_Qx^Eh#P;(>YA;{P_zlw)6O;4cS8_QP zK^hk?4PkhUO@H|^|H$!Sp%g-9@c!cAMw#_(!xwaQA?ZMC4W-qfb)IV{SVNel?NHTP zA798QTU;ty5{7Ly;(drn9yHrG+@~xbH>E3<ij}2!avI<&_$PE4o@XG^0jfHN)9cwD zK42w&IxFc*D6fLe*}V!WGWr@00+{lLm{*=V@(!_>FQ7qK3MSabD0$HQu-C2=pS(Vq z*>KV>6!5DyDph6K;tZ!@`T8S9`KgVH@rU#T|E27rs;6W^d}GHuu1la<QPq{SxWW#@ zfK@9zQ~m+|`^XMPwiJy+LW8}yv033Ovg{dJ<aQJT%+1YB^+I}Zcgec3dboUJ6fd9` z236_uN$*X<rWmvB@dCGvwTySQ&cJDKmX1<UNlQxhxPLV_QR6MA+%BsB*?G^slNxPN zP7l7drp9l4`K5PTEbD0i7xaHS_w3f4-+D3kY=X$}{l=0CdX^VJLEI`r3qO>G-KXLr z>`g0Kwn}3ILW65jANU1FB1e%|VQcm7<Yq}1Dd($t363Y%&$9DOS}Sbd2I*aAexHsH zttb%!LLe5n3F#ch^ti@|y+#J-wRz*e#U$x+!#WH9Df&~oK??PoC-JSGl0210(N;6M zKAa>kAz`>HG_tFXQrC6+*L$hOmB26>EZychF1+d1VPDuYR#Q)i&Ck~qH8Q>@i7E_u zKt{K|P^0}a`vtbXrBFA8d-oErv_-HC$dy-?<%mUn1<C^M_QtZZSWda}4x6RLVGuE+ z%hTPn4&BR}TeI6S-J&`?`FLt{GzzVRUr}La_j2%E?c&A%*c{S@R#%yn1^M{?VjfZ> z5?e_=G{U7BTXU>ag<BCKW|9&TFuY48>llD^?|(+bcVK3W{A%>?x?78?uCoJNEIka) z970FS7IOp6Da?MoN;d5wy7{;VIg+GI&LB53GqXVGcEFJwsbjA}c`lCJG7Rf_Q(_m- zQFPsfA6#hu6@G*bK*(GgktB?`48IeRQnt$TVce0#;>+DKz|v&|0Q#A~s?a|+1a&!? z@CA>Rj53}_=zq~u733@ki?l74JUP&V=Y!##s0XB08*hot@jf)i;`L*D;@Vn1k9X%e zb*H%Tyb!l;Xnk`HSeBu-L`lMqUmrSh<CY_&>5cC+Ny3;3MnhUI3oYX;tYJ+Hps_wU z2>-0%#^#Rb|AkZ1zNdM0KMG+rlN1-fp{iO{6L1dHAV&1krKMs|H!`3dhvN{^Po&YR z!5kf3_x2FkN>H#=H)mUmJ*NvF4Gs>ap?Mjk93(N`bbaRT-n%eemTCL23B21dJ_j*+ z$m<eyZ3xeu*sm{xEK4-MxM9-fMU2eM9L(IcAiN?2XE0yT!N8CX2#AC^)j1&L<G(Vz z{t}4&U%c`>*7r9sfob{Y^GRSf#4<2}`9SI7?4#dA?0AT0&PJtAmTCn@fXdw*4u7Rn z`MyVayWEEcr5)WiZGIi1)wt1@KO@BmoF&sPbF2!~4(QDc41avvrOCkOYS5sJp2&qi z4~G~K>T2Zm*d`WEd)|}W=@V5Q4QpdeOkMU)TQ5pV$o7(UTr)8l2~6#3X{qShT;Y|s zi~Q-^{_B^2*jrfx`@y8rMNEJ{iazaZZ4Cxj4loNK2*58y&8)5MWz2<k`_fLai*Bls z7jYDihnb-iTM0`mM7PQR)~}?y!mCkwQ`E_lj^eii`=;CO=Tr|5AM5<DeAi*}?d^7$ zT3!n<@&7m~Eq6!uU3sRQStwI0zjwP+QCxA%ISd390+`}?@?Ti#-hQO#N2|=U%OIH6 zfZk|rWBc6xz5DmRTy;(HVj1cSw~L^vvg;<;^blOG-*+9q#45U_^?GW8U^Yx-*}+Aj zZzfXIReMk~u6bWL<@28mZ@G*Q-R!%WG_7`N!UhPq=H&AZYu^1{`=xI%!N@=y>$b<2 z<_tfZ!zoSEmLEpfU%>R))3Y<FPPXjJZUh}j$;&Zu2_E&n#`uau^UJGGp67=M`Ptnc z+xgqa9rY=p=%uVYkgmPi`;^AUDoT}o4;k4w35j}0gb3qcep0~!i4RYZlcQG$$-?*E z8!$~V7T-T2HSf6b-|5qolp-sGM-4dJb91(zaMxrC*iIrbi&p^pIAo{VJ2xdic_!#4 zb8zcRQ1B)0SC_g#@6pikPs?z^<m^`?*^ZO-b=5teNxD3j6yln#zVu$^$uN6VV&?Js zzOze8#KirSc^b=th22h@+(O<3aBzhi=2q;-kGu1<8c<09Ytciyygp&+R)%F~)67o8 z<Q3KgD;+(XJbymBZLRgF1H~c}T~9mJL%%_gbe<3PwcpGeZeQt_zgd(@GV{`&n86xY zBXir+Y^v?bO*2-Hu(0n3)RP3K{=A&Q#OC5kN>b9`sIE|b$5fGU@@z85&7yA<6s?a; zP;#_9Ps_=n6yWGIBemcPKTgLoeShiw`}?;O6=AanV=;rRl8rNQOh>8cY7*WgmM>`o zD-s{f9t!fCgoj8JAweUVqEeeO{|GHred#XJ)Y0{Upo!C&b?+o<we7lYtcd7Z(c%05 zd3W9K4sL3(Ct`cmj-HYll|_|$M^CQ=URw|n_F>A;4=0*1KC3%w8naRd$S2?nneH%W z1YjFlgC_=X(SiV7G2T`y-glKo)U?Q++~|p|@B6IeH&ex15rFOVEIFd1^lbYkcOEKO zW=QcBZJ=dQO}CrszUi9*!tA1f4qJ!b<@QDN;=H`U1ktUq@854kIR3c+r#dM(wbFx2 zi$4aBH4G%DXY!5-=cJ{bSZGtvFd~O(A~ZKd{y*XrFgJ_p{pI1d@|sL^^+w>--81YW zKCL=#-h+V#y|dMeQtfmvf3_{ZoE5%2D}2256s%<9x#Fah<%=jDR}cD0ok^P4dNI78 z@c7-~Z{ojxbpYTT@Su15FXY1+W}*Fr<NY5zi2J{KqK55smxm7xaXtbDtX`d=A8Dgs zBcC9@ZgZZEwT=D6LMzjm4#qt4S?yce63${mZ*ILQeXGTOj_=~z_mAFFb?LW2!uPUi z|0dYw97OiKqLR|C6$?vCjQ^C{ctr#8*=G8^IM7H|AsAe>Xk$^6hzEm(0_q?pK``S! zJX3V?NKKYxKZx56aE`oWsA$q;RvO@De<b=a<D}cX>o&B?_uH)~*)L<jxH4iJu};_$ za;~sp*G>=A6<MlHyhexe+hL==l_OvRMgl}S_LYaAoWMDb34sAU8<TcWlHS(W=aS9# zV1V)Qix;P%fC~&f1|$_p58N1H6DbyPv4*#OS3tZ_PrJSS^XJde-<B+ORu5(v`xeu_ zs~!pS6f8;MeW=aUk)rBne$*RYnLn<INCwv|8An<z`ntt{-eMf#Vx%_c#5tSXI<|)) z>D$gen;p0B>9g4C9BvLxr3V{n>Q=XX^8Cr48}DOdpG~<g`@{sExm2k8Z`%)k47PxM z)I*Ex8-7|a4x>17&E900JKRpTy*t}`mQC|{O}3wo?_FK`kIcu1o^G|Aq-wlpDw7(2 z!Nr=NIb{4xwVj;#!I$E@eh=3^L$t)T8~+^!2>SNjJNZqyJfFG<;ZVCC*WhrDNgAde zh+~ONi~ODqAE>qQ9B?>wmXV3p{mQ!c!q;~giaMg&T4?$!NfO47YMD*~#P5Q3_*&GB zX?*0qi3vGb*}53QxzT{M3Ca%p)wMYF=CtRTa(AQY&hZA!bw?@$e8`N8(xcVPsnne* zKncoftz#?EM<<u9nyTXsx(i5%G(z^%=?B~s5|}||s8w*C4X`S<z^{%cX&XO3KO9)y z)W{4U{raU*w6*C(=en#13Dq;x;oU3UGwX*Q7Uj-mzqSM!P$Rh#4Y^E%9mC|#)WXe^ z7vf1OmUgz&$uf$LjK5NjF3C$d)ZufeZg=Vfm98$n%*@-Oxg$-c_pT3&w`*l)9!qfx zr=a*zAF0sdw!Wu9bZh0)?8aKpM#Q;nkxLdUbYFto9^nSLQGGpdf*Ljo<VA@tGmEoK zyd1$;LFg*)nws{97WQ~P8z-)%xP_pF<0#LiOMMaflc(8F`{0DFuC2XL@QhnFyVOYD z$f})gD>htPQ?J)boxg0g<y+czqg~_=V7bJK*e~y%QL^`bZ+dd|I_Xbs?YG{CcWw(8 z7Yly2Yl4U8a$AQ@Nu%GpJevzIyekB_AAB3kpA@6Ts>d3}mUV|d;@%F2jyvEtL@nuk zy!g&JE;e@GEYWR7Tf6I%uhU4BhbK;eh)4vH&VZ}IwHF{EQM4Dn`0WcYcl7n3qh6Pn z_c_&rb85HrV#(4@bgIEpWTpOXad2pjdZs>kvO>0hQMcFg=Z$L*72MG&b=!{}d^puE zESr6h+yuJ0)9;d%nWd$rqu>S!MjaLnH{I;SQ_Q#_g*)8TfULW;^mL-#1dv>?OB}$H z085XNhezep!_5*&`sor6`p%|V^H0^Zah}om&q(f({J?mQ<04p(#`tR2-b|DVPWI+T zGtQl)-d9`wb?e84@s5sEdy&uvc?w^}<+QRU{{xnm%#`dg>%W6Tavrd#M7lCpFL6Yy zJv-H-AhJ35c2+pkG<!SH^3tniGjlUX6O9O`fD)+><m`@Y5i$5};1~8z7IP>#t2wXK z2j8jXA;&*{9nV8`zHCRz!i>hKgrku_{5hr3i3xbu`3UPymfVdxii?!>p*n6UE$Qr9 zuuwnW-cI^w?1jAC+1?-VH+MN*el_oyl>a4d@=s~rVpCCvfTX0gN=l4%3$vp_L^&6m zceZr39g5qRXLg-6zV3eMpD-b+BnqU`SN9^g!ap<gpz6f|)}FE2y`pmdSi#oj8qqro zR%WjT)Nd^>)12Y8>z@NwFTvmkt({|tv%>BduJbOhy%!cTGY4<Kv8-q}G~TXu@tYN9 za71aoy_1vfEpf>Jb8!5wWOu-!c6PSEzryQp`2hae+qWmsBojkbDqbE}Vi39dY_&7b z1{O_9YHHPc=$-$AAq8j?M3f2y=mE6nFoY=Hn6TuiS(2nr8_3g?EP5aiewdp^!!JL| z%6f;*dbt&`x=?IZe0)8<(4gwj{yX|N>q5%@l#0>uS-Y!Ka>zS&Ta%J1cXg@RJs=ls zD@`f;_VO}4z4gOMgU#2~aFXLDh-|S=t<Qwl4mz2*nUG+<;J(Y_bLG^Zti9qEG}zBO zSNHS}4@eq4WU7g;fo0|WzS3Qr3oXTJxwlVaopRY97B(s!C$1}b2!%yRKJjIO{Rj$) zuQjg%Vq)Wn(k|fEky9&S5)EFSKCg`Y=0528*4Eb|Zb_F~DchG#quf7%*>$DnoZ9@N zyrU~83(Kmo(CY{h?~ggbD+dqO(ZBi;rdjZo<kBURrlx5j2Wzd_E|_UDz|+*q?;;dG zuaMQ+ce+naLqpy%g)4+5Hr&I*!<VWtQrL-yOl0}}sh+i^Df)%nD0`=|=>@ikKwDmJ z?itu_9w8^cA|<t#Geq|FR3pROQ4u$N5~oP}C$W1D-KM_~=b%3KsY<(`tyD=txB}8; z__y>EAg6gdOe2@=;<6{<EygE%*&bu5-r`3A@`8c_l3Y}dB`qxv#FD>NdO^^UsFExe ztJnw|6G_QExD)_oudc2_gihq&4GkFuv1#%owX`Ll>cLELy?N!#1rOE1Y#3ja6zmEN z=LmiMl?F2)ZOid5vf0{p<L@u>1d%i}@bU1@HPgF(jeR)&a#{7NfD@15_U+|)U|sa> zD9Xzlk=aeLCs|N1kL$vVH)qc}yR~W`^N|wdtzJT<S+ArZ@~lkDL(k9L#>OV<#GveW z!6{Aw`~kgRZ~t6Qp~{xhQPM0E-C9rx3lDqo;$_~rlg8hx8L31;eikG|C(^XNJAUqb z9TZWCg@yzO#Fv`5t@XePcCQycuRiAGh2S^7)8o75UiBq6w|C=*QlNQv-6cxOS6Lbi zoSdHW)Gk}&_OCV78)18SiHyvem38mZ(z%4R!yP}Ae>`2g9ULx7KqA>(z3|cv+u`s! z8Mz8BVHagQU7d$aP4AsQ&x}|-lHf(cGmq!`=H@Qumc4SNH&!;?+*aM3ryKW_G4$w9 z*dW5zxHgCl2~_~MUffNNfoD`1)B<35!O@&_76|JZn&z%9;V7G*p+5r_WGPl#b%!3? zknETv3057-$xQmKTFe}i$NvKQv8e%pC1L8RsMuJ;w`SBAd3lL8Yxpj&0|PNiEJqWA z+33`}rs{J~wAd*bdY)(6ptXiH9#%jnC`Q3(IzA|P_Utn<k@ZIi<SuI4sK_MPBzzxR z2ote+CvM1qY^%~`;(#to@6Xf}<xb>EC>(z4N9rx<OKXU0TS}1szVK0lwUyxukj@?w z5R49%nm*6=yX5H}zojJw({3i4p&LU}gzdb%3A>|zw4n56^6Pb)Vdz>|DE&-&@}&K$ z?pFU8Vs-AfbDlWe19H~7UMoF@<xE0CVQ{QvC}r3?PZs7EPAOiA?a|po&{aF58V^KV z_262>LyZyJg@FI*0e5y<H<^D0n{lMt<jIaF&$EtPm%IKu+^#1oH&>1CVT{?*x8HT< zrv2SVWi;*K8<##-~8?`VH|p}X?ycm!RYfWY^JmbVSzUfIzk4;09Zn2-BTbY0hy z+WQTU+HTSm@4zXJqV*?m7s5e(4DNY%V!?|8Uf>QJF?VN&?nkJdoc2Ld3ijI=ZGsSh z7$RACoIsnU`ew?5zR3F4RD5r$+Xf4$AIQ=H^1hFh6yEGR(crDG%<(@QKLMJss<7`j zsfzC5rF7>GYaV;cQxm;j(R9Y@dNqt>Z_>;Y87(aAfE%6hbxOhc#4nTH7jbZ8{)^tO zgadd{(p)zjVL<onp;;^S)n5)UN<b%6mwAV%lHKtn*RHJ4%*`=BO^Um@actq(v4e|3 z(2onU?wGn&#$t`u36G}-+hzE0=tX@_%<zI0nzgmfBl7e@3)(&5Xcjkx9gkDajTE`O zqQrl)ZhYdVo$dGGVM(xT_jGoCqB(Yl>$bk(*&=@a5kf?)-OQc+kf*uo>#G<WGxFOV zI-2!Pa%p0~%bU7pY5K&chazG{pb`=NZ1AVIX>=S(GZN~!DsCiz0cG{H)Q$}j4>teE zR6fGW%Q;pnZ82Me%cMiT*>|t~JN`p`L2oQb0H-8*>v-jb@N;Y|o^5(Ao{WcYTZl%z z_KOz-M=V0Ld}ccHY~f+Y92|Y`UUXZPhw~l}z4XG*pUJnB;$9C8F+8x1u`Szuh*h() zv|H!Se$tRPeviMzd1S@MX99JZ_|2X4E6@1aZu8>R;}0q-!UP_?<T7qZTX|eBl(`bs zA)mY8C~UmH;q`mj_gN24?J$8?-cwDwL2qr#`-9bfwM`9i38i!5=tJ}{Low^j^&@Jt z;LPKP9fB1Cr~J(E<Hym`_9qPc<<~mg9wyP>?4B(+TkJa4YPO-rk}R6pKg6?ADt^$L z<Zgk_As_v3OWuy69-Jy?U0;Yl367(DxcJZ{^W<tvfLB}h-pYh(TDp@yQ>HyEDuY3_ zzX9x#kI+l~sZlOk9b!2|FCq(K+eHJy;v7NgqFDBJlrL?EDeWp&+F3QkV?(LERa7$7 z)f;b{*S{Px8d6o6U48v)|HrR|$B!@n9{ieTBc-KvzAgRPMoLQNL8D-Ux=4c8-MhAA zIssGOUeVSiJANf6b7Y;QKHY;dTWG6vu3)ap&VIC&V`e>r;5GU?XWLcE8l@)1>gsPq zilU0nHFXE7+F-VG0t_gHhr37OUlQ9|PuZ86D9z}c)-RzNWfT7bdj&P1(t*CO%}KmW zP49EC<oEMaCTUjDQBpD|CBb>9aeL~8V}rZ)WY~2J_2oKs{My^laP3{FS50SLSV!99 zjoP4_!Y9J-<zyP<JtfIN^mU{t*;nm-`;M_`%Mf}u2ZPizO!DUB$CZ>kYL<9=T+8g7 ziU<56g-Rz04;5NExT7zLZwn3On9$4qoP8P=TrJ&+M9&pw28gC%g*tW5+b7{~1^~9C z5Ry4ML9#{L6A3XWso#`&M>aAAF2(Pk<2EvC3)3!%e^i{F>+oLfHcN6aEjYPV{S|_K zQk6X%&O)=o0k5Ub*gM+a(ZBapBl=oP>PfpZMIX|41WT|t3zo24d~-bSAgTA%=8QJn zq1Xc^NEi(|9$mHJ;?dUDk8JA-=cA`z<QI&lqp|*B>TsSn*eyxBc1K|Z(o*XFjGy@w zO;XEcd_(%oAYMUVtRorwiMke(Hv37MNp*EwvUtne{B4d&F4YtvEHz7Bg1Up7Ym>!M zZk7y6#2NzOuNWN!_y>uh6obb?#&Co6Vy8NIDxUj&OG`@nt|{F5dqNGwIw_i5#+NT4 zjRN5SJB3%z$DyJbke3gx$$s4abi+vUDm0B$y1Ly~4}SOGF2A<h>{D{ZHRf1J_Tj#l z`;8Kn+jh+T`IF0ckKzqAPnu;rr|E9P4h=|8UhXfjw*DR%#F<I)<(2|j2D{F&n2txM zdhXt}H!}FX`9tZ4$}Owj-pBVGoGkXgy#Dg$nF}UnX2&W)QFPziD|I1HG4b<Eb<W=; zQMaa+%7Z5yFZ`q5V^C$*T@aE#RTK*G*nM~uo}Mi<sPVUo%xP$QJEg5XV`5$r-J)@L z(r<q0`h7dMfYsGVSi#+yUoAZ9dXP)I=<JbwlNOU|I76wEaSAQG7Sh7xc27jdS4raU z#&?oC?MW?O6o4waS!m$8tg(benbTny6z_L)<9zbO1jU<j-|mZzCf7v$@&!YlrknGX zW)(-`;^AAEKlQ+Nu;krIfk&oFN|#ks)P{e5HtrJOG&j3wd*AMdY5V2#9UJhK4{|%D zlqg9>`+CY~&mJ>6`$usLj+<-Vyp<awo}JFbcY^&PEf{9!mEIT(8-Sj0ftmfor`)}S z;}N(lE_G}UvAjAD#v6mRleMN)&f~T=wU~*C+@PQ)Lks!(0*4XF3o)@&zpttG_m_rn z-&?lwG~@VgnwOe+Y^hW%rn2&fljEHP#YR5kL(&u!%a<?T*1lQ7E-Ko$yBSMYgr!T* zXbgIDsnVSN-6cgPxwSPb*p<Cc_uu6!TnUmL{|meRp}z6Fj5BA>-jCY!4@5D2go5UI zWNOc?Sc4BlOoqrCMo)_2u+7qHzQ?{sam>Fk7ei}4IyMGv7o(pP@WA!KbE0~vxWs<t zVXkE}q{V+k`=(Nf+u+uor9WTVv_xL>XmQI#t!4}pX60)H!^Q)ZwANdt32x`PZWeU~ z<?C5k_$25`Sn5v27<8a<TAM14g!>Y-{Hb2f!I2!2exKfd%)WL4h$Z7?KHG0B)@Zi+ z4U9c1B7{3f|9pG#^}qeW?6Lad9#2&?HEpk5J27gz?F5^y{JTi{HOcD5@Mq6hYwE;% z8m}Zq(u=OH1&G9O_bF9W1o8{`o9RD2Hm#gEgWQOXcqJ`92W#c_-QTaD0cQH3J@=L> zW%sR?PR$#SJmSOX6cjd{_IFeIh4{wCo*ipVK6m+iAkYl!IcqTVj~%19p{DGKXTp!% zudO~k|9_jLJcgV%wxJ;*eS?GU*DcsZ&CQ29@(vl~<?Ax_EZ7Xa50-j;;3GxtWI;e{ zVc}hRA)_Ld+De<@`?U?%v{fbJe91x(02BR`<X4G}+Q@>qp`qUqnpX;z95w<1X%iz~ zV-vmd`1x(QeY^Yjz3;4f@ss>kHP%{PN4q{dh=QV}RX_dy={&Cg96x%c&vG7nvEOuz zJ&To-mlu{1$DpL&cfCf9$hQ**!2pL6hUl;T{l(Br+ocwVYP+>noGj*+l4a8E(*lXT z(PZb0O1!dIg)KU4;zxiV7m{{Wg%o@fJR)7TxDF-riFXK_uXm&ldpl}XB<<f!94zJ& z+2TvK%Sz{aFy=no+1yOzJfItoE+TMUDGFxOevVwoLYG3&5@j{AbIdy`QK>;GLi8XE z42I)8y{P%D_D%K23^%XbT8MQd2f@UB=QCL+2@Al(CYHvUDm>in{4|Smu_m6*ybTd@ z&Qg0n*8tCYrKzFT*6mZ<nK$zI!BxYK*5LA%L}@C98h~-E;Alu_oMh(Z?G~`!8R|vZ z_(PW6?Bf4&0a}|uE@%l#IYL4bPv6v3pO7C4nTt@@ugausm5W>z7<G2_et1+p@f0c$ z>YtXUSkJsVV|ZjGZVr1POu*(P*E3_a-&rrK)1*KKwwza%_<L7h`<?A?K>}z`SylB& zOJ{Y^>b0T=VON7ZJWlm+&kaTGJ;cQH;Jt71(6W_l^Y{N26K>U6SXK!OQrABtonKvk z?NCKqX3&wEA1dheGHvvanB%6<XF0if9`1wrHw#Krr00+9n~940w8yaOREIAw&*!A9 zUCAmeo%Y=?c_W8e8lt6?Z)hvAy#kQ9PuL;#mdv#P#MLU?fe2S$f8b(!#Qu55!c*PP zO>)4$fTuvRikEyGb!*YgeurI7lRaGMGdd#T#(52MH|o5TDp@tOIbedV1F{EFJg&tn z6T9pC_orX^S+-WBK(^=T==9x$8#4%KgZhupI4>-yJ~1PN@{%EY4Va+<bXYK-J-oj& zT-41~=6C*=kMEY<?J=Wuzm%sX{|}C>u4?<kNqafxvi^Rv+HW72SVGJ0t)Hh0oT|H( zm{w@-#~r5-ZE;txq_1q9fsrI!hm4jsb7lE;t|NEN!(aw4JxY!v4u6hiq^Ey}>vv25 zFVCI2H>nS<)-22q4*qEwIqQF=J!L5VBU945Jt9gc85yHIJL?sn=@|U^46lWO=ictm zp8I{09h?tohSp|wc8>4C>M@aS5pj2kPM&10zsqVtXK{U$2XlQV=_2ZP&uelxPd%bj zQkuMZ9t!mn!@tQdw*8VGnw0+&Za2FT#$RUOq<xdzCnRM4f$jS}tB*JL&Ff93rT2#} zj9t*olzKf8*~*)i`*}OQzG=1h@SB7aJ+IJ>kw+d@FuWCekqNm5hYm2EKV|YQ)*!~2 z@;K$pRO;qhU`_V+LLH8E{Fb<%Q8Jxm>TG2oKc1bfEYkaO*wUb!{T1yAvx0R#>QF}> z3s$`v|C`p0RbLU}g^(q`w{NSDDhOS%vEc%E@g*r|W#P3Y>Yx);)Q!!}Tv0pjg5&Ev zTXQZ<(C!eJZV1svvefk&0%6$KZJlxBs^iV2#YJmmGr+IZVbD*~ell+u>g+E}D=Epz z5`Ho7lhzgWt^uij?{*50qQ1)QVmkP@-rg<rCPd<a3Wem)q$rb7#l<eGJuP#?88hYk zfExUGYF=xQoo!neA-8ecKqw~qX|+;Z8sVE*w4!(3ts$9_SFhTNAF}bYsNVUYa#T^d zd|=_A8aL1T)-jKo?CH0f_dnk>xP!}hVAFf)DBVf<JBkc&8^RY#x5=mxeB%-6ORslY z4>d&B|JK9Xa`J4cPh2ljYE6oAZJ?nOus=L@`j(4RLqr9k>BvUHE#=VAqe{x|`qy?R zG&Jb#YGe{Cnf*=k;#Ev@(~;D4&dub>9SxL!;BAIgKA%%sZ~Xs_7?{Mj#c9eMm=)GO za9kN(MPqMItT;oStj;;HHz8D_1*^;vc%47I+)u$uQ|O!gIVr${PN0E=Z2pd=rO)S? z<>py*gm`-gFd(8N@^=AYLgV@w(NJSdJz)EdG&VQ3KmPoACf5*`V<@PeuZV3F>_|>~ z3&HIaMuzZ8u*U*<dU+kyFx}3oQ}7m*$54G}6)=+5GO+<Ng2gx7wqs0a6Fck<Wyw*@ zX!jjF6i&|8O3Y8YeaNh~E{2KAi*ftrF?P*sNVyL6p)Iqz&m!yQlz(_-()K|GgDAbZ z+g6ML_4}FzANrrk(RvLu&b8m{3nq6MQT};evuM(qtJ(ME94B{Oc4Ym~8t+jMeZ>@a zNK{CGEXkS932RC{@1B#TPs-9xDBAq@uM@p?N@nSBrT^3x66N>R)iRzErB`~hAKp7> zSiHW5(LmolIyFkpJTD)JC{IP~r`zqET4Q7F4y%_*O-*;U7x};Ks=FKXfb!3cGtB4N zSdLc$#shBoA0#$0zl^mx;D`HMLMqk$N+wK#iPkvp-a(FwZvxH_=@Ai~y8Y%MYpWce zSIFEZJDkb34YM$_3pOM)ycCr0Dsh<%O<TI9Zzhx{``FLFqphtPHqa&DVmN@>kBplz zew*hliK?WLE%C3Xo{>^~Xf!o3zZd@6Y<OrW-D$~!NGA=LAX@i;!vG6HaFJj(m~Gi3 z58Hcm?wB)>R=GkB`1MgQRYI+=WD)gAYAGq1_qj1@Cjw+*c`NGO?%f-E<Q!*w<4s7- zO*gmAnck;$7Wc~HQ+yt+I~!>icz%i9)f_}|y4IK>Q&Zh9&yoAh+;FpjCE?{eVlrPz z=EvRmnvUhg9#Q?^_owi4i4XoP*YhDEGk5h|eeQ_rp&>#LB7{DJRq1q_bjz1he}P~> zP3oIpB=usP-G=!*Y!ws&w{K@HxWB#ikLmiJT?NH)#-+oSX*uVRM4PbNQYiSx&siDA z-E#@d_$u=U^JZwSe>uqeo|hU^gY*8!0>jwID`OPn4{r~PS8VF)sz(yi-h&6v!fF8a zHAy#_*?eKfObSR9|EDy1ZD{xdYIe@hDU@qAoz<VYn%d-S%Q7q&bZ5@s*QctMA3qLT zGrNCkIzKKuaWTl3EfG@lPgN$3w%o9+*^YDSywIWwsYoqDFPh7hxnX2$n3$P{VO=1x zgev%kn%ep5Mcj3u**QawjgkaG<;(2^*K6QP^ti6EA!j2BCf|~D4m-)neD$i{y?r~4 z^fjUlJkjU}#|p*({g@h6l$AXNaTs*+ohz<0svJ%2T}V@kx_AzcZzyMdR#x)y>$f!> z1zIrYJGl20e1vW3>4#cd2W<Ox*ici4H2-}5!1x?RVWC)~G>PN;s?M-Oq@?f0ClEaK z-$H@I4}JlL#<7`%q<+;4@lq@-02x1}rhPSmD8r1f?NSpPCyx#7@ND%}U$BHc81CM_ zshX@pDqL(_ntg}}=lgXWz4;~e(Ul^`Q0jJ}^F1MSbTr^TUpVy$m^=mwdcRsd9CYck zX=#b`z^?WeXdzoFpEEf*39zw_aB;_0{Rl(>&d$eoJEr+_!IyV&ii#mNMKqYvPTf|v zJ^!4#!B2F6?JKtuV0AG(37>MMPQU`RlF;fq{rWyDTUBxEvSY@#d&fNv(S9f>2qP+g zj~|y16Wd`-h@hRjgkc3yS^_c#G1opFj*l2gKl@>gI|?UxCuZZT39(^YM#FE5Q&Uoy z;Hm(PHjkP`Za;rMNF1AMQ!6lv!meZ0{4$<E5T&b>5iNe_JhtG7>rWB{O^_px`cEju z$<IKgd_!6JO!Z=c!yHUG`q8K|!W<YxR7K?FL5o7~wti_F5`F+pf@aGccAY&q!)5K^ zl~1A@^Ge$Qqj-9I8<srT1!ktTjm^x`(r|oS#F2)4*D}W-c5NAD<zwj8my;GxGt3XM zkHE%;2W|Daco~IZwcDpEt_R)t)4$`9pS(xB%(H@G;ytI-@?Vj!411g^yX4t`#&f~Z z)CC{aZS4kb-K=38Cg^MFJXeXkDw_NCQ|nmOn;EMNcAl47x<iCWLbRwuAo2@{hgUT$ z4ue6%m;SGkUfoSRPHa9I7&s|D*!n*GJh(RAUlF{p5;U^#HbL3smG`s#gI6!zioc(l zG#E8^yiUL_h-lOAF+LZ*m$$6m7>36Cr1wEUw0DjhWI4Mmj=rcq-e-Y>hQptys$7U5 z^D<7seGrHzeq~`O9t6c23@$EkaL_NF!10C0y)?w;XfW}DkyBCCAV!lIyN)gdr6Z99 zw9Dr5pFe+)a|SPr{V>mEQLzJe@UN@+(uCc7;+n%^i1ErqLr;Hi@5Rw!-uv*J<-GTk zRX&XGboCM}KGgE8WAE2Vtyq|um7~r94-X!-U}+dPg!N%Xqhn$QIomf881Za=3owLM zkPLfptw+tG6x0$h8+#AGZuka0*+mLUiV@7B<`)hsoAW&!fBX8O1)n8$fg2b>FMM7O z`Medhcu82aH@Rn7w%?wU&HK;1t<Ub=is=UXFejgX8`5a=CQ#cef)0|bnfrGy1V&tq zZjPe1D$LioMyUVNcHUawN@Jv4-&f?C;jOb6PJ=x1NtyYG{}CyIY-D=MiGNF_dNpuz z-^CzjvWdCmV5t$>vk&T(WA8XT;MV;1?K3<35rdBV8T=7a1QXu(TyMaQIuf`KV+O~! zW=^TIOq{Gl^)9tg*$mqDT+3z`vtPM)F<dEf5rlS{NcL$P0QD7}8HS?p^ty8A4g+y< z%FENB9|6_wnaPrPe0=->@yj7CCQr-tR=WsHfO_1vgiW&?WelCp&kYlXKUdL3r&!#! z00TcsE6*PTGB{mucsUbn!X)oHjJg}-!{G+uEmn);>NqED+2+)w6s%v%%iV2;8*VBq z+qS!|AyVe_L}yu<erIY`R~PN0rY1$qym$5Sd`J5T*9th%APK-d_Ij|QhK4}0OOfRn zjBeGocPKW0lEo3aaoAW}dz421x~GH!Sp*t4`$g7O|0Bv8$u|aW4=yxJx92u-%Xc=j zajH}BbKDs#HjiC*=EryE&f<m+=t!I=Bb%`IKYp5|x%Xd~hJo|AXOr;0O2(euvbUIn zR8*{&Lb&);l;OZWLYt%|JYQ*(DMe7jr{}Lo-?$?v{q4-G!Z2Cr6sTIB2YhK-MMgrt z*$;N4wK|-SuCa4=7J{iWuV#)#_>Gv3(htvHzgGS;c5ifwxA;REri}MTzMo#4>Jd#& z7xu@qgcv#o@hvhMzDF{#Usxx!lBu>_XYrVT?sF=0ld~EWp8ffDQ^Wv0z+4bZpJ!z~ z!_Mx5FbRDA7r2aII}qS1d_9=`H&QL%V-0e1`Pj8`zm`5DRfk}nNDM`=1Jp>6p#vH2 z#k6z?1M8d=XI-<Z-S(XPAqhW}eLUO`1XvO`vhuB&8#U^eC7ylCBstr9CR%Ihz^l$2 zb3WI>1xqH~HE|=66fbQn?Qt2%qVZu-brFpo>^rR#6+RxJJK_VJDTYGqUt65wzFcp8 zP)oXqh+HVDOWT_=lbYVc^yGw03YCS3q{=9*c~5rVa^vCyLQE(D-K4*we|3E=EsrG; zO?xH@drP;c#(WR7<ci=ZCF#<6V?`c50hccML2fZHHRaYa99VN%T+&U>)|NXvJDo*^ zacW}XH{u9Es5$I?&8Ev>O~w{MYtUH|`BzBoR2pgs7fh*ogTy(k1af<Jw(I2HKaH{s ziYi!=q9%z2gAj_)*GQef8_Q8Jy#szLb>RHS3~~5L;qrm^Z3NIWePlRcd5E<FR4tgf z-99xTbm77aTrrwD#NkZZE*^Tm{}PkgUZ!2NJ+jYF=4^(h<|wV-ev8~8?Yq?V-|uzZ zsELSg74{1ah`k<^Zd;=$(-8Ffb>M#x9TUBC_+8xt11=z8Wg!38(!1<UBDC-6c|am? z^1|0sJ>+r+#VLbdr`cZ6aik5}wF^7^(6Iw23vOQCyVSC1sXIDk!zAGh$GICH&(}26 zUrQ|fA#U=lYX1j@4{y1gK+*4-x8`1XXl;FRfvEBTQ*Q?e2}r8vE?gK*ApHJgTAps$ zqFS&I#!<hQX9l3yFsQ7~-p;|nfrRtr-lt>;O2|#H4Gs#j9;_yZ!`iNP9oXC7kDq=Q z9!`r#7ra`q20Y~B%1TNeJIoEi|2|GO*8|13`&>h$C_P>aT->?$`*vKsQSXAd0(@jL zy!t9hY9%NSvDLxQvMijT*u0lg)W&%n-Wlm;?TDEj|M+_yXiFW$V(qVFPoAVkLtg6J z_l{d7a80IhywMd11n#NkSpjhi(axa!zU)qK$f}M>?}z8v2=oo#{jSEud^}7}QDQpP za@2I}e{O=4!1UbUA4h!sM@RYlJ{S(@-6j~*yYjbhn>WoW^^WT+j+V&l`-Y#v&<l2e zGtt&$^JL|9J3HQ*yERAyi)u7+x61i#AucICFfw9aHuSLYQuR_H_2lo3E!W7U&2>6@ zmw9rSf#7HOTrX0H5aJ)bBLYbS^xrn)ZJ(*mbzBXpHtvT97+4wy0?bLSMmIcHMzLWN z;V?v{wVUOhE?H-1C-V5f*~&oh77Zg~^vz+?y|dbgkAja#wdPbo1zFF=#pJnAUc1{? z?~x%Qirxxo1PG=UHlG!qpA*#R<BC50=3ABjc$6>gsxjizQI72)ql<wv_cpYcb@g>| zzq33$brAW`J2@ne(4&3dc7mdx+h*mr;jtJ1Mv%Du&TgIVX6qhAj1%GR`<hZq(Y`|8 zh^$Q*qd%PLuE#|acdMwru5N^?so2Tj%kp=ZPW@PUpT#Z2N`P?Zx;`U$I^76UzW`rR z{@<y3td34j($d#YGqUKb`3@Ui4<@H27iMd$2=S4RW8AV8!R`CS@eA>BLAE5uRwAn- zjCj?-<;wfu?D6cG+_D2GRYVi+NpYH!6LoJUY5*Hp!9)P5wuqYo{>RH2uw!=)hrMI^ zor;&#j$8%KE3=7{RA7=+v{nUYUAmXrW@^E_QdPCpTO_wM^J^>>$_+_?n;_yfv-dDk zsZU!8`I|3i$iy<>w4=b-n?3<!XCh6q*nX8#?bXe4IdOvz==W3{Q_5|gor`M-W4IY2 zrKw46K4CuIQS1v6E7DWc^X|l+@A+E-939GjJt?|TEILz5TRa#pT2zL#V$O-#iIH9@ z3BwA*0mkN%Dw~0Q2ra3ps~bfA3GN>flJt#nF2ZbRu&a&snMB-LKLX-oj6aek9-8>l z_U3K%2?|!VixW0)?;?m*K9XPV1E=55Y!$uEh6bNtw>3^Dk&ZIoHMe6;4Z=b~#IzAo zO7?<}!xNYR#4CTeasIn$R!*Q9^$o7H_tC9mqmz@BrKLN<8$25t=wg~`e>;5yjZ}T2 z@MMVAbDdPl=oYPwD@xTLy+hmVr>-q-<obd(^6udZoyId~0~LZvhv{>j;pdy`v5J`8 z)}edCIo!!!vzS2;^2*CQ(MJ(N2kQWAD0>G-KR4#c@<DNS9oUW{h}^Bsi&I@%S^OA_ zkV@zOKsue`7>^z79UrgTa-J70n4M)Q*qH3V`dqaXI4BCjlWLcTuwpg<LO$o^iw6&q zm<J&*X1SudIM*UQSuvh3#L7Q&{xalm7bnxJpMm-Sf=rytA+CcUBOqw<h4c%6lcWQ1 z1Q35N(O>vY^RTy{Q<3QU^i_z<@$iPHIWH|NKtBo<a)F^?zHT#tj861BUp~1pyGu6M z<=aOlvfk&lA2J>`HL~_*gm-1D3<oMPfx<)H*SJzX$eL!o%U$L}`s~LfyXop*B+X}g zR67K?6u(FY+{b~`&^U>#_``;pgU|24dYWKLU!dv$hoq;R5|AnFk*k+;&RC+Rp{058 z(zCRye&c@zhl5PL*&y~HVjCYLy31MSjKAL9py$j*jFDCMwdCawA<-)q^ZOI8&953b zHH3|F$p7r=QTWH-^H@0d@S!!60Ov{KuvEk&MCzs$Ir@RiJly;BVH7Er)zP?r@|DW{ z36NxI>;^kdF`#tJNiw4znVe!W);?5e>BIg>MWstk{Xuhkdkt<VL_!9~hWAK;SsuY6 z<aa_E(D6v4uV%LB+OToK=Fk{0^Njl?VmdCrZ$-4Nmdl;(iFVnPRJlkmR|g9@Wbd32 z5zz@W_oI3S!s$Kd*4}}Ms}JRQzA2xDO!M+(p6Qkx-Ak5}LLV5T)w6Bey(1Eck7V_M zq3i$)lB>Vhh^MJ)YuWzWpi^e3%+(m<kxPtj7^>np<M!0TXV~h~-ugWDCG(_WVvB*1 zvA=&1r<v|5`U6iNPoo!O{&yqGWDQL2QISB>DW=;x<JltqTNC@(&yNTMVKR`DX{K-t z?gV&th|O$!`%NV!o2!W{V1>ZIb<g7Ir9@~Q=yJ^5R#)N*R(^*5_}KyjpfVWk!KbWm zg)(BeKBs%IMOEi_O;uzV#mZ)_?pA63)(Sg#J*})g`muq&>rPaTuYl1E)&xKsg?Q;* zkI+?dY%Lnz%$6`ZMx^*H@97;Ixc>hreo>n{wpRb>=4{x-{QV?v^2}p99>HzOZDpEc zebcTuQgNk7QIn>u?Yop6@|UsQ-lGH9#-+ry<LM4Gw^i`riazIK{bl;{U$(Bb!-K(l z@N#<nCP2d4H2w8A($2-iWiW2fA36R*`_s`%9I?Fz4^{LK=;Lksx7<^hdgMvN!O$`= zGWyW`$9|ELOE=p?B`xyLoGa{Qh)>`zqon+Nr{1}Q;M?YU@;NdOv>AIqO2f?`)o400 zIzg3V1_9{i)W8-sQwQ1BpdP+4Rt|DV7#(;+SX#wlH~q82QZC*(l1119Ttb_BTtr$3 z-Us~ermCu)+^l(ZFIDnF@OD76*P>5@w^d#)ekGfY_{$zd(k%TR$vqkxn&P7rAy$Zg zMDU;bK>oGr-D6<0W@iU=>5dmoWR(1y^bBVQ|2<sJ)5B!B!;?<-Yrd8+=McHOLPs@9 zH&NMqF(NWjK}##_R0np8(30118$={9G<oh4-`djhdAL@XkIj}rfb$*rb*U>4pn?ZY z=*CCpXPNT7**&Q$u0=EeY2o^=2aB9n=v6?@L+FxqJ>gQ2Gh9w^NfI{t^QbsFu;du- z&cbaP#-;M0ibE0B>Z~(IVRHg{%%M6eV2|)@qfsjI8yOuL&9m^c1c~iP>shp*0{H?} zY#rbq;Le8;05L9jXZz&T)G+3LD6>Aaj!C082E!F=bSPjd%Fi-SOQg@icQFrU3B4=E zk;56jq62WV50Dq+)mp0j^K~1E-v*F>y}xf^s?PFpINc0}e<NCj7WE5ZN|k}~_5<UG z5K*^HcilwKYFkJ^#MGotY`?d|{mVJn#9<gR(>_VKuRbUyt9(G7RB}q=^uNmDv<xrF z&A0+3hcjo-S<UoI5S_!|bb;9g;tu81iX^Y6(m2k=LvuqQ&{MQ$gV{^`6=QXa%W(re zv+-Vx)zMa}A9fNk_M2lMUKE1`CW@*2yrRJ|gJ+_SlYI?qx3L)emW2KsTUlA<)_#4A zBSF+SdhGCJ!wW@MsV?-4QjM;!1{X&(rkg{zJA*JOqA3f?Cj1&;`WdzTbboQG<$C+k zFCL<|Hl<%%Y=hPf_3bhejp`sn;<uZmfoVmsgxEnpOH{d7UOa(eiYp+<>wT`hgQ*&D zhS1k$^awg6BK+_%xnh9+_W~=c0d(iV5+m^LKnCUz(x!-md9?8FZ=AR9Q{_0|<qY7M zg_#8iILy9|RDz|nZ{PmY-$idMYw6ZTSYG{H-T0vs4-Wht_3jQvPqh2I^km@Y4yhZL z1t^UZ92oSbA5}6@_a)$y-ivyU1j;y!!w#o0J;FmNZxj|&TpS4}c%l?ND3|@T0K;nb z`1HROdeNcr1x&6ud9uX;Gs~lu6XWB#Zp|C(t@&FL=H?Ub%?-#ac^<2NXrehhG_)2D zJgLkbSE*KFBO*eeWhQEU6}DC`cxh7{rKJ*1IsO16ugoiVEiEZ4Cnm-%$LL~OxLdF? zVX1r^uWEi<gOIoP(18eLWvdS-2G>xg$*tMQo&CQ}3=-;2!AuTW4AKi`ypy~`kHhxZ z_bhMd4WRH&(kXn03t}gpSTyT!D<$3~babvEL?J1B12{ttpx8#KTY0uhU+>PHCvYGm zzBD<P6{NDsXa$I&z~HG>LP}Oe=X4-hr4|ux+kp$hSXqYwiUK$n*$Q<1_uGJ;9$Or( z3DHW+B<q)+pXF2M;@LITw#D-7o1)PHD_RQKy&91TQ|V(7C??US!!3^GTlRMR{GSym zjAzd8G)(Y^2oaN55a7@AYd(QR18(Bh*tapB)#4Z74Ty{6{i9P+g&$$$kW}yrWPl(x z?Q0<W%?-(~fB8p5nX}Q90b6HSwvX!nF!dhbSoZJ#cs)%?GKwg&qpTE3c&wIDN+d#v z%BGC05}73<dxRp{WUp+p(n7|aP2o1O*Z+0(e81n{|8pFl<LP)t-LCt6o$vE}ov%R~ zM0@wH8BHz5X^)Ug+o!cL`?5MuwYkqbX|$^u02`vegwTb-;o&_gXU*Yt_<Y26>T`x} zWpA&G_AJY9MdvfgVGm1VzHECU`9@1{E;#14gfHlZ>JDi|{I`qK)AuL@x<LqWO9_Yt zPR@&0dvVUqe~ueTt*x!Wl9Uc+J<z=TKRC+DYWlqt;iwRI`NhkZM6lYf4`9K1`}tJ^ z9tzV%oCwbCe_7hx??<`-D0$2>eC};iku#`rH(VKQOCZ)|C_Tu2ZbW4O5PT46)3C6k z+?XUm2L;a{qPs;f-rx`ZPl^A_1sER275qdcX#jp6@Le=8G4X}K6hb$tqZ;XilJf;w zcYQgONJcMNUeVZwjc1AiI4h|oN?}1t+#H{zU*M<1o0hT6#LY*-E(bR86ai*$u85C) z*G2J9)y<Fj^y>0|m<AzVSJRe<Odeg3_bz{?h1{$1gAd`rS^Hx&7nO#(@y98RhtIK{ zBODF**ms@VQO7KK?Jt7=yWWha2e~ic^nCi-&FR;9y=yPa{^$Prt#A1)^z=caP<;$2 z{FCttpbyztGqfUX*^-^iwQ;(?c<=HW8s6TmSfgELDvq;L+1n2NKOjhf-@Jz~0ROs{ zQs>m1f1C&)45W{ev{Ppk5f-k11qbe)tVdr?fgD7jDNz5*%Wp--fSc2fZOX2>&Wv97 zm~pieHunVIm;(`;nVa@<e);;9zF5;1?Lcw7Q)F0}P`i}?#-6V_Z?P0(m9X`*C|i08 zA7Dse99F06gkcWJ_mVJs$8CisiTl(k#z#PRu3o<U2m}(OwjCA~-Jg4-IZn>=6o^Z- z-tyPKp1ME!!g3tIaw9q@@C}JPfSbR`l?@FSj?CDl#r~fDn1AcBFiHS+;K~<%3&Na9 zG?n!4bxTI?2JgYxkF3{E@Sl>yP@7VsP6OHHu`W$Imz(VDUmC7!GS_g`Y@s~ILeROM zh4*p)y@E`vy3X6-%OiT>6QVl_2QXRJq3Oh!Juk_28?!gp*BeNJL4*qd>~zKLr+x}` z67+VR)o;F6_eTqhiH$tZwcDNgHi;`JItX5o1VanYIs_X-ILpYHbiJw1gEbgU91WHS zg^BmOB3}aH1JFyqkAcDfS_5faX{=4%cP7_YUw?mx2FocnUf#Q5PRwuLzI_!RuiriL z`~7(J_Q(s(uo3kD&kFk<cJ{4HqT@@ru^F$GA?XtAS7d!$y?IrVt&@o0Ci214(x`NG zbz|)NDIjGayx)-_V{dQ2bF2>r9K`p&31M6)V__$M2cE(TEc5OcZupoZ({==J9tKN% zkI)iA;1rutz8(Q<eSi}vhFl2j1O*x(z%!VSpj9>{<wb|RW$c^NrPK(rfG?F45@ha< z<(MH>IFTxHCp86+O!$XzH<3#9@Gr(HL=**kB}ZmfOt<k_dBY;ch}<|O)xaRJOb=|B z9zlJM;Tl@bdzJjle>*dC0dt2jDUFAF&^=MkF}MrkvWzRAF}xvF@yN+_k;J+yfE+i& zAKHk8--kzoWmBt^C5tHxNfU~MfU|hAz@#IzNIm6{dRzzS{}4q$K2eC02K~d<+yB5B zrjl^*f#40E6LlXy{@UI$IZS}!2JrGnKKaJaslF;y4O*B;00<No7AA@if?Ua<rB}<# zeiY-qULxUeK^sy_>6Ok_I6=!Ks|ALHfRDWu{N_qwj-leL<N(dQoI7_+e>&AHQ8eVC zy@mSF%~X16Fv!i6VgLSJb(k*@w|zv7%iqW6pMrk&C>RhdAesjBSP&rC{?WO7`7piL zQ2~KOY&qcJB16PHgT}*+NJI@C7muVEr+eDGLj$*tElJr7?-t6<mZZh0W$E~{35O2_ z=JI8=N5EQm1U;c(=`S}9IN%E|)Iw^xXXXn<O=d9X@$J|o{@jgGUH<7gl?w|y{?@4Q zI{u?Qw})<{h+yrt%K-NBcteu!EN#uyt8i-^#J~iXZhrZ^jP_l`QMV&K5Q}4rLq``7 z6v?rgo}V8I0eJ|&rma@m+x)z|K(KS}SKO7k0uRya6QvPeLc+&Iui<9|@ycO1+_(c4 zL?owKD!d6agDaiJv2TEL5%*`zIg8gk_vMb9-Ec4imE2k!-v!~Gg54isd1Y#P4D$m@ z_09cDwqXPR-qpnJLIR}%kgp|rOPRcrOjOV)V_pYc7bqkC$UZClH7q=wEwqs*cv|1f z4WDn<$RVaU)`vRLDq^Xv3mLl0CoRfXM9VjN$em?oEAQ(U0IdvOBCmNnPL_EdYMlt1 zpE!V2R-?u(T01Rv^RV$g?hn+*#U9=n4*Svmk>BU+&o2hcFDl3<Vxhw<+M5%A?J4a` zZ_v&Nfkbce8I@>pE*CLEwb309%?8MGG7u!AGpfXAI{^C4)>MkHkdRB37s_<kCmNlW z=0Z)KO@C8$rQ9|!t17i4HD2_8iJqL!-DcG1p}c)He<^i#X{mDu%VowFTZJQpB;nc{ zcPAVaz>Rr}jatct?kYSMfgtkOc&sF%p{^1O)tfgDZ9>bt3X4Jv_WpJ%OwYE1_=RAV zLi=fUgsMQI1Jl`4)`MP|JKzR{JAjdGNJ3g#m$5ixg3H#{78GI4y}#i2g_{}3T}6Gp z7onE0vB7FUR(E!E^bRtO?X5<92}p;4cCHGLB1O&hztk#UwJ!7i35&2Tkt{#m``t5* z)iI661gNN(Kfj(JV^~Y<2`9VkS+TT~-5)}nV=>RwtNP!c5|BVzEk8%kwQtvm7GF($ zr-5~$_GpHaBr3$eKbBe;>~um$ikOhjYJ@~89PK?_I~<N?ywx2q@B;i~?vlRu7UJys z%L?zp)&tJJC?uGq&@qCtPDG6im90z;0JkMx{MWBJSscfO_X}tP0={?amdwM4r-2ur zSsqOwj^3OwMlWcuvCuh-FrmM*A`!K{y6ObsWoL<l2>v;YWsof7kMwXr(yVyNH(uvw z`#qH@6EkDl+k;hGKy>sodG=cawa<_<gs(&TGA>PUb+M}8=Ht5;=Cpwse`G8vCg%83 zSueg@<VT)YQA~vU3!|8rSW;5b4lMDZZOFFH=2pwSiGBoxq}JgTQ92r?$A4vcZJDXh zPL`P<MvE>-l&G`j){yk3C#T7v6IyjD6ygqQaF=@Dul(K1`9(fX7044nX2c7{t3I38 z?8<82QROla*Kfv{kD1JyC*~)Dll8$bMZ2c0S~RyI?P$!hU&EnnqqRwBd`0CS&Fev# zLGIB9whNt2P=97};`<L>EnMErxxTr-@@=!yZsg_)q&>LswfdNmmEu2DyH{ck1#V(v zzD2RJCuep2-{*cW+%vbHZy71F&MmQN319fRX~cyzQfQG7@N|CrnM0CEhUqXX?Y{p- z`OHGM4Y%eTLp<V7;e+tGvs3)u*#`jKfIh$;9shH0CA|=eO;rzRW2Bvtljy<43YIi* zEcCyKx`Cwu%r`#(BIz<OR_@?(U2Ujanx%9d_K+_9V8^;R8Qg4@jT0Rl{1SKxm!azx z+^esyyxqBLcmLP1tA>U~mNQ>3fYjIUu^~RQV9H0Z(#OkhAHJB$8_o=9$KK}Nd(I-^ zgF_5cn!s$@tb20!0t`b$OcWL%_PA{F?O?_k0b(4A4^;@-8+v&7sJ|ObQti5JJr9?a zm&QvmA1Wy>Dyna3PAquO7_GwNC%Ef|`^C6Qgtjpm+fC>RF}i>5#rhvtzk8q=DxOXT z>(vY8GWv)41bswoji(In$%|QPmb1cx5_eQzpC_xR6(egU*xWGFyLyBRd1@T)OKJmy zgNE#HS5{V*dKbz(kvHmP02W&z0zI$ex+9mZ2#`w_T2lA+Y=81N+xhk#oA>bIp(KVe zP9Clt1Q^{ijcGl@qP=pM=bp-ofbfd&9OKd7zd5c(LK<2ToX_m-<;Q@QVX|<R<zDNz z`0sC%Q{U02{5_EA{}@G&vXt#Q;|}_3=B{HQdN-MH@8KDSUQnOA%xZXH?5EE|eW!ju z9aW^gapPi(4`dID8n!SF_SHTBNX>g{^7rp5J)xZv>D!-FR9_yK-Oae;tyjjs+~Jyg zRzL<p@>k#JsFzL#gMQXiY-}r|?Rv$ja#o(Q$v6vR*S(X9qQ(m}Cb@Gf^^V~e7<X@< zXYKYERa7+T5_?I3r8ei$Knk6Me)8-G=DN}G&8+Px2j`RP-m{1wHn~{yyhvB!K`0`! ztV0BEN+rM9U}q1iIG7>cZP)6|{mrQ=MfB;rrRsN71e>R`BGutD<QSYHM}s(qNb*x) zRaCsO6`g2lp+6%jS-6nym<(!W+97S#_Obi0Xbw+(+xq(5V`%T;=u2e8mY3@?F3ir! zy-^dkYw5ll)syQBkakIo^S!5kv-)YyLj^*2T)zMK;e&u5&?_P$HXl4xEMPU?M3^XY z`G&p{8$Ixes%dfb--NdM$8tM98Q#5f_byFsbaa#|H!lShMd_=Kb<uT~^~IGX8)R~S zy>Sw!nFu9!B%9+iAOf<)Xn<b9NVM0cRI}KKpXXAve445a@ir_k<9Bm^_bhBkSpVDK zqP^R=)^`$6NF23;{ot3&thlh&PPAIiga0UY^w)v#15t0qE0FvLGkor&zrJX;e1}k3 zM}}p|V@bALX!oRHaxkA$iF2ZvIr|f%2XY%g;8Cv`pPj`o2!UV!9qwB~jP@L>RQF0v ztdi}74_KI))%5CIRBk?~eX~{HM8byLiXR-AEXzBV$9|KUb23d4(o;&^J22m6Uf0@g z;bXi+bv7ZO>fD~7@Rt{^UJVk$V$uus)Bet>D`Si7LvH^(A>R7)OEkxG!%xIm5HSjZ zcCNTn1pYIRdbYC6&VIFK)nV2ngd+EB^O#5yr1V@IB2QK;S1<U>{pI6@Ya6AGVkQ@E z$aI&<I)nj`UG;Io6UL<zo%XGB!^o2q(o`jr$>$=|_9=Pkhtz4eS?3Yn(3G<cN9z;v z^EDV_M@0OC2kD1fBVB8Tt<!`!gT*X*n^u<$R@N_a(xSBC(bNxFgMWn!3cp}md6+7D zHa_%lhRq{!x<X%X10lv!haNHsyh?g=Wees0ulhoa!XiOX?V5cyInx8%6l~=$U9zC= zk?aZO%G+38D4$s_*G<aL2qm4FW1cK0yTrKs8slXko%`tj0uRf;AVJ8;!or_jM#fNn z@U?dz&R3>=oBp0d;_hct;*tx!!S#|_=@$V=%6)7S&5;jYplr*E%8C$*v<MhtVAIkW zR95%;o}6j;Uc4aTnoR|ykN7~cWiwOtNtrK%f-ihjedZ_69ZH$@Hs$0!JPr@*yku=v zRs{Ya<__L;@IP|5A{X|)#Zh5cR_S!qO*#L<vcH-FQ>_Eo(SQ`-!R$ZQJw9%Vo!X<q z!othLxKA<HokR9GTqd~Ncuv+&`*bKcPl$XGC_0C7;<r~Hb6d2^Ib4arLQj1C)+XKb zm3(nvaI_laj4{}y<)qj&RazBvgoHO-<~|Ce=wY-E<K4MIbIji_g)g$`%uBjsmHwam zw(^Be@b}pe3HpMIO}5n@n=z=2$2)SLj7N<(3K%fZ6kge#s|1Pp?%cD=2x<Xn<&-;; zQt|E??`kK}qtg^R8TpOEnug~nkMC#aH{ALX_7{X2E;OKR*6!cM9@Kp2=&veeF9a%k z>Fk$GKKcvYK8hs_X_d0=M(mqq-l)M2O!_XFOaCM5#?(2Njd8NW&`XV-6ciwt>;t0q z@Zs_{)^4l;2%1D^XQ$!q+g7k>&axi5Sn=r-Jl_Fr0T8PFBQCuAd~%wS47a0g_kwT; zW9IY>O!Qtr)@i?3fAjK_iVxu;#+xjy@5@^VX}3jN@SNju8eYQML&5Rfik`>jP?w)9 zjEq00d0540y0Gh4Q&*pX-vS-H9tB;deJe)aU)WEoJL;eC{T+bUC?O*Q0~-aq-$2h{ z?CtL1o@KEi^}h24VGU${*Qo2cnc<Kj6;mERMa)d0mzTD{<IRt^Zr^%EM^z<JH0WvV z_S2_NFRrGvHncRJ4S0L_xYNwLzf-4tZQXm{Nl@Ujt#gj>@(VX;=w#bd;E^Vr?e)^u zR8s$%dk<tcck4U^ywVQPYBJ^Cm!+;p2NC$0HrrY`$4(M%pX!`+^o%DC<g;7TOqL9& zsFTVflw(c%J2xD^%R4zfd`N`7XThKxAuU`{h~Nb_&kdjvK0g>B;4@6DG@$)DfZpNO z!pg;+M=;WZPEiG5@`9ow7><^*?LqVBtupR=W;ioNMnn+96Pya+2()+qe$iiU@{R3J zO^8E!;zU^3y0R#cf~IJR(D~=Ka6#~}URP}U{8`q)K^)t-!JlzYxb;^sO});`+y4jv z3&p~U*>vgrdhY6EetEI!^iAh@Ce$$8;qJnqF5jI{d`ZNvo+WIb!5Y#m)VzQHzGd0i znaF&zvylm0;=JKCzWa5j3%$Lx;lIB>^1V`&#pz3qjuOREBn4Y@(U0<6a6bN@`{0DI zS$r{KbiACHVlocWGZOs_7-dC?+}4|)s((HDT>aJecX#jHVLZY1W0niHe{K|QL%}%* zc5lD9@G|ga&`EYjjW?IQsS7j+5}>3Vsp_U(@5y(IE+Ef?1K8n}jU#Fk{86SYBsBCK za;@;3Qm<#ZIZhVt*s;U&=#}9`A|vwGuX_M)96(JBLkV?{C+EG(oB7e%{+2S0t`_49 z5Mm=V=GV2f2p@N}l_0|jiQC;7K{}Zph(o%%vECFv<*hR9K745m`W~Vl5fLe%Xlen8 zGsLc7$`D_iloSgDGuN)|>&mxa&5|R1{aOvPeyCdk{X_Oh*uzWMPX2r{$C`=9e`f9L zmr&D{x8j<Ry$*jJv)FGA#pc#>ukfEAjs-Pb2mS{U8+|B!P;{vBe|9dWKe8#{N~gAK z-{Z}6TAxrocgcph?=3kMMwkjWeE!t^S;@rYXqTNC&rvax%-ihO|0}YEpS7*pdH`I( zs?wvzgL~;CLdM_H^I@P%{}U`P5TqdEd!7EhSJjYb!&f8g_0^>c>pVee))Q<O)%Mb` zShZP;;thvKYMYU+%Y1tMR~z2xQlsVw)mCPKvf0^L^dsZFrIA|Zg&vR%x+;<R1O6D? z?c99I&tww)JE$zysLt?8QdCf=DJVS*r`G3;HV8X~`N7PL^(MZfN0U=it4SnRwP~{x zOjsnGV-NTVJ~iBb-1Qd^jvumoVDkph4t8k5p#d1@QRQPZ4eIuwIJxigh>Ipd70}_^ z1ER!=fK5as=)cTKguQVBEWp>lzSQc9BVdp{>&!dt{Ob=dGC)uAnEVBv`t|$0o;{Ba z(5%9RT3uV6ed1oScey-9XI8UiuR@#Q_$%+y-{us1)nCWA2`v&0?LqxOD^hoNQ{F_? z4etHE{B#8FsNr*zy9hKXkNTv(Hz8$|&Z@lEaMzbzxk?kx>Bg`l$FPl-NaZzB=SFzq z``rAj+1cnypNIBu?}~RB8j*dJB&%u`YL%HCCaGJW9g$$A!r4YlGn#oo-Z{`GK#Abe zu#l4-I13ER^Ja0;0sm0|bN)DfRcP})C>dr5+gS)qe0+QaR&InU-oDL+t@N3V)!9uY z3%!mY;mEing7yc3=#X)mP%3wXg7ql8-A_qKe6cSJKuae~HpLUpHtQ0FpylMd4oHW% zgoO6OaER~)#53GB?F@<0>e?ESrZSOF8g2>~0b7+|cMym}aI~wIlUA4(UhHISw}uVO z&80Z>ch>p9o8x1zCl7B_nq=d$|96pAV-~(QKHFv)lop`OQ-Z_;V>~SsLY-yD-;3XX zG(g;S9c9P-?C*4iH<z=HKrrxEZaw(U_@jay-pQ#~$4lN@SFCPBD=@s&6#0wSONk9` zvY%dD4%#;t@;wCSIJ#?x#@C?j%3e?VA8|`KY8d{4sHEGmwY1y0y~nisz17zkGDb#{ z-0hJYY4h=9gS))OeX>;r7(+=?Aa?!>O(s|q1w}>KK*nf_TQ%J1cvLPUw+rFG011w1 z7wlzR4bRHSPsmB3LtBDjNmtFOtFyCDk4#Vlb4Tvg9V4uX7XN&?v;=RttyzZ{7|tPl z1RF5)OK6GkiIBRbclWM0kRh<k@LQmDyAI;=!%~;(EWp<s&!gcPNhJH-zI_|SvnLDE z_OXzr;B<gHg5K}Hp;9O=dVQ=CzVLumM{l=rQ`RS`#P*lYk+byH|3SLQ)bxD#BwPo= z4!^vJ%Pkn;&T#sz|9Ie!3W~7a!0<EuMt1^y*{AnW-VVzglndZp5%N+?_A9Thyo3Kx zpIT{d{RvB%9Y2SS^2|ve=Wli?`^_YxP8<F@AW){eHj+{@mCs;LG#Y#MaP#v|xb<rZ zgi=b7s%F0@xdCbc_t0VNO(_1D!(3e3-~!$^mvGMi%H_*Ki6#%~Pv7}-r{vFLhQsi? z!{VXWX;yi4b@jZma!tEk=AR#WLYBkh;WAaZs@3_?X@@}giAs@x?|R*B?+JLm5!}%T zuL)SQ^*;Q~f6v4O%?81!eenCc>Wv#dH`30+l9EWFU}iS?ti>PH07UB+$YzyUSZTw{ zgqD@nBAaq@eB2M7%~`s;ec;p9yuP+lC@^t)eZ9S$j`ra3N%D|V#plnoFRv(=-cP-d zqSoBN)ayV#wCc2WnfF>#w1{0%5+A$18@5glHBYG0V9a9spU3)DWGvoMPw(Hw+r2$K z{C>XWO&L^AB{osN%t6TTPPZ<E<-T_33^^;XZ&uEjSI+1<B12b4&q?=V(U0crnZt<V zyXI^{-A7=mAdO?=B1A(<(a1oWLJ(pC{Kjq==f~De+!jM0Bj7xB1SC!WlP2FS$2)`x zvpOw{QUw6s)RKQ*ST^O?*jbQ%##eXd7z;KYPAe^qCOjZPK1L|&Q>-}Av;YI$rSIs4 zi4I~zc_;-SOzcPJR;MSV{ipny61M>nq^6({_hsyDO3FZ5elM;5=S>ljk$9$**aX72 zWu}_$(q(OJjP7jucehffIzLK^eYpJY`u$v3squ3?D+oJ9clFb|UwrT0rR?0jlaot) z8?{{<y_%sB)@^6Cl@2z>hlDTgL$mA^i6se!?bg@c=D<hfrKnmp=4bw}YX%&{8r1-! zHU1(xx=H(n5=P3$>yJ~<YgsA8C&+Whwl!sfJnt}W?4Q+FN@dzvbh}BCbk$oYqwdZL zFbj8~2k1b2C5YhrsuwP=+n+sK%aw9$zlVxSh5?=z7HP!VvQnV<Y(hm{opE(bKIFgO zc-{#rnz}-}g!qmyuL+c00wM(00r)<;rcZ5cY*EIDumUj|_h9Ipi1>*NU_sE+oGg%& zZkp%@90hC&rBoaX9s+}JU6?=A<*@N&VQF#;X~?d8tp^Nm3j>2HpZEK!>uQ5Q<+;$Q zw>p$HQ1@0!wK=HV$@&KSCwX~+8jsaoU=22}F!wTaZ6X-m+yNBHu}?gyKLZ;;8c}A! zr@_Z9RXtA(6|(PqvU&#nl$R!pT+>Y0Sd35oDRG<m-9R{g(E*-DJl4-MlJ6yohI>zT z+bl>rl}ry%c#~o7@uj2V)FkH?0Nkhzcw>OJ2L=Wb3nb`#kT)<(SZ89V0-`mPH3JX* zr}Z&Ut!@xL(2#Lq=c{<*M#SN=x{Kh%p%s=%Xxn*v5O$|gr>xvIR!5|xq@0;Hp~rzO zr$fIt4@kvC4mS!N%pQ3F!r?@K27u)-XfJ`F?!ZP2`z)+5W*{sA<h@0x(sJU<MC?rO z3i;->ej*|R@I28bd}LuZVcz|8+L0au1I5$TT^PA{x@^M_@ii*7&y~D!=|l-JxQB18 z<uBT?eS1fqGxOPmHpA}bZ&Yt&dC#hPc{N%8KRByaVCW40%Ztj@3)iXIH-R{E8S27Q zR{uCUu2{8dWweV32_4=^j(d+?##W>rW8X~VPC<<rfVXik?Qv)4S~#%d`4M$WJwvB? zW~fonK?RQmZw(fLbXoY_HOpNjK>$?X4$49<IWec<Z{U^x05$^|k&xJ6sr-`M?M((C z4~`rHvk9^(L1l$krLQj~xpaXAf0Kx|B|DQHk7?!kLHCv->qNbKH#SE?mF3lr>0<fa z_Z$8E<mhM)P+<#);`0WTz<I|!MXMc7c(Rl#|Jh<6RBNS2R=(!waHsn9F!29rt}!&i z(A8i3bH>&b=gnx(gSiKW_e8`Wj=v@J(cU;+PNu72QAwV@WPhpk(Rc|GT>DVQz_*ig z(mrERJ}p}A@JnnUro2M$-=r_XLPG!Q>ayY+0p3Hz#QksF6rXw764v-k|H}n13Q`Yi z!yuR#pY_kVgLRUzzI}lCwosq>kkcw<5;$qemYtKM9AA!?T1mbK=AbY#U`KsKkTuxs z=z9i>ey4K?2$+9tjJkdN0HFZcym>Rw;ykl1B(Tciwi;TOn>}>gn3<MDcAb(cUtAJg z{H?ow`i)K0F@$X@a48s$7)36IqVw7DQq}_o<|kTI<OgR!5#p2(jKs8f|8%s_WPiUb zXv7%H2VT~R>o`OKl|u8*!V<6hn7CxGhhKJB`qiaQS9&I*$I;Gac>KWqhtYaRL?W%P z;|+clm-Sf5jC*L`(BF+wW2gX+uoMkuw8pYTHNK&;lM7a4$%W^8NpPug%3V2%c~b$8 zb;Ds+`gP)Kl|?DPvm6ggd*$t^UoN5|gB4si7-n&T>4IeJM~D2`Q{R=Jjh1P@OG&W; zI~`y#%e8+ak>i8j1ne{{mf<d^OOquT)%Vl{6#@0k@A^ST7gHD{0*t4&C|%mGJF$MR z*4G^6!0N6rAievxwz~%O#{=t4Ut?=w*~co7w`I#es=R7QW8brDrrXp<(H9u|K}p-- zgu3V1fRY3EH6YSSdEgM9hgZ`c?(sWA0~1vXtgBN0KbUa^gNF(45x%|4QZ=*^Gy&la zONq0@Npl*^6hcX;{apVBuKNgelIUAtRCX#~i_Q1;_Z^AOCxz2zNxE0)eE?ou>3IG= z_1up=r7pa{6`D6U2Z?4hRMytQcltTjvU||1qz}sB645s>NV;X4Xj7n8SOPEg+2K~X zq%VEHhA$cnEDm%gGL`CB1l9|=7Z*zaIXI^C-k!;rhuzwNK!zh@6~RVE?pb94{!2a& zA90)Eod#g~rD|sdx)*FkTl;bTWgJ{xuDH0*_*i3nd!=^7%E~tUxfTKWgzr;|c=iXt zqJ!nc6F{YpF&e`30QQst$<2h@Jpv|Cx0D>TU*P<7U~D}b^rr7;-xFDK4B8Dob|174 zbYC(W^v^qyP`M9ES%<-y{(`H&g#iFC#@!sNJVwl0o^EDpX3m;qNj-(A%lQ9<yw48` z8%%Z^aR%Ov8DyNEo2x-(SljZ%c|k;6>XV*OCi#QZdrbm?akoOt7Kk(l9roo=uO=2~ z02&0F7@9smCEO|b-t1zvh^34%F*dG)=IXqkqI_i9ZPH_B;Ou)?r0U~1Ja<x3$%VhJ zZfG03*zMz0pNh?vXHb%gzJ;+x_NQ%^5kv>D%%)^mseZ)B3o@e^m*KnXGfCx2_x4!> zhi6UQcr+5@VE#GXA@}%Lr!pnOF~dGL5AYG=fF3!{A43C;n__3b#6!*ZjB(IbDkC)z z<8kK3PZt@li*K%gsQ~JoWu{%&jCj3ab|Y;!zA=MeT%Hw&e#N;01}xMTsMe-(HOrg+ zHKUPyG>t<~_fZ3^MkRWCKYcay)FF8luQZvBY2xRN(IL!3kpv);P?OhohcE}flY@O( z-p&EsfJcIYVQky-u{EGR_kycy`GsR0duK<Q&jHML?OhetZG_Y&Qlm#nUzR=M7}btF zER3rT;+eR$_t4VJ&yi?7lQ*>R14JTH=WN`SOf>QD{52w1l{FtU@?E^B*fF)f{d;$@ zQ6>2s>=o-GrG}|n*9dD^o#i@3kVj@$HzcLwegk8l9h<+T&?dP(@t9C&YdbagDbF=n z&ZS+mnd}xPFxkkgP(WU6%vYLB_tO*}$81V9sWMLD3D!{Lq=i==Or?wlC*9#lf=>*{ zqi;eouK-EKXmYE76XF%}@bJ)kjh7Jxl=<o<u}38>|BTUy6=XN)Cw%Vfv}$X=seO7A zelrSWS0{u-UqX&~Yh6!sbWAS`K7esaht&PWy?6*<%2yU7ByfD><ic7wzGHv*Nu=Xm zzOH><MW<z_-CFQqFa_84Q{tzsemCa_2EPFC+y{XWju#N4Y<$JgYN&D^Nql|pqWs`J z834X8R!QWhyOzD{5uWQ6$MpSnb_*9AS+REd)$)}>xBdI~E2PWPeZRS@c{0oIZ@6dJ z@C)Vfv{LN-$@+nsb(w9U+rj_m{Z3>QOqLcq4C!Xz>O5>1fh$o-im-oJ9~vo{Up4_J z6Zkp-5Il9C`QqvN(awCmrHQUPu%cuVY=tR|={Al0`JcXjw;h{(gjoem;$v-rI<zSG z#)v@C%*=mr^;9|@yMA+Ho22m*Zfl;awU%|`eYg*aQO4FbW<EO6L24GYlGtRnq_-%> z3N;@TkZ$^IQQGo-LTg*agdX`rvsiCag0xF8XfdjmzD>JuV>xVdSRIJn(6gx3k+EzI z7x7$~Ec7Q!FRoqi9ksEt?VH!K7^#z96;|9YxVcR9;4$9em#(Fip~dAVgb&fv&<GDX zQoH!ukz6$vmwOg^ht^Ln_;-XgwKQ<^ic@G@(g>*&Fs^GkRB58?GRKuqa*$wk`NMWA z;Fi3A@8Gli-n}}~nB-{`IdDH3{?1D)DPMP%T3Hog4>`Lx>xAr`s+E!78=NQD>HP~? zQj2cy0}@QxZoeF!wDg;_@zJ2%$<Je*a_Niix;z99?P(<{r-nVLH(um#tcY%qJvXRh zJ*2uFH%jph?8*TDJm%pt@9;`9&k6Qm>hG=}lu3o&yC2jVx+ofRYM4ff9})7xMf~yT zM}S?QKXv?z4pnz@JrJ7(dWu~*J;s0bptzdq*IVViZaVP~x4o56gO4Fp(@9pg3?t<h zYoW#)WKCioGBV<ZA|O>O|9M~_E#?b&L5mb7v9UZHWh3CmU&%?t44>co@F@BVqN!<W zf_o{0`@;3nJF}6WoC$+Ps1t=lYyG`5w7%#%PMi!mrU{A4!CX>Gp~I)GE#JTIM@M<I zXm&!fof%^;nBZfhqhZtK?f(az?yZHy?)=5`ggakttFFAE7iH0JNBj6IDrv=Kktxh} zy)HceZ$GV*kpw~(_S63Z7^HLVrU^(1&s|94I&unPAr)+sI;YyUf3{1?=}Vxh6ei-* zCzemJtTiN*Y)r10E?RC$A>UBev1Mrt5lG0*eF?A7f6zCII%N_#+xOI)a#!?eD-_+J zv>2DpWQEs1)lmz*IkOaT(*2nB^=T%d4x`1%74l4zP3u&9`RYse#jQk%|D1klV6-m* zBzbG>7V}JdDvNYe4O%rEGqdvI`tNvn(^y=4uum(`tPe%*F=>4`e|3WFI*=s2!ds|W zxT$1u#@8vcZ;Ot@*ghyDmwL#qb-jN|&;0o*r!gNXMWsFcV-j$6&XGGbo{iKAZTC*$ z<KT9YTA2}n6OAe-pVv-*Mw_K1yj;AHbE3h!s&>VYU5Q~EzwDdK%J&LCtI;sgehg98 zI%Pll%6n0r?<KB;*}<Sof#Km7ZrzG&aKM<jb^CT}%-Z<+m%hZVSHp^$u<Iw{4@b*r zV`xFsLk{L_C8gktu(0#8vX$=X##e7wmB49^fBVrV+qZA8Z)k|a$OBppa_HS@m;2CE zf$rd)lOqC7?$x4!6Lu}yrW2+(2Cvde&1!wW8PxgX=1WdlNgTv^38^lS4>`-fuPavG zh)Qm9836v@^*wz0IFF{M7MFQ??m$JOMwqS~>VL`1DfFj^ANINEL(GHd*arp9`gk?z zL#TI|lXuauk*A=jpnqUOr1JGF)~Hoqz66z*PKj-DS?D574{7KUE5niKjgl?9ABvT% zE`&}a`4PcT_*TnSe>Kvy!_Wm?*3*`B6)e0xrt^DUe8J!ICA*SWp6G6@@OPJVcg%GP zOkQ{1v59h6@aIO%nsi^3Pr^QqNghNto?~&@`bbxL$z;`S6^rYNh6Zmtl4Ix&R{IxS z=A~4Rq&KEpor>1JP&jWGQGS_`XA3yLQ<GMf7*bfIytozR;HE?f`Bt5H@F<SZ!GGAh z)P|kiU`UomsA^W-n3=Sn6zeqOojL3LMOiHFN^*T;BePZSi$y7y)l(o{4k5mdhm+Ht zFv2)=$XVeEJru7pP!fPi1r~v=?Y#T`Gg2<22EC?ELC%|3+_S!Zt#}Kfz<nIU&Y}lL zQ6fOH^55$xCqV+y7+_scM~Zj<(2&QoTq=AtbSEwLSqQA~K(}W)p?Rwbi_$43nrBi9 zMwD*FE_vTyZ>vN4mtoBxyx0y7S;Lbjqr@GzV{bU;eGf;*U7@dI^g2-N>hqd3G(R0l zYb=80Gsi*LIJ4NZ<6Maje(Ni7Ck`koU*NhL#OpLc9<i879Vz}43PrVWYaD_IW2KjE z`b>Cuc;eX;-li@OGx>1VaAgFAy*RSE0pUBEM{!k~fAG%<W#Se6z^Uc<R|==Zn=|*< z@#^0QorV!4Oq|f`L=;q`-OYAxw*^gU`%Qg0`Oxb$Na^V6Qv7etkEw!k0CWSeEW#y> zCr`APTNi{aswgTJ|8zi=1dwbAbeVX6zGb*z3fhXGm#MH`4FQYlmh`^QJD$6>-GR*I zDYHchjfd=Gpi0uxuH9~5a~ucby@{lcQ(<`YdY>Ac;7(k*z%3xK2W<-2AiW5_4h1tE zH!Y;lVJ{j2l011p&_pC<%i^fu2hPvdI|(ZGH95cc^x^y{*Lx10dBm+Hr`RZD=geaq z>=QnePL^zs%r*IL{eKGt5MShi-o&A%0>{!%FsO-@4ls#`RPU+wXIY|wRHJ0Awu?i@ z&ielGv1i+X*_g3k=efZ(j<vFP1YKo2m<SO;C%MVOA@eVMB`LAny=?W~?f2*HD<7Dd znC_UFMSn;&rWT2}RbdZ+0$S$!`LG5bGaE&bE?ZM(deSbg3g0KjO{}1rj1jKYUXKd9 zOTKk}ywk6hrXGa-tfArHwvC^=8Aw=+8PN8CE_IG|E$WcO!^e%TjH?Uf8_HL%(1PC& zPZtC`^U?3Bc`Gp+)cj(R<;OJe&h?t?+l@-LAF$TU%*jc>sNm}A3QfM)@NZDqImCj# zbbmfpoz-lp5_8%c$9FI}h`^7yvf8q$&(`@!n6c+<2k!)3|ED|WtlBTB(e7swHRzfJ zT0c;{;M#6Dosyr=fRpTUONzpZLjQGY{YhVKfsvk#GDTn^EiD`zS0Mz42e_-%@}Ij- zPELdyd`ge*beHaitu{H|uz?nh@Y#~OmYWg;ymt#Kh?r7G{9DI6!()!L>)J`OTC9dS zlFJxydVAN&U9wIS-&*|k_Q*jz266pPYAUfY<<qzf_`C96HGdC`3O-g~;Nzw3OSr3F zR{K{+Cg#G{Ci@w6W5i^Vz}DMuYgfl!hNA-9v{iv5hh5dM=z4T0DBz-|9R#KCKbeXi zMj!~|Yn_!hafEKvjde-<tg6Y!sEN{B)!BJ~lG4}L$3jd)3{5dS3vy&lsRd0A0ln8g zVv_qlsxW+*ot-rNe>4>OT1fkeYif7-6uC6K7TH1=K;kY$p1X9(pON>db+gR?m6*;{ zF3RGwZ}}PAdRCjnQcE6}jyZbku<-v;(VcfpD+w4`pE{`8m;g(dk=f|j*>Q3#*8>GU z$}Rh8570Dd6qolG8plMc^~_;(XobwN$*Ft^9LTuySAGr+Jy1U8(ppctgHuF^y${e_ zKn5eRA;uL2uPq)e=?b_j4Zb$qzl}eF*fVGgqdXnq<7MX&tm72;h>;TWA<3ic%c<fq zB0Z332O2{KM~Iy$qK!b~1Jk<j?czMtj3g52wX7ar!Q6K(1eNF`3Ku9sU_``4V17uY zL8}FW=O#clwe*qKhc4H2ZZp31Gtl$-MR10(v4<whRBc-F>#StNqOFxxg`Uu54P7x_ z{o;%=YPqz{o?*$}CsHIed~YO(j>!cz4#htXs!x60e`j0x52YZbn_yW7_6K?SM3qi1 zyOg;sE-i;MGVM|LI6ORpp`#jzL(cp<a94%vcNiVZe>hgOi&=F0#gfH%`B>97yrQ}f zqQP7m<B(Q(nMxaDb487JaVeZTeRYPRoSqLfk!V%&HHcU!A0;L6@T90*!AoCMbQ&xt zo8hLo*O^-%Bu0S8K#aY6_cL+hpqH;tcwHpIJ@ZU|usf}NCh1nzbk+=p`AHs-wRQs- z;n3*-V1?dM!m+5Rcu{X{$KtZiT5G1rmHX6ez<PC9l+_IBp_VWlx%~yi3}hZNi&<1R zexbx3<B{tJVzp-Y5&9?Dtw;|E6_PS;IS8-{m74gn64J|_1B-$m{<fd##gp;L$==zY zkKY>6g5Tu6eGg=&CBGd_0me=A!Z7@vh95s+4TT;8o138)39=!!%HZJ84HQ%MEoO1p zY@7_Ob$%9l#`f#%p+f{i0;?dbT8v|zpWa9thE3CPar1&j+$4!eYXEyp$){s7ja=hU zETXt@Y^a|9++icxQ09t!X}V1qI*;iVMS+he{O-J=x)oZQducxmH#gyyAV_)&{KfZd z-2g;U?B03MFSz;R>$qD&SLS^)%7nawqxmJ4&<xbT%Q?Q*&??J{qn5Ux?z|Uk_|yK$ zNvX=z2ln!>powVsI7l<Xzw3r!w)b5#v*vfq8qZG0wuwq$08}16z_MSeKdf)N<w$ER zkD#=FLC2{*tl~{1omFPl0M+*Dv%gXopP2!>HdQ*Nm=F>%{wF#`qRx|9+Hf+e5WCBu zZ-+q@1fMhMb*ejZIO&qcjt1nP4!V2C^e|YJ4hnynyVv*U`r+pRquwKX7P)9Ui;EcO zNDKsd$q`)0$Jl|RKH6h9j%~W(mqcZ!#Xe8BMHd1`=i@^UHXPq>ZS|mV^tV9`x~MLT z@<T{X$usZS^#QmvjQ*><qAdy|qii0GaF^xuw0ojdx%^)By7Me-O42DZ%ZVExFC`e+ zpt`oil;(BMF$msh>R0du4kr|@86G9=8iReNt#g)%&=paFPgiiHOhMjA7<Zh;#uA_O z`j~$}WCQT}TV2Cu?e50y;F!vx9qKn2(A=Nf^g3w{-OqQ|_bjXytZEnc0oaKmiijWc zlZt=;?u38bZPkjtK+sJ<^8ta6(g2kRuLR~cI)+J$1?VcBF#kcD^fo#9R$KgZ+J|3r z4?)_6TO$~C3|K6%IR8;?f&FJvtjj(2GNdEc&9MyJE_i{JpFEZk-!`|k1sNE9C6WA5 z$AQR!tKZfkQFe2g(n>tmyG@93x9PGWo$Kl>t14gc>aa%nt;z0A^1R@2iRAxfa$Nm; z15Rg6S0D2)H0myW61tUO%?6$Cgr9@$_zxLdmAtTf9PGz^0lXTthB7RCExZwaE#7e_ z*8PFBfnal)_4hh0H{I<eO|752eT2(;jv)VzmVD2%=%+K1?frHCbN6RI03Sg9+^XKF z@o}*q`$r-EpB<i*3)}vC2H5}Cx3nadra8+l4dZY;e!N-6eqmt&og5nULBb!ZtSqKE zQfwB;FY>YT_p-9OHkhcqYy=#~Ls&=wOHW8j8i`jm4UI1=Lxj1c>Jh)xn-ccX4Sri; zdh$;hO;_t$pE%!h^}Y1;)yvfFv-7T`;T@!n$N1XQk5nbRe+o!rZ~Xi8ZBODX3}|^B z^`s+AsnXKY^xr+hgq?a@-DeW9X2&jb^I}<G5O~!IgJ193&z_Xir!Nfts<?B)`sb(3 zCp1YPwI0~AXt%}6IHYI<Vkvy0lL@`q;b40LoRY1=e{W@dzo>d&S)Xh_DpL0Su`7C( z8b#oW<1z)0K+}<Q!)4(sd9fiuIxfA;Tzdh}6Q#~=YI0(t=FSNMx4HOcadB}9D|(x{ zLw4HPertL|GTA0MSw{Dk1M!gwdNe^eD#*a9b8*o?Yi36MbJy<+`u(HZg;%;4J{@VT zc{bQsv@S1AN7~;7m~3_2Sh}jWmjz!cY_k-mo%em}?R^d`x~<KsD9Kv2B}UTsMoQwl zqKk|o00nk$$lI-DaNMrq06v;v>U!XZY1)N%%Idb?Pu|=NS=({Pux~gbfQs;HpuNIc z{t7@b?BT$|wu~R%idzbtp6R{|hG%b`VDjkAO-u}MNC6d#j<ySv<0=wdX=qqvl>Tr^ zs4KHUseC6VH+Vu&ghriBQT8%lFo(9Vpr?f|8TNYcn7&@-Bo5*vQ2(9!j>mWZ+P!_t z!%`Lu^C0hHLsKaUB0KUT!yIc_ZJonH#QC?LXgV`+9@dpe&BeHzs@1M+K_30Kc}LXO zs0XVDZhgD=W4pPBu+Jo=3%8rxW$v5HB35i!W_Ryi0Ez<nKRVwR5fL9@7$-k1sdyI& zfUFtoPh3lusc|V@N_BLLm74i-p#6(05KC~B35W=ikSMSmuov}x>YDJE(ojf%UKblL zHhgSGeAg3Pp`vD;_nRG~iS>e0`mQ!fcc__?->G3*g1>1T0=e;KVDk(iHv0$ZO<3lH zhPLA_9Ap|HI<K7LcTHCl>%LX=K7L*OnqnjkoylxVF?ni)VZAB&>XXvPq{1PIGqZn0 z<j=~h*iT+nK-Y?n2vAgn{2hMH5_cr5nx~rw&Fi3f1pP~|xzxmdIXQ`^hsx!SvE$ov zgo0wv{j@@F@A@+jm%8-}(d~wxQY{im*|D*%BO_2Dz|)xWtKX?~9A}ub(R^Aub!+7G z*%B8vfj{9pbq*?JvmemVX!nhA#pA@X8QK-BYbqDY<KiCsOD*pN%@9b!Uux8mBYSHW zj_DP2u=LhWMJBma`3jcT17(S%=`Svei@^oI?;LEO(OMC*WMs~BHPb6>mt+nR)KW2& ze~se^qAEC1qY;<pz}^in)F!GH6d&n|rO&aN0FJ^dz)w&ta0lZX0#EXP34cj^*3Yae zO1`;s#<O#W<e!e{5ET)@UM0)9&Nh$SA;nQ+hpwZcb!@M%+x~#m^R-pZzg$#2tBJq6 z_`&hOdq%DL8(|8nvNZm|XRIqoZ;<SPexkCna%yhwjn(e9JC@U}_`{fJd}quAIP>tz z5)yvs0njyKqhk=b8<uJ?`})w+6Acf-sHmvwX!3!kJNj^Dc<TN;J%RU3ln;aMAbiii z2$V6miUlS&58?<A+UTqk*1Vv8e<@=WVm=Ua?<(Fqkih{GVey>ZH$WAim5zGmH}H<W zN3Nrz!*cCGJ7s_I>(s4yU)l`LVIw;FbI*+{n8<_jpK!AuXZlNZeJieE9FZSEA6xzT z?Hjs}T89uo3uEKZFt4Ga2T?hBiND3l<M^aq&w4`%VIJfY%=XXf7BEcg9drtPf*WbN zF*Jl;<0t(8FTTMrgOu<Wc9JJ-JFih)9Z0a%Ts^nM$`sEmuvp~V$WTyF;^(VKdvS<K z&-Cm)TnLh5j%S^?|Jm{n_^i4!B38m#NZ*EE!P$)Vfw3{(>Rgzk#DBX7z>1BZp9<4X zkO6++n(WyFwKdhY<e~?`{5ncGL3F*;lJ2Asezmprg)i)7kr9z_j5&DPy1shKqW&fc zLiCHIjT;26t$Gi(&!}3TySk1t{l>K(fGj4Rhf7@Q+WBte?wM$l&vK&|t*-e_vH{R6 z=v!t!@1^)}WWpO$lAi9*fEkWpjbOTxQ;ct9y;B-%6!$5}3xp;&X_W?dNF6-TpeZQm z_vnj;E={%tt7Q4|xA(qe%=(0e;t1cX@{P#AvCf~Rdl?zMkh-3lYN}L+t3$>R&zo`x z^7&z0^A!C6-uD-|eP=aw<gum<a_g0q{$&r}Uvu;F!ST*35fRIet5yAv`uM#T=JT-- zv=hxg5fmAF)M;Ymx97!V{mCd_S8klV5ro0TNIKRxHOXhR2f@c5{1H}{MK)q@4>wsN zSOJ^>PFnAVECeLIc(Ipo#UlO>ry{}w5CTX908CXprIw#|_8<!3%XXc<Aq}0fR~_c} zmlDf221^{yBZ}EcJ)<nXzxd4?1))`DfxN1}TN=yzVV&D8asv92MdfOXP^sOr(#f*A zxHBN%NOF9~&MxAH=N_{$Fq=xs1YxzMoU}?5>@y21BdELz+H`oOL1Hv7>f^=)^vTeq z!&Ofj2S)DP9;<>?p}2}TY_&iayad*skvJ}&SKr@?I}g7XGD7ijGCkAQ7|#=&|4<yX zAz;@x=zZ?)BjIy!Q_IO63oCzw{mp^M<9g=iDqtu}*pC1Fu4RGp?}4PKE2^qiZL`od z5RXezQWAQ-zVbrAJ;2T7?fti{8AOiWbEf#`IAvG!|8fE5l^0{UBca5@H4h$1T-Nl9 z2K|qgANLC;&U^EC6-=KkT6k9C&-VEE_d##p1Fwe$2a&K$#D;zRxa-;3C+aD;A=<?? zx0jYy_TD`{fhu`eykuLNnwtwih?|JWQ!d32+)O?g0(70{_RS7A(>*Lxn3kN=PVZoO zF2h%<-(L(}wpm^XI1}NF>mE;?)=c|2rL>ez0$l>k<)IcCSJMM#jauy6TA1y;yix<T z&=<G`1l+w<(2<v$I|MZAFeKP;K?s6Pk(pgLw-1@OKZ3SL4!l6i#&=p<rzPJrIini_ zsCgvytgZ@YfY;95!)cQjNL2)NJF5Zp!yiH(x&E$clj)wd!5}pTdZpw=xWtI@t}yFE zu|>4h!-8S&7b13vx)cPolkB4z*607hrvI33Sro>BXpm;XyTG0aIdTrw4$>P-t>E?& zV}xl}-m_~d>Oe<{?BP*lE!7Xr2(PI!GiG9sp{BNbSoKn3z+j~yL;vds?0PphK}W^C z;p~}XW4u|g^lP;Vxg1=b`fV9Jp^e0DJM`GL(y$KolyAWydzdotrT87;l7?XbHNsop zF8#*E4%44oVk_`Z>IOdpMfJshAiLhEsG6;S4>@_jP2aI**F)E(Mqi%^3j_8ta>17J z=13l8C*XWRFC!H&G4#y>4X)-Zx{EK{2TB^?bIL!$_)_>FNaMsB2zPS~O9Br+7(r%! z+<6HJ3F5$fp#pa$yn+dVC@k?{gW=onxT}C$VPP-0mfa6$(>S>};~G9&j!x;3zLjlR zIb}JziKdU{2rWInErQHyL{Yd@==L+@JSSY9rlKRuMB;XaO?#QmKHhw6WjS+{d@iy5 zi^(mSSdVR`!^4bRv^ORu?p`}$*<I@Rv3lXdhezHO&3o~_f<L?{@aND%ZU!gpyw0pQ z);SFJojdDAhJuf9)d8a%Y$42CeP@7Im=}$4gK7j}9VENqgeMKb$OZ!ssnTpa$;rbZ zTINKwcFFRul&w2<pfnwi`@LkiJmnd?@wj+qGJZ5kfxEb-O8nuUGwnB%6jGkODknYi zP#AbyN7Xm_(_Xd0IqUcgPzoK_wFiigRc=X6NihH}gZDJOe0^EChxB4mMM>#3z=3vM zSK>4U89eQ7!5?%z_ujt$Sj>2ow0GbXQ*8_H;;CmHlLxr-4*lqw&Pc8(%4cZo)#-D+ zc|$9U{Hwntfy2z!_RsYjpUv)G$auqb^ZWO&#l<$uCeste4kF(M=t)3P-1<nCc5B${ z1fgZ<ndpD&%6_%g(x4}``xszBqQ%c|#e@n9N_@V5{WV4K2VCvfsj<bX+L^Uh%WQF3 zON;Vf^b%0NaB_27!y(dtFR4{(?O49ch`OrNrAH<=?o;>mk5^8R3J)o`xuHkG`Uvb? zc-P<Fc)W(TFOWW#Ga|-II}jlJuiwA#nwemvutpXXqNH3gB?1-K`7W4}<u!5R(xoV^ z8(ycJ7(+w$n-&*YnwZxnr%@HB3k>Q?NHcTN7MYr&D}U2g<Du^8c-qwT)WBFnR>7%M z9#vwl4LTCa2G0IvUbU@@ttC-oS(d!hhhQ`de(Jd>W1x+Yc_>+1A16)#lnGcdTeaV` zvs#(R_m{h`TNZQ!8Ei=DLpJpzK;$}(6S)+*Z6(vI%+*olmh;7qZzbl--zVAUAFZ3` zD`P2rAMnGY-~~~i6p&t~rKJc~-=#CtTOr8D4vUgf(sw^UJ9+~P^7NcF!X}BF_L;wG zfJ)=j@aca4{zO!C^wM}vE2eQaaq*>yt|jw(=K2f0Jwzq^kL!x$!`gk0_Pkj)nGQBR zQmQSn899H1_tsdPT)kkwm-I$cxN2S3`1lcc;SP2es;w{974$gpl*Kw7H=0I2g5YUU zu(7x&m-{EjnrhI>y=+h8WD|Xy8g=aA0+o6dng;516-`<t>nk(c81@2=U`F#byUH5N z%9b}|E&lT5OH)!=k72^5?UHuDA4ex9Zhw1s%?X~;Nr{P1{rq;Dm(SYD%E>xRh7<Rr zihP^oZV+H53)c3~Q|-clz?*U8Tt@p<?JG*CIM}>#@#^?3>@5@`c3ExbSl*cG9{6#P zAM+MGiE_+VL<w0pBt#{gi}CFR!5zKjPU36B!;4Xpin13dZVe693k1v^JIR#wd%QY5 zhmKryI;g$n;lnHY4>sL(b-l4L&h|RhRJ$J(!>d=+Ws$pmVRsN#df*zp`tVB8dBtd3 zC@qNr{GX#QFTyN}Tr#@{nDubQ4%UNL)$^loa_!l3(r<*U4X1T1qY%bPw|_sk7kOI$ z?)!reN-XR4bjR2YHEl7zYkBYRWs&8jNKrHWjrBE%YWm~JHf&jvYLhqB)QBkx`=wQ~ z>qZq!1HOJ$bD2xgg>iH>jQDE#^E|=&e=ZvbH<*z4cy_>2me$s?Dc?ZZ^v6943P`GM zISagLzhuwOX(TN|Cn*CW(}y^Vrb=j-I+r?CvTd>neJUjt^Oq-`Z>nuCSPJcljy|%B z()-N)^VgM1w1JwRO`!37zDM2gHdR@E8vjy2z(M;d8Et{ASrEIo($)7(F6+lmjaR@y zlUbwpysT5D-p1N`#rlezC$-gL{VgQs{)G-`yC@ZmcoMuP;C%osio<NP7~yTuc+JX6 z81K^i+*|@c_3=TREX1cB(EG!yn{a?7IWNGn?%czNMMuhb9>J+%Nt5x|(w~Ld*x|9J z-LR3{sYBa@MHzvQqv>e7GYEhSi&i-0RWw$a$QoT|*ARqWL0rcMpbzpcs6e5_+Tlyj zm*xN;nK~yeX02{*<;G4xSPm=Y7B=mrcGG?5Sa(TQd0*t(oKf}>2dvM%T$<v|o9?Bh z5%+6qKfiT&eYIbbh&`^WYq)*O(=w@X2?>fbR&GN(_WX4GMSqT+<L+_=_0EF6?WT>5 zcf}n;z`dUt?y|_X*eI(g`+2KPS?(HJWS)8dR6v!RcSvL;bBcO;|I^<V1$>T7cwwfk zrdR(2#1hs6&!Z*k>+4_T<j@HUW>C(PwXR<$kRWV~{_;G&r{PDTV`Qv{eSc<FR@|H1 z8qO<9d@pI~Y+@oJoWbhZd*FaK8nE6H2P85FLBNG|-%8nSl@R!Jg5d}*e<C(cf*BPg zEzl&e^@Gd54{$lSh{R!;2j_86;j0kpff=yod#&x)!o`v0fliTvNR0y;7jBNYJYO3< zcg$h#+WO3b)I;a(j>R|gQttdnT74*5+7!DXjBMEqLJ<kyJwx!=D^F7H+I5O#AH%va zS_eXrsQHijn+v@)krw6No=H0(pAiIjiA~uRH8pwMsUVtx5}%D+7XnelniP}=!nc=^ z@zmJ23xFo!qTC0sS!5VvrwlO76RyojetDag_9iZFbF@kwhD}ZQ17%q~(b*$mH#u12 zT5=x1JV2YAJnMHrzI(=siI?HmuN@3ioU{$Ej=neiB$S1p-N#@brmUSNM@``1bJkhN z#KL04LU8?AaeH?&gRYAVUT<h4-kKLt<h!o<%27+o=Vl1@4Gndd+VJ!~co3?scaREu z(PL+#oR6wsW@c$Q_+&HFb`J8f<&|lP2R@%>te>wesb;}F8?@RptgJ=W)^|+IxFk8E ziM|nBndRjbcgN|Qqm2{!y(;=n?6$Uav)X$Lv#;N{PD{U69%~Ua{a?kt0&q;Wc$);E zC2wBzjO3ZD_XnLHtI8WD5*R_b_JX3zp8-}Y=);hxU5G?)IM*5hyT%POfG-<m25%sd zK!$?_b%77gqgby!w02VH%VuGZ4sHZt;RE^^<~Xp;>)u^UAv~Arp0f^+EY>5_y7Kz_ z`YPfTd@)XK=1V#1v6VyhzV22nEiG9$IS3A5qWlDL&;YoMTVe=6sH{v1pEKk9rNsJi zIlh<2!M6Ze#=z`0fqsA~c>jSNF$iH7Qq$YQA|X+%=riFQ5O69#*J=ad)@nB;1>&d< zPtOi~^4V9ikM+`nJ4Ytx=TDtHd28{9a(7vZuNTL;JGS=+FRRfPIg)EOo-${qy?r&* zbbxO9(B8d-WGL2j$$g9Go}JGJ(MEUMuRZH7n5i|1Pnz!PcSN%4+i$-bX-TJ}_h3vb zDJ>N|Qq<gJ2=^yT?Rc$(w#%xjGBOpfg2>q69=|4GJ-8D)3Uv6Z+46Ri@!Id6k%Lw% zMUEvWS2XGUw2&4~BAHn-Sf0OsPGM-OPFj6tFi1KsJDV1mJJGN!EX1zQ@VLy3UQ()_ zfAKcpJZDp^bSzx!u|_{4AYg>6Ve7VS1U()8Y#H@WvH|}=bF&d!Dn{))qeM4n@m8N9 z_@*ZP-eBbbXTc-Y1>8o$(f8+7E~&H*wvRMjuuF8ruj^hLxBR)E#3LCL^T#lJY+RT- z@mXH&Hr{s~h9m|WO+(T`nh&3gtDbY*rhWAEbHy3Hic5>XR(kn-@_SdDV;3BV4ijep zvH*C2^S;-Jt&?F7$ixatrfkEyU$A7(Gk>v$w4vYGRS>*;&z``*h)OY6SewCN`9T-# z)6TKF1Y?8GUd4evHLf%v8n$<k8v+)L&o26`7jKnl8oN6GI?l9wO>{_lmF-%jn1Q%d z%NAbV>X8u}jw*3vLUAIP<h>1##kL(+_05z$a!*Q5PF6D=5EkZG?N&;-rFEO@1|6M% zdG~oO)6~aK)KpYfW1qROtRQSRq+O=#OhYZo4R|ieCuRxdf3V9DgsK_-GHu^_YT(j_ z1_I#8@iS+dZj9uLz1)gzop|AO$AD0m8CushF;}z0T_9dC9yp+S{W^ATRQT{{@(I^_ zMBL-UAq(^8<YWs{u>s1z%FYhNy^McnYGy_sBQ0$ADa4gAQ`7-~?a03EdziGb)Z*$h z<4k3AF`rSVY?Jo)!l`P5OVF75$tJ%_FM};IhheqfZhy|x)(<xwVL#5CtacF_Mz}<6 z_pZ5dLu+xY)#akPddQ2l8#_5%mxji+-Zg1w50Bz3dF{St+|vDtkNVMc?XzI_r!&ty zcT{Pdu9ot4XG^B%5D|filu&M_p8kD$Z<V?y#;w_Lxi533r-NJTZKY;%VpXL%#=9Yb z0E~i9?3tD}asT|?pOvx~$)fQ0k&1L$jAYn&3g{p1ZVk=NT*r?GLWYsDr^U?Fw4>a0 zBRijr!chxvLaZtSFjs=o4x9_jv+Rd+_wa?-|4z%_9oT#G*=MRZ_g58n1ngixu$t_C zQlnF&xFye1*Eyi2x0DU=qmGl+`f@Mfn%vRVHTzjnknQDpkA2_5;qZe%B#@UA%gZ<N zIAsGbz9B@wNajObR#DN2HN<-|^3v7b!{WJf6~y2Ulv)lpyQ!%uDc%}!Q_l8`E5;wA zG3GJuBW%n7xtMkpJ#&ly=d;L{11v1K6n(M%$}yT_!o0CGI^aM2G~l<Q>&=FfdJ;k( zW<9A5#Ew4h$%R25e#osoPpL*zQ|n3D9vSUvavPJo53(8?KRB6QSV%nQ{mhNG#l%)q z-hF!cvf?Yf#LJ7{cki}5CLZ26Imx&&LFyOf7<V$X4<n+S!E3&qGRtrMJ1akDq;Cf+ zx0FE4iEB*oVTF(dP7S<#H2DlZsb}s9e4p~)_~Y+1zhu1KG0)`Qy+!C%&x1e>h7Z&z zL1AHDvT^?=s~v}*AchhooY>GRc%l~t2qPo28G1{#YuB>y_UhR8ZNmizFl`WyN%H?6 zUH<{ib^rf?!!3%GS&}`9>`_KW5fVZrG9t4=_6(7cL`GJ25h_KQ$&AXTg^-Yyy;s)# zcwgW1`~UBA?sH$~T<3JID}21)ukn07o{y2;2Dhz7A|nqlJ7^RGk<+pY*G{wLmj63U zDZBDTR%(A4OPaIL4zMax?)<qaC~;N!srHvIKYjIIAC(nL2G0$YkNaVv2d^tC4S&K4 zK+on^w98>eclT=U)~3)?iZG+1W}`dt4Sad8jT@J;Uk~+P$~x#p8Ras5=xx5)Wi!s^ z3m1+X7&!f?@sH$VeiEWwlY@w@x%sayE+Q;+ic2Z7KcFJl*7<zTZ^zM~dwX)8pSHGX zN_Cr}%S+CcbGqltN7gas<oG-%Clh&99|IJBuQW66x<#fR7H6v@CM<dSw(?1IG<cwx zd*CdRS)On*d{t6sur+%S0~rWyz#Me%uGYe0cAt1#`x9bw09C_SMC^QgY7usD6Mz&t zKs~dgdh4nWQbcqA&A-vCb|0OLyOM9c&$EJ_lC7+R{tQA8gp=(C^yj=w#VFM>zGahx zo6@}S+tQ3P^D&Liech8dHL5?(HJO_rYO#)Xkkmlk5@7TFJt1u7276XXR+H4E&stf% zqza?dHTN88na+!BRh^(Wyx?%YUmVfXUgJ7luU{Q{^VX#5GpQ3FpXp`Z-?5D^3JU1{ zeTmO|&B$QFCX=*Kb^2n*tL;@EYy7uHMuKKLjNwLhpI<Q3^!rgO8QHH4jIDgVV#{8Y z3&ldSe~c^Z68Ji3OPm~>?FYXGv1X*_`(pvN(Z7W6<>2tp#Vgt>uyMh7jK~w5%6#xE zy@|UUeujQF#f61rBe8LDmo8i|Ve5s|H$iGIS_q7I1Mc1X*4};(oO6^KUI>aKjhe#> zgxCy=&HBxVLG*MsCz{DOzrAH!<rew(J>16=O^&5yX==K|;ypneetI<j-H3s?I8k)e z`mC8DxWd=EQQUX+<F3;05GtIP*44H8GjOc9D6_LGVeiqSGF`tyi(%ZB=aOxolC50R zvX_3QvGGhtTcBmPxZ~19|GRv#e~V7_?XSHwv(CJ{xSa}#S0>lkT*f<gs#DsIL{1;K zI1GaIL{~}3)_VAsdCfiR4!sJ-Lx&G@$nqsurz!X!sM=P!jm9Dvkkqu9&nmajUa}5b zoeHp^?5=cy5^hy^7{10(I9EZmDCsfBMVPn4cM!}|7N2zokn%^OdlDXMpWHfoHZzKL zYkh@J=F%*`xIW`W*Ni65-~SeaA3s(UdN+y0@0fdV9mI9@H`7_&iaU}Gcdy~H1Ewy; zC#<Y&Y(imN3@Cozqrh7WUH4_=!?GKzX+Mmnd-3w};;tge5$fJ{G%6}UTibB)eP(-m zK~RtruW-a4hTJv?*rRQKo({}7(o!`XNi7o;)M=!z>T_nN?B*tE-oA*Ry_yOhQpz44 zq^%vOmk(=d_ODsjFP~cP^{M*#^Ks=?XRpvoA+=s7+-~N7-mQgc^O>jG_HUOsqN1V@ z2_0qpSkv5{OXPxxX+V0NK>D!hzRG{K#<QzWTi@zi9I0~!eH6Mv+@4LPg$;;f1=SfY zvh;<_$^`Fg`19Z(7v=}^cc$Q+x91d+)S%2wd76>&>2w9<<{TU4sf9N@z4yO)UvjsZ z>D%49?)(1VNjg=MW`X9=@bGjkUddF?6gX|7@c1O#%dvyIQWl;>-(4&W!Y8Y$F6(+e zJ9;!UAjnBlI3k)MKQ>HXfcn#?!8-Ga(aBG)_EfdA4u)-3{3lQT?RgiOChNIkdCz7y zauW@WTHgOMJbIlh?u>CNThDEZ!O~{|UsE@u|CPa*P)_NxOWRd}9&B*ZMWe+P+a)Ez zs8+q%q^QYtiIBMIr%%~o+)h9vzuwK>>w5it6d8Tc#~nR-6nBaxFhoLv4o5tV6q$3b zuHw*Rq8%0*>$=&}@|Rzr^Y*G}4rl$(8zWoS+#DZNHBDq0zAxDM@Tl9@)_#o$I}8lH zB-Suoir3O)i{w`?!pXl{)9uq&T)8HYC~<3e(LXn;Om_8PfqTO2tOJk$sZ>uRm3w>o zM*D-YdP)=5_8A*+B;VPz?#LMevhnO+=k;Ur%UN5zJ5SFClf4>=UlA!R$`q4H65HIQ zGt#>my^Ye@^^b_Kug_Ix?~01`fxx{K8s{B4n?eOPHnah;^BfEQ%upE=uz823q2Wz^ z>-CGTEnVfD#~Ft9Ur!Sg&#doB4$exooPK$EaQ*wKuRnjjTcKAP47=9T<svitlNJ}_ z6Rl(KwB5+S2v*j)Cm)dh*#5kE$-4v_*vJ!XD5C!dFA`-2VPywxjuVo%a7+Z)3`$($ za2^(aiFyTdT0oZ7OF8%Mk^c7C@;=PS80adqvG5%fVKCns?$++VKj%$y;eFgTAx)t& zneyl5+93)ju8O&0k2yVX!g{7<WL6`HH&{wwb=oY=J~cDl5mkRK)a7Ks{Ex!qge)g~ zCsC$@%AaEeo;6*08%asQ#wT>Wxo%HpSlG{^BGC$~1Fv0O>8|L_uD`hCb%6Fv7lk|} z3nOPq+Kv${si1qq6f(K(q_Ri#1;neIT2HkKJqXzcCWkn@5d-bJ<6E7gT8|EjN?CUp zm5NV4tXux_g$f7j;Ls2mUl#3HFr(F$&1lNw$JeZ^$l>Wi$To?8VITyfU@CYb3=WR( z?Hy@oJ;rdXKL#OJF3!UH7n+=Y*S-v2t@+FPcXTx(lDZe)MqMY(D_6hp!FjnvE$bhl z55ooYi+tuk+Z|$NK63mx;jKWhZJf0i@*0;>2aPzj!p>KK>&&j7Z|>}z+a<-=F4VIt z0dECL+$&6S>d}de4IdR>mY0tv9_g*o(K!y!hZhwr@7~)?Pfu`_70{i#K>e-I`h~jc zpJs+5o$F`M2J;FIH<o+ej8+jQl_}J}^R4~!imvff)PKdTJO3tR8Rb*=efui!e3dyk zBg5U(-QJ}6@P+r&+aV_L7+ce9?lgMdpcRQBqO#-zeyI-q&O5NEA?(V*&&o=<{Qy1& z8mV&UG1AAvA&dY_0i~Ve6tQerMoR$OEWd^EZioJA5`S01;^VluxFhHh`(<2xeSNnX ztqoZ(zw!$CRvzGPxA56BUE&12wbpYw$N|Joo^0rJx?X=WRS5!nFt>I0HPe;2VUFzX zaXYUf%`fQRZpnc$g`!l}xT}UZJnWhepPZa@7>n0oNUS;?R{MEwlA`msobYKc52<z! zk839Kx2_zzzGKHbNweXNz!3V;f@1F0_SpNuWbOO+nMg~jD4203mz3x-yK9JS^?iSu z8~%LBHRaZgj}MN8%F0f6?RUlsel@R$7U%G*ZNF9C2^bnzBr_!+VqrOo2;J&x1wy{R z(Ko)n@`-g`_tZbW2Wk&;eWE<DU(_`;Kv)UL(?CazqZ*ewVN$Txy9EkkQpr@IMoiM5 zT<NWZvcEE$?F})PbzdYV^(M9oiNVrMQLxKFV7O~s?XS&)kSwvG*5V+?BX!Hb5PtqG zjC?yQa_{Ut`Xk+T8?^@OOKz1G&d$+wbwoM}?79$G@%8s_4GayXT_@RiMIUrfR<wi- zGOM-Q;uL__j^0RqfOoraa;ahpTW#Za>-wn^jDYFC+;FdW6ERh-5EdA4sBW1qf|-Ux zWm%o8>P&KSKx_>AF@DAOt^#pOlLL%)b_u!aHo5T$e=2eW#oO9N3oZ9i(j7FFJ|1x1 z=Tt$V$nk;ImfFYh4D_-x0n>|c+bd7bx_z60mErTx=6%T;ZnYC%>Gcj<+6t+kSIc-& zaxT=KP7jmpgq2Txm5({Q|1C#@If{dVV&A^6Acdm#juSG*%|-<v0zL*X(rqkSl%Ey` zk3wPelD9Ozbhw}fBwyCenIQO2;qzCnSNfPtr<6B-`yBJ&hEHSF(bV%cbDfHdfmU?9 zB$&~l%dr19aWk*wIyEb;riy)?AE_mWo5aP@0-k`Sr8mX-AyFD(=FJh)WVEyzM~==l zMRIPVh>eT7VIFYaUfBEK!H+uHZ^j<jNYt4pEiGpaKd@1|yYc$9%?<0C!U8(A-MjCs z&DMq*z2Kzy;*q>$aWBxJ^OMrb@2ACaSYw;-^F!+I-XZ$v=6nSo31JZt_JHmd!|jF- z><!+%_kz;@qLGm;Ten)Ih#O8M5SV~SIyyc=|8FAn9;W7S7w*}SKTt`%LfXULqr2gu zYD4~ctNZbT%LmMBEj3x0D&M*yK6nnv9<&HKQ9o)RG6x<`Ak+o8UnwZ|^Is`KG!7!P z7LCUDnU?}?(mb^hjm$0Nr2<tJt)uYlom#v9AoNe6uJJ$x^Ky@UDXO&k=GG%((%;#R zg+a;h7{4AHyMJ<Y^ur$aifc#%1c$Fc{j)|4`QjHU>x-8>c!k2bWo6-l#fgy5F7GwT z;ej*rG4g#0FOIR?yiry8hU)w+fo-(Da-<gQA{+yjmR=598_u1b=Nnx;rMtVkJzk|p z%|@Cihd!L{B2$hG9C-V|e<amAMa?CSI5G+f4k=24_(9EbSWqzUK7Rsk8?U)eZYKA^ zZSviI!|Hv1b(8Sx)}x5cxJZ5Ikcz44pA)pt1Wo|n#*P6`hlhs;9Ul!9m3^D*-yz~L z5G`fz=2UT-a|l0kMWXjC+FlIkZob69TZ&5d&){g3x%qXrkQnMRfkOkO+WLwI!<5qr zpTUSQ*QLKh-5qfWF6ux3j|<S4lVdnD_a|yM>!2sM#<iDUg)i$U+v_nv(Hk7kAP^k9 z{;4Bwj3IC1v^8J9lG34=I89^LLx0OsOc~QcL%BF*n35wS*}8q&y6$CGh6k6r_r1`` z#+5cZJFV^@Rej4O$E$K}vs8_@`!@1MC_Vygd-C;0rW*gKbBKOn;-e-Xquc5fJ*{+a zw?=orh0VY~bohwp@y*RoippU-V)wpJ1)TZ6>DfG{Vwg688`76lF|SisjQ<0L7R5fw zuiYJ`*E(64nTN)6D~Hp=<#t>{dI)6c80MsUFEJpguet<&!<gV9l`mZV=m3!<nUfQS z8I0>x=Q(plu3T0x?+bIXQc~yOna|M4KpH&Po^v$><zQ56rcxQXnwsXc+g#6Ot*Y5C zTDa~mC@Xy(9{jkhkyPbqLxBYq9Sfg?LwonIb=UY?zM$)7$a|ghdPrHK<VR_VgN#(X z`1R|Cxphl5%>tqOC`G(7Qe@P*kAB;d4d&}v7H2FM&--f4NpCHbrp1eL+YD!>*s<#r z988~-4n}^Wp*mD`dwCJn<n7xdw!a>!aKS!?8XR&){p&x&;D!Q+mmH52JP&XvA16G< z?hL!F;N3hwt*kg&K?0Z30l05_SV*bHJc4$ZbocJn#$q2t(CySq3VrfgKFuq{@Nz{q zh|nYT+?_td6yv$k&Iw6L=8lduYq1B{lap@PJD4mV=oGKu=$5Dscya8k>vU#y?e6Zo z+i4CndKAryj#U_awxp1m79VZDalD$m@AdxT!0ExYq13XnSIZ)zq6zaEr|zUD1wW`B z9Eu}TQw7s-r&{BxMORIFQV?qnm&jL|VDtWr1Lb99M0cKBzH}G_OvG0uA=NlCI$9CH zsz9V2I*DI~Jt%0hO0zsK<asary#Pf+D9)R)A~zS8$izf7BosqE21}mUe+>OU{<Te^ zIl~bQL)k$%pgnv2y7_d4vFG9m*WbnSFPA&43h55gKT3&j`SK;g{ugQp(8b|OWIGk8 zr+~m3;m=wX*=6M(Bf;E1;}RaU#&n#`ZsWiRD61v)x}C}%R{??N*48EQ?1uWz#~Hxk zWMLY7k;btkVPxriBZ8fib2eXZ@coMW8bZCysQM*=MZOTr%H(7+8z9?HesIXZ{6ayY zX55y3v1`xeA<qmm3yV+f0tSHr3Hr%PC&S-)QfI6kG%+{-80#yr>)-B+`bG~#ubzYD z$HvYLCTWMzg;&lnv&<YX`E4P}ndffVxLk~j;orZx*)x>XmkrguYy~rQA9*mu#L-?b z((o&lHq%v&?AdeabYVCppc3`R33=HFydE24m>#uszGpLDVxZ%R1Zw!Ha*9buMKUmi zTx~C5(|lLhUlfvo?5tJ>i-$RZMsJ9uc@?f|Bik3+u*wmknhE@~&`V9xEvMi$w)GKb z7n|tmYvkhew!?Qn?^bcIS-7`5Ie$58acOC;P1hKnyA6AV%6wnH7Qp7jVAE*Ns3AEK z<Uq6s3kyqMzIMLl=_KTYAP}`VPmbUSf~XK9bt1zAVWvNSUP-z0@233otA>V1Lwthy z4iTzx=@MrWBQ0$W@Gka=)!&6~^kA8k-I;OOx!OMJ3~Rvj1}zccm8&EGdUvDK-?c)* z|F7`f<-bE~yGcl#heqb(zGzkaE}<>GyS=@*fa-!_=wu&T!c%sgV=)r^-TS7dqF4TX z>l^+Y9Z5}T^scHx&4q$;LCpO~!pQAvZ|-Gp4z+N(>bGex{eZDx*bdy>@lQ9cxw%CI z{Hy=F2Ba@k2nYy3Sg|XeFYWbEN~$vr-m#gvx#E{twxV4&PeFpb{Qkk_UBb0m^7cB< zX#6Nw9nGEvO1dEf#fa&?FjrUO$Z2OEA4fkwdpqlz@i~j?hDMRZ$M4wtQ+5d2{8GsX zr+k=`bK}{?w8TV@byESeo~v$)o1i49K{LjnmtTD=x#JO!n)!TYbMadj-LsXfr%s+c z40lr(mqkC8tTro>`u2|YAEV9$C>x_nvTC%a{p`*+w>Om%LRhc0ZRxZmzOlf~Uur9D zbaH`ac6hd$e|a&b!xWyr7B_C}!Jr6z88|C2kENxiW|v82jI;x(8w}FFQ&X9RuU)Wr zF~8b`eG!3OA+4RAeLDz~7z%R!$Zn4_@Bpji-1+lIBqZYKjok0z-|fCQt=V5(1@MfC z;(x|`|3#Fq_EY-s1SF?QyJ<vB`&Y`;os4sN{_XO@;xgGJJZ(5d<RYtlrAP8JAZ8$& z@#o{~^r!NcY|5kX~m^5m7?F4fcL_Z9j3UwIg2>b!4zyDArjp5E7~zSD)p66Xa4 z3#29A6lI4z%RK68{L11@ZrrAl;{2~;x#@MUxvPY>`55~^wRBER6Jm)tNCu`4>iwbp zd6<WI)nU@|#H*f#6?NA4r|r+_*E>Cg*i@HqRRd<}dvXmZ>ILnK0la5E_4TpImdkp1 zFIa0cygX2OnB8&wv1Wysx3^S$bbzQRO>x-%iGTmzJbqkt`^KKE6qX56(kmxK{bqmA zA%<eXz~K8(-|6YGw$Q{xG4q?}8sED(cXgY=CR$N#Z*Qqqjs02aGa(e5l~JVoQBxr( z_FMip1|}xDFlniikvs-^{YCkD#jeb8f>;0axcxqI)02kau@NCtVq)_N;rVbz9|%8{ z`SxujEc^GK(^xoCLjXEQdd}EwV9MO*;ggAIGR$j1|JZZ$ql?8FMBH98A9jQ0<T~9| z{$$N~??dGpq+$`KpU4!&JVmL#7_<i1C^|d4e);vQtZ#b_pdun`7$Vd&(3J%Df-oh8 zY)cIE0F?|34Jm<5gCJs9J)u5EKnpiJ`-f|kK2T$#8->*?;+2%ZK|}?PWOlObK31=p z?Qj$!CF@xFRk<6aZnzuG%+7vreJGIU&LD5#H}$;od;G%E`Nm}@V)G9<aL6QC+1ZV? z=W+}1lII7L@dLeKWvvBh**NQ<ev}&_suoSZl0=-GJ~uZV0vp@Rl!Hsfv+VhO<~I66 ze<z>XrI3B@{3?@Qc`(6UYw-6+BtHn;H6TW&*wp|&H#hl0_-ixi^=JlY$z~|unQe(H z*;4ZTcO-O{-JDNrwEV3G=qphKNkMQzzGYB+0RZjo_JxX4Fq$j={o~WtczK|BT4QiY z<ZJ~qbKS!HfL~lk(#hV;!~2G5X%CG%<4_m1wG_`9E;?f;B;D8`sdc&engQR=c?y{k zMhc9(ni;%u7KGK{-0UzKW8Zz3p}%NJxBAwG?&hwJ#7fVoa?ho?G3#8yA8cS~RO#Ci z7c8(4mI|Rh_@*KwZnN+#!$3bk;VG3uG^=~xcA{2-(Ftr#0K_Rpm&9jfuK%E0U0ub1 z`43WpdnjS%s4us<VulJ1Ph+t0jPYDuO*sET#yegNrU`5e+q+_Qm{GpsjDkYWv0g~j ze&)PIe9yzr{hyWUmk6-K;ZML_8*mkgAvQVLH>7}{h7tl$ngWjpH~{#A?)k?fLqngo zR#><ELAw*Y`d$&vOoUN1yy$)y)wke}=izw^BM}+6fMSM+fYWLyn^b*$wpFe!+WjnY z={{eX!*>@W?Ppa^tM}%5if^BwwX_t@{=IAyx~*f$l_nuU<>m8dm05`?eC&g`aze;g zlRI}qy15tSe9^6*&+S#ONe$#+x-IFru;*pds6z_ut|o0?){&<_d9n=$A?)i$m_wSQ zr^yy~p#d#^A56>|VdJ#&QL=`!ruv|GWXb(+<qCu~N>CtenZQrB8XK5y1cfsh&9dim z6d&BVIyH81a4j!8o2}Q1miC8kBu~(9qw0i2k9TE$o3WO+b46y7><X_BlZW4#DY+P* zkdRg|p~?~%-(OVZitFSj&6}YxeG8S}De7}e<`-Ksnj)tO_ykfRj6$BjdPT=#W@Dp% z;|33EN<YLv_io98W=-UKxO;ezeJlUjVQOXdps7h6fHXi5WP)CuUq?#&ERt#>V`41O z9<EB;J3AA)DPqfmsOy9jZ5bIE{8EUhyB+3L`u^QTUE{OH#=U9g(%>`WuQ1jX!Os(n z0iu8dq~~9Ysuy+$_z4(-4NR85@!Ae56g~oiw`-v$-Y1$|<Lrann}>wI7wD&`60*Ri zgzV$(^4)Sc&(3yb=f1tZoI=uLm+`%0E7{8po#!pZU6*wSJ>?eox*;UyijMu--F9v{ zM$YbO@UD@>8+6oq6qxh|><XePI8k>kG6Um7p~_7fKoNtYC6X<))S&AqzR<?Ls7CUk zZnPI@@z^V$z`9Lqu>9SKmsgF?45}l|VH#D)_!;yVLc_w4>elj9h_Z*eK3UP08B>6G z$%Q2vZQa_Mm>7zJf-g?~46m;5Kdn2~=VWEo@Wj+N1=e?a&h4EZG#8(5D2}6tPx8qB zz;cV<WYL{-8yKKQK7L&1)G8a4n>)>+FB}+D>+!i(=z@;x#+L<bfr^zsd(ri1La&-v zw`9Y_%nXybXyf`}V|{&94ULwhm}yj0Kdcu0EDWA%*#lxl`A5>(&aGm7^CmmUXwa8} z^>z@e0v-TV7+CG+G^W7Zyt=^+=P}B+@2L!tkzj&~3JX^SvEEUE2{3lze{?{^0AO1$ z$-RjKjmOAmaj{gj;=J$mx%tti`hIQmXLr5!=6SD*&K}8Fz%B5}?HtKsRH&}OP)crU zq5zVkLo9|lLgaEmnIae&e<U@{_k$o#guxJ2=rlBbm6fMlU0orBYLZ$;ONbkVvEA;P zyZPga%|K1<5WEIcIK?WSRi-^iqx?U7=@27hdg1FBO-k?EjSYu_e=#)0PG1V!Z{8GP zhaI#oWXLAMxic!5Y@uhSDYU(VJU7WM=K2vzIlgS(bC)teEjYr23sL?cH>V`eN?7b< zC%zs$C(VfIY}wY;!L^c+6nKU+&tGRt{q){NX`(w$UgiGMd)6X2$}mYe1|U5Vq7=#X zRg?WPj(tT+^k8+(jGWqH2vqnm)l&)=&_+KN332gz7hiC}a~`L(ws!Pg8+a~3U8?~l zH?BZ%EV1<5r%Fa{SX<XX9ale=GhWjI-^RE3`EcL#MQFFy)vJV|AtreWSBc0WOsHn1 z<~F*7jLiT&seMc7J`W{aX4MAB0<xU`P7V$QC#7kxTs?1oM^0Vi+llnlgwE*?ZOgW; z++F!=a@3KG$g!h2K&^Dc{<)SsT2yVOk>Ep6CA9ReH}}qDo!SWQ?>8Z)>+pA(SzhJ_ zw=cH77~7fX()aHdd})(e=SFM{oFnXlN5ddHYZ*!5mgY{x#3I2UVRa=xTyMI9#lw#& zd>>13=?f0NZRK8ex2%sme-&ERoXFtp(0})V>U&1U%-s)lNkckbelMe{PuVD>d0wG) zK7sdPSj+zY$C#?kip*l?{%T{T>UcB_2g8=N$E$;$!*`amXD9M|bd4IbD^vFE+sA|$ zBRI_CEVe7P87IJpv#0)16G95``#WN$@TuUbae+66G!Nhu$!V~!6ZnSKQ27KtbH*qP zWCm;%dc*cxZ*6|Q+3pL86#Lp*lQ@P{Vp3Aa3i^XUdcn_uM=qFxa$vE!Z?tvT#d|?h zitOm%sHpFGhP_zY*|QEQP4y<u&UA(P4>huA9W|O_r>w7z=zAw`W|x%c{Y+!ya7@Rl zr=mSz_NGqMGbt|m@yC0MjJ9r<lx#U^f<HcKI1ATmOrIbPb_JZB99oi9+c$4{j3x(j zg#NKVs&>ZHIG7$ZDMe37@4}sB?jVZ!S$#|Wu-B9ahE(r<Imc6;TBX91$K3jro3T%6 zB5&R{RW&sST%dKY%A#)+>TmPo;|1s8tCPhSsop-Pinf%%S2KSri8>8B&wX)T`s9M` zMv70h_pl0Yg9Y<PpkD`Rj{dk+LI0(38M3a`Pp8)XuvsV}D+Ujdo~suGB#9HjgcSm+ z!(%)=S1#nq(!!f~d`h+>3Q4NC_9N=eQUC4Ddwm@wH=C}4V3ZQXxZeDx*e9=&uhXlx zIG04z!Gy$^|9)X%;fE5`ga3j1$B!dG_GhsVtJxW|$BBtT25bBR{C7ubuGv+r9))wQ z1*l<-M|+`Zp3l*5o#?PszH6wKcUP(x#iA2Di5wjr1I&uY+yoq#aoeeS*_3_Y2)UEA z{Gpch{~fITcd@6Xo868yad&_0_S<7OG~#$3?CK5G59^D8hmN=Bq?cZQZ<G0$ZF0E8 zO*zet4CM`115GeOYRA0}N_j}(nmc@$apn72pKACEU<*j-7I*h(M|#{34IPYXl{2xo z*V^L{(>R2Wiz5&P@Sfh*gVUY;wR@Spsu#w(j5p`#QC#h+NAeBOX0!U#+BRak7I;x! z%{s)s2^oMOZorq0KJww(6uuqR<;(|p4@6l!*F|7_tfHniP`>=z43_=?>91a@sHv{D z{aXQOdl-Tef+IFEQp{norYv&egvIhy4_4!o@1w)X*XEX%K6iIBV&%SgF?#F9P=VG~ zoAE}QOLyP!*yp8ZlW@YAMeqf`XKBUq-(`CThyK3t-BNM43I8vwuDGie*F`T?ERy{= z_^q{hT@PmbNa<#ikkDOOZCP`jYY;MG7ZkVcO!coTzl*bkY?cg`=Z8b*#~8;zlB~su z#xdUO_Zw5{NQfuEbw5QOBh#L{Wh-LKK6eWhN>n;60QKW1B!c<6)$a53xba~2%yr}_ zH8aC`B#A?Hf_*$THvT+2msWb{Km%pU#`fju@>Ge<#eJIt;al=PU_Uh!2bMf_9w)iM z?%&+mJHFKm??5D@*EclKn0p$05jWbX%*}(ep;$2wpX&n80sK7gWkUh}`@s*`Ir#q+ zook&m$KqIMawdO39?-kDs-k?&eW1fm>!LnKK(euB1wCQ91mmzYq#7cSvSMXoFN^HV z->dB1_CwyS3!cWWbqIbq4s;h60hNp{sgc}(<=<^xePe$fAV4kQ+&-&^|6+@d35thB ze@7sy<uB3Il#)Qp;jyKO<>3iAyWy>@%uL)C15hm;Id!V{bP+LYhu4BymnAi|>^}!1 zZAH3xWc3{weERhUrle|<8T#U@HVT4K`Ea!-*5ZMWVy!Y~K*s{rqikcTo7jtk7(F%+ zYaE>%ED*nb`N`I>B#I`N8TN)GaQpQ08aXg1g7eU|f$tDNmpdC<cbXedd923PEw_=T z{PXVl=VU1=U3NvNJ4-Wl81&xa^F>1cM?zv_g0hwq8NkSGhNLaFd>`M#$Vh6@Jh3{V zI*BWHd&+K#ImR=gF1xlV+bhA@i+-CZ9RWX-UM$-F;MD^ycfQA}t5ee^US3J?O-XN4 zE%EY@wY9zVIKj%+j4wAlJA@BCton2AL#c<1?R!y?2Kkro6z_Q9Q+~)c#%sK|u}R~g zRDNq>a)+rnD1}LK-d)!k19`eRiVs6t?rPI3k2G)8cZ2jA%Zr#7J}<fApPI`WoTr$? z6nDy0(R_#ickJzj<>loOPi>FjazeXk<S}#rRxej%(+kp!DmqGYvz9Jmw7!vMBgC2J z+<OFc90%h$Z_?yEo$LcAEqa?P>MZ6AXg+i23FBk6N~|Q+d+ltAuZ5W?$YAW;+#^Nx zu5dXb&+vQyZ+eV2F(HAtt)0ym@}|ySeSzxpk&B$#eaEi@1C#y$wtL>Y%*#z#&6Rtv zxgymf^$6%bF{swyH9tF_96Px)oatS*X!Usga_e;!*??nCx?#;tM`!2WH?6Elo;h=v zu-3`8n;e^6wAUM{MoujQBdeLSjq?ZZb67cd7BwsXL}{M-0DVcE&z$Jic<q*T%jQg? zNv2ojzpm_OycgrND@MADWlPKYZD!kj;O0&gpD<xi>^!I^g5UnFQ>}(+nyE^wYSx?Q zQ~<BwWd|z_=))p-)INUr-R~-K*_`AWx)eNHyckG8w-Ki8#BGL1HVU1J+RvYfThqcb z9x$q)8AK`*@9pS8b$WI^^U@WWo@2Vk&oloioY;P6J6a-pXZy0A^9M?*9UGS?-ZaFM zeO;(s7-=$GgcSy%Y9q$+d6Q#fycAV-f#!upg#hcZPxzP+CyY(*hvOB_4F4@rln(yh zcWxg{Y&9vu0A#APBYGOg6QpLiqls{jzu(Wu-0u5|HA?S~q7_FH%F+SUcewg)#ZALF z?GKL6y1#qS4N7nkG}VdT%2Xf#|2@}-KHg@XgKNLyos!gKYkOf-z{4x3PqUh`QSn1l zre$JzVWc^F(rF}9_qP%r<_m<h<X<0Q`I9!FW$_%|LJG)gMz$sfM+Q5JBG}ZbT3k)) zIh3ZDF{2@v_C-apu(`+wRU}*EO9;O#mSe_$-=l-Y)Xek(zK7tkl&R=!-si7!xDXS) zOK%6ZKT)yiUfI8zQr;!z)F&kt;FU?(XQXTKAhlj1ViJzq;t1oa`m&7(62<n|vA!eL zBBK<{VSuIdR)TwK!QX>}DQvKQN5%VbA3aLJOaHf|vw@`Jk=^yP*P&OfZ)$q>@+En1 z^Ky|*wl*)iNeZ1k3#hn|${c`G$TCX5VA!%)CcP5of4FwdZn)q7@bm-8@`1Q9!P!KK zJDhb(1hXH5TBJh2IV~b0!uR3}!-K2smAUie^FQH+T0~;UDIo9==xgGmX=@AaRF7X6 z$2~WZyHtc;oybSw=ePL~kE|}+BM=NsbmxbI1|7|ys;ZjRTbVJG5v?0bTX1BLURmgg z?2ccc)V*Q@=bUWcz9A$EBbLMo;AZdC(H=1XJ#qP6mM4~{OHx-JyA$7{Q5A}a=*!U; zj1crz^_uG=_cd#4Pt;<LBse@br?Py4a#Mx27JIh<bxobGU!J%;mEG0`%__HmK=bLM zMU%nh>C#l#X=^j^l9KNJJ3885mm2=0L5n@E9!R9Yqmkd8ZRb!eBR-)2F_E{$6^);* zgXBrB<&r3PvXd4XEWRr(iHd$4P)izqq@>krjz}*-{>jv#PFN76mz5<6Rjd%X6im!^ za%pEp`9EBd*hqr;8aQ!-Wx+QWP|ZZB3dgB})=u!c*xvRy_Du|i`up$nKjXhZxghk; z4j+ujMScCj00Ukm+xBj4E-x%C?fC9rfI9_^irc9T>CKU?<x_Sl6}d|lVQ{C8+nQ0s zEJt$X-v`G1(v>=uSzB&$ofUSq-q=hR{_S3aW7|{A^IIu>!f>n;e3f!rxz#84>n`Sj zZof3$t?8vMb93}2ByQ>7N3j#q;2zX>>qDKXg<3+Q{9ua`t1E;yw@VWpTiI2YW&OS! ztNom=u6t3(=rh<OM=Xxu)le6l*rS&u$$7gJ2g8~8oM#1P(O7z@XM;mR227ikz!odK zv6{jlE@zy4YeV*Wu1#z4b!jfi0L<F{pJ@{nkSKUfANmhckOGCP;^|0F&-aHHGoGcr zRJaj`HzUdOc;)Acr{f!pOzSY(Mx_Y7ZT0LB%X(|{^r?#ZvlVWAo_t0{iv*U18ZAwW z#~n&6GIH|j?(VgFxy2*pvMOQcRy2Ej$ZG+<gBmhSq|d<do{$n9KHQLS;+}VwTz>*a z_o&xVRq~g30Tec|wpQCZead^odvEL{lpe%=1y&6qx597@%y3~0vWQ>|SWSFb{b&CX z?LCXfAhmpj@m6ie>g4pDQl8a{uC*>C0ic!@Y8`#OkA+c2(ruXOrSpN^#;5LcoPW!+ znvyK+Xj$3u^{c$9YQu?|x)X;V3LgVqP8n|2sa~7)k2GC_@ADr(hc8pMWn%tT^qclg zZSBh_Jb8HdpS*ka7zyrw%%+>`t*Ikpe0h4754je($}Ci!aXL8!lv`Ex6T{c;PY?%F zv1Dp4;THZFTP5&6+jBKI8t)5CZdHGlX*_%PW~auvb0R<Uy~}sq#PogUi@l$}-!UG3 zHcn}OG_}Y^lUx{L2cMr!Gh(3J!6fZ_cZanw*)zN8qSxIKpXw>{Y<}~BRP)F<LQ~oG zo_tBMi**M({_en}lUmo)xM^v!U_}MQ;y_F4=S6?uK+nt~OOt2BpMF!z;R{ao_I*G! ziEKQaWQfGo1VIM=0?>;~&AtA51584ARkXj-I|Hcfyj?vmD#Fh3cZCrqln42{QS%TS zT%zs)Tr|_?Pf5eXq<-!kS*p*b6f{-D^dwM0-pDA0iUq+KoB{gu^z@f5Usm$+V(fP= z{XZ_idfMRH%jt2K@rcHp&5GDhjViK<@3D@hI-kc)f*FS4%ozuVS(jxS@HVOFY0rW- z{6B(NGpJ%Pq4rv-50WT<eMZr|#2&v=Rn6`Qmj+NFw2hx5Q1}s?-c20XO`e*3RI2TX z>MlUmE;nwLbV3JEcP5-IBq}mCMcLwV#)r@wD)xKO#j7O<pEVcs_xD$*E{)G)?qfX- z)zs2b?_^13q-^g_|DEXR_U_aK>WU%=KIRkWEjW?b`u~Hvb+tES1<57nTb)S6SWSDB zSG9qHo1w_IB(KM$xxBbXKD+HAYzuE&o<!$V?En!0MuVVumOp%5Du(>|s_)-vQR-o; zi6FqI&!69@ulZ{k7yk_e>cPQ?)YR4xp^EzmrbU1*5iL(62Oa^i6=CMgiksgvmADP_ zi;J(vwDG?8d>^kRB=g+{T~5$`=07MZfQ0HtOd^k$J=Ci?;lzJsHKgdsrC~#oJ8ujg z4kG_F(B0dWFCN51(Wxc*SnogC-rK~DC6*@&(g#gf!Oy>sKQ$mdkvh$D!KKKKi?QVY z>6OT(4nX1o2KM@B`l+{|8Q@sV5zN_pn}vg;m>jGb7U`Ko@Kk;F;u|X08jy2GoLVkv zU9s2X<~pD!hZqFH;si1R5Dv~9IXA5XPC+d|f&Z6Go*>Mb5SMxuM$=HT;N=GQtEe^2 z%m|O_jndH_JQR@hZ*4W|P^x=#`SXy-X&5Hs+7`xCYYdR~bs@b`A;@5y&5wgqNBZ<J zSiWBCowYz9!e!(I156Pzkk+7mLEF%rt$W$g^py9rVBSj@m_4!o_4Pxfq8<nA_AtbB zBbfePt3z>wXoQtD9L)#z8m7Fh$LI^0fL*ZHU&TW-zO#A+I}2zfxd)+{A>3^+j9auF zzd3DFnd8;n-DzfNtBmkCEGnFRDB3F4=hW!P1KGO4`NB4YKt{@Cj1F{?H*bVNV<6(G z-r4u>K$9s0<V(RX833O~lH^^;Ct$1!hb*a)DFD@BUZ-X^xb2<X#8lQt{{B@lU4K}a zyEyk+`<T?qKlyLbH-Ya0h$R{f1iRp$#1>`9g~MdzHU8I_DZIe2ISws-Fvyz`jf1bQ zmM+~(iMwCt_||svWW`qb^!IOFehM%8F7_M&@#TN5T+jCm38mPu2M@@@n52k+L!6~B zZkfe#GdFI$m4L{&?w+y(cX@g^surxeyu{L^N~B1|(t!A)oO3&lr%=7S2YHsbpp*rp z1|}xT`m6;MD<mMvB7C&Kf0vdvcsFvfqq9B8R5?It&(p^P0|SP(@0)^Bz3RYPK_P#^ z>8<4ymp}h(3cpDf&hBG;@-aDSK2MA#ZSAgW`tjdAy;Ws!ap#6@H3|Y)W)S)!%xIwG zz#I>6i+y7Da&{YxgN#O0dqvDoevF>|_0fN?3F>)hULtW`VoZUo^N4BG-GUOvpMU*Y ze>r#Sx^<8?FXRq8gBA0xbs`mXq%M*Z6G{1^;#=LyI3BnD<!(Jd{3v0m0svMDv;w%e z5s~EhkKr<Nd+^3dmjSkNA<PZaanQDb3|5zP7u`ySvlNm1)RwKw$YtocT<%7InkP>t z^pv{gi+ONw-&DIa%O)S|%c10Oc~$(x3AEfk^=dwPSFS`PMXO`A|JN`M11LP#{OK^% zKYgI+K)}RZ%a|)7$dShc2kE&V%c*H#Zv80G1~!Ds?767+;NTDykP9pcAV@^T?M8L^ z@?`?b#5+dTT?=mIKqL%cQJ-b;2=G}e_8IV}lzZ3HY)F0on}BH*UNJ%APj2NvAamV} z3OcNh_Ro|=K~jHnGOf0@dv}TYol7n>xkq|Y+@fm~OtfhwiXU)=fY^drUSHp6VruHw zcs_1l%m2x)vH~?le+m3md(ZPd2H_55wYNHcKB7vk0+$7@B4mF4{;TzxcdB=@dQ~B_ z6IDEypkNpzk%T2Yly}pWTXLAUz<yKOywcT2fb%owp^g5}cUUpLm6>l6!x-^VY^*Z4 zmUtx-o%v_~p1I!Wc2>7`f$MIh2oA51N0Trn4`Y#4RaXAY)R_|hunhBf0EHm`2F%Q0 z4zgp%j-1;<;25}0{|4i5;9G{;%IYc-&Ke-dhga`y-%*>tM3OhgOQdtjDJdFQcw-JH zP`1P#cO0{tdwsoR%*NpVZ(I7^Aiz9W@~1Tas5csegKiRTDc)mx#Czj8Kx_wGkznZ| zY4(4R&<+er$BoqoQ!*fFLQE8K9m9u$@E*XrCmkUu?CS_%v;@xnE9U|Br>@Cx=yT`@ zE1t6a$CxJtbY&{}Z3hD@EBF5}MAGalMkz*sZ;=lp&{;klW#|2F&arXH#`2!2C0_Wr zSFF5yu0~erk^Tz4V3e%9ynHHZnzURbnT`MI|5!jVHyKt(b%z_VdiC?5sY8XmGS?`C z^DdgLw^e4I0v2JIvl}j-{OwuJAjncN<<X%)sMBc?+`bEezraQkkURyJrm&b8t<~xA zp>Ei~{k!*1sooXi%i3^OZa%)oYpqML#DfhBhK>HO_lmJ%ws8-nS^%<Fzm!8I`x6%6 zIC((f$4p6hBnikmVR7)rWGA#oeqNPJ*&QpWF&kTrHW>&NC@|4VnH9Bdn?tEv7WEdM z;;??1=qw3BM~*HCv}g2G+S)o=dY5lTP+U?pKhh7XCacW+PT+njmoottfst`&gl?n` z@eJZ8V`sjMR;UiP08<G<LB(&NFo>KoLb&1LaspLGKMFMvP-<*`N$MVxm63UzkYEaU zHriHk^kB(;Ogm)e2gQyX*#Zdv;$Cur;;jBQ$c9K6>=u7L2rU*HT64483`5sJAOPKY zx2;S}KDe&B7TI>Hq5>g=SvQU=@MKO~8V`!D`i)KfuGiMN{3tfXQtLr|SJz>^SE2aY zy|H|e<6<XH1S+RvGwuLN#^O040_?vYxFiwj0^A=(;v7hmht0nl*`l)sI|c9OurE+B z0^7zsf-olX63Tpa1@DGnUcieLkjXueJTO~R(9>hsTC&?xhU#r|a}(oN&bY?FSA*yi zaDCEHQ#;g5%VIxGRc_tE3Luyr+}yjt&;!c?)`3s3u6?$aeX`Qi&pfxziJSJ%WgV2T zTes{SG>Cs`m^UsE-6o!0;?ueT=JUt;OWYu&B!yWW<I5;ZOG2Z>_3_BBr~?d&I^tN< zpx8S=e?%VRhYJ~^2`SGh{!Xb*)EdYaK#V(Yjp}D4xdUhk2gwtS_#R41aF2vK7uUd{ zf<^*oB*8J*+MM3{+}!-ou5u%`Nu7*=0afawo~azg^}RHDR2Uuhm1L!+V}}7XzvL7} z73M6rECZnvAm`un{VG<4`YJr)a&m%9smWRsI=DQmPHlZZ)tk3=b?@2TXIXx438R1n z|5i)uN)-wzyvr9DP5Ji5XsHL4^3lyJG?Ref&CJYP{TBBeHEQT9b%oZiLVg_r5g*oC z`mYIr+<#d5G2#Nkc!I!dhZaV^LtB?;-6067r>(Vt5SR}*o`CzoiN#w!e0*%|4}!ID zOp@m@!<@vNb9!{t1SD9zDKv#E%RXCfm~(X&TGQiez%}6S+=hNW0nTcy2%<r)h?uc; zFsa~75e4W6Nq1VjF+?$n`sEE$R6(DMJ8WRJTG7^|uKe=ssjn|IW3TAz@J0{O>3S>b z9ERKxBu6dprwM>^n3I{I%XJ!?I40V9oraZBv#yA0*2y~1)YMb~WF4Gu2>*+Sj6_HB z`_U_R<1+V1IM!1kT?UhWD1b?yV1OS<E%y0yXkAkhU(Y3p*!@E}O3}8FO8t;Cfh7(w z=c(2)WE&8uF0M!U3eIYdsS<lGoQxQ@qxQkYMP7>*JF;=mW`RcSXjOszRM*>(pU<y6 z)lPt+9T<8IW2%IgU#KRX&c>9sWzM0$m;us_Z9d>5ZLGzGhilT$JsgU&HY?1K@z7>4 z*qr-m7Ea7FFkSV&IyyBrsUTfA(>C%6PKhg>t#>}BZZ2>`gOuyJi6f2(0{IVWU-Z8Q z=N2z-Z*<R3VIo^!e-7{x?BQ#Ads&fIV!<dp9@vR41JFN=OJLruz!CWcLx!=oY_dIj zs_N^>p!@k<?m1Go4D37}i0T~k;wpyGN(ol)Co)-r6*;1Nm{?iq8yvAn=l0GW;}zuK z=L&sy=&k7ex`rA^<G~is;w;d<2`>hb<Hv~|SKrh?SA6ER7BaT~=MIkgL9ouv(sKCx z;u=~Fg29E$Hi%Mg<(h`VP=y?y&8@7uI^obv8SlfteR?<UO?ygkgsm&u-hXJs*!j26 zK|}JQs?~!JMo&tw3Su^jkSlIZz8W@d7l6%m7LHzJ-nM4rI)eWl&xJuhA7A+<_U#yN zydb-dj*&R?gAxKXn+VJ9xC#&+S6xYlo}?w#xuV~%bD|DeX>n6{a3+PG;3eZgg=z(O zC2&b7_U(k_#aVscE$r4%Pr24`V>NR;<Ki)#RHTt2x&$i?N->r@D<+Wkj!-;<%gnp2 z&9!qXDr~^{aI~{{&B&v<v+dmGftpgG`b5UXb4p4iNU}J>!C~4m@&V$OU8^ni_5Jj@ z>wc^<YyQ${6FQo9lps{kH8`@Ld5_BdgZziOKjzhAj|vMHo%LG6_G705)Ku?qX>EM^ zMCBC)N1o&C@_cP;M>xJFn)e78e~>!ZuYYt96&3sVF_jN%c0W<3qYk)p=MH*XB8|Y% zkO@3039lXq@2RP%s%lw%WTth#Ra9L5_}S_hPlTxGj?By%pH0fLEjiefZ8P?E5o;Zr z`ZFcY5ovLjHSD-psH?eo0O;g(CsSQI?m_jdPaZ;ku2uE=jT<VGQxk*gC_8(bJ6ay_ zi#A&&w*7zOnQFM&(%uz3{x)~9h~(CpgWP6?%?-bIONs4$MVR!aai#}Tgwr{({8GT1 zfUXFAR)PL&w%@`VZrPfDBno}s6@Pn}5lZ>ctf8SxoR(T7S??#tI8U~|Lg-op4Vyiq z{t`3Z6S2%>J(mpU%Rra2cXj=Y%q&C&{7!4{kpv2bsuK3FhwGM5PoBH4b`72Kyj)9X zXM8QIcM_@yJnF(YtH1`f)xcE+3n~$*7j>#cGa<0u0KC~}U_P}y+?0d=%71*?ty7*O z%)fO!wkE?fmsw_w9Lkni9`ScF1bn3;Co|#tB1&Fx{%OX*S@xTEFZN|<DbOn1^nG(q zfi2>e!FRsjo*!NROuF0cvo7<IJo(nNGq#wy#rtZ-eO6Xx+1k2qC8;CQc^}O~8ZRp% z$dJf?#sn08pbsPL4u+h_op0;t7-)#$1DEY%!LrE4hNZpBWq;+Ja$8I*(>`~<UN{lP zQciK{du*U#i@@$<JzODvh{apqSif-f(!RSYzByAl!G=%vjzq*nxir#+ej6SJkbbhw zmwAG@YRI0N?ofeWzCkImDY}!pt29i{@ElAl%VUCaS?QA!4A_*=IsB}jxE!~;^Vc_u ziiq&+^SZ$zN2AW^EE|)k$J&(`?mrquNHV=%D-Dh@Dlr@&CqZJep`oGHrSFt#YNO;W zHdDKHlMpt|0}T#!2j)6i-&BL%p`pz!#K(S8NQ;Lq;9dYnVDb(F#+r+!_`;dK4azZR z(hEFvRM&$YUi8uEB}JQGR(PsK#d0tVxzo|nF{il>n%Li<D)%m5St_+-kG)^-`Q&mn zrj0w_UXf9%xEoye5<y7>hmTZA_v(9RGN%2zL2UWX^1atC%y-+q_T1emUNr9}i?*X? zE_re>Mk`yl!*5abjH*O^8qFc9``fm*Y3t}J@X(}X74OC!E$KaVoU4<@{tA;~KyJAq z8?Ice@%tY+up_AkfFkxezT2~({HU%6{dTaKZF-BCZ4NT-h};I_2CWy`bwW*Nk>8k> zp7uf2a8;%bRmqGJt@lJB%+B+|H+cONp8Be0_#ycgbtRf{;0G)E*5(El12(_(`WSm= z0jFKj-yt9%D13t1H@T;YeV*?;Oc`)8JvpR%`e+<O8C7CR<bK3g1q2>$@3MIdn8#1j zAoR~8)3iJpfO+=UgfB`So1dzYEfG`6WV@85D@r`pLKtpQAD|8df=L%cC!chJda?tc zvRN++XZnT?oZ7$sEOFunFM1YYh`)8q(6RSTPVT#V`iX?<nC1KT@82M)jv;(>S^}sW zQ&G`*c;h?#@)$XQ*ZQv1^BUTzw}RubzR|Xil!9PZ#>KPi!`%-&x%@#|{E9#)6$QV< zv$C}u<P41Qn|U*H*=Iic>kTa<hmFJk*6uqnGA0IlWm1Wz-aG~kTWxvwG)d5>yQjHM zyPQ9P+1Q-m(9<_JhUVC$PoAuzpLHnN6cvFpGBqRfULBf{rbfdZJaptQU%q6c+Cw2{ z)IE@(k>y`+?uQ5c;hHc0j6bMm9A0;8oDe3_=Igyw@gaNr+|sC9Ku=Hic6F6B*kIw- z&6IULvS((mZ$``!b4P|}qAxz=B}c~Jja#Y=m`Jk0@A)f#gJr_gffWvRan2R!Ln6%8 zkYD%Y`)2`RHY&sY^kMr$z7K!-UK8~<=GE)nA|;YH9Zg05m}U;wL`A&f!t2I_@jgYk zqR9nzE-4zIOnv$tC%nAZt@Co4$<wrX+2b0inV3R#jXX$z7{Vg`ahTWEY`Bl2y!>4a zH3M&qL8?1C+`3Zv=*TH34NPu4r^(4Fe>W~j4qp$#;)6JqpFJ~wD`a>6Ohrf(KLd6s z(6c@J_8)N#UfcZ-v9P|=KI<uUB;@<{Uv>F|j>6e>ybw?f^<GlzTg7(-{`~E`&wQ%) zZi{s?)%{)1UuU<~`-g@E8^k7Ccu)F*5utb2os5BzkzgfY`cLvy3p^AGf0hm;Bd4UW z07AM8TXvkVJZYH+?9K$XE+i*cN$q>$;mIDC_X@T!X}P(SAZ~-Z!zb7apLJm|34e9L zn#ayfeap@Dd6SqygRv3^HuBxmY^U9|S02?b|NYB@1f&S#$CS8#L)X?;{TutMZ}xnn z^Y}g*!#|jwKA&k+Uwp%x?olCxnr9K*is&WhlkZ?f+ZU2s=?et*;-!oI1C#mRE^XA? zJ1vLpV-)Wb@>$($Wo0$f<JLR6Pdasfq5kXqzK%{Zki+e3nMH*UxuA}e_c=wsv~&?i zwF%rg(Y$hob!3`68Wp9D_;x;T5UWBlK#7f?%Z7tqg`*mDecUDXb8AslYDWj9CGA}T zZfLfsb(q4Mec?Hmh3Be+{>bqQ0ngK!z4{fYIRX{7pDWshyGe2XqG{z@&5r%|Ckjgo zeiaRgC#`RC?Prl84yb3D88nj_mM^y<n&>Y0tNqxbyW$!@F}wXDv=Nx8r8$=9l<o7# zjnuIVP%sKzRbFWra)h<j5sy|$qy=L7yr4s}`)GB`cHiy1>aY2QB_-eeb$U!@%xZin z@z5FGC{t&fAJ_Eg)IPe8^tkQmyaO|ozQMs=kt(}zn-h?O;-J4y#d2i<EBgoby$QM6 zyh=J62L%rpej^KBxH`Sph@4WeMR4!Q%BSj6F-`QdU)x-)+t0F>6e1h|d3p*ULf|jM zVo@CZCK`;HQTo*Cnx36ybS#kG>)d`>ECcpp1R{~c0M%ic5yUy4jd9}(h%lY-%F4(v z0mmyp1>k|C^PZJW&#K=>cg<>*XS=Lv1I;`=AHMN$+GBV%OL+^xA3--47q`x)ZN4av zb3RW*ivIb#XNUgSh}^q(@5}dYe_C$M(_GYd8;wd7m<nAAvCxqRaV|7IG0{Kyqq6gl zA4@V^jo~5liqvT^wVDa^I&O3`z)+Al%8c%?TnM=F)FT2DU#k1ujt$(pJYjoEjn4O2 zx#(Up9>-kv$+IWBdQ<<gtZi0ko~-~3aLvrjAKfQ#$}t)AX@r>o2H!ziJOQWKwk0-y zM(z&b_bD8&u22?t`)=#kuhcL_bcfd{<WLWQM3ba`&-+Sq=J8J{oc23XTZ6DOK(U2O z*kZ%7<c~v4Oab8kK)&aq&nQSDXC!w`nBh=VnEVT!!|N3ut8*5(nI?V~o;h0-sK8EC z9tr_U9MqCbVPRfDO85Flme-lqjDAU62QAYaPX6*!8HPM`4;VZ8CwJn-!gAl~WUuMd z$rwYut7IrOQc}(>UU1|x|9GJOWdP3En2!oJ&isx-Lx?8Y?O4JDq<&>EU$bv$G*H`? z_g7EdX0uwLYR0$DNq8OO@WY#a@`SBybvThQ-J#&kTpCVf(!RX?=FJWF#kRw{NSFQu z($i>Nr19&vz4W0@1&e&+h0FEU6eTSxJwwgCD1I8z6rWLdrr_W_>Uj5Krzy_TC#7q* z*~47Mt1N_!*~9+byN&l&;8s9u20ZjsywQL)wS=yO%z9PL$+j9KRj(*iXs`?#u9+?` z8{6&Hc1UNY3RH-{vHPQjo|AV?hbT@?H@i~C?mI>2bG=T1-A)_^%F6e`PJbVDM)%AC z26Tko+ba|-;Xy>V464vI(Rek%9)yGwoE|VlXW=0Wp$vph)bnz^-n*y$SM{7^f=2F( zV7LM+{Xgj5!3D?gRT*EfzP_F*V^lhS%hq;3q*X7R9kP=>J>2iArfW=C@!cS8M93*M zx&S}SgfL9H2B$H?su5@7CZflv=i5Q@^Fz81)r;Nz{rx-w0?GMajYE#i$G-eQZ;Tfq z^GkMkQ|-zQzn%WnbX3PLuqqwDU|<fuUzSEHN(c(U#E>r$ZE<NzbKgIMe0pqx4rvga z(h`gws~*HH-{pMZtelkJqTKigwf+xnpIkDsZZ|%i?0Txr8%*Uixk2IofvxN2;rG{S zEsOhBNBFMU%Dv?ootOv>mlOT4G`X~gV#4oXGY?Pni*HvUL<OIAdv4iW!=J0a4hI#G zJv!iz{5e7K{a~J9i0jLB*6-`r3x=hx<y1jYV(!P(bnlxv_8%4iiD&+x_@kj(oF1Mm zUH*K!xxPY!=^2G2kS0SBhxIGs-j81^;xDaS3A2`p)*jSDZ}JNb!W!AX*4WH#)NzLY zy|q0vW*RWFLdB|=oNei(I58+EJyjWb;gs*{fs0OPG~kgHifRnjh(gaPUA)X>x(>YG zf&1dYWOs3TPR{;q5GRF#CQQ5wkRxvod77K=+IG#v<Syn*B#j9{iMx+~xn}Pk!E^2U z9^yK`y}$zsRsZDV!&(+k3gQk_;gZC}2>gKAAD1+rrlsuwHU}LX={Cq1Oz=JJU0g^~ zTh9V-BLqrKVy*C+bJSVY;h{U(pR50?=NIuJx*I*^E5kER8?YYX;!(^BQO5WM336l( zv5)_z$t&a~5OZ^0i37p2!6!!<G48u@!^XFl^pw4nA$)vt7qqWuJbANCsPdoapMgKK zrM;WBZ3i`ye+gd7xG0ZOyrh#ihTN*~w(7Y0q<6TSWRf_}DM=}*53Q|~7zS<g4Pqq) zcxH3W>^u4CWj7HSnNZK^a(ZBj_a8pI`e@uRgt#dGpa;a!$aa!fznJRm$f5$1U`}7g z%$wiWH_~K!+cLBJ_O2p@{^)0z3)CMJus&obWasYbk^c1Ub}wpHm~+5~<Wu0n-ny3N z6mg|%kP`mk7lHe$vz)Wv4u3Q_{nw`7{EAZ$-Irfq92B&fd=7Isc-kc=Ph)a}p@(}{ z?Tz42e&29S5eojKoErF@!f}Wc^KNJau7S4-2IQIBxBoqwRuz|!7{Ea2Xa03cq)x*1 zyzlSd=bZg$4!{{EV#49F27aEU<bd`s!(UIdkA3a#mFDgg<m0O$BDXMZQ7FRD4_cQ% zm=n;!{RcuO;zh4`$-OfayfdHJ`vg=aP`d&iYsxL*5TM$#tIx6Ic1;U$!QNq9ca}3Q z;9nYPyhs%73@qoK-9Rs=_@I3@s+Rj=fu!Ls(k4Tu-~jUy%$7cU{_#*HR5Jkk#jkn? zPmJo1t2t+ShE9SF=UdzV;j4qg`yKp8NdifJZY^&}dJiAp*7t)lYi4@q*5~<39~RB6 zvC+%iy-^mo^L%?{<l^gZ#z>^=WPh;C&wAEYKC{DqfrsR!c-YMUaRF>?(@&<}1l&(B z=>SCeBaS)Zf@Bn1MxuF}a0%5}T#%S$93^)sDDKY}I%P1Up$O8(ih^8@VYxymcsK%j z)Pj$Ou9vsoezmNZduh8nw#{{+Bqbf&gFowS0H|VcppYb>Y;xhLhV&DZKUk=*oRDjw zD=$hL!rn_lLPA9zm@lX6TyR)VZ@w}9){Prg#l3ezaHqgyi5eRV`{om3BM3u*fb&8m zU4hR4psXV_`nFpY?qiG&w$WdwSFyMVQ{7f~4SH_+x&w}e;}zm~i$X%RamIIo8yZxT zlW(EM*VfequZaoQ8laawd-sBB!3x@k79b?xk{rh?U%s?zH-j(<mAm?cSCDc52R}ar z;JlCL%k!he-Z2TTi>p5*y)ubASn;e9Cx?szw^DX?>E7O?6;cfijXno=>$xr!+gpG? z-dGGA<l^Q!lXOJcWcK5A`}4Q<Sy@?AF&&~14B87cFeYV;u9I||kg>7h{PNk3cro`) z&DH@V3mQ7Ewoj=ulH+=>I9lBJ?CXt_rxKggM|62(Zjb+b{21F?#`jXz(XjxS9}pP? zgq9xZ#Is}Bxz#OUp)^SpxKy)=4&POj(Lu!Fq?DV$YXQlBs~6mFyZgme`)37Z$&XlD z+wC;2JA1~=zr~5T8;-FPzMg6>$GG@D4w6@)3+{NIV}i|@)taJ=kwvs>MwpG=OwTqW za=Y^Z?;_QO^(w+sCBrJ$7lkC<XV`G%y>S@$%rGP^C&z-djLp^V*<{+>+T6TPG@gPO zx?$cO5gSVim+(LL&f-Mkq8Zh0ObI@kc=VbjcgjI&X=$7+P|qmldRbfRzmqII%^Q>E zb9y;Asa?v%#)je+^DU=Glh~6?(ykN$`{B{aVQ#>GZ~%-u;S(oF!fR{neAWy&qSqUR zDg!{6PI3Q3wzBfK=rFu1iMSC^(SywjM<8cX!swZ}YSG~MHV)C4jNr5;MhIzXX>YbZ zZM>TglO9<PF;r65`1=3h>Mx_RYP&UH7*LT$Lg`NFkdRbB5CsIKQ$j%L5Kt}}q@+be z8bnZ}yQNE7IxbSWyWe@;d++ai$2*2Uo@Wg8#<k8h&pD5IL?`c`KxRE(0RO<Qdalc^ zPX9&qF|#x`BtjIv?b2jsW0n2HBIBS4@+u*)(N)uU5fC|Z%YIBB43T-xCigoI-+Ot9 z)}9OG6^%uTi#1l2-5Kz^*?*97#q|RLB%7CTYu_ZG27;nLfQr8&AWI?@ehse3O(;QQ z)LwqL6w~5fSKa^P$8%6=%rz12ZI4^!8^3&s2D`Kt)ZTX?SAT>N<SM^(S;^+U=o^&% zsKlo8I_0mat$|xbS?@+MEXWZIba89EB&J~K3#02}6(z&B3=f$@Bg!!BfpdGE5gmvt zZ$nsfk8}uW18-_+6@BT_g(w*&UTMNG<uJG9v_MoQfX@SOzng@OfM~yd{aUcIy!>e3 z-xhe{&4USXV*t4I^()ZL0`<%v0ZhjE@lq=kZ352D^!Zvx$s`iPO3-S?buS?ld@N9J zN59hX2CNkQ5nGd$FDyh%iV$690&oiOBJeVPRK8XzGSJWnAYoHU{r+8EA*98GU+QB2 z#oU%^n(7QF7H0NNW_H|0t6h0vwL7zL&qLZ8qGP}-1MJ&T|7~#B_R;2Qg-R~3J|Ej* z1|JI@Jt<DZq9gVXGOX*PF1^BxOJ|zxexPiIy33s29OR-rlF{7mqRgCg8^}PDl?N&X z(b^=Bl)Ac7HFMMq)xtwMar^^6Fa;!;L|XHFS}}8<>f+4^?v^i$At^a)xaQ-N3Mc(n ziYMiOY+&EPw0kHI60A*L7HXqdC@rC6V2xzkw>1meX;jty{gN-pSuxl7+4Mp3AF;N# zmTzpoI`ZHI2yCQp1FD3gn3%SKEuF?~Sfcwwx6;(wYTnu#48bl?%&wTpt|_jt>Kp*C z*e|Y8Rz@EKqNY&j8+5!-qkW;FQu^WhE_aO*-Y=A&ASZaX&2lZ?vCY2m@ncU6a5``R zPW1on{Q%aFzPt;j2n6-fwA0qlAF4_MBCTz0Zx=AWRNNmeaUe0gILl$@<P;QLN8JDS z6&SVfoP%0S5WqzgwVy$Q>$T8fUVht60_(c3j?>R6(@8QG<|$B(L`YwXzOk~}fs+C5 z<Yd5Zga+Wz%b76!nZs}wSh@VsL0O@017CKny$mS5l$4YYApOhK^crkDlUjIRnyCGT zz;|ac5Bb?-JP0?Ai6McH4FVsHZEdA8Z-j$Y8T_9#b(Ip{>ibJ)(<#VM58h3^Le1Dv zY`=ytg$9Gy#Obt)8ox0!<2H<UQci46VnS_{iMq8Iy9mTP6j?>*5d~<a8q5ogUsWD& zh*`vJBq|n3QV0bIFaT>+<X6gj9MjN}z1ny4<`RdYZQDEj5m8A=_;*4B6zDuiySux= zd?ZoR7pOg`K@TLeu>N`pb1s+$<L;b0izQjczjJaJTbV|}Z&B0G$P^S76AOWFX)a7; z`Zo}%U_p)AJ@s%*fL!VrE;uz!%@51jmNnaPWdC-pDp^q1a`#IhW!y8QRJ$Qq&u5f{ z^SwMy1n@G-{CmU^py&XzBn<Ijd`Qr}ohaGyL>78JVrqdUsXFGIo0-pppWcYuztc45 zSg{Rb{>${XU45szgEUokRV^(M(^n($z&=5NAo+iR3hf^dkOnD*DDuyOIIxai_Um&2 z&Ku+fZ0~tgeFevH_>r9#CR9OLv<)3LnC+-2l)*3x3=O!w(810SPJ_hRdNB+z(EA3$ zYl1&9v$iI_Wd&6Zl^g(!0?68i3>$2?o*BF8IXQ7rVM1Ue1~^A#baXlsGL0y${1bwT zg2LEu3lp*;))2HRo3bi0MU;i5g)N6R6Y$O$ZehdT9~%JP#yJ^)nz>dlCK0dB%&|`D z>h@|?Pf$U(UW8X<yyr+<w*$KTx%mt_S;i>u784)Xj?1L|hR`F>xkFpnJpV<B6&UPz z!U_0=+8<%m*RQZg8ShrC<yAv+vBF~!zXm?`Z<AeJxG3uZ)Mxp2ZFm-{5o*Zi7Zbzb zi3=6qs&UdB<AHQhR2R9s>j>S#eA|{+Gfg?txNmDt(+{v!p+I0~2xr>JJeMH`n3|MS zS-l}qpI%vSF}7*$)&@Q}o(!`-$s`VV6cD-aIOww$nmHG_5YpG`w|^qY6u{LM*RgVP z#$Y-DxCC<f>bY(}mWS8Iz{-jVymx>c$*0}7Bnz~;0Nd^SM<E!mgn$rKEPQ;_rD54; z%41ab5%w>0yNg}^*04io<mHWs+<<ove+0!(!(u_gE*T8Xq`BU_(&LDI;-B<_os^V} zY#uzl0+m>0QKK=OTKI71VPoa5%H9l6bAjuYVS4XTE<G}7L=5#}^t7IS<d0W^I$AEr zF4^(S4+2?%KD6@jhdRds*+NFeH@AmTpIRz}HdboGq6VjJan0t@vCNaFGSWn>gk zQZ#sHvdAkbGYATQ_}h*pz{K?N>z7ohEKhO~ynO4EU?Hb_qVnX43<4psySp3Y5~2&_ z6s!}-8G>#cbj80vbL$m2EvW!DN->$a6fVB`0LXvvqoXO6d{uh<_&3;P8{61O&RduQ zV+<vxR@c;IWEK0z#yz3?7z%7LV4=oc-?{w}Ryi**NW_(%$2&j4V#3Dm7=M`g9L(`y zgemL^sROTEH)>i?{+dg+=`VoPIu)z{fU^kwqT8v~vnHrL`L#RaHUIMeQ=Wp56M8sc ztEGongXIb69k*fYoSKtkHM|!q^ts!L_QP(d(K!atHa0#bh<Z4?y3UUlnu0{TFUp1+ zR_xFvpz_q<hX(3Q|I`#d9Ua}b%*=+t!2+2tdk;Bx0j_{%0v^EwxI*BXMw!`>Mo$zN zGyW9=awdQaFBZ<W8=AVJpH`8>()b}gacb4~ujCNq6BHUO3nx>j$=^&FoTAZSjZ}6h zY=YuA^%M0kudc|zWCAnFf??+)V~5$qH~UJQ6Ztj1tin{8pFi7gEdQ1dzFwG_S&&%r z+lt*oQ?s2AS2i?<a~xulT6>O&JCB?(Y@nJcCkXqrn1C}bJrmP4G9LZk2Ch>9DA*WN z5<a!xFP=#TG&DQ}QYN4*tKHZsN|5eUcX?_B_g_qr2MMa}dG{YE+VJaVo(wD*027I7 zRP?Ex>MT#CXJCk@fwBNni6CZ1JOX^;`NPA*|MotKXW>&yyB=*xuBqACSg?Nex4zmT z^zw&yIQ{M@>77xae1;DoT|_9tA<W5ebHcwC09sHR{TctcwlQ2DwfRMAtCAcCD#CIF zY$(C_PYGTOOo_0A0W4h(f>IzjrO@N-@a|B195FN}K%7EV)?dHyP}!c4>u_)<Hv?)R z{AO4JQ?63kZ}&Ysw?QH`Yn?$V@c@=tMOD$3XJ9TvL_%{-lM(ekZ0r|TZ=)cwlCoQ- z(6vMFA_sRr!)Lf!W<rm%K{5&QEocSQRMq)RMZU(HopB_D!J<L<tqY^52-!zYtyJyb z=3(G^R2I|%ld$T0w^RXkEV9E5KgX!WGrIhXYjhsF{WS|`KsZ5-y8t0JtZ0Hl=><nJ zQVBkza60L5SgJS6wax7R7_9JE+rUh^%EExjqZ}_L=Vb^pBkXczay2v3e`3TA#lqI& z5svt)N4lz@#rXqfbq`;^yX$X~ree$wn>T2dLCei0O0AQEsE1s0K7Qeb!DmyE8!hlR z$igoOm;nw5`~EA?*q#5mH9k3>YOTdHUULT*7#Hwvpw*s(e(%L;?VCl|E4>decayDy zYMv#DLcgMjqWJiQ`X^#sO8ZBUH`BC(c0(NJTvamqfn|vgjR1`AoD#Cc(POV|Ut=1z zw*iLH`~?(<5WpNoo+A1v9sH+I3(j;vrl5`1$}{wV-Jj^wk8q)a<&!tqiJ=@<YKpr} z7<wDf8{WRHIGViwMfCnG@@VSjQ?zL&rUC#49gXN(2iSB!_Fw`Fh(94rLQfA5mM9~Q z7~HL`ZmSE5zn1nK*7K@Wk9x#OZj2Dn=&JUV$7PWb(20F?->kfe!gY8IYp?*Q6i%=y zKv=wb1(!fq>QX`&3`L0&?}$Mc{mr`fzqdd=tT}u<Mk9R<`hhgF^c%n-L-jbFoLzCH zH*P@XS_fnv_;L^E?<_CujA>7JH~piRxQ9@4@<KN_sk7g~U}Rz>(<m#2-!}IYgsJcX zmJ@zn=!W9W$zO*%^8xV5fX3H1n*AZH8!P*7se=KS@<2#$g7)?PZ2YPQLq(7#(G!QN z>KZ=b8byuF@^Zd0O2d2%I#eZPrO<7zk)A?QwVYV9wPf<t)MVjV!xS{YGT-S*0Coo6 z+O3cPQHR~@IJh`bF$uEN_0veYaHufmcX02ksPNIzwA?8qPppwZ^Zr>$;X3knrZ)1H zx{ltp;bGCGIp5sYR;-TRo8#l(6L6Lf4=q22Hc@za=_fJQL<|r6>KYLWqPd6DG~FP$ zSs4|j`X(o-{_3*ErH(U)gW(n~3JpO~q<DA;ObW@#cn$BlEx7}V_gF<mm_7IP_&aq? z;ub+uQxnB8VYKH}incni)wMq|aD7&idJ7kHcWHyZjEoW()ORct|2y;K@~_^qTu%?C z!s6EatT|I48ibY7-eK?rnzu6RX_M_8r&u$b01WuW5i3?mWnzs-87A+)%6(|k=t%E; zYfgXl{*2(%4phR?F?0_P&B(4yd&lVf@ilmWSl9&UNe@%B@zlb5t6xq#^4+`lEk^2w zQo9R?H$<%oe&x15GK(I12H60|j8Z%!My##mc&&+!#ccC{CM&o~hqQ8r9WTd3Y<Cyh zK`*Fqo)~E(OjWry{P5aub=IaHI!|xA7+a$^yoKav@7??7)<13y=PU4reds;EFs?Sf zRyI7sbWfVj(uO5GYiulyfrkJrZ~G7i_R8p!gOhmqum{)BlzDrhjpNPDNR$WxZ|jE> zY(JCg_XvJ@9dP<BR#$ze1jNB$sw$oOHbnsPYV!yJT|wu4<-<fr$FE(t^g=HKa5gZm zeFz>vcPE_up@Gt)71tA=EZ(5CkG@aB&Hj^3SC#ZOSz5_2QuyLuvK4mFU=T;Y`iA<u z3m;fyPBk`SteXi#(1B(q8mv7tpzJF|(6WRG_gn|C<-I;E1K=|zx*EQd5#ROp>uoV( z(j?qU|3|Z5r-ZWQv+6zdCV~yN`}_HUQw$0;kD>Kt=&7#Xz*Jt)|M{u!K{1DsmF|bY zz${XnOjUL){K{mWSF+!qM*Z^4GpNR_3(9|?k)o2tB*sCx&V1<mhER!2-m}=+3cCjJ zF2w$tx1%K%Yh~s3wQXOBEz3yXuFdCt|N0(cbLpm@k<q%f<%1yYk5!}Eh_$VV&x&Aa zTS)<y=c+@0(a`p5Wj_r4O`Sy2Euy1~=!PkSZcec-<^AqmP;2|}&Sez8II2YsHj%)J zPD0W)Xm3_FaL3E*vi^QYdD`E<e`i3D4Nb)ZYbCCpb9+oZyNRk)r^~-Ea4fL-)z(UG z)-D;^SBb)o>}SnSbq>&bpmbSodu&d#j~{;yuj+dH!j>NJkcKBF3}OP5&Znzq+R+e& z+1ZIQ&H+M`H|&)`_0)S>(b_5x1V%;)32G%)5?}{M+F<%UJfDc1Li|f`r=O>~c6`97 z-#-Tn^n*(;82@B}UjtPJ97w_shczuVEte8H%o-sr^i3G0K&5pLE^SvgtW97A4?oo{ zhAkL;fvW%)Jn-)HW+|d0|EK`9^|}cv%Q}dkGOWz<qU`9xhVJsR6B)c^5pBcW5XZYl zG4!gYlESmQ`#3a#iX$U~!LXio{X6S1SPEBEQ`wf5KIRu`yZ`K&wXMw~Gc_Xh($e>j z&di5JL^331<d^V;0(^bEy{UFDF3*<5?9qC!R^F|jO-KRX>E_ySE>pOxtJ6*1fSZ7W z*Df9H@9V3d<mKj~0;z#SNJK>vdQF;|{*`<3uexd~;%F8ixe|$c*2!k2{CJYtn0fvb zbia%_b<vSr=m+=*aKD4+9$PCol%O8Bu$YTRr!d;&(cYQrix+<IwfH<{#t3X`$oIOi zf>(QsVgB@G@z~>M&)Tf=Ycau+V-jqHU<QEu06q3e0NiqFEt8SAtXoP|v(-0>X+>yY z5`zKVAo{2jyqaWxsQb3fuW+m17ZnYH>eFZG{L4u<Fg!f`)x?RpKs;)agvqkMuwR3B z0{C74>bGY4J{7|ihu8zaLqQ{^-7ppvNiGkT0`M9*a%|OyvY_F?i?|+G>Q;L5>sL0H zUm&NkKbmsQIH)_L4-RhleQzo2=aBvKhS2eO=dh-K`{FhYg^!{GKk0~7cs3>FEvb9g z%a7eg<37ub4G46_+s=q~?^!KQxFDq}DylQ)2vHda<glIg4rX+eARw$;%W?_rYm-^5 zhFuRricTxv@R7AO*Yw$u`!{Re$f0*}vNA<@qPb3u7e`YO07_uVVd&@8OY~py^OC{% zW#;vQIQr28BTjM@BawxfK}vXf=8gtu0FV);rH|`+!a_CcKoJ8uVmG25qs)JxtS7Z? z!21Vu9rf&i->cm23LPFym+%Y9Z}gI6K4kp?CD-lZU<B-)um}Q+XPn*#*Vy0ILRV6^ z?CtGUfGr^)l8~~CV`a5=cO>(9PT%x20q_LiHU)7fS3Cj=5O8vVOk`~7W;xVV22&X< z=684ZoDCH~GzA}mz3vjw#h4iQKf>IF)glAp)|LOc8Mu0)Zx`TWVR^$GTBDLI=d44) zQ#6*nbMOeMoP_mPony7OW`^&_%Oz(%YHE8S9)hfk^S*X7M*4fC(mA;S?kWUdwYjMG z_GC%?&;z~ECN+#Ae*0o%vo0c@DP&YvPdl8|NnIcM>&-&SC?!fhkrx5}a3&++2HO*S zr9){9mWyWr^))Xe5hEibvdqM3U_1&Vjp+U~18^qF-bsoC^FVWdzTn{C(g65P-;eM2 zrKG|kz;c1?U+?Hul)t~6Gzb!5+tjRbJ+*#oRkr~wQFKqHOJ0+RQWMBA_J4YG9Xwtn zcH5c6cA+&63#5II1*9@1R;P|kaSjd~a6N+><txYd5InLzZWNoF9{EfabQUzyt~0cv zOtcacKf)H)yTi-`fN=2oes8ymd6UhtuC)3BzLHQ@B!H>FT!+Ok*wv=+QyL3_pf4&W z&TsN*W#qF}!u9HDGN`%wi3XbXF3ijy`1wRr2Y=qyz8t?czDeR@{?Dx_ojA;-(C{R0 zyZ}A;(WAlSz}XpZ&XHGVod-ueBxpoQNd<P+&C9>hsGmOhoj%B4VtlRY^*!pHqd>p> ztzWyj-&IwsJ!^Zu$QsefP*HC0t-h(y(eooBO52OKAK7s2)~jI4*b-FYL`qk$SpY=k z5C2&3ID+K&olCE2wpZ>^44Dc33t~VFa69%1e0wUdGV(u<Hs&nrjj=#{GqP9LsOGD3 zT^4T4NT)0OS=dc)gJ7fymWB{0o{#5g%bCN9N6_P$C<Uu~R3tRS@XFLJg=*E4$q!|S zLDC&Q*z~t|ci-TPia~5nR#Kd`0jC9~U%)K^qXPTuo@!l5zXtE>1aWzJ1)y~luez22 zDG|<bWKx3izU@skIy<`U=Wg~+Z}t8wC#{g4(5zzu{I`|%!zaVE%Nq$;NSET$K~5xo za`G_)H$G6DeFa_@KBFP^_x(anIyOd>TmKP#a_F!Baynyb9>JT9!rWXe8=FU8Al|^l z)S-1mOQDYBy*rW7bBy;6J7Ie-eu$R6<<w0~LRVV14jdjab$`X8&&B<)ya)p@NZnk+ zfjpX1sU`tIfi!Y0df0Z;QJ;E$+F<ehWJ?^Kux)?zJ2~)h=FOl6OlnD&5wLl;a>)w! zH@o}V&hDmBvjPO#@wWp0`#5UsG%rucJbDXw_^%fyrlt%O>QdY{@54uaeA<(k)n;-# zEkB>q$V>95@_SYmK){&5ixk`Cj(YqO2BHN#o*TL-Tipk+9ssHWIvQ$YWhKLz1e+`% z!98%bD{l}-9aT_-0>7lWG|wu>u&k}E4TTiLln6GI@*mybyD`Ql;1Ie-+)kvy4mO5Y z`QU#ycWi;Fzv=DACN<RDXUtD*BOgchn52!5kd5*4FP9ZJ)n+|wa&#tDr^G+^zn++K zZ>!qforsszS3q`FsGIpDZ?uLYMNBj`LB5GFJe)iztYvCwh&-;N512Ib<;d_HTU(N% zsXlM8-?G0abmQXvj^RdnizEMu;ChlPvf-a{g5sE=37{|x@tBbAk$%MlYbz@~PQVCZ z6A4U}y!b?Q;^@q8khcl@<+pKm`|_ECD?wr5H#mdec8$pOu_4E&3}hF@B_%yHJN6I1 zr`3CT8ZUzj3smNtDZMu%+L%xfC;o5$bsjPZ+8BLpQK&7pYhz^<nwOjx{AS7gpXJt< zx*>8np@U*<;5wU@TWbTw_W2Jva1uw+|H7w(h`;0#^J90sF#%ui$F+l+LpNF95N?Y~ zBymjS+{i^#uSIQLNo}Lql40H2m_d6HfDxgo)nsmoH7qMzKuPX>zN$f<-uUUzh1sCO z8w(~wZS7QKBL>*=y=-o#w|j|3ro+|u_l-TTL8Ac+i#;Dd`o`(mGzh=CfwVAVbhTx~ zDHfQ50~Is!k8eadA<*!hfAT)fd~UWa7zq_=q1g;9H==iycVp7Q=+Lq@>(PWOc!`~M zluqx#YQl@){HE)q!%ai?3n54j#RNE1pN9;*9Rxd%z-|4>!hPP`)6>%^nhKbBfqD}g z$THd4>~KgKy|#1m>jpYFlL_$eu_ILp{!G79-~|yX2&thP8Q?^Yzgaq6NKnaY>Te)| z0DE8u7?O@{-d%5~s>qDG0c{AtwvUTgfIY+7YG9xbODp5r-ct%%Wtk!|D6Z|D9bcbo zcme(k&r{ThFy63Ri4B=GFc2xkht`{;MWm{Wle6ZP<rI9SmNP_dZF2))M9c@~HeqGk z_B9(T!D*@V{v*S4hv|%?0_3Uu@qqaQ*8SA5*U#)N(8{obeU9^v0=C{8B}p|w6I1cU zfoQC9>?KPfn6VYV(W8rs<idoXTaJ^Q8;Y44k=jc(-Ws@Y<N)CKR&t#&7z->fP)I*; zJ3uNPfuimhF9~*(4=HQ7kbz?#)j5Qxw*eR48@3_jDDx|qIwnR&6etOrpY-Z#s?9<5 zk)eUT$AlPM*Sx3p5^!TWngNy!o^#SY@!aoMm|a;>q|RbO{`;pImeV&j6b!o^E{J?6 z{<eKSP14iUvm7Q^6Bfw;02Mf3!%DIdDkT3V5dUZc%h>~>pi!rcSCS_^P0-iyf`vUi z$p%h?kN?L7sHm#Sn_2(Y*1c=sWl$F?BO66SgFn)v;#N}1@T=^OrmQR<|4RnPKcnOq z!^7-HM+(KExZ@+aeq*ELGQ38u|DMLZltqzqiHmZ99=3{j2H0o6<>%Z?#*ST?adhks z>Ya(1oAvmf**|j8q4)v*3KB1e%ei-EOXeu1p1RrJp9F828R9u19~B0Fpc{|8zCl7n zi%t-Fjk7B=wsk1z{|_4ll_llUY>v4QPQSn4h7<;+j+11?x;SE3I{+UGwR0G)^AHC# z`a2U66dsR26b)MnbBPGQKtGkBeFVRtU=uvuC|F~mBH1k&G>wd;UoGh|Xr<;<TdA4p z@x(PP2N7*bd5L7FrVnH|9^Rw~(#@3z)Jo2T2ouw;h86mQhWYJVGjs)(y^myy)Zscq zL7^&!;VS!~fZDj-t<g(A^wzACwBFdxQQS2sHogW875!r+|6nCd(*TpXddK@pW&(Vq zIP71P9*2efFTB0GhRpe)K6-S-R9J#XwdZJ@*Y7Q#p&Yf*VfhO2-Sn|7{(rR))W_&p z+k_APf4f^0TSsuI_dzrhI$OM7dr&(|u8g8g(O>8jAAmjp{7WKjV6oWm8r$s?R@#lz zYkvZJga2i9Bfoj(3l9s=6x_!m#Aj>7wBV=^COg^O++^kO>viq<A7lb}6Yx>Ho$s{m z6sKI^f$*s@n1n5;U=K(_uG77ObgWt>TI{4yRY#~?>Qn&+1xFkr$o}|sW#$vo;%*1A z0qpq|mtU9bcfJ;sm*0$QdSw4{``6O)>T2VfU0pbkj%$ub$Y!fO|INK;W)2Ml@;T0h zGEc$s>?S&}7opYS6scq}VLjO_FKN#9d8@d7c18qHj-loqC5@lhV|9jM`WgM?2;S_e z4c5v77-0R)d|*Il08aO9joY_E{FgV@THwR*lsIGhA87zs@5byZ7kwwEru2WzD5Ll~ zScUV;|1I!&Jdi^}kHJC-CKp&S2k~=0<+L9KIl&{PGgm32lg*VCA60faK%}j$|JDD7 z4IH18l*;3B;FkhV9gOdj5xa_@NxTM$*fgLm4Te?F`5amOmm?=`OrVwl`2}2fn?dtM z=A7q?fgcj8(6Dr6((lABM2Qb%0tQm-{z3P7A+Tz}1xjD!Or%cA9sr$gd$}SG02KEv z-vcoM;;_ZSZMh+Edk*&-B8E#6CJ~f&K~v?kiiQUeC82NH-Z|817~>{<u^`TAB~$0& z(Qo(q{>J?J=^2sZiGUk1_Q$q1HkZ7+q_B*b+k5%_$h(7Kal!T|7atH^=1?>cBUswA z%lOKuYN}xZfC{4oh$v?MuDrNq5gOI_<RRo5>xlZ9X$VS4DD4|0P2$K;xDHKEd)}}p zcT^uym!-c0YmHFy;(`KtMqNDocgf0ir9gp~;kuInTse@_iXxWz*i&Z;+2|5R&f#AV zrw7ymFwVn05C4PV3_K#-4#zBv&CNf6f{>y&Q!~e*Y=6DxpD{ZGxqpBe22=z8Jiv0$ zAyJ$xWPDuo_zZWy?kHTXRn^>yxaVc}$@!4b5Q-qYS_kK^tV|w9{1Mx@u^6B;A4D#Z zRHFNr4Ddwl-{~_mGkeRVrJ`*5k}ru;JT56{5i<{KjvGTqXR3{RoS1dqLG^+krEFlZ zFBIAUPyqmQHR%%(aFO6~OLyF$qdDQphbo`r;la<RSO=Fi5dxmH3ICT7+3lf`8((G8 zmbrebc=CQxDYBzw``^P#)c;}X17_gr!odNoS*z*l`~YPpRl$+*HAi01Gw7%Q#7f^0 zm0FOknsr+V?5ttk1civq`LgRE4&v8>xD(2`oPTz8E;I(~0wNRK7`)fbo2*hNVl(Og zb(|9RTEs=QOS6)|<pyR<8*bH|TxXC!%JRgaR{zi=LINU3Z08KkXV=qdA3nK?)JiTP zAOIe(3*LWYMY4aXuM#z1v*jtuUMFW+k0<FAxj9~?3-hwGVKqF|q7sb2mWOi3`~3vE zB}E?F7k;p!^8e4*7To3u;dQ!6(0U$KBh$WpyPnmX*t%qdQ0Y9P%mCWr*;O4~{JD}u z^^wl`<rp&mD;5KE2I<j^LB-8t8V5<k_kBPrfb8{xGbQ##r7pq10K(I6=tp6dtf`^@ zTuaA)kj3PG$K%}u^cq~>T&zGCgxx{>;6L77Fo<Q6aLWEqd=wpo*R#jOpz{Q_CqZ>N zF?tQhHrv-Cn*6}8)wjn;Pb)Oe$b-Vj<Ki})L+uW(b+6ab1J4KVh#j!JatwXI4N5pv zcR)o`Z5hzF-%(y%TpVuAi#eVkR;sJqUM_6$f^+i2lcS&uta}+bTi*+uvq=eyX)!}v zsyyd8zc_wW=LmQ}@2!3zRyKnB5M6b}SX(Xo|7gyWZpuK4@J{+8uim`gA_%l7HkUF& zI*cS0=v2Ws9RqGM`|X*Bz^4rpJ%q)xoKJPa;+c;D;Y?<Iom}S;$0N=Oc($yqmpi>) zGqrwOvm(9cn7tR9mA7NI62!SJAtm%W)ZUj5W<vg0r70P*8(IgwSrRTA1)3ueb>}Xg zC*<co;_M#eu2KHHn!w_|JF?Jg60LU=knYEyZvp2UcnNa;3aQx@Saa*a8jDc4sjm)2 z<-!^5$E=S0!p$}qW1mDNC4|9(#96linyVY|Y(qo4e0#hA@r*K4EO6**)!;<JD&--- z{kb-|&0oNtDw;U@79CZ+B{4z}x}Kc?vf1V33bWpfNA82Joa;Y733f4r+%nd_|M8l` z&Hd@^pXyH%rM+ljqlYpRV7@wM!wVC7Q!{{77n#5Jl}|+ECTCQ@a`v(g*~|S77ZVdk zFtL4@(GL;C&X<^_07#PHGL8S-LlJtN4)N-acX1^O*3eO(x!GBvhOgAv;lV+Gl`dr` zfFoX7WQHCa8q~+VKCj}oR>ZhRCk%M^$x6yZ(4ZWF2qOsEkQ=<D&lHTjQVbs^b4{N% zb{<H|Bgy!7M0lef+pqrp!BUAC9UFie4`0ER&LGTs2Y_mJE)Epo6M#4{s-I0DLH??m z&INSAZEME;c-xC^uDt#P?vZmvz@~HeOCH}rk5~Et_(FT_r<_5Y)`>1EKo};c%s2Zb zs7}o$T3T)t5=sSq&(-5UZKcYV_VOI+aDCxK0<+TBuL(i?(B6VM79#@>I=~=0|M=tT z${i~aDvw-CMEv2b!{-mIZ1`xQdxOQGmB8ZSpDMvy5?pBP-hS=IoxMNQ?@CBs0gYd( z%sT4N$|T?_sGkHLH)IxrM9L(?)WU!qsN&728~sSyjSdgfFLLAb^gXo{f*jbt0L;pQ z^;I$qxIiU<RBIBruTT&rEbwJzuSp%xTmw&t#-1Jm3EGIrt>UE~FyE>Fop<Is3&*?U zjg++K8zr_0hG$a2T@z&tBZDL^XGcvJjW<d_+rGTDX()UGeMWZnFYgCjeJds4tQSh^ zf+OQ6JF<YR{oLktA`14^QL#w@a2KnqtJ5<xn<*~pbveHq`w()t-~>C~AUQ@9!E|{e zX;i1Yq@<Z7Led9xZY;F~(ThObfVbxlFuoKIZNFMST(timcHqt&3*;59ZIlPC{&7#4 z3Ps&4$9r^FA5s75yGScixJ&m9fQ{B%0U~#|yAr_4<XJu!>~PsjmTccXYz_Kx_s{%1 zk*W^%;#1z0c9DdZ*2}m<rr5Zu)OUYkKM&slJVC$meE_*21Z5$tB_L(u?YK@ZD>XH> zD&#ekPrvU<O&$X^;<AHs)?kB~0QSjnNO_&UTx~Ym#EaQw*%e0pj>brx&Q!au_du(> zH;yeTenqU6ch9%uZ%T%kQbwA@UF=ia-e<{TilhX8<;B6`xw{H&u)p7D1c{&tymHr8 zD1)`_4rE7U)Yj5Kn>bqQE&|jGlrtyHGbVs~yIr0v0m-KieBXj90VhQ{viSO9K-v>E z5Qjm<Ik62$H27>`E%l@{LA4D&bDfTeyF4Y1kEmAq!#ZIhDalZOsr%a1QKoHk%6_`$ z-Pl5PQ57*plx@}x;1+!=cz%mk*gdVj^nv4Z0cII&keTn4$6aA6eufu10U6doQkC!0 zp6fkOPEmg*Wxm@BZG@wflLJ_@ny57o3^=w7-g^8Q6IIhR(ZrI%VT%jYIC@^`h~?n1 z>HhHE`cuT%g!6KY4OnTr*-U(Z;O7#LU2M<dBa!1Jsw?J2_b`4bsk}YPLGbbX0ICe& zTf$8|W+py0p_kRW0x$BXsj0E&oPRhXl*Qzmjf$S|30M^UzrY`;b`jtFzdc&Rul=H$ zH?at#b;JD5EmBf{U><#ni|ajw)wV9;U`T5eP)$IN)w&a*v+OV<zA=PXNtAW9=CB{k zjV4jh_f*#z0B=akKm$D~d+crC!2fkm{P?7$rH!_!iY-MhI~W@XAP2M-02#@N|2a&~ zirqkcp0I}jdJ`nAD8Ob7L=8lD?tB0jPps=0C8ebdA|hm92nbp^Spdv|;~Nw}1duAK zKk8iqCf_ySHdeep;DBue5fxP^q-*{i8bU`q+?)y>7<jH<;f9X7L+>J={?Rvc7og;d zK&-8m@Wsh^Sw)4trYhvOnUC%Q+htUf$1pj*oYqlWdhiH;DzOnb5vaTelvPvF1<8Mq z+HHRz>w-Q>Un#MN#|#i4sf)Q6ZWZp{KxvN48i|&;axS8&a~Jsln~!_Hj0lBdu-BH7 zo7$_l(l@-WnBZ*z6(*9Q{Q;or3n5g-3&1X)akxXPoc0XG@h3X!lYI}IvG46ibspK$ zuC^VE)&B=6tp)MJ0RaP0VEZ;Xf4HB2uX+=C<A+j+*3}Nj<w3p|1CVL-%B&k&!>GV_ z!5^f;pjT9SH~GJ^J_Jz1jv?)~;O&|wik|}-h7e~eN7=kjV%NTSxO#|zn9Y8%^R}Bi zuXTfkfco9r{B0(xin-0eg%Pr;I0r4Fp*uGfdiBv<l)@G!$ecA-B`rWR<uYCEG;9g$ z7=rV?Ft537FG3K@G6I$bfNOS6P7|n^o}EjhLVg;Xo<4aJ85b7_Uipl7@4oKbybtVR zc&V^pK$Q(JPk^5c<ZS5RW-khfJZcNPP@4e*Le0;>Fk(Q8yRJ7s_42@m$<yi5BU<Sd z)VaA}sv?`;OS5JtE@L$mwo5%}2N7QS1^@S&%Q3nbkRnSq*F;<j*t(9pjea*TIYN97 zz?9fy;F#5tpK>X5xqqJWc&x4kg+!a({%t1EVC;bUFcNF18Ifg`nG`9ALu`;1{sx6i z(^LURbuoXEwZi(CUz$bo!;aH~NR_I7YApO42iwNlSBK@_5cxzut#VM50fgP_*TK07 z<vhoj2&p3Fe#@6!aen+#;SQMBfJJ7RhxEUNvOO)?y(stax)#x;*H=?rRYiXbSJmK! z@<%Wf0^XiqY`bq|<%w@kJvA^*&R2ttX2~MXF%+bvfSf2nOIYo?B@d=^@Gp96TcfP3 zT=;I!90+uenTb(GJfL)I0ieMF4gf0p2tGE{_CZz!oY(un%@*R!nnp&*5`=AZRmH_Z ze0|T1YUrMMoRackHrG&O98m(#^>ROJ@A%Zp;+~LAOQC7;l51OAYcD(M;*}$>)GPxR zA82t=W^d_bWtvOJkZA+tJq%!-p%i(}r$x^KHS6Hkhhn@9xhc<945pFDh#0nK#7kk} z;qve?@O(FFhQhAgd4v(KQYM??hVgdfm3v}?w}%nkpX#cYTrmxDtbQm$UL`dU@*;tX z2{;fu!1j+}3_|~L@;ruzExi_qDkfbfY8Lg3vToSuH7&P~;a*IIaAhKpT$3V!pVmlh zfr$moWsqTI)YsGfKDhV&*bU@&jljNa$!y6H?hG+=I9|D6iH`h*QUQV#C<@p$>yy?C zi%XziLSg9$=Y1wvc%i=egq(?*9_a*YG9>dvjM|GIV!M*>XVAu_&Lcl<X@tZDlEH-- zR4@ji-HFxq1R16ouyagw3QA)r%6%y?`*$iVwJXk;BeqeUC$M{lp4$EWOCbq7;2b`O zbW$Dd)UF-^_*an&^85T9B~Lm$%#QfzA4PkjGW7|EAi?i~cO#`30n6M6z?dsKZM9{E zujxPA1#1+ec?FT<Gq&IkiQw$Kyn)~c-7~-6aRfOBs5K`lIRwT}L&ufF{rzUtq87Mp z(D7XZyGY%>@FS8fNgsvg2sAV~g7mx6S^bvV@0)Q2p5fN)49x8Zfe%WXH1e2D>UjHF zQWC1MLcmoEW=y}q^VmN<opJjFk*-?;c0X$LHc|m6z~4bxpUl<7xOQrD-2sJKKO8*B z*8+!E04ZT#=71!q*&m6s9kZpN48zQPmDzsF?056%b-+1;g2Us>oqOOmmXI_Syyssq zuIvAIs3E_Q=+k`{4DynK2cB-CU-k9-3Y^$}EzzU;d31p1K_$drMrwmUA`r@rjFIgu zMItAKt#=*3p#mg7Kv`rq)1#92yy`hqgKRWFG9SPeD4P2rB-cUGVI+CV<LReUzN&{? z$b59~;|jOQvX!#fWI|vqF~cPX`f>XoGtnwYdE`MID9>i*thM#BUcWkvQsCSFBWMZS zY|aVNFiiC@Ob$t3d5s)n9gTo~S7gg^ARPuJK7>pwo)|u|<Q&0ikx3t6=PNf6EABXa zWoI{vhxfZS<64x4hJ8xOgn*V9HH{i6^+$6pt$kg+rrMt&k#-x(VQITlBO^C`w7o$J zFjojYGo%j!p$BGPNM*OehW4)ARl(vWBNG!a!Nshy=is{s8yoOr0Ip~u*gM@55=w(b zGziM>0dWyFx+)74R`n{0qu$}+j3uQP*FZ{%<9R%L^PY%^DIB3=5UQY<op7b37VgMP z9e5l~1wz;hK)p#f=yDO|Wo0HKc?J;S+YrU1u-%Bu`+zYDB}=Qny4W%{vGxT&k-JXV z$5LpnODg`sq119gR^fhyJ69H4-Sg=Zy)9c?T<hW-Sm2&l)X9j&V;#aOANKuCLJ2>c z;$X~RB5S?V!1w#gd&1wdmTIQ<gg5dx6rV-&C|bWE&S+%`S#Kx6@LfOSSi_sZE3WnW z{ZY^wBP6}&Xm6HDLh8??;2#MmudTJJ{4Q#+H%g=1$UNWCtum>yKX;S7h|pTuJUZUt zBA^*ZX&vj&7kR<IDsEFa-=Mk`hzf0`IU{)KO;GE^#z4zw0j`YT{Ru*pE)e}KFE9UY zX$b)1IL$o$4q%#K6A*j{%qCu`^<Q^_o!)H(_&EXv6NrG;V?_aAaSVqaWGfBuhrneW zyzT$T=ldhHDgy(o9NI`bloKy|K0BMF;8d!Nh|)JLE2g?V<@~yM>+-6KnTbiI#~QcS z$QZ_p8A=NoyqYk7A`q&$*MCX4h7W5Q8o%5X)Z?@YB&7NNt)w~i=Vg+mm78=bFOrX; z4L8azOG5?k31(KQ{$Jj3)>~N4TfOmS?yGYhjw^}AX0JuPb|hd$=&e>2MqbGVvmOIv z=J=+gv@@F(sH6dh;9^hhKMG~HSy_K=t~5BjM8mD5c8bS)8jsi3@G$Z8luv_w`K^7b zMGMXcZtk}$4zik>&Z77E&24QzZM{O}1OKY|2-y@s%5!d8dP60cV6CvyQD&h>6%0Mx zN~QoWX<_Ak6DupT_qScps~{?TU^w?)RrP!x*-2eIf{=g!5>!=Qzx(m9%E<CD`%d8w z*w*sC|J9YG7rO<N2S8Fl;_~H1RbXK3JrS+FhMRO;+Eu+t;=mL)1&=e#sAKS&2by&^ z<Y#d!x;}V>Rw;dPm!~aa?}9E=(c^tO$A$We=h2kY-@o5b-gRie0j~eUF(ue>2(J?) zWockp|4i!Sdazt0V4!0l`?-7fZdF^c*OjM?jEwCB(v202Y)@cxTiM!b8ybp5=^4Rh z6u^H-Q$e{80k<74RG9bS3L1oLG2lU+^sh-X^3mHXwv~SZI%MSM*V<_la3KMYL!D!Y zrnt0}#a3@JQAbK7W}~XqO6R_4`(-HEj-{Q^{ugCyo7cf1>2JF!Wq{?&&LeDjkwqGO zj2Pj0a_ySK>c*><N~aRft242a;b%`>fGyuS#;E-Z0ZBScG|{X6deWV_+$#6=%+Aaw zu7io>W94U=xwXo!e;ONop=l|)>lov}zewA{J|+KgG6US!V&2{lg-ux!7CI^);Z{QG z1l9c*lwBo}SiJo7%woX2nX|yJqUh4l#0QUabMKB8`1}*HvUGB3{q`fcA9>!&j_iW? zq3+lsP6#UnH#6rptvqc-pbkIudAJvCa~-4X4rzfTn?+f5)m;-Or*HlJ-!L%;Y;1dy zSKmnB;6y(A!I(r#B5STrie`KJc6K;zCgc!J$+1cCBxgvAJpu1)3LOglyR{~Lf<j<y z?my~(^XG%^-2Z3;y^=?hzXrgB3`9hFpPW;`MRI-Jy4i#ucG=JbP`0}&D|e@V)8mNV zz1);0GB~#~VJ+q^tKSk*u2NP$dv|$)@#Kl;6HQG@G)Vp_eu5esJbgR|&GhIt<n$7r z*xJ}A>+4T`T;jP6?pGsA)%p3o^oxkqQZ08|U0q7pD(Opj?Sz-FR%@95?6Wa7m7N?G zZERv~*5zCnuWRFrUnHS=X4xLbl~QR|?Q-S$hV97u=FqU?@w$#uTN{~>IposnW~5i# zB9&`ds59W-o`<Azl|;T{rJKNPXL_|~&RkYj;qq2F#txKYhNnGGYj&r!XtUQQHq6p? zH`W*aY`1ThJT8C!<6CN~H-zX-ISTDoor*mle6g}z6D4F0sla936Sl9b{iCY={wo7* z6qJ;V;7%UR$%0Aucdcev&A_0W4tbK{V;v}YaW5JIt~&-v>OWw*5E9Oh4*KalBh2vd zz|2|4eZ)*`ytyD(ABuaMQ`5eGf=bz4Jj1TO`#9y&45~rUlg#vmC)kjIjfanqPU4=j zw+Ci&95R{7I%Nu6+zy*7#$JvB)7;#lRdyt}xXcN{QIzD5zvt#|9?M=_taEV6M#Wk5 zdEQ9vpGtb6sOT(q-&j&iECT@+tI@Dh%gSOygA>Kv%({HaC2gs$p#|rd5xD)}pb!K7 z82B6hV?n~Quu!|kY+!17x<{*S_x7~cl?Tj0sGwMWej>mZfF1X4Dalp4(vbz+!=NGj zb9c(>S#C>DFTs+RgSlCDigL9}+7x>R?-Zx>?!5gl@5w(A$<Ye_PcXj<2(TV{_p(f( zp*NtTV(QpL*+*Y8O5FZ009UB4uFjR416Bw>^70_r$i2rZ7iug)I02kQ$GI31>QS#5 zf^f&3Kk8|EdiS^l7#($SPV{x8ay0YiKs@t>b%Ltyfcp&rb*k-#u31d)>~N#Zp+Qy2 z%ua}n4S#Xj_q+7odp<tuN_XN(F$i5<h+pV`)OmEn#KK~=u~B<!DB#^n7*~=C8{6gk zZTf3vWmssiYo%sebhmfpZy0^EIvk&m0KPsz`}k(!Aj`oe<C#1hHiG@dw^!f#hir~@ zBc>>;Q#Xj^H+fD6Z1j2fO%`ZTe({ooTgDTgZQ%2c1e<!8v;cPRrJ$j?!TRbf-Xaol zHbLs{Zpsk1_xKG5kygIIo!c!(hZ{{qSQIoZ?<|9+l$D(`GrQL=b7^Q+o;*n(9sjx} zEUf-Dfn;!^s|ieYtZ;FTosVq4d7U#I^42ylPuLA!W=T`v=5aHDF?kdf6E-34(qOOj zq6LKAY2{4@-CFB9WT}0#;PU(~WK3WmzJHzI#Be8+-_=F_M?d{rM-%H7oT7{K_P&^n zz_YV4UBmE4#tiW0bzL{o8%N?&TjgtZ_tXv#=Z3~R2U9#d>FO`vVy>@ehlDhq9y<)L z0l4{s#Orb|1se}<q2BY{=;))|r0w@7ie_faKquQjINX_4pxezcx(ETmA~6YxMba&v zx6Cbo4}sYpq>eYk4pS5|sG%{1tRuydQ;z%h;~}9Yf#+*>eeS;~rU<l1hn=~SE0GPM zMZK#NZW$+;6V1!IM-lHJ><QxNV9Y4sEB~Ta2hukmA6F3#J$6#!TYP7RHqf(yQ3rSf zSM`Rt`^0lN_hwmsc|cF^EX&T&z(ArS6;Gj`Q`HIr!f$I%1Rsh#G@q5BPl}6=#e5Z8 z8@-N!{@KuQ|Gp@nrD;=Y5)B-a^$O3V9CLF7>8;<}3zaf6vw1uwA))--ylsD50#<9? z?{6$A1ZsbzzxS!Fu`#ILEvoR)ML*Ao4eo@$U&!x0s1C)Y>6Hpy+nlOc>nJaq8Fw{2 zCg8nX3oWP3bCUW$E<h&RfnPHMH%~G1IV6Szz!DY`ngNMf6S!-8G}rdN{@~Y<UT^77 zt8eDtVC-!I@#0dQgo2Ao*+b31DEDg_&Q$!4giORC*%i7Cbe>l?4bp!7D3Ua{4TokU zus8Wt%K|M^PC6s)-qDhvmev3lcf&yR-&oEu8>^?Po>Hqihs!wEF+MalRg%-HbauvC znnr#99iB-2_X!Ip=FO9TZFEj=mQ<ej`l?>e5|Zp*Odtm?d&K2W3|V2LxVy{AyVqYB z;XFp1qm^$y7{x?Vw6W3M{%M$n>SxXpsV%7bPQqyxCME<eO=YV~g(OY*d6Ol(ED8(t z`>j|GRlTGqI=c$lIb>d%$_|FpBobn!y6hfA-X?CuJv?+vk_tmuVu}Cwlsc|k#K`0m ztZ6EClJ`sQpq1)xk~k`$FM{U%$5ETY^My8Put3>#k$&414P|~nV8C*#qEG{X$LHmA zs$6&WQWUOU#JNb(oftj=p)C>Cbrew%Lh$w$<BS|v|K0`BI@CgwtIG=rYg2pvTwrNK zdrZ6At;UGUysNPLe7AIqxS!%-=jkVkUO~a)my4YSd$dR3NO}!#=H-@mK+B)qT56r8 zT7nUwJlJ(G#dK}PvyUm=t|EJJPYI4F(H$Rf9n^FYF%%RVo32kOPEN)w%54EqZ<c!O zrHP$gXSwYn4H?-~q4M*)Kck7I#%dFcU$PV!oB6Yei;+t>VN%ol7%Pt$^z<xw#zQ{( z`rf*gHS@RZApTlzBYqYZeFDOf1GE$lB&|j7!0u`e-r>OxQu@NKCrMht;o(kAG8xl{ zNhOr`+REnUKM)!{Wu15ddC9-MYNc<Fa6In%GRgxRz>~R2GBbl7MhHCvAHfU+@)~*O zL{OA_<k+Egp!6BnwX0oTu`$f;H#UoUURTu(-yY^_7PAP&a=W;EIz4k5m`GS-B=W+> z`aRYgAvrX3ePJnMbraLJ-KB?gY+CeQb5D+z4*xy>C;6_w9_Rim<gIU3;$dSF``Q4U zq53PyL*6<|xG@`tLUPVG{OZv~;%vC<l$DF8lShYQSF_nw&Q1q1MbfTDb{)rSYa+kI z7n*{e{|9MSzZ&D$gq1-{%dxtoJ#_THN|zTczo*ND(?deQshA<f@k)1PSit(VqK4T5 z{)yE4PgTVh9e+9(YNhL4kx!3gzL|a3G=(Syz<+sqZfPX*!fX!dp&;x69tJdVFz-MV z4U?o~5-L(xu8vHmURx<Gfr^%iiFs&~IbG1Cb&r*?5t&hcMe*KU=t1wtrS8_>GicZR zNOo;t3Mv>aOx!-)Z5<n<h}Un0p4^wi?P_^B0!X3@%Msy@$9=QnVn2+2hV-09pcMV0 zG!pGu?neV63O<k4W@jlP5`O6^Jd(Sf^6nkKXr(kF?75<e7MW*hX^>XlLd#DMr5hNn zXg=D1?A3^jq>iX>|NB>>+*wvD-*ow%)i)$Wb!0@a^iEZ-dPuC&_ZVAl-IGm8NB@~V zRj$hmBxLSYWp0?rvwl&o>+0%yyENHR;_36?0T?1aM1T0nh?|XDFwDmX9h1c`@pO(< zXH2KLty`aTsC~ELzh+r>QmHKTd&wm+XY6`=PqIU-;n*;yjm>op^;>f*iaKV@S+%t* zcY@t``67orJ!{l8KfE=dAuF?6`j~93pwwCBq((H)#FYJg>hwC{EA!_|D~f@|dvYmT z3GGM4&!j^$4e$MJAIQip;KC*_Zyq2%;fi8HrysV`%X+jvC!?%R3PkDU#KgXdpF@bu zH1vo~+evx(<+rXDb~fB#go-ylHp>>{(A^(pq<rVG-wK3bvd+(Ay&V5W`oPx2cf3EU zy(v(KJ2pB#zVf%l+_VYL-Qe($WG5o4!d(OKPy^urV6;$!pB*ivPs+q|Ou>l&68>Xm z0Ct0c<P59Gdnju#P~E?Sv<$oV36iyv=auLAH7_mNGGanyUk?xVu5GUTs}H#fH9T<A zuRg>_laS!}o+A3}a}L7&-TOk57MxZy(~lp+xwOlAlcd|e3R%J8Zhps3qNksZu9j(c zYIs`y&3g{~Fp*Vsuqs@APnOWzH||&nX&i!vhCL!bf3ibuu=4cW7ZX(yf0kZOgZZGw zmL`@;WH&x5%g0(;Q!DTpJZ2i2(e=@W{KlpqgCwaVj*jdfL*|~YQStt1GZS#h{LXln z(^Obv)1c6oA!mhx#@z9KU2bl(Vcj2D7Z(Htv5cnXFk><{Q*jzEQo#%HX}xO<PV)AE zt6>$V`|=G8bSfF)ThydVuXXOiWCG*&3f=Nja|el;`K#5CbV?o1|EVQG+wJyX6Yq_! zgOjAh#JjuuwXnC$PtNz5(_YE^3pEiTqRGE<L0N2>QBlr$+7H!rDCQbv<Zt856%`eP z1*P^k_>AUgIq-1F@r!kKzo`JTa=3M~n#N9AJ-Qi?^~XcJmU;CjZef#BaH$&_8nWx@ z1>b)c!jbY;9|tGBe~Kn^T1pXLb!jocbxlrg=uhj1?;8{MH|J&B7T%Rn;ztPGD@e=6 zdSuG<_4flF|3Ih4Zsl^mdA69staM)_Scw07;H}^D=Eo-k50C7gM1IR)kytU_{MU^( z>FPy!rLp-gt|Wg4d~=Hh?YfD7)YDZYJ$Dp5DJv{QPfbhn0VojiwovTFt@BwLpgFnC zb+FyJ5Cvolr9PMOQDPlbEPp@`BKZ(#RX)L{`uTHn72FZVs3&f-3%H1~L&3icrss8b z|27CsKkl59^*Rl#F;5Y`oj*e2_Ig8#He7lGspD0j7a5UOlEWrjFMC0=1F3ho(HkP+ zbq!;C7COb|_zL0F4Q*{Vfu#rr;&D6%y3bEGm)GfqBsGpsFiG66GBVP~h>LH8vb=w0 zm3cR{!oR;rK;^@S=PPSg^hn5JViXZ<QsPnIx+A!{snXpUi-&W);%@AEer`(^JUk0F zCS&7;jmeJJY;04d9Kh0zj3Sy$NLX>QpF!^K7SK^P+FD{6Ymr4K{B3_68vHQLm0LKb zO9wgK<5cVMYi;9UvB?dYw7%5iZ&4GV_job*92*a-S;tPrNd$OYs0jBehEH>xEoSBx zz<yZSSX+!CNr{Y#eF*b4`epHmE1%;M|C4eerlVW3O(e13MIa}y$^FRD_Q-a8<X5~} z1^S;mqvLXY1HN0Gu@wY(Gx};iGE`%~a$nWva=YYc75~g5Xu-hQ{v(W8s@k5N&r1th zNDnXRfVK##l0pGT3!>1L_631q4GkjBsOZ;P{K|Ftr>Ddzae?vr;n1`!h2WTQbG19W zvK1Ca70j8a<KweqT)TVTDk8f0@4McYozGokYFdGMUec7YAxpqBuBxYd=PCjcX!<Y& z>w>wt{=vb}g*EC(<%Y4ne;>TM@es(rB}D@ov9(A5<LHG<Uw<<bKA9#h4TioLu$Zx; zceqz)(pO#K8{%lkXKh|a`xmdz#y~@6(CiL;Bk0AnxrQ&0h|BP;Amr@sWf$77DogQ= ztLpCRyO$#-92cDLEVjf$X$4Wi%n%(aoLwdrTg`%`-K2%@oKHgFPhVf3@1gb8LcN!a znnRS2^%4ZXLpnV}Ob2MH&A>Px=yy#I>X3+eWda%r=cl_<;HR!DPYI(`m8nVLm+UY# z>xrU`@K;ib-$+s<pOM}cbX>&Al9Bz9_z`g=CboN2>wePO5tFKJ^7V78PmKg^NYL-9 zLZU}nWTvyT3mfAtaGngB#Smux-$HQUb5`wId`yZ{vwx?-&ZYYr`(%NSm6X(P{4vkN z_k_s?2H8SyNM+JCPwMIN-Mhk?{hO;LuV3?*VE`rw_{zLc*O&XZs01Ry%4w%0FT^RK zX1<}ai9RE^tGc>p%k%wrewablkGH>Hu;@oP3bf$e;avT_9b@}WX8YgM$waugzgk=W z)kvnPwm+7;9w#fSn5@J^h>bJXG4PygZB5Z@nL#Q^Vzb6m(*0)+HW!!N*x0+l!k!YX z9%n@2TW;=VGjn1|DHSg_Q8-z=3wQa7<bV~ZJE5yHa+gt)k)^3F`co=B<<w+Fog<6a zNvD>m^C4F_F?M5>SmWC2XpPB@qB<#cA0JY<?p<UmRd|+WJD=3x;;Jc?sZ&@m8hDr` zo354@&&No*!{3mpQbt!lE$e2%hLedAKi$0NnUPZ+`gdRb%^N#)T|<t$@vO+JEw9<x z&4%i&nw*%8iGZ@+T%h9qP#1vwbnr^q97WuavAOT`+_t>(ekq~r%)Sg=wVx}Ka{T?T zmbTMRot?!=7U}K60rRM-Ndyi;baeFg&Q1gTvvnWli?bkseF!@nzIzh>avbsH)>;}G zJJMHs(rC^uZygufi6B#<qo?Ozaj%rA*+OfzAdKUUjWPi5zeDZUb}vfvy~4oS%wWNt z!Cf)`NS}?HDa=Y^#JLSM5EDhg>B6^Kqd3HzM29`2n*)DFW~SIl-M{%J)F?}kEFIBx zu*Tlj%Gc2&PcSMczq|8Y*-Xj&gMY-wf}A4arE^4UV4&SsB4HAasGt~eS4S4UTRyto zA5Pz2{>Y(<=pg_^a~`9i#41^>icTN?n+fT{L`1X?AF824dIq2-eM3Vng<jN60EjkM z$RUPLCO6Wg`u^wQBei)NsiCQP?(~`he{77|ZbE*j>Mfp9=TT6=jU{4|`_6~!B}lSh zIm>%rUl-v6^DA225F&lPMD?o)v#^=oq3F0<D~as!^jy#V!2otKV6i*DyRvpDWN3J= zvU<&Pxbu)?W5ZhGC%KcO3_I!SPj5;cDa*x)tYW{4hu9Q{E@CI1TUJJ<TIQ@&dCE#( zUd4Dxr|E}x9E+NSVV3VWTpLTSqe6Io!o+kmo)Bgh7Csgc+8N5T6)q_U>P62eSCNOb zlGN7sPar0%v`Eq0Jv7#})!Iq1eeohs>Pli7d3p!PuGcYpCmWx#Z<_Wds}s<Enw#an zT6)e*jB-rd1&fsazP{fuHr>8`8+Z-3Xe4XD9;%~mo(k^#UZFfIJ|V$J9I=daalLwF zIXO8edns2+0IYx<tg77wsK2mYaC3Km0gc()x1|kRx!Q#ou%iP;1n7L0!1PEc((a;U zuk!LUkPp9Ee0$-LD{~|P9HYjj#^4Fctcd~p@+g(>2x&w8Kg+StRRWaTkIn#@_!84( zUi<S@HXuMkSM4Ff`5sQ%ttDTK1zFk9Xd7=s1qCUOV`H(z#BICRvp;%x^mV_onYr(N z6&Z9wNb4VcoTP-}*4>{F{4t2Ro-YMluK}QkB0bYo?-c|(E3lA+z?CUD3X%VF6cUq@ zgMU^h=V<QqYCU<~-Z?k-4M8|Q{(N?=E946~v6B<NXTB*?D#Sp)y`Xfc!{v*5Cu(#u zQ1>@+R%d&%`p;bEYr+_xj{U}`a*-(${w<YG*S=A5cQCyVFeDrTAX+r;OVH$Bb+(C! z@=_x17(p@N&d6jwikw^?qmtc?i7~~=RDWl8@#lWNC<y)Q@UPjlk9bpeFy4AdQmw9y zEpOoa`IR$IIKFt%!^UjSLXQ@a$8));d%J<VTWl=Z%EXKJ+5bb;TSiscZsEczhzKZM z0)n)Fbf-wSfYO4rbSa%8T@uovARyur=?0PRl!hfOUDEZ<_3m@NG0u-Y#&!?3vet7y z_nh;ZSBQI^c`9_v=Vb56Iu+G2Fks_v0ihAxbXR;DUUF+N5n(au^`@kmg6{|jQ>ctE z^Qe}`uTJnkdlZ#0vEle{m6cho=>F6FQR>ZfmL<^IDjO_cwo~Q}x=#@JgVFU*>40uj zE-KJ-P+2@T(9mM#>EZVH`_&f7j`A6jWFz2VCYR=ANv*UU8ySIg4QgOr<j30?85sdX z>KNjl`oNO{9u63vIQ<=X0KZ(d`z|e5u|uT_{Q2|o-v0hcD~E5>z`*;hX;@+OC^dlH zw?e;i{<(GamJ@c+lVAMr@GBqLxB2XKU(fJX%ggY?Cy^b^Q+f8yD8|x;HLa`b2i3hN zLj1wM7uW5?t)PRw9h7i(rn#`Gl9NWURbPKDC=m0zR|U9k8MZcqTXUJG<}H}Y200b> zvx*~a%+C8RkpCsg7(WQ1ibfLWtkATTh#8AO)rBI2OC-C>Z?Y&ZY1ELFMT_h#E-ouF z?42vM<f5RK`@7zK*3f{X>KmGdcBS@$YI&uPyyNg0uZqe$UOs$6B56ep0;b;HRg#F+ zisB}pZju|Y(DCn4N$Us=e`0T~`1l2tk)0ibwOK;!ApYmJvMMivTtx*S`}k&Lw5WBt zIm=@<o{v^KZm<2S%?<ie!rimzOmydtKw}g6`?Qo;>U)ZTwIX(f+6&Xj{zhVA{DA>~ z19r=24)YI*uq+L}RclY>{yS1rRA?o7csnD3U~1_h1I*O`)PYY6>RSgoe+vo^Mgkra zDoyz76`U0C2HXNgSRLo?7V-Saw3584Z@gp^O~dwSzjx-1`!zdww@z{Yn9RNHaCX&w zv2g%W`cPQQ!`Ub(EJTG$L&6<CA)!n6Uj3v8ZD~PcqtTH;ZwL(bAW(t4vjEi!Q0iIP z+5Ns<2Hwy85?7+Y$TDc~P64t6P^r41^k6>*A$;R;D+kD-z_E1~xN~4iYVNoN8((;< zIp1#!Al>63t(Uu$`{5&w-}Of2#K{Y$3r;_>3?F$5(Nd+p-!391E_KsrC_=v(OGVz9 zx@9jaER0$7<)@P)UaWP6?|p%RYdMLD&%8X;*EdxPBe10s6TdmwEPTi|(c&9H5wehG z0fT?|qq1^j^Ilq8D^6Dk^2^wRQFO@kxdA{}R`yoQ7mW=u;7JCzOBKSYc1p^J=6@{< zx#m)>xQLfY|544Gy8RYHQO{L^Epc(mFW*|!Sy~NQTJ0V2o@<XqKAh*_(omOtV#9iy zon79}j{HZ3#mFcL6x~Zof+yvb0)_|#rM=Yy0~T|4ce2h!dQV1OZrPe`Dv(c(e5C1X zZ;!_(4${{qWgjat<>7v-X+(WUaJzzzF7)7Q9BYe7@HYhckMdm05-QdFctSgN_Q=$< zQs`$%zZ*0a<zZAC^mX81^KrVASw1)mNJ4|R^0Q^Grk>VU3YdUsAV#@ryvm%FVX}VF z@3@&-URinZgSH{C<dXjV`zPerKQfX4Pkz>WUj_W$J78!AnHiYmL4OB~aWD>|A&FRF zpm=*^`1#?A(={zbSMuT2Sdmdaluq54NC!P%!r0Y~lCO~FbiUtz0wJ$>Vbb6|^&o47 z&xsM$6@r^0_$9)D0-DjX)t;S$L(GTV-{1B&7Z=|t7G$4!9=$cIZD_~@nOQP$L4fPv z0iIvG2L}w0bEcWE3W}$n5V;`*@iV|mIbT)tLrI&#lJkX`egs&$p#tDw^a4`Y+p7!Y z6`vr8vy;HR0WuZ9L^p<g@8UO8LpYf9fie&s1A~?b>-Jq7M%e!mN3)V#)Xl0ukMld5 zRyI6bsFdq1mXXmKzXKx=Hvw#^UH)5FV^@36djVXb)03P+&h6sT*3%1O!UsG&rX$mo z@FR^7#;IixDW%dYZQR+}uNWoEQ`E{7@Yqr91r#-1&@@1p6TO8dPLc~py!QJLkZF7> z4hU|;fW`)hBcX*6>ofP)e4_qaps5XZRgMvzh*vmJLxZ|SMfL65m!D;gS=HU&dV7+e zVQD<Pr>VIX`1aM0(uIW(>b8RXkZp5wd|^)iXDsH9!J)sO>2f=7b3Jbu-q@7K#>#H% zj!>*;S;)h>xy((zys(fQ9m8X99o{oSlu|9U;CW`$8h>->zMY-<3v&j@<c$?N<d|KT z|4e{-DIY%K3cZGL>t;M&nq&J}BYT3}k(i>Y)?GQIXjcfeub}!DCazeBDLexZTSHx4 z60!r!ZkE5Ob)8#VgRnC!iQ^_*@T^?`C=Q&kXz?(CaQ!>%$lFXRC#Bj&N=*$H+<$<5 z30az4mPluS3JWyzQ6_M3w}_q`FnL^r6fG>R$~-^l5nEX42F0c#tVO}vhMtbjG!?bq z=N1$cRB6yg7y!Rm6)bAuBmq1CG?j$;c~r&=j@cP3OKNUdfms%;O2QyQE<Pba8WJ-> zAOeS>@7Q;ERtuDUy1KfMx(-HvO3){P*zqO2s{W{+nU?nT9(X<U0L|6O&1EHuy1vQu zjJlR%wqHt$FhjaQ?^z4Lg_Z*LpJDX_Ee`$u^bHgCq|#3fnau}x#-Bg`^pqt}roz(e zds&=M5j+3AY7wZtKj@rprR4~qw&VX1CK%ovyczjDRy^w<2CNCUdWOl1@c)iOe+rDm z=ooRNB*8Xr0`?gh-|QSLpZiHvG&d*r6U?ZGNy{U?{jID7<R%5RI5(<K#aB`qEic>I zJokR$=@~1}fW!7UF*0_`ixlBqw7o%Z{Pam`pjbgb0B?2mC!z>)0WRa|mUk1vgW(?( z>!v2%%L;DxhdV>(MK<WQ*~2u%^X5iPI#ZUEloX%@8s52N9}MqVKYfgM+v)Z<gX%r@ zXnSL@)N;Js@Brz%`@&xejJ<l$i1I@cD;xm^PnmoGkbtBKD4WZ{+H-J>Ls^l-BlkWi zG-^d6{UnFPK7bkn4h#x*>FKfUn*vKm5cCH7oi9*hl+^cm&17fBq<}T5F$~Ah@PZ|8 z8_Fda);vJ|EY}mu@h(hY0j&TD{S;7tQRFgkX_aB>kd%}JE*Thq+3yJWhw0q`>Ms!W z_rS{B@pxy>W2PT+%!I&07hGNX#m^!kYs;!q|LIfI<PLvkQxiK#VBb8i_VbN4YCN!+ zMGfS>OMfmHkU=syq$E!Kd%@oQ!4Mi@WW#!EeZ4r-wpWNhrI+WxQ($V=?xJ7WG-0aa zNpV@3nf4HSMT_l&b!U>G)*u*7zuJ5)_+G%sN%Q{QI67>s-c*Ko8W|_p)5+e)gR&5z zU#U@UPj%-$VJok+^?~#=4fe6zwlKgT^wRkmR4G33K4;b$8~POxEPJE2hAaVRC_f3y zTSED3WDhRd$$hePMx^Fo*CE}VJMM{U9fv<2e@uJaSK;Qx*fbhL#G$=<AGkXE&Wxz& zr2~!4i?OqKvZPSZ5xt<CLEzUv^wc^Lhi_%7(n0PM=Qkp*c!;)~w2_vP*@bTo;@N9H zu7^~6P*d=iL0S|s+;1yvH}an{3%YGlX8E2zgbJiYI|aXh8|;=iAJ{aW&1{1kyE)|k z!P$79aG00J2&wHVy1KyKyf{CHG>R2e&MkObpcpS;VucDAgWGgn2!fbl^u@e;*Kp*G z9y5_MG@p>x2bNZOU#)5BUP3Aw1Px~V`STLCpTN;;>F<w$SA2b_4_CrB`KSNSGo^+Q zhmNDCk`Gq0Y4bZPgAAe_P|s?un3)5m9-CO?b69)hz-|%lOwl^kVFDb-<+&HQr3@C> zDHDV#U|=2IW%B_xp0ZD0;@vL3{Y}To!Ty%6{eSbvEgYYdOH!Yc!(B-e)8^1z20DS& zi^30^h?A3Jx7Uyc^fx0?)tc#!iwccJDlb{JL^2Dq;O^n)TNp#2sxZkVC>qr=!NS%x z(uC{*V|V8vM22@?Ih8T{^)XfPBtqb-o2{5>K7IC*CKIp}`Zk6&y{j4AzuiY8W&4ov zNbYCJc;Y)3L^=)$9(CDuw1d~CDty`wH&wprnTN}paj#c{dmpUfQ5;$xLBWn#2g<pS zq6<d_b1!xf<)NZk{+GrH1PIP;By3pbV5MbH@A;c1%0NHLfIW$jj7%QbXh6(uX=#C1 z#u$v}AvPc)akBs-X?Fh&s|}Bi%7P_11aT4(6Yq8#UB=DL8G~y!ieV4yX*e^*4oGpd zle<_r^RS|sb=$jev}Os@)%~pMTk(BkosM0AG^S4#RCe6;$U(#XWzX}|F=3z125oNd zNHz!X$ek$l!kwzH9sW%QLU{v3m7<LKO^UZn*wn&o{rBjOu>R}pubY4M9#hH7uvzkA zR3^r%)7Nva$|e|F`x<upCtKma(%jY=)>s9)%3!SqpQ$MwZ7tcQ(*u|<O6zMW#<FSQ zwtK3gYn#%4xp|^2o`eS6V}rhWW#D!$EC>i6e&08ggM@b*gR$w>!AFk<)3Sx!mZ!h% zi47y&zk28A<qZuEIt}Ca`<#6@HR0yW{|Gz?;Oz<dobtv=-j>U(t1UtF6RL?eK`gV7 z-{pDT=i1y{aGqv=s;=GySI`@)#Tx<s5I_z#!eA)S2C<4TjzjNMP*jxv>C<)S^+&;Z zhd!nmoXJ7U@ZG3U6?8|CI03>55G==bF998Q7%+jFH|y}S@PBdr&Ve-Y*kFyA)cQdN ze(^i|`}%QHB$(*QtRE;ldS&91LTq0HuPW*ZBD3PkGp}r~I(vf02PO_k$4Oi)Ci8Ga z?M?>8VhCy(5`lu(^*s@!!px62P%)?jcRsZ^L>N^(x=a-L-`6k4ikx-ns9Zf3oJAlu ziVE9n3&Lg_42j5O8CNKBlNC}Ur^P^iiV9c;t5?GKiJW&4G9YWi!^Her@Zei9J`f<s z7h5#__Js63mkbDdQ_O0A{CJx5%S!-E^=d}hPOW}{lp17U^IOZlV{NYaaJ%?QiX+c1 zkB-5~cdC5l$N%L5=+=AkL3DO<rFYVY54|4LF1J%P3ZP>M1mjrf7dkZ6#9P-Tyr~?D zs`XQ66ktf+IXcR(t2@tIxr>XtKdSGb5^whilomB#_QCyH$Y~xO{vdiVqKScW#00TE zN+J!qJOx$NWzaH06^sK$^g57}$s)C<etpZy2~0>Jx(hc@W8D#HrtscKT$I|?B@&!% zA*T$g;;-Rh7lkb~_N0ZidBydPj>w??vW1iyc^{t6(WFhFn5kw6%NQADZB;~)RTBeQ zLvZKsb(6}rxWp7$IQ>wqfL;Y=m9P(&+!)n?mt_0!>Gs3OA-k4P{FkmL_e+Y69emJc zRidE9A3#(-DI(qq%8OGY-d-Ze@P6;;>}=8+P7H>&C}9!MA;Mx}jJQuQIC=P_7~^{d zPe$0M*`Ae@BO#t*AMTFf>1iB)9X3X0&Q}We+m&H4AD@<`q-uDVdm?Iau>8Iaw6|u6 z_DK=`#3gA64PY>5*pQzL@bi~|oh{1lA2Kff9$xk_AfXMwZcu|1E!YP_sIMGtESu7V zA<pF3IbDqC+r~x-)Ura{pTsVrXm-|63vOF&5`J*96m(w11U8(YuyCI+MzK!MrQFf} zNNj#+WVkd!cM>5B89PLaB#!^u<%B>L31<1wR6Z*3R`b~?eI%^bd!CwFopV(R?E*{` zV07`<Y-)5gal3AZ%J6)Q)ZxsObMIvdtPk(r7nBEv-4OTimpZL5Jw)D*s`p^S3a*k9 z73LI>4hm4h5&C~8{=W27ruoBxq;0>#uNE*ouZxXUi$9c`<Ur6|FIA;nt~CJxW#Yyz zSxO2xmEW_WIO%opYu0b{h=8k71j;khr^!tWp7OY~P0P(AFjfWSMQUOq$;)iqe>_+J zaEdP4ZQPYfFbx#pYJ`L?s02Lxt~n=}Q}+ZwJ-6*KsLuvH<7W%y&!INDjlN?2V*8ZV zA5y8W7Tfm~MT{^ZG#(ti;T8h0=X^NUZys*`orZG?U|_>&2XsVUepea-m89*Zr?>qo zZYTq~1Ftn~C_ZWw0{w?4vyw>KK5{W4-sq{$GxzpIueFuj%YHozLfeb&=Pbk%6BFqo zZqXpBfBB@s2);#+6QrTxAp#?6I_;ZYd3dvtkTST~6_6KzlpY504%UvGFP}sIx4O8~ zoi>8zIq<*D5{=*46cXIs%z<#LG&=MtKmQhllzX0e=F2dY6JEQ(8s7h4Tg4Ry0Z1sz zY9b;cwoX${ZUIPvue+RFultvg<POQz9M#_a{JSGt?HM)%!UrorS?Nm`lCrU3bzCvm zFL<W$^x0!z`+Ps*QvTe-*v2ql+Gp9>{)5uW)|#GA>;vR%&2WK9+5bV4UOe9|HA-h_ zr16{eYFK$v@XQ%fte|rRB;zR87S|d>!Bvf4Fz*=)9B@fyqM?C5aE*)U=tcKBV|PO~ zq_X2v&P1(5X!P2M7xr0_^R)^gM!F86;Q@TPJla@I(!v$b8SuUaao-6TQ$>~7Eq<Td z*yw?YE<dL<5OxW$+l8p(#l@wkItKEupYiIOR6w|oQ)NgE+yB|f`S~98*PUcJ#HA%E zf!HZGH&=-rso5%5OX{|UZv5T)t7fBvogFHp8A|hN^!9i|pmxJqSDYvYor|fBjhEb_ zSH;>QPX^BveHm;SAlYp-93v$;d1qs|f0k=PtKb<C32EFLp>CQ5v+{jwICZ=GFH(Og zcV{doS^xzUu#-_La7TE#zKpO9pXOb#vD6%4?DKU>eEaLI6{2mK4)~IBb#<a}!))tM zjA~Su#Jv^c;ZVgwx2~(#f6DTlm#=(&WySJoor4gd45-y4M5pB{b{-#}o1YyswF{jt z<e>WXc{jtw+N;Z%se7$P)+eJ#VV;A@{475H;UvXelmj@Jcjeep=<-+9RP9BzH%jVz zQ538e@bdD59Jr$<T?XnnSDMK<Wj(oz%YLoch<VU|vsH-u@uv_E_>a)l(h2IFT(aaR zPgS!v0Ne^hP`OoA<Buz1F8?x5RoK@e7WhjX6ZINy{#uRiE4VN}VES^Zz6&O{pkMqL zZx<`y(olbPe8Axs1;RdB>fLkof@cW^4^eHlM!_?;X{!%}FfjoMn(c%vkq*@3pY!sE z#z(%00NK57`EPHFZ8!vMWJY}HV9xOFXWBzNV|mET4DRv~z&_3NU9<8%p2XemSbr%* zM-s8~@1Jz8#@yDHs)IvOQ({Oh4<i>?=Y^`YFehLwF6`axb_J6an0}<&rS}gVkjtCM z`d%fZN7#1#dHvL+gpN_e)k68zAC0cuDMsWeg4g);jl);l!r#`w;HrAPN&o}6zj{R! zo5b{JmDA$7+$$@)2Mmvb;K2iE*4fcT)5z&3nT3XX<A0aoqH1U5CH>1hSH{xK^-M)@ zZH3!?1>$6D!h$O+1#aKIZ5uri31a$3F~2)DVRXOpa~PCxT;CHrDCgDet}2M{hr}C{ z)B&WXjAkNiY?0&RI-qtqIsdoPVjsmo%VwhR_3-O&>+cCK9zb;S$HSjp#H<jxTb0u~ znMk-vwFzIR2J&f<2$X`n2uA>*9v$=N(B=rboc2WSQGr7%?9yNhl%Ae`%MhgmCWp|^ z;-wGpzm}I116B@%=|S+XdRnmc_ZS%74dM-$?`|w&2`QF48<v2?;`o@Fnxf-SiKG4< z=#;=&38<@a85#9vdo!RHeq+a1>{R@1UsnzQ3O+u*N_r#&$yO!{zB&6Kep-?Nu>kRQ z;0>CclQXg3ao<&<Zfcx$qNAj_c_uJFM%3;{y*y)lY-*;Wy)Qew>3CGc^=5BOwun(B zy+f==qx<OD_0$@@A~8$GiNV9Ddcf4+eXl_(D9bPYX$l0=3o2&IOHPEE^6VO1pYXC$ zcijHx+zJGU5LdBxPuUiSa+MYr7db^mzr}AuG*x!a%9SJw5f*-!bWK>k?~>;Q=KIGq ze?X;xQ34+4zfeU;;y8vHoOz`oO9#S^!Oy%eT|{bhiEX~J6^H}>Dmp6vUx@}46=hgV z1QR{8Szl1z*@wRGsz4zG_oP889sqtemujh2-|3yOv$2fiW<aJQ*#Go^{zB}*)Z|zj z81l$zXbjmQPY005{$kU1M>jVn5Ph~?PJxw=vI-YI)~-%zFo<9R`CXO3qw81u)Ga=1 z*>+j@1pCppXmyu4W2-1wc@vs1022Vl1c#^+)AqZDCzq@kdl!C&=MvsW$i~`NCtGV< zw6OAAOSPUUF1H!mtF8140dBs;#fchehU<6a5?UT<$h)whIKU&(CMwFym%wn|y=Y(d z(=$#+iiOgC2|6B;co^Mpph51DAf4<o%03AiRE!|r_O`aF1kW%~f>zi~SUjCtkX&f; z9+6GtJB@ds+czy(^s;{Dyv9=Ro1pK<*9Z<XaC?D<*;0ir2|8U8CFkmNs79Bkb4Jw1 zBud=?Z>T6(-3BU9&9k+tD#806i}<N&sV6%*xF8u>iQs4$kZD+<Lp})@csXa07urA4 zQK3~~bQUwFQ+wEELkk@8$KebFxAXhbY2hvc4U8@3?2j)t;7m1Vz4UyDhw-yv1f)r- zu2HwxXdWHdqaNAU??Y5PTwD*VO^Ngc9A3nIEeD!3%+YBMKRget4gEF`%pqprS93F% zQqckT7~)2bz+o7u$z^}1TwXc<v5dKh)b{xOr%H!y8L}2En}hF2%gWCG`NO%XR|GL; zP&U~}OzrGo$jrjqn+k=;**%PMWqqw9>@Wdl2%kTH-U0RT4Z`hG;5^UG&;KGd@&?b# zXw?p5T7rwp#tW6P1uqcon^{`!r&anjJNTZZ-RwR($Xo}yxf5b7bt@To8s$&G>EcFJ zt{8ICB$kJm{5h(qk@Tg=e%B~qW`D>C-v|I(&?P&bmo5m3hyV`K;n}!~%?|Pv6@X{| zl=g*y2aN`g#_HM{$|euHle8+`D`osqv2EnIV3AGB#XIH)59XMa7ndZy{ML$sF$Z{a ztE<M40C*YT3mEj@^|Vk!7_0yVGbujKi#LF&3+#73J^jl_1Z1TTif@L0sT>jRISEx9 zRzQb41X5RN+D~vWpmchAc{#bdj;hcu1E_)qzv{JNbbX0a#6@LoZ5jw-o%a?MKq4P- zd*X8a%x~#n%upco5YT(kF;4<=e4y85mlhI&C5<%goZ<wro}Rwr>(?!Pqg(vqQnJh7 zR1a%{E(!6oTjopVHD8h;N1)bi)8eY(LUeD3&im}d!PMMb28d_`Veh~>9}62BA1er& z`JPirYdcefmr>xH%_`g&-eC4-W}&LgrlPETyv&1KJVwUsFA8L~fcxH`3i#lK8QO$! z1!rVX&5SW+y93Vrb&ch_mO<;Up&Otv+fQ5sl*M~*f(gv9R}X(pPD~cNw5uL&&%{8@ zKx3K)E?~NtU!sdqW=>@hX|nsaefV^XHm)!6)xo7wCO4RIbqQo1W1Jmrwl`h&<&7R5 z9_;z~UHOFp85tPw@Vi$yAXPzB1z$KeHulU7eE*P;TkB&*ax{1lG%F1*lrZ9fL_IDs zG1!2;eQJsV_6s0?oTzf5gWnd4Q$_-`YcG^IH?<!-T?^r$TGl>?Y*a@uXaH;8B`@UJ zeW;l=wEEP3=eys=JR!}O^@oLxO<`@8z9j3^^71k&A4;PDr%h}s3Dz<&j^@b4IM27- zM(sQ1!<b-f&x7QRPfz6`-w&E`(8mY*E&@uuF;hzlDY)D`JiB{)CP#F&*N-7{#~s`{ zP>MS?Ufa>uk1%TY`FbRluJjL0O%-~vsZ-<#o_}aY$3Rz|3IXq(uCc6RVXvc&To_GZ zhj)5*_K=P3Gq~5v$+cUJJxuP12E7Ge)t1$82dL2-)j?dZ%-D>Yk?POI#4rDv9*UO8 zX<r8fuB7eF9r)XSl>PV&A##A&!(v#QwMYZ(hcXZuPFa<)=I!Cctf7&iEfbw7nX~u7 z9F>fkI{$k^G^@Eb=sk_g_t(x&UCO_IQavI!j(kl~y#Np`NMxbHbS&+WYbJw}7Vzw# zq|p#z7MGW2RKx(QACi)uNj_&Lg7F13Ze{leVFe0Qtm<kZm;;W?^}12qe)Bx1i_<sP zV93VA#ch{1`xQd%BX8(Cn@x*6)!-d7EQ9I+O-8ln!P;Bw&ycqp53=2!JTmqbL&hQ+ zT#&(<YSKY+*th>5?_t}U;Bw{x1H~ocB_Ki!OAHi=Y`xrmY+y_I=|S+|%mmi=8MZyd zQ|8y(4x2Uw&_;vkfI_+=>%WFAkoul<g{9Pg#C1s!ATnqxc69VXd}L_DWkcAro^Q$o z^UJEO5CVd#MqBGMHKy=sTI|CZXhr7(^rLS5UEih?qsu7#ATT>j8ygzBgK1LP0!Fwl zNpe+ntDBpx)6<mTEAlol@HUV#;a`UepLVr(V=zey4q)x51km$srz)c0bH4)yS89<~ zA&i6Zh_-uRiYZh6Qw&KPi&@EM9~m7r1P-<zJ6vUDF;E#n5Do>~k-Z@$4r9oU2Jagn zEy1;d^3nbGkN)991=3!W(;kSP;Gfsf)Pz>`F+D+SW@dCqNJvw4qsN&*jTrJYb{p<M zFgbZxR23Tp&S;>tVY0V@{Pqd~9~^9itD$o)%I<h3onAu1PaV++jThG-7u>A!(6Xbb zKv7YHgA+|5epdrkGTj{|3_m6Ofw#oM!YU7piOM3k&WhkimRk~MoF(7DqUBR*p(g2O zs$PNnBq<@`1vJj^<iPhE4j6dL1iV7x1es)8f0brIC2HNe6>?@mi^!^h4stTpPQPN6 zwgaUriBJ_8GeRE>7nmN89|ax~KtQAnQ<}vv=*Z3A<(G3{{GZAd=JJC(2O|O_3+oF? zCI;EXe<$r^ucV&BdqCwhHIGV_*q3qy<u%;raPdJPC~79n6tfvPU0==5TrQ`s3trLd zzbSDyR$h9sO&+*4cl10D{;B4f2n)r7iNKYo-^}*N$msjTSXoQ${H<izer{d3NU#sg zL;{g~sC4KdD+f<P+<@bJMX#D-<YUN0M`d3L3#WpZ>>C0x@xvGm5EuE}A^m7hBn~tZ zuyMQg;>8PZ@IxH_ege{VfEjtM?*N<Z-@ilfm|CuT0V2}E2v(>x5Uuk_zM{0G1htTR z^yrcBgzK9(s0##nc~}V?tsmCESsDP<h>MMFTIx>n0GEJ?dap`$?2k~IP(K4YJr$9o z`lDG>P<n$U>ps#mGc*bxzA=ir?^04v!Xl!YXYD=Tom%v0H<YWNf}KYn=uwQ2EfpVH zwde%kC>+#}*$>8bnqladRWRAMH~XyWGvDJX!Gq9MOdQP5=hi~2DTEQ{l{Plx_5Ob# zQ}LevUzI`8y8XFYvHNsKT<|f<+?1tDmx=7eCNe#zAx;6#YliLmm5BCd{hYy%qtnNR z%tZ4gljiEgu1RR8GAv~f5<goeAJpL8y!hGl?#ZF<iWGeNP5WO4U%`HA5pu-RUHT6Z z@G3lkRv0S+`;G?o*cpO}iyhz6a%IX{0+(g%>-X5i*f!`z{(GTo6#qo%Cd4V`V(fud z7U7+inmRNx(t>Je0H5Flw}wM)!${lyV3f}Ci~qN7-N@+ZwdmS!u1%mT;Vb8>S;tqd z^D85qxK;e?t2FHcG1iQs5{(R?@IK*xXG`O&e;#R7ihJYv@8{^~w@_mGfr*LE)#3b; zPBq_Oz<)+v=1olj&`->qKmemTY|#J`a5_JB+Su42qoCk<?~trBeLT_co2L|i3DxBo zmh4!{Bej4)2!A3DlNMYODqdN<Z{RowJXLdB+eq+(*p1IRe+N1al*baxc(CHHDVCO# z+aEWLQP<P!f({=1GUZr4^m+D<<$3neqpliDCQEvPFv)<jG#@Y>0M?L@?|GGKMSNV` z4{%vzU<d*y5UA9Bz(VNg>tkePRjNcVFf)e&Nd!oxcAO;D2H!>8zyK;rHmCN59Z?+| zM@Sf4n49|~qMbAN!)lnZ!hS{(;1cL_E6WM08oX`5Rt6~AA+VFsPu!dUJ``Xo@6)nu z2C`<Ry3@cx2}azRJs&bI=UP}WBqS!q#ilfUG<)ji4HzkXi|T8PYU;(a^Va>vB{gqZ zQTOg+S(3<0ajQ>HLv`3>=?PXZGy2m^pxuM}J0j5zG2Us${qD)!Bkc}oHX+Pn4i1+B z*0o2(r<-JDu=?$(rD}eH{r$s-BmjKAol%rkR=QlCdjwi9D*d(u88^&p;w_2Ek3c|_ z4JlnH@uvzOP=BGA$H5+c>MRbq4VYRy+zQ%92^*okQ{!aCyNTJg0ukO*<Kurx!V?uM z%Hgs`T~*w)Lo~#trG>*ZB?zA@KxzIxK7^Jt_kXKg9i}PRJAiX2qy{;?=G-EzCkEuX z6;4bGJU(zgXJBMR87r|tRO`_ZYSu^|TS+m?eOG3b-_#vJ-3>1TDp?6M?RAiW^e#9U zHEw~k!EI&l(aH*yvU|g_4d96m64dOX#+c>A<(o1U(94``l=i=}v*VMeQ&Ug?KP~yB z+|hx7m+ut~b#y|Dine(tMola%V3Rd90Va8{Mgp=T#piSzQY)n2mCy9d%tW;dQ&Gd| zSJj4yh;aM{dV0{i&u8_JC$sL|Q5v)Ks(7RaNz(uTk(IVYvMH63KReZLM)epzKHjG% z`DSL8@5z$n{r!Fd@4~Jb^fx%*2@Uh@qVq}1Se3UPYgPd=LYlTmxfhnsO<i5qsqY{| zaCmr%C*KwgGx_8yfn`bhKyB{bA26a^XMCu6MAA?CqNSoR9?<Y4pL<p=N<1h83Znm_ zq0J~2^5g;IHSFl|e(eUB#ejziMpY>AJy3i~2~}KRwS6R2J5l4o3IgW@gOpcPnjVNa zpyXm=VM6{*<_A_S_Eo{HH-HMFB=<SPoFXO<vujI15&3vhqwDZlUY?1?iW!A;ASD&0 z?n2FS0O1xa;<!tB-bCnfI=v8R$g<~vt`f|9N?|z<zOJ1sS$?X(b%59}N>O*<>^uQ} z4J6dM%tqTqKDzBiXs=KM5i_84mzI`(s-f`<?i17|8?vf_?XgC$ZPWnWKIC>8y|=x( z+NgKaNgqo&y7K8FviR~O8=L+U))RSu^lTg)dFO1wiY0<}hTb>v_57;*XL*}xGf@Jy zV+~%L9L1&E9AOz|cI{3vrtK=lZ0f<E!t$OFuKl}<rtC9$*3Q#!98CK-+eSR;jY7J| zate?CO8R#7_L=L;}c!v5<P{uC6s0qb%>k3D+8e0g%&Hee<J$$m2&;`j0KJo!gC zgRj7v>yAPk$~FqvPDS6CA8%RO^QSqX+~3U2W6SneGX3uMUmfiq_f<BQ{-Jd*IR>1f z#VzZEz2RtP`_b2l6pic;PBeiDuXaUaB9hqW=W`>*t4*2qa6B+^_szpjbc6<Yqec>* zZK%vfOrGk&dZsJa_~OF-Y^D;p%>klPv#E}&MiYw7?QsvnX@Nq?#Vaa}Q<_IOuKBLy z%pt$~_Si>kAm$FNAHY5;L=S<{?gS3M>BX)T$-1_zH`2112XIuf*A&yDI(z7U5?i`3 zt-ND)7x{(t)*t#i+vzH&rpA11N$_!jWO7v88h0MFdrmZHw}x?Nom>3)ck6x5T!pxw zYF93rcyYsMQMJGCMk~TY!B`shxrv{b?_+T_zCzemM|ywL?+CEC`3Uz9RR)!rZ9#Tz z=KR^!<=WLeq`)5MXPpn1kX=A8PF8Y99+?&GhV&z~+q82O&iK2r)<SJ~hQ{A&_m*p{ zYI&Uop~c!mY%wz8nPj&yS&i)xEc(t4Q@?EjAto3d*u8W^Wf;W=0U&%AYRg=_nz$t7 z{^27*V_Ax{4ftqv4~T`FX}xCAD3T$N0UUt?0C{w=yVVsW@$|QWL4;ZW4o*xcv{Yyn z%78f(3_S8`yPy$DNKAyLn36pS8xTllXi=X%8&RpJ4$npzo<ojlHe}kFn>%ZD1E~@9 z*P`FN8O!W0E&WbAYuiZl2wU{1dxhk=w?1Oj<ISDw=l?v#qA7*nMxv3sZwDSZZl3a8 zb1snX4kDr7Qk2eo5Mw5Iyi-i@k__Y4&|MmH2P{ahefgcU*}6PCzw(wt!#-m+ZO+Rc zzVB<Q`r?B=X>{SVu;S$s<o)~Ga9#H8)IKtPxas;&i_#|hN~xT|pRLvQinf|WGS*#W z!PljD=<hvJAaKuYG=8l|BqNxiI&a&zFN&`2PlJVb(~YW%{%zhXfM6alGry7{M}PCi z4Hfa2#BM}u%JKng^=vpcC00Q%jE#sVY#Uwx=U(Tq%}(@NHy6HhOb4a+P;xZqyWClE zY}gfzJEBL9@_oS?HkX6GnNnFI6h5%hnk60?St#|@PP@{fr@)h(!9R1isDo$h<vh%V zRL9bTyO(~IuaE5vQ5))&zIo4|7FB1Y_MqJK?Cv7@9v;594@*&uz7+n9qKL?~mW@Ji zyg^MF_{eULV^#$MJv}`~D1o3Eo&)Z2x(kX9cs~oI_cb*&5WeSswpAN5VmtQxw`9>+ z4h+et$i;2nBat}8%=q{~$U3Cmb0C(GkZ?vq%m4SlleVH<?@^>I-FL(KaBV}6n_$EO zN!bH&q1(Ac(?5I4OB4sP;i#)TQfUaZre=+sFgP{MHibuH(!KnsTkN;T0^v+07sRP% zyvU%p7R?yXRCiRPt6-97hi3@@M3ZFG%jaxPl9?*DtoZi1zmqI41h1LA<0pJe^K;2L zVC94&FH0#7J$mJjqwv7=P-KG7!*2VJBg0dHCYoIAWrj4SY~3b)YrbZd795@z)%nMl zNtRbPpXV38?BSW8@bhq;XgxFoe;CJp(rroL+bJq44Gb`ge902>!a!M1&Mww-no-!- ziX#E|W@dT#>$i<|=lBx~xo^Z4&fVH;G?i@*L0n^@Upmqv8W2Q~A5*aZPr1;Db=x7g zdA}}cN2^X9CZmR(AdWxZYqx$u8IN3Ok6Gvw*)|xh7T@`a_IGPb*4X#~yce#`%`X(< z9HCZugO#<kEmYtOdOf>xy}9je+(dH)HLKd0yW!b?;7=K<a+hqpFqlKp_%XF<sOttc zsV&dcQvzv6K9sqr?Ox1SHYn*uAu#9__MC&XAZtO=UX|U%)Wn!2zO*GFa4k3wV}gx~ z=_rqK+UHn@&BA$g`|rlj!lK6Ts&PRwm#EN)jQaAwicL&44w|rt7@YX6peH%=ZM;F9 zXqwylIt|4EIy#2Z<Y~(P<pMk|9PDGMxUS3VLMiu-zgboA6AM$hA_ePBwR~swR6kad zh}O4Y@dNp@7EL)FE}x1Taa;3Dpl-)=1slIlj0@iAv7L9Xea1Xr`>FVPEukC7s!e~= zz?)B1M_XRT9o!$spGCGU%Z6r$f?hsd%#Gyi5Q2U!`og=+bZ~@gg;8E%-P-K&T!6u$ zS>1a7hSNsZw@4dJIOA>z_FXz2I>Owg+%Jg2oBjJ$uTKcrUw~UIT@&zp1@E!i5BT>F zx)<Q12VgodoGA+Z(JK56Wey0uEkH(eaL-aog!RW_v`hx8%5Z3ObmnmR-H`u`xPT8N ztLNvDJ+|)DPUQwm?^_n7<V#CSD9hpd;L=5YXNcq;yf3gzr4bQHOa9W@);15S5*cOX zo&+1>T^JFgu8#Y!ex4qz?`AmoSt=}hvN8{@6KICHt+#*t`0yfTyJ6pc(QNr+RT&v{ zT6i+Cl+XI}wX1Qdm4Ym-l2=k)>o<iBeGklSC+cn*)od#jW>dtfy+#H@%Fz&uWyQ0- z&VoOshH@%ZQ7-IvS+s73=lyvt+{6vXr#I3>KPAGM;8Exe^!#g*cpvw)1I%@4E5z1o z7!=}$$DM2tH*NVTYHDf|M|A97I$mSQBjDv1h?7DOHtv`w#l!nSzn>iTfxSu$wHDuM zJn|(w#bIXufXj(4`54#<YyBg1d<?`wDMCuV{>9_3k6!1%LmZ7jm??KgcL*n!FBU`< z64x8X^iy3@mT;Fq7GyX)T#m}~-x~WH&ecz!zX;mvaxSV+YnZL?4jk&!z@LThovr&x zu7)HY`p~j7e`;W=6Z_FLL65sHL~7Fj;{{#{*IJ*h1$gct8HL4MlS=sm15BdI{psmx zioORlG}nYCgiwW0QAsJuF<7AgHG&!dMTPbD)sh=y2z|M`Un7)dAZqe0b2yxr)|67q z(G9&-(>JKr#<D}|^zwCbm-3hI1;I3!Rn7-kdK?wBR&GPiYED|-*=PJxP8*pnuPI99 z%9yV7xtL9Ls!8;@9xdFwucwEdnw@W;Hq0xSDFt?BY$Op$6Xe|`WW|w>p$4g~--2`U z_qA||x>L1*Kf3bhG{I*p0UjPZN2uO3n144nGxn{ndbvS~226=`hvdI5D#N^oTTc1X zw`L3<4q__+oZ0XinN+87a8vT<>e}#^!XkYhld_^BT$w!DGJ|ACF$=P`O5++C@N#qf z7o7u-AV|aI;aY!}{Rw1hmgxJwoqG2wsM^bga^?9|-VZJdy2$D_bFQL&uEB>=ooyN= zcZs+fNbqFvU2Ca8W%$aW@^Nk|OGA>9W54-bU|WpGm&u8bgp{%Pvh$St_H_10S}U%l zHy{E2ZAUv2_eb%R(!vLwKbd#wRTG)piF@}DCv^v<*4#@M@@gyObuB2dv?tE`+t3Su z>-GM9!h_$~^c753_|n%|v>4=ytgvvJ{qxMY`o1n1i7=GFxn-jxsY+*$jEM>~CVzaR zt*t#YIq%_Q;hXW`1BxGzIA0}5%H^MS+q{{Ff|4T*J1QzBV4+H;VEcY?<j-f;zd&1D z?>W!H_Z%EourE_9S;4LEcn{6!kUMw5<35B!d?_ew3MfPC=;<(cLlF*GP@HVh<6&Nn z!#o-$o6Y<|4q~t}s@nguk!WPX{@~4ffHYrO8wxQ>i}vT#RNONsHvgfAFcXDT$2J4H z`N|fKg$-|ILkggEJp52ISW_NH{_)n%U}j8SB+4x^_lB?t-Om!yU(L7jJPx~>kVxvV z+hOl%0!ZCClfh~Tu26V;#<ME?Zd<JO!nr;06f5wlPhqRy`Qa$)eieu+Cb0#Wq#Q5) z>9LY_|NI>iQ=R?IW!aghGx(-|@?SE_E{S({)&<xWHkPB|lCS{Sua|5hGeT%G3cb=& zpEGkM%;TO)C%#Q^N~kC67<TqFDdjb3g?G$hWEA%Un^&*(4wzm4^e}bAM&u^bq{x)h z!Q^vk8CeyI51EgCiOnozTIrBPm`hGs0j}bCkc_dojof-S)4{h$`+8=L%SP7@et0gH zLt_57Z`6XINoKAsvsO*h_@9A~Nyd~kSA8t@n++SGtq%kRb-oAobV-I4ps!H$7hzU< zOX5A%)JAiuCWlIACdy4q0PU?UvcgAU#if=8^M?54v8f3bKSh^bJ0}i^)4`2c9wVuQ zu}{~#-`BN{-eBy7T<Ir|w)UKyrN1_iPV2fcK6h|dO#nl{c)1IydqBwWQo0MSGknJ@ zz9*Evm(%@_*Ix6PF$Z;&;Z1>}LP9T(M@}9VLhbF|rDw%10FO8|+39=mq%O4$8vKF) z%@6GjJzP(Rj=)a8@)3N?G4L(R?ug<>ujGw7^*2-6?Ty8sIj|a)vMJHd@Tvq_ygGT8 zWf4k7Dt(<j1lu#?el~q2yGymf&hVM!Hb;!Ydm1d~dzmzt{@1?nvcTU1ugm)8*r(Ai z4h4O2BO1em5nBdc@qJ*?LDsVbVwf?{0}{3I5B@L&eHF^k#|FaqA68tyn=mt=+85{? z|G>qnrxiZTm#@7MY~pT4#*j;h7`*1@+G6kKDjmuJ<E{>A$=&uX@!<3gN}=J81%us> z{EYU*7tL1KYV;duFuzD>;%cVc2I{7ns3;pHJcy0yVi$FzE7x4eDuR45=PZ{}O1p^$ zpToc?c=zc<MJb^*23+=An05K2l6ybK%)OuvqdI?k(Rw@wO9d#YZD3sj3V@&cq8J#7 z0(*$D^<tkXS9pDGU8hvS?BHXAs1Aq#*=1!!LLNd9EDc338iOJK0dSvKE`(M@Po(na zZ8aF?40pz!jVkt6#H;2LGUPJAhE;E5>~Ie4y^_{i|7f!rf9y|6nk3wNciNuU_MJ!{ z*}bE|oPFy>;=<eS=jAIFKaj_arJ58UYF79gORJTZSrAh%iiEAXt6+Xh)352lPqmd> z>Uc0wq6eEVzM@)saf?ZTfL=Y?St%PGpH@~*R+5MJ@pbsRVJlvlp1PTm$d~l`ABAzb zp7D3ioV*GQ(f;_|3=vn_{`Vo^8?Rr}7?Z~2YRcAd_;;+1pC^+7D>vrA*@2lYha_21 zMbKp{QrlJ9<O%Jb^Pbjo*0l1L(}9DktMLnHOXb_Is}rf~8%6M}^u6c33gVX}lEJs^ z%LwSSecNjCV1Z)P;c?~z+}pJTB>xV)J75?L<mwMSn)Sj3-UJM3KXLtzrNBoV;uyW! zR%B#l;Q`$6J96_2f$w@6d_-Zl!$hn9U&J=JllCgSjv&<-oO#XUh@I_KZ2bX<veB&C z-+?(}Guhvpd0%KxWuNx^#=jq`rd1WmP|9qhkXRwZ0Z!}3>A1qs8~dIXNgNPNVFX@> zH8^;XH;*+O@&PKhFjAn2&EAl2a{<tA;y*`0$jdXj>Ka4cF2Ib+&M8HMx{u=Xi@pf! ziR`%<QBowGs-KEahFA6XzJxgAd-~g!{aG@wy_c0`^y~=<4n}>wGq(%dr`?4AtIA=v z{Y<HM{scdvc(4EdP7F@qiU%hST9h7Ic;bs5#DdliC9Xt<?c2PO(t_XC)tOV)0kVYw zG+2beud>tazlR#NzLrI31-dxlxnH-AI(LBc*f1;p_x!clgBtR|ZwG1e91Rn_VZ9bo z|C`bd!xJGV_YPe8KxuSXYY->NRB=k%i7N7KX0_{|bA)+6)RuYZD4*jb*aT4C1X@%} z)CtRbxc)vo9uHo<a|Slm>V8_T-TmUQg1k&n2`w0THy3NneZPjCs5;nSLv_5~+9psN z4Oa6~bCyAzNh!N(S9@yiVCsUhTL*a{84d;nJi(j`X+ljlGq9um1@f*y;Gca0O_{{y zZcHp}VF6)&z|T(t1bocxR(^5_ItC~Jr6zpIdoMOsSRe;M!M!_(o<AH0Y9Au#Z$aAu z3V?Ji?+CU#g;S1jk>lLGJ3C2fA(=mHyr0+mWAfXNNWEpsiTl*lAuz6%N_dgP(R+k# zjv0F0(f)35{TeFUK}3YY=<0NgRM}f?>{K10#bHA}0(pMB$79q-UzsW=Yz1}Q37`ab z^!3Q<DNe?{@zJ#f;mOVhm}ZOkdER2{o-bg^{Ds?iC6#q-C{5Iu03#np2%|V@!u@?O z*KJ+G_36oDiI(<sKpb0yD3cq7CSU(T8B1KCT|f_m)BJb^Ldg&}3Qgwn_tDy&K9b+# zRcdan{>d4sjs9wy`>s~&6QY*ePIT2WJU8P`*%b(&u1t*ly*O~LC06y1aJl~e#hn$3 zjAvWm!u*pH=ftxidj=kDT?r-Z2TIav(vBbPa^8z<z+ETqN$l1CVZKk|A!W?+1Vm69 zt|F?$8Bb)M-{ktDYr88ZE`AqE8{Zo~Lldv|Ln`=xVd5T{%YBo!;NB<{ezCNaC}Gqr zt`IjcFz!D;WC9DH*xmOpj~MB#>};QCVNd8z@Pu#6-S<F;7fbNXT7owEhiqngCMFQI zi=o6K05%8towxe|H3Z|n=idjgs=Q-e?y0Iirf&?kxyQ3d4I!Yxs=K;8V+N~7L&MCm zl^*ZVDuRGYZse~(_W>JG(Ep%9y{cVS0Mo%$i2LDnG$QqYVGr@!T5`B7iEHQy1cTt! za*^bi<~WngP_|b5wr;K6Zis-)3G8fUutY$E7vHn~KDEz3{2q(au>*LgVT&dWAXKL3 z+C%UCG^8{n*{XzXZ)MsOedu7cz+(BZmM0-W5{TH<FXr=Qg@OJtv^Ve>p{qLnSE{CN zsH-}efI!bbP5T5^@DdkeS@RhZ^??HePp93GJ}?@)AM}px&Tkw33)_~-h97}W_}|e{ zd@+Ppk~!my*II68`-!tN07^t5Im`>Ax?pteLzl8nBYid!2(j}2ME<Jm9+cja0Gjd{ z7NJ~&upg`!iU4}RV8ony<Ixb_Lv?<oK=klz8cEtbE+Q4loYD99XR?_IO8F(}9@D*| zxlQ1K=(OM=u($n)am_Phc73-xb6hw>^;zb3X?XrtH_<xOpP7Ci93yli{$$Gx<3x7H zvv(lV8n@;5c3tC1&`#u-v})+Jpp)gx%*6zTWZ>XSX|vBzsQEbKjg36atCNh829*93 zX-kBD{rAQ{exxBQ8JlG^E9Z(oW`}FO8COCSLET}t`vO3J%S;apl>IvhKUa45>rVdd zz?UToKm=%m<N%03`RYC<lChoQ_oK_E+7xm8e9)1wOD7loIDZ(G!V9C)@w(9!$}bUy zT4mOT58`{!`a5f-hn!vZ{#jWGf%qS=690$$uV2Zw5e}3)*mOc&$DaaXjXUfvi(z*} zDdda}!CY;iLLB(bAQDo_76CP9acRjI)PN|5>-qWl9q{U10L=z78(aEwZ?B4VjhDJ4 zRu8S<LNJU)JaV%|22f48eJrTH4L}0?bEdGZ$~r$FO!$z55H9A;7@w_lp#E+@8=03t z^!M#sJWv-HUWEA3%%90g9HXL>6TQ|7@AcOwK6(83nlrb{`x1wP`?J%SsQCjE2d8D{ zM|!rP5vnb~y>rLd%naT7!#%kB<?yF)di}GP*2xnCm_rv&;2y!d3Bz{v8*&+`&oTpX zwiS#D1k6uAxARN!KohX&8^;`AOm@OIv$}eN1Af+-s<-D{QUYNkBtys9QQJFYtJ(s< zDcl*5x5q?r>+yF|{^fhc5ABBy{OHBC$fhdo+7IofU~IaHI=u%69$CvA18-kePARy) zTaonvB#m?V9zG$JOQAz+JNF-}acv!g&~>}9dP@J{qx^-Jr%hJF(rNms>IQm|u=e97 z!Na>Im3SQh6#e+L_rJT$b}xW_fWKQ0mB1=%;b8+@8WC_Ch@Sq<3609QaOCHGO=NUB z)a`z@dD34F9)OhX#{0{?nk`2r*g0@g>p-)H3bKYR0QiXnfuI1cp7=2>gD}Xa!Y3tN zd2=jC3LQBfp!1*R9{f8z=+m{Gg5wPa2*==<Au40r2wN>!RLOu#u%5m?L<>U(*$$|l z7Jy6%odOto@dJdr3%J=wV3C5R5xBE)wm%Z%1KaO=;lSEEP0RZT_a6#i$XjOQrUp!@ zgyW`A3ikHxVlw&-#h>3ZY6k{J{7vH1V@=7+|1`%)ysPf1o9A(cK4KSDQ>M1-HW@04 zY-c0KG&G%@h8e4-$?a#1POyG$SE1o&`6{*?4XcSqfn{Zg_^y~5yHRx{ttLK*Q#z9k zi{uWQY(M9I&)^PP)v4X?X)gnSxXGe4_LTr<tx)P-Ik!c*9+xmbR+JW6x!#>%^PdCv zH-El5y7f&&EZvxlAizSGgoqg>_xQrEGI(uaute#G(_`&SCCxok0*2UB$J+#CVb@1W z6w(zpxBRfMSjw^9nx2jbN#gx<5j9B1X739E?L(CT`-vE*GyhNJLFVWMc{PLngeq`? zUtC!>g)@S^AGlY%0i8M_M0H4;y3i>qGZ5yVWcl832};5IbYibZb@vv_SC*$9HA96& zO-WS66`?a^O3I<I;~1D7yqiCKJAUFFj1BcTXL%y9r95JqAQmsKcdpjmt#{i-J@N$* zwL$qvJ$U1~wP;*gZBcJ84C|NOHVTKA(4_z}jK^;`DcvH_zmGkNSdbl`S+;_4&V3zG z`4p}u=vX**sle4Xa|QM|*A0_rHVq1Y)7naro!&Yf{5`|RQGBu6PL0||9T7|c&;y%` z|27h{v(fM0<4uDfF!&QngA@|V-OXzdeuzTwz`UiJUr><D2(lFihlbvklyCzv@d=U4 z;>rr0xcL1f4kN~S5i2)>yPv6lLPX2;4zDbq&a;;t{4|`LJF=QaPEUz~KDW?AzqM)Z z&nL<qc_iUY4PatNcc+xellgFb<UamX=D*;ePuloMCe=T<$g@oC$!axkWHP*j>N*C0 zms+-0Rw`{Tg}MV!$Q<Z%P2rl$W>%$W%{=F`I$OH*d~Hhv^AXuk=0{B(CUU$2OV5)K z(#<c}Nhwut6>!}Wdr<Q5sdS6iOhjtv>ryss!#_)*Rkerug@av;)?1#AT4tX}e!rK# zP1)ax@6=>B!g&2H^JAjLqoV!cChPJie{Rahy#q@Tm6Oa}Q8mwb&%B?|?*DqF<5Pdb zrzfN3MVS0}ia%h&3CW6_g1n(%i{kzIoG!V$7sibDbxa;wyPL0t)d7zS|B6+#5gNrs z5u25?-5sryV>??$o+e<IsCJ|j4#~3$IA>ifT_1m2*Xw1&1OT|Zso&ZqpU-^b=nfH5 z;&>N#2Ss&SXp2Ja3GTE)oX%P3v7zm&)HVm-eF|_mT^RTzHD2ezqm#&xU0YCKHF@A5 zEEry!+b{>JRk(pF^NEpS^?P%}%JcegI$pnE_Vo0E11fG=Y*#sjqFSJYP=+S8FpI+G zngxiVsIVZWO!pgLrqJFQ&$N4nyt)s^2bAi-eK`DzFa-GW^3dUm1c5*->H%vM2r|$+ z!&N)iN@^qx>Kfp-?m&_c6-1ORPCnAF_|wUh*@6^35h%47L%e1V|1~S-Rcv{5zer2% zzbbd(X3WCV^orADtnWoPe|sYKqvO@a%h!6v7wu)d2H_EDTDEF=0&F<-5S~nn^xKga zISSh@c>UV-<BuxGaKc9Cow}jPGIquW;tT$F#$<3};_nyn+}>P8KN=rTPVYi!biYk= z!nRM1r5pR$@r3OOIz#8LwCBYz2#NN0zfH+Di|0#a#J6LZ(I~jm%3dH6o2z0Uq9yYk znpadI`*gizU8ws9-t&@$>Rt<24elxCYLEZ$MSGPR%-m7#97i9pAPBo>lbM<~FbjbC z3FL?eTVWLU@8&dxQcdL}l}~i^-7}Z7Yy?99j0E?2(-!WxxZ;=B;Jx4xwsoeIQ^eo6 zk8lPSzA-Nuej|f#0WvzqoW@s46i~370~6M8mDayotFX<Yow)1k>x+Ve^YnMVy#ch@ zvHn6hno{U(hKL&o3EWlZ)AFo<rObAEZs@tnklbr=etFc`j?Gc$kI=8ohAkD?O`vv; zz>fe^OUwG0N0Y%dZtMPD4!-PAwvt|!>p1~?m$qTMZeO)%d(doGjGsRk$QVGpG6qqi zp$W>m0LAspBc6g%LN}HP896ZMfb<F#XbX$`fR2t1ihC(`$ObCVYPSOm3-HeX&}7wJ zo~~DUd;AJG2gTH4LyXuV8R$A8&+p;+-*yR91TG1p|42g$FvFu<lkLp<FNmU`>gmYh zVlL=I7dG9HveNG8u-aCtaZ6RVb(nZ7k(W2GVL<5~Ecx?Ta5O6NXaDNEtmf+ywN$=$ zZ|O+-zsL!g>Br?qklaO(xFSdrfBw9^>jSOL$ywu3m;)|wl-14l_-`55GhHsVq1HD# zi84>0;=#nh#h8{ZyY;Y&7>y^Q^#*Yv?b|eCasr`5=`iU`VtRRJKl?tBs24e-{-o~C zM(RY@Z`0T7SCj1E&0S*-ixc=v<Z=BeuZ*<VpDnaL?w8WR|IoDyo@uVN0N)4l0Drm= zE<jm^oh*OtoqP$AC@8~4Up^NxZEfC>QI}U$l+`dHuv*|XA#Vap=-I13J_)Hx3KUF| zc#bv8{}MFbb%e^3x%f=rSF&biUJqgjA|oUF8E|pyeO6lIM*W=6G-amU0#SwS#M@ic z?s&X13&^Vl<Vu2T!#I?^&v|($TX>-Dx$pN1>;f<AeTN&g3|(Dac~!5~WGkPCyf!_3 z)XxL}M~wI>+!&syYiJJacgBlNZ^0V-2WY3A{R=`J5V8@lMuOIrl!Rpdcy|F0Js@-w zTrELiHooavbnpUR4frpPlp)8*)zslEW1v}3@iNL>F|M3y+7|_AeW!&`?GN;=5ko6p z)yDttj{1Emx|gTd&a#MuiQl9zW&Oh6?7mM+Pp~sDCQ4C6<GPkZ^UCoCN{Wa#B-n9j zsqY<kX)BCsF)X5^FV|@yK+|5XH&g6YMEH{_pQ8tVI`E}EL$~v@yzfaI8%b1cwzz>p zJX~2uv*$YQXDS^o)${Hks5or{ym#siaibTY4F|2ct-b8<=a4V-3esdsar9&ArCXQ+ zDpCYYd);-)6R)rU>&mkjdKZww9QH?0)t*bXJI}hyMY1!3ie8BO`@b%&p5KoHdgT7x zEZO-wvZZB0P<IzcCo$+nS>W^1fyb&w>Uy7#&(7!|RhhCsb`0|cHI_sM^}V!v>gvz0 z!?}CR&y9tPYvlAsK|B#R7lT9SA^CyjnlXz@{?MH}^Znab<gjMavC}Gw(stJogf|1Y zA1mB_)9s3qyEu60P1>dPimU6}QpE*iu(U9XG$xxDMf`gu@yxNKa9KZ$%>g)fhDBqb z6Ia?_61+><-n9Cf7KYcW^Zu(yfIjAcCrLM73)con@|9Be$no*#o_C)gPC4X!`GOgO zON}xZ)pe1vvftW-2^I1{1fAyJC5>-EYzT!zT>ykLbYcWypfwyI9OixnVZ*ph1WgWX zVgsOT?3LD%yKYVffi(+iT0+gY@JO75Ds|XUvkx>N5Y-w2+9;3ej3Rz`HTA6Tp-cJ~ z^hk4iiB8e5^YVmm9=q42riNd>$FsGvX{G~T{fZaWZ^3i!#=^qxENNqCWb|E89ix~} zLmH8%XF0+`<VklhUZtku?T$6hFEw6y)$L4?hR#juZA)`=3i<;o0$+Y7Su>}+ih>Mm zOdnlHlxyvTZA}rup)J;dZQ$H%p*iPj`6vOEVfsCsDx1&G*?@uJM5Nu*lh7`<UImkm z9)p}M5vlV{hA4_1oyRk8kcu`%PV0j3++}l89HreFGifhn)DzBpBXCyddcW!vorPv& z2Ah8*VA9~DQoVKK{KlW6Bc_Kd{?mjYcPCu>utaw6KCR1L931Jk031qo!40L8e_S_H z^I}uu!s|P|>bvkTLNGc}>B3bD15^zgnAF4bgwusF0ZrGTNf{WQmLJ6mHvZwTElyT~ zGc2s8#&2+zb#;;@6!HHN^%YQAty{Yw4T2zzbR#Js-5rXA0@5uaEh!)=EhQk0lz?;y z(j|gQHxeJ6(ozC)=ePg+-+P8*>@)Tr=dg9H_g!;7xp#8n0TbR5JR9L=M<EHt`q54F z!6W2Be|`8adjbCb*=Y8^5Kx5@fn@RQn{aDYDR(xyZ2NXaTMRf2B(DC9zKo0!r6vGb z%MxIdCKfYxpA+2n+_xtd<CSTVT2dt6keHa*ZY#Ky`YbE3YcWMfy{!S+Zvl=kxF6sb zGCv7^7CBPR0lCZAFgu*VMgx+~NYID+ZW|)x)YX5c5g~%;Kh(97LABP`9NIVm%)OQi zGCN|M1-WgE%Ri?6VtN1F2mL!cXX%qB!Pne>LiePcQF`uEQOCyiOnedXJ^t%%|EWUR z>?tMgj~|*|`}99zXo9cfnZiX}Ec&DNK%GYNo^08-%ex|4XZ6VWb1E7SD^eE2fPLeC z#8ECkiWG{TCMWg(VE%q#H9hxi#<9L@(M={1q8%OAU2Qr)8#Ry@A9yH#WB7hUzu|qM z8I}xs?d><Lxuy+ttC_nz`@1La{7uvTR|{a~NHpM5t(BHF?n7D65rz%WVl$h+zyGwz zxBH6|zs6_YeEX&Z=!#dw&Q<Y+>YNrJVzBU&ZTBo$CUx=MJSp7i0gor}DR{7(*z-f4 zftG;@Zn8CS0+)=2Qod*UqBrqx<>c2|{aAB_k19;5P>U(JExE?jDlR5w#-BR$>sO?t zs?Yw&o=GPdR=zzPG<CV_*<j=>Lj6@wF@YJv5tfj-<<RY5;<bq3OzkPp)V4WNNS**0 zpp{%v!t-8e8ig-)hyB1f0uS0N!l9t&vqqu3l2T~K{Oo8j7**UnJ>|=EnOImbfb;mk zZYPUT&jzCmBtS5|gxED1SVX}8(NWEXY`kpoIlY16u{#@qoN5XRx;b|)-w$5hMhYE% zT#`{~k+kr)lL*;QRkGXIksI(XOlM0*2_s&Os@t1J#`e(7TBMUIT8)h_LLo7D@O*A3 zCWc&lG!3A&vm|#*clTKO7*V&nUO~v}cD$)pU_TAb*}@P*t<)iQXDqesSI~Q{?!6}G zy*$CV?AP%Rrn{`5D}8m~P^E9ipYFUiOIac514XH>FJ1LoL>DX;K$U|77*<u8J(&dl zn1oK3q;VfAGzot1B)wg{tjjp1_LC2n1YH(IQHS|9kD6;)9X+;!FQ-Enx-5P1k_7Lh zhfizyp+u6}Dyi0cW>q0w;#FO%9~2KqLAb`uqS3(H<8s){j%!esoc~olAq4g$m%2qR z7gwy6$A`#Q;<0wIu%`$O0C-V#>=*iX;EDV}+eBVq;Qs`o3$QV;k}bTgN60+3B8hHL z0;-{LR_A!JtB0EM|8u)S?|l+Z=!MzHf!{r9U4Q#kxQh=K)K2IJt7LnAYyM)?=gUQT z(=deksqe`XuJF*RiKdQjGH;hdk19Pj^yZ};OOZQ}#}CK3sJ~3bJKB5#jgT%#qmbvE z`y@%Ah8773<p2tG6ciMMa!PY3WH9OU<<J}%NKa4KGBSz=&*942n#LWR$6rtPhxoFt zSC7s%mSc6BH^>x+e{L%<2nvz_gT}mTFm>2`Ct^nrzy}r~vJ5qhmbn;9|0_<9`nvi3 z*Byp+AK31bHmkjP`)ttSOV#kUOJuIIH$uuy<A~PaDVelO)Lup1XNIy?+IYCdq-n)N z)m>aRAO$ppPAWQlP^wEEamDlcXvs;p?2Pu#9eMDYZ4HdYn^7uiO=VWz0YV|99M5=- zvfK#Cmjo<}Ac?j4Srbg_EcdCb8?%07z15{$zR#zVjLNivgQ)xeqsfS=Y*`s+cYB2u zwNP$VjJe{tQi=VnB<5J!C2<P1PK@f6WL9My_AL0Ao>Jbh{*#}pJxF20LFf)eXka^D zzKK!ZcpSE9kINU2E2>YQK0(T^LUa^-dI<7q+IPRseUN#muqFw8nNq_$mKyL51aD%+ zCnv0}8qJT-y_uZ%#Rm@yU|)WIb0A{s0M5Ddv5nkS>Z=O(XAHvcM<bk208h^eiF8dV zqgD~8Ca@6vR9cqx;^cwbW}~y@&flQE=M2+z4tL;3ZVvEIOFSV$sH&>|6qKh_^hJb& z63TwAk+ive*|Y6>?sot0wK(SQB_&~UDk|7O$Hmo(KY#x91lo*2P9N^@W{#Yv@9vi_ zAt$B5#jdmZ1rW^ST3GB)&9_vaIohJ2pywAXB4%$q#WHK6rysVF5AVmkK5#*wvL7-m z+pjl3EhK);L*DAOMe_P$mDkd!P<}5Ie}3sgyhI&zk-90Iec<ms`0M`yR!ZOprYg<5 z_y-)_;i$f#&RQRa#QmEi0mVd)75BW9o1Z4xhki`CDzZHn%=q|Rvo_=Jj+>~p^2_>n z4b`@spT}|4aGP8~3CnT1?BP%L$Wc^jl(?*Smb_h3p8wk?D=i*eMs!uO=^*yOCwUVO z6sA!1Gj(fC>=ognW=~@blAer<N^Ify!0}6c?2!#%7mJIFQcU;hUMdx6Gl0w$WSJih z-B>n<=Z2>P^-TRqtL|8u_uc>d%I#vmDhPZK!LR~>bocgm)PN9UoL+$y^RB;d5Jq>G zn#PQfGK<-lr;<^16YOF0YW|Kami9bBJ}gTOHgHwI*9>q4kxT=X1W*DY7N$9)ptKe# zCv<k<@s6zxlB8o+l>>KKq<Yjn5s^j9+tegC<zrC4tA5AZ!UNFs;Opq42ShXE^^QqQ zGk1hvML3|CVW2*JX&XH0d3;w8vYpSmJA#Yms?hw6>ItMF>;18tAg#KF5+r8r<KcHp zPmFi?`%)W3VHkM|D{+%mAf&@CV&%O2rE_1s8fvs&3NR)@n1|hBnw9tUKiYI!BELrP zIv&r|F2GEX_#|=Bt^fI9Dr#@02wYnVA%j^o%kr?NO^N`mp}>qLOgQVvu<a(wuz$lV z5UY#N)hhjC`v@1&f*=bb%A8_|1Yb3db)@$>PNG75Z_N!wEzK&|NU^~q*i#gmSMg?T z?B0?2;}9ROMh@wY{2ae~-$hXG?;B1cm(Ob4r|qjoz?{HRMnCDPnh>%xQ^(|JNzJag zU^H9mSQbRj^<_9Rb_NMi%GaTSlodwyz#pSYaB17VaO&dp_r*wG66#2Kq44|L)N0nJ zTXgl@x+SC_FR|NdW)el>ioiE7nlDC4g=PHCP;5F~nfMUN`*TII!!GyE92hz#5?w^M z@hRvg!L=)CVbR#Z$9a0yt<Xcy!=u4t{c=jLb_z29Hb)p(panKN8UquvGtRmlh5@qf zkU@*8g=1k8kP=A;{E2qkmxx_%Xb@>}qWdlI8}Ub%b7F9qBXe2AnU&Z>@9_g7MEvlu zS91+<6<nA_IjELLDG)jQNAJ{ODxfutPN@%IrmH@Ivty^%Ex8IXBO=)tz(2#cB~ZRP zMTCKdW20!pI%96@D?A-O_<agBIsE$NVD0jGX2*Go##w|0{#?EazO~kebq9nT;R)EP z+_G^i*!+q*AG~k@hbdkZMAHR5iFX3Q?q)#wmspUhswT2#t<&o4i&+<<s3tbswPDEa zZ*lNwb}I0?sFBV6@MBgD8r}SQT(?a@bB9IA4s>i<@mf=aji|s809d+UL=AWsAt@<~ z^1M^K-E1PvLZBW7@oyXm&|$6y!9&ph*9dn4@d$ETMpiMKhQh6`9*1DysGllQ0=eA6 zD2gPL;P=@Zp7j2tI6MuK{=C2aF5S$^EA3HJ*X*`;tLE4$J*CQHuyCwsO1b$7b2xKC za(VgRKcTaW89pgTkTKo_b!cIJCNCS<E<nc-I%gg>Zex64aRK8iNor*CB?d&K$G=Mo z9`h?!=f93~X8;xl%45GY<=!y-HKQdZpFi_yGS7cbEacYB+5IfRhfMT*gwUNM5*%bU zZW{-~Ol=(D*zQ!Ip1gd-*=sIQN*BiiNphuU`>f&ARGnHS_@>*N-+BN7GGLfdfB#eQ z$C3m-v0q1^VGr`TLAKkd(iafKfkFl%4B%L8#+T(sjSAwI>Eh}3|Il)bWa-p(A=cZf z6ODmD<(q?X$p$x>?vy+<Y3Hz$EAold8>F3&LkV~6A~&HwMVnp9v<@etqAyI~>@;df zUibcUd}<Cp*j$?obHX}?===^)jEnv%Psr?3)KV~YLX_UWkNkWgeG|QdKiQTHRc9JO zHdt=d5(Km++=`5M`R)FDHfi09&R#UHIgoE3P<(EGenhW8%j@#X><jAFlg|~4u!_K3 z*{*a;c{LS;`arpaK`aZ6Ok%k3&uSg9s6KQ*27>MDtBQ@T_%~kS>d2fYFv%l%S&%Ia zoSaxo@`p!8%PA<JmkM!yD_iC?u{UjYBLe;mps@IRAjSM0JguVsuqkKs%3{G;WN2a- z6SOs5JhZB?hEiErXbP$N9^DMCt`(fUm}~=adb>2&&Byu_rT_j>Om6ahob38EX{k~u z|IQ><H#Cs6T~Ar5J>`M3Xr@YO>DQN=n?-XC#1)~TO9%^#N{+j@Z4Xr1-*_U9@5-h= z@YJUeW8L9o3JcwDIB<~|nJ0M5T$Yk8+2c}FUZw=EtUWFFxJ9mIT=x6e{&XQw(oJAW z4Y!24h|uUT&UDFleSM;RPg-Z|3n|0H8o@ED`(t-SKWEGapODQ)R-OnxB1V@bTjyGR z63Z<c1U|R7@7dJm?z3nuc*Xbz+$*J))icov671ekRE>I1uROftA^z*vOz#C`%OHVK z2-W_s<&_r1{G$bOhJ<e)d-k>nIwjid63<DI-G+@`{yfZ??}|R67CbBJ?|BzTR@Ghm z6FWrMl+Ect=7`VYpv`flIYm;BbMAdUMIq1>U`znj-(h=xr#@%nPOskpGQq&fi3b&? z%;iQ6LCML<l#_)3*)xcWQc6Qj9}zr3pWOy5$U$Njcu2IU_SHw|Yu3Y!?OA{Iy>6SD z{-2q?@J_uV1@$qqp&b%7Kl&M`_hYKSR)O8U-`ks@)XLP!L`X&!TIC|TU!{#c`M{{* z6^0^<;sz9{SpE+Pi<G&kR9ZIxSRW=r+f+z|cso;Xc`;t1()60<f!qzLnPy5SObl~Y zEHv(b=rx<@M(H~uF=)?(n5sVE4i*;XNeYqOsW9qzv$b^x*D*btPU^>C*tl^5g{WW% zQ(oTL;rI(p_1w!EQ&egH|CRJjmt?<!LcYV7M}Bj<WQ5rpCV5^bgatAkyOr<}FpUvx zdQ+>N{!pRT@Nvl#yYm%8mPw=0#2LYUhpdm`4w1PsQN+VegTG$HEYtJnP6p-H?%t5e z-45WYQ&cU-DU>0S7rH&I`!}@7Fy`U=e@YP~3gK`T_a`s9>}nviLtm&lXLc}W!Foh# zR8U_@YA#GX&)Ln51T-@yEkBaZ|DK-{)xV^J#|+1VDJ+Iwfa%>>B3OYyifP+26=^K) z$-v9z^y^{%Ejp>SZx5coE9oB6EYn?X`*+l~f8~EB1%LfV-1fJ>LQ_{a6wETzlCKht zEQQir7@vSX*=r*wOjA=c0P>d?C)@trhpZ15s6z!+6&}@F8<X4%T_B?sfTI3)(RO|3 z;&d-;*fyiidcs%pxTxK{lVtbu{0KtDWdOB;NFhR6sfXNBEIIyW0Sd@fm~32y2Q+%{ zn*m7<p9SSpxS4+)zW^<uoT1Mh%2BwK`g#@q{`*5(Pwpy0ZTljdxiv4(`hez6l&AEy zw-HEplpkftH0nknT|D*|9?g<(&tAKlp-fa)b5!Jn@6n^=>Chgp0b(uneNb6XpMo(g z)Y;1l{nWS-{qq;suO|<##=5#X<Dd0*4bX_ccky^Z3=g=A{rEfF%o}tY@81Xr#Iu%T zJ3Jch<GU$nfDe$8K>=pZOX4-oF@>F4*A|uUI0j$6XYny`gV-m{IG-!SV%jA**p{@N zXj^xgjh-C;Xpu#Yk@dy9(Q#D5zz15@UbpaWF=3&7SlL7CdHDgo{+vpNfXG&<_1mUf zC;Z~K2n>lZa9#Du)h_mRuahF90c^r|w|5;(15veiZ=<6EuxRV}TxqFXVTH<-yjyZQ zEcP>QkBf-$ODg!n>Wr}JS#Gz2k(RQ%{;;sLw68?U*gLE63>gu+|Gw=K<CfGJJunz@ zBYouWKq!H%7*z(D3o<JQ1pknm>O&LM7gofnRisibLp9R;4PKq-tu4Dth=k}K&Ql(q zn?rI?Fjx2(7b>(;h6b8c^qifYWxQBfmzxUZg8)P`TQ6++E_t}Y>pg2B@C{q9!kEPp zSS?B{ez=JiN<(YZ-~3!n(>?Qva58D%y(LAz)MST{`r|kia3Ot;9{A>sh`v@}sp^tA zh0IdJONs_rbRQuN8|xfK7K}gwEZP<~9MAgNQuZn^Lk(n!M*+`M@p@}pev*k-Z?|yQ z(gh&I`?!i)aF&3``L^H7NAx5A+l;(Dr<Q4CGX5BdrQnx-a?)tSqDIe0HuU=0X>~@6 zbdea&Mnj_UlyK*Fy;T?YSZFfCpL;SJsH*BkPb6M&axDMYW<S+4Nxy-imiuAcR#lxu zi%_+MKWljrYzx)Iex2S~Y?A6pV;-uB;Q{O3v;>7{Aj|+eA8=o<T3&PbCrUZWBVqVA zgMO&fsndL^prSmvsi1}AyweQQ$Z8)|-lBU!nzgQ_V~F<h4W({LQnWIX4dt_#nQ-_i z(q#B7^6cMduGX5G8dY?kkL%u%dtl+Db!xj3qJ_*6j$AiZeGd}h^rSL~y$5O$lq-y_ z5Jp6JN8CU7qqDk*_Jwv~^xjPUtz7op>gwCnJvpFS1#$vNq!e9Wyr2N!SAkD}+y@IY zvxQ^=ddM7&1p*&1EpszxGp*TX@&t%<B1s}yJWTp&^#DL7KYuZP0sfqEJ2*i)kZdYp zXJ_XO{WJFS5}zl|l$I{uKtg$Poe;B0b2yEnqJnQaL<%?eW2!&wZ(bLmrU>6!u`-Hy z`^LDUN0KJ<OHCC~X%q2~8qo~?Lwt52Qp?`1VZW-s#TO}&kK8KEy|Uhqrffu{z39%& z_{h4In$$z0tb<%2<~%0t(1<su0>nRYYvmiie|EPnp_;%<E&wfm_e~$FV+VdjxYw#E ziNwfw6777hLdah$)LW`T=I_|OO|mLjv|Psw$`T&!V`v4ys~H|MdU#>;G?`*^UxK&r zOVh#VnK>|yu*U)SC|5Db#KqNjy0~IFjDvf#lRWk{5jaWM@4a7`J%0)MJ<x^c<rJfW z(hq5E0uNWR&nGG0QVQ^%IQVe`Ml^EwHVRy(z&}=5Uc|s4-zkuJCY0U}oG-*!u4Qze z4!%CA5sfGb57&as(Vu7I6>HLy03I7PdEi6Fh0fRdXOf#1AHw%Q&?0d%WeMRoa>m9q zP}C8Qy)Hrk>H}BiCk2@OLr0&^3GngXm=yN3FQ8-$B+Wg$gVN~JsAYdwX}epO|D$$s zrL?<rH33o}38HYvzVQ-0BuPaN@&nIV7c5{&3w_%pyFF2REKjlMKHL+dS}iX2x+-rX zw5X!5Yr2C&&da#`=lK~1W+#6bKN?QErZb=2>F<u?B6c?=1^OwwH&tzP*_^ysKaW1> zhEHM6a?d~L-k?jdJs=|?37P$E#Ju-(>h+eC4RX<B2TH`QMlNrn*P(6$M+;1MtnrS? z$A7`E_WLfu1BJ}R7(sR7CA}a)tvgckZI24pg)k!X(?(MWXVvEF7(-D#1r2W~gqxhQ zTzf=0s^!wF1f8M=xT?^rtw_Rp8WG>#AhLhsQS^d-^6{rr%oU%|&=9%8(eJtQSF#d9 zQkXI8grt<K7atC*n1R<`-WA_d`XA?=bL(Pr2BXJ6t^wgJ<-;s1u)Jau;F|0f|J|>$ z?|Yp0#k>o1Wp#zYT(1+5kAtV!{|VY4Yj%F$JvZ<97bD^Nlj$7~Wab86>I0B}m@N4e zFM87glM8lh9ma(pjTKK`5J6hgZr1Ld$US$4Z4fG`t|un()Ls1jt7&yt4lJhp->SJr zv`6AHQ(Nr#|00!%mr%<BC0}e+udiM?Q)A@~hXWDdZM+Wi@%%84C&8i@^Xq+7s=Qpy ztmM!dAbwamaQ+G1snuYsCBV9r_-BKTO7IpFN!OktgutF8E&b*3T?GRC#Vk%eEltCk zrLP|Fn!st#DXb5R#z04>XXC`;@X^t|+}kwhLOwBY)5Gls`Uikcm^fy$2v)M5uij+A zb9!sQRG3_%fB2;x$3*Kz(9DMi_Y8IHdRxHEfnP7kFcg83%{-)<)(|8<H!BddYu%}& z#Z2SpO6NKfd9zwIedNc3doRG+djoyC*f<Zf>qpEQY9MNLddW<S@$JH_SHB!QKm>7a zRN%+Ou`M^TIAz>pb>MJU7H(1^s%L|l-LROO_43bF-;2LRSAwHO;&O8N6lCir_akBA z_`d=fhosbeAStt6;Uca(P7l5xJkkUT1Sqhl-KX%ev<B55cO$1e(6t&FBB<}ahrpK) z{>2s{PE$oCWrjgDtPbr<LxMAk>)lrl4m-7*>uUY=8igSE3PTSAOd9^wux@tER)@Ph zHTv+BsxhuRg74PNoB!7^$p4M+ruInzJ)6KYE$UVBcOc#Xuz>)~3xw#X<KyE+B_;BZ zo{t=zsHuOGMjzZpG%v8U^7eeQu%`{fCkhVc`*XrrU+vl*u>-_#US&R^vGF^DW@{TJ zZtG3M=JU7%zsX5@I8!$DM8nk7)Hh+~9(GvypinQ1db2xDMYyY%yD?Ew-u3jBn^>kR zey#W~bpb)ur{sza_$eBNOvT$M&35IIIz6bOhrd&$b~&0=`|B=_lSn)&++4k84TJO$ zjusz6BgQ<nNL1~_*rzu$f@Ty3u6huNY-(DhGQ{UDk?WxWt<?KuExbRku09#&`<A|* z2rKXL>)8!vm_Z7L1@8-kIbdvJe5r3*pu_`hwX4S$-l+9E19|zi=<;3j_ahrb8>VV} z1|3-HNWq%+8^dMy=1IZtt`nLWEfbR%i09+&`kYE#^nQu&d<OAPD9dXJr}^*)Cz3&d zxdv*CkgfsWRZdf6wS@EK*}>Dj<!F~qZEMs7&|!dP{H&9_H2~CCAmD)fuO-Nk5dp5M z!KV65SK<c9KFAd8#g#L#&)88^d){fDkN&_QpMzK#b{=jedCOou&-DLPStf>9pCivE zHr>uH*QH}271YhcgHc+VE+?n@R%GEB51|6`Fs9|^Y9^;e{&aD1o?95=uy7`vo}25v z_dal~ffPi3U>)gPlB@NseOHw<wzT7cL<;BuTp{Kd*~M3eS=$Bc3FF+&u3jz2wA791 zofyI<BOd3Bj3991vi*HIN@5!rDuefR@tyTkeFvcpcQN>yk6aka-d?4hi!?hf<<;A2 zNUF1XXXwtc7pPD(_tB0~;VHTg_6rQ_gJmP?Qe95(zFV&~i=R{vk+DUuD9AED-vJ}p z(O(mIanC~D##&o~6~Jp@9&2c3CJLTkt&wfKF!lX$u-?Q%@&WikOVb|9!oCs2tZHlT zr~p1Gv|u!=OOFaI>N|IiwqBw1ZX2w1Jh<GrkiN0L)O>T&h8Pir)8m2^wu19NLVT~8 zc(3(>hX?^;;IlR1wup%d-3$ru!_d=V`yqOl!Llaq7XT}PMh+GcD79ilTD)NgKx!g- zzkg4?eLk^$ys^FAWL?#NB=K#lC+_;EuR^Q>;_xD+4~D@91*{Mx=fNl<tEDpkE*ic; z=vWn33Cu{xieVHO<3Z6wFD;#&pY1c@yN<_rTk6tT>44^*NO<W0k5wW`@S2DUr;7dH zidc4Pd;}QdIm^3ec97GF>~D{Yv0u+XOP$5_RgIH7)Z8k}wch#jv^_v_)m|q>N4g3% zEvr;%S!eh7?;;rFj2mLsy|IH(lAm>a(l<Jj=4CvYB0AfPWIO(q^?CT+Ofr$Ms|vB> zhBMv^Eym87lJ_6cZ#(E^3>jVz;)P3jU_DOHRoM|^Zr^mh@u9tv`187&P{7YkfL^h& zGqM9b#4>?Y<Q$kD?b$)fS81ECWqEY~lGk!?#0BY8Nhe7U*zl0<bfDt@{=MkcH#4Iz z)@r8dJ^|Ac(zP`<4ov7=L{ohF^4zK!YyDAQU!SN`Uy{jG{f!<M=64zulgq$6cR+Q6 zH}dO-Jaekz*Aw-vpYz=dsos9uj;n@%1=#!r8nX~w02G4SvMWo{XJ}-kdLd|r-|k?` z7qz#IST#bmxBq*l_EGc1u&p4{1REI@rTX{WsJos;gkm!@bISjagni(1?pF^zPjY0q z#pWRke_ev{x|64Gt`GjwbUjsyO7}<h$oyn>A_wb0aCr1=OtHhxmaP$k&Dmi`S`wt= zrt#-9rp)L~1(#gXly;W@cDb@)&|89JrnQ=?R2_jgchb*HYTS@jKb><j`AAj1kR5mS z3x2H<{ulg7kpYZAa+#WF>QoQ9+bVG=8Ys57JoO9YibPkW$NP_F@cq27K^jQprxMU* zjn#k8jDqS0FQL4!W`J%P22fAmTv7~v?!0c_hNPE!2(0v2QduhnX4=0a@+Lc`A~8sR z4q%_(<$i-A6G<3ani$!(fJmb1JwqJ8Wk?-(TEZ(ssvFbxLZE*H?CIo_fW~Z6xP&|{ zjOo%lM>YaR>8id!MIe1Nkgou^eZ8P(!IQ$DtAO01_qYsgx_Pa{D?7s$zmOLz)ybCa z8<dc6+ZWQeO(yI!fv!kM+uQS97iU&Hx1pd}-JgDjdNxrn=X_R)iZT?G{50#nC$c92 zTzZWH?!>ZWC=ocjh=`$0f3^uR5=90{Ng6<bipt9Vi{RMaK7dpXrh6`oI&wsa*9Oun zM~wXH>ci7>`0?uuJTjCWa=>p!fmZpyJcN>N_kSM9F_2!t&C;%R=E#Yq+t=Bd5M+x( zw)cl@=alSjs?+NIQ%OKKxo7H(w-VWhRdw*<G<P}H9~H&^YG9J+blh^oYuPe-On9;H z^cw9GisbF<Q-nqEJv8!cA4>A;>&=iTmH*WO=yeo5*^i1)IHB_=xc*{m<bOe2+jh!f zlzcDR*irs()OF}6;u1&5|JcOn@6}8IyTvxbkM!V?A0^7d#;*L8z;)#CM|DDKjjs}i ziuV7)*oMy6lqtmhQMskP38Lq3rMF(-qdzO?-Rto)TUg2%va2Oz5f$656z2m=jdU5E z5f8ck_~pNPO@p`RfO&<-M1IS=CApR4`ptzJj$TH&=v%m3L{eT4dFroNcE5!89XW`V z%*+t7Z<~>w6z;Zh;|GFx4pglmR1*}5VOj>BBLwhSef_D7T>-rV*pH!2!i?uWGBMM0 z&YQgT^b`@?Vf$tC6pX1vb08w3?uj>(fm4s1CawNSpUg{?zr7f^_V16@KwpyTw+_Y! zxv8%+UERAc8cRac_A#uIbvq^qC(rtaqXG`pg;$^ZclU-_=U&ga)g$ufY+i~^uNA$V zR-)%K;|Z=pP5-&pDyt&bV}y`a5>TP%tLwn(J31IbqsSjt!G4~VeVX(>jP7bf8Tg8y zYMzh$2i@s<ARn=}Jx4xlAIuz71YygKC-=m+zkYwW$VXLUF4O}p&n<&Nj<@Vl)b&w~ z(y74?^LYGmPF3-+B`Pb6C<con3pSqd^b3m?c`cHY-_ya+r66(CCjewE2=`>%-S405 zA$YlqrhW@WN53_5b#;AWccK>+5rIPyjS1AU>I{2iLgPS%E^BDtugU|dG9eV`5@yP@ zUDP|>gW?Bp0DRCc{_vP1=keWwiru;X`v&;Gg)V%pevPk0-!nA7L)D$7<Bu*Z6)bRi zO|wLM&1E6wPlq}Gk8q~-oHT@F2UAgt;=Gbt&%}rBRInNAp(e_&>+5TUD`~p!*3)ZZ ziHCW6gV{@FtLfPDnW&H-BA9Bvx!GlW>>ujjb|bV?ndr0|OXgFe$OW&ol9?_Q|Mk8E zwLp!n*T(k#&j*StOksS7yQ&KRc1-2#IUkBKyyVviAj`V5pW?Kjgv)VgS4KsmYHn|F z6TG7Uta3WGFXvltCO1e%M8tHE(_J%`|1l2C=?viX(*ymLc`5(WgDc9F-G0S^tPGYW z%AdWncY)<GE8;UVbC&s4XMi8*m8I+_FX^%O%TM{fLCwrgk*H4auSSE|?s;$;=j0cm zL!0d6XT<7?I3yf^(Fz7!5nqJ4gwM*;-+faNpmi(R^P<#G#!$r-sO+|__j(QJS36%{ z<ox@_-^RUl)`+31(vWR#Lr`#nj&ozn6~6RX$;~EB{%A_M*Z3TMbb(9$H|QM|FR~%d zlgw<^+6UkgcJ8}LY^7X*Q;#VK)kq+3Z)kQl8tM>YLtoV6>5S?W@#%gzmMc+aYA(%u z%HGFor1y4zLZI5MLLTBv{scBZPP{`X)&8u%M%%b9NE<t^&1ku6wjiBZ#hHrW<<c2% zJ#o^*Z0VcY1tDTQxLcL<DF(a@^a6@!EVqhxU!8TiZqz$;47s3r#h}S*r4%_NpAcsx zMaH#=7yNNSnL1nzlPP{O<cJ%#w`Ti5*f_vniT@k^XKe1ds6gS^U~7sZrY<u(d&QyF z7VRz3E`ECK99HAsN{*gWi+MyNj$dQe;I<u-Cae=h3Kkp&LPfW!-CD&q+!{+hrXp0? z9Qg0N1CfC5Ii9J~-l_@3-J1YthIK8<G*nT4cK;0fPuKjM&#Db4e?9dn1|!j1B_?jd zx!xCv%OcJ0zqv2Zt}pHZ%Mh2D^!8b{H`(c&55kW6Z`z`>2+~TPCUBoNej<b$hn<_J z`(x2~G1dty!Xu346yYfyLn|7YNhz+k`Wi*W&kCMu7awS4KCpvh&aO2i+H|RA62InK zbgF}J9ZDrx-$)JiA%5o-)~+%Tc09&^$F`4u&CCo->x4euom6QsGdcJNq73*hx_tZ> zty~AT21d0gH6l_{_pVs;Jfw^TilmT&n<m87ZkZG{N+)wr<PY51+Bz@vQT`DDO(Xqi zl<Q*zwv!}-`l*-#@Iv-NymwYHLj*}x%e!ONaB<OB?QGYC9HZF0*x4t4c8_lwx@kT1 zs&uB=|KM9|wzig!h!AM-jtR5;c2i9@@Fh2P(T&T>Beq9sbmgsv76l(|m%_@#B=j4l zwM$T+)dW}dHGHK)=?Zuz8Zu{$vQy_ZnEI=^GL2{Aegsp8ZRp8Hc=_olUdiqfg@9g{ z@Mts+fB+C)_Osj-!Sh_1pI^`N<)w{%3?dr5hHxW+fwj}IKCiU-L4uQaX?S0mS@CX@ z1;^L7R+e0e4)NbUD$QOuTvT!TkjGqZ^g6I1z+CQ*?+(*JXur+7Iw$x)8d=f?vwi9J ztHz(Fy&Kpgp7|BuufnshEc_|&wai|*7Mk1i72#HNrZx+Bz1ZOX`qk_Dj&b7{P7{RK zJ%1jKvoD+PZQThL1}%8@$diqc^7-{cdvvfK$Y_yJ-MKS)*=qCb*)W8h!uhIbBWEKL z%yc-6+o>HBOe9IR|Dxozjq$W`k^#a-4a#)YCT}z=H=yRIQemqQIb<z&@c(W$BPPtB zBqh}?8C&R3&+Jqr^B@5Lbt_Irr10U$UQqQY->XBx+pT}GQB;ULPH*XJHO`$j@uig# z;DkJSz$}=<fZfuDev?U|Rx~+ybTfp1h%Wm3-Tvt{5e+J3rI&)(2?66aZ<GoGfh*Vj z^_+n_iXLbG_oZddb1K04A*R((yV+VczF|~lDj@*gYe+B)>9B1FIXHwiJ6Hc^wi_6; z-+1*jHT~z%5aG>l-E*F&zkj{#dU)OZT}V-@_s2l!9^zUu6kN#fV`${%ExR085P}c$ zTB~RaUual5I%@o)CBGAfd=TB`T*qfhICyx5E`A~?vEPjKy8K>YgIJ<uJd4r;F9_Z9 z2HGWxiT4Vr{t|a*XioR!!I5}ycz8CG(24(Yc@qH&3QwsSg6n6ezO_PsD%IvC{+II# zoYXsAR{V=VxNPk0DZ}@lakI{#tf;iy=y7_Rq_wzOq#7aB?N>Fop4yPc4;D>ufH5*9 zg>daXPqZ5`I%?P`gTiN+uj1(o++HLw7W7u6m=N3^;c~(#h_g$jOhfIiq8Ako#Ejkd ziF7_#Z|nM!Lw4_xFBy*iHHDH?d3!`q7}0sE#gLAG^MeO@3!lj)dV;;5E+)s&bXHki z9zGYmS{A^TFu|Og5J?#{mOEP~pkK)HMW^ZQZm%$XQ~rsl!{1$ajPkp7nz%^Lw@7By z{RP<sX4|x6?b+tCQUSqWkh$jw{rD*wFrb_j$o2AB^?eu4I#$Q-Zgp~VJ}N#jG2D{z z$VZP}M{fPv!k?owuyFvGG!PzP!GQWm-S}2(Q-*z*)G^5~*O$X2q!{C{pqC-8rQi_! zu8VUDH6NN93;(gDreCJ}+~?0n+eEVWNZpR`v6pV7Zpj<Doc0PRcOsokj&y~b=MV7V z$E;K<(6%%BJR)Z2;DciS<(OlQ><2&ZEMDa_W?Y;z1rw9?#_w9WJnxb1;{g`t0K@%X z@Iu4O5WKj?!u3i=@FeMX*V<Ws$tjA}#7%&f>gt5R5wEg7hlf}eiRp^EURR8D4a|2? zh3^<FZ)g2dR;l-8l6T!B<#GZ{D&7NuV}hb*Ab5-6bH;7$pGj&Et&BmE*tt#Z;3r3Y z()t%~!`Iz;KqUU;B3ll!Tz(#aU*@~C-|a^3ss&Nn`0OUUMXV?@yB6&1DRxZ*{79+S z7^Cj%W}7=<9!{8@xE^RIjC(u^njXJ=)x>4#_m0VP2=Fmw<LFgyh-Y8(2o5hUbTHLg z@v7ZLv@7g9ohp1r<Wh;9mfvq?i)kKq%3y2C^Pr4e_6-(Vh+$e2XMqv8H>{C8s5nf0 zU(Vw#L&$4BQc@AWBaTw4Bt&;nS5EEiEyYxwNr<cE#(_vPJ_-=y(1mqdbSP)P4*8UJ zmt>Wk;pMZBTnK*QK2S{j;QToZ7^i~{J4x@r4<*^%x9$kz2zy~A#lV-}Galx3bVuK` zz1|NqybEU~7p%BRg`DOd>H;yKGI;L7ahv$|<ez^|$RJ2+F*j^vR<Ravpzt5kf>v5_ zkDDO3hb-R2+*u3a`v($MiX(HBSX(M+0W(LUVCCsrSfI}s;BoWxuUt7cSYEz&eznK6 z(}6W?E%@pZc6!yX;NsOZaPw(nwOYHE`T!}8SXlVLJOfB6BortZWjyl;x<H7UtKT>w z-Fx@qXp#~p4`?Iw1tWyL&<x`y*_%57V;$*?kgAQ5h+B~O_u=jQM2msou+B-W4j+CQ zLi9`D;}0hv@i@n*Z`}ysVIe}lPj~RKmMUb$>PCnr+rtFrpqBzf8R-}(nwlhDF=1kY z*q`ELP>zbXI(!5|YCW`7Xl|)I%6cTbE?N|HgYY2L0%9j(R+*o#iPDBBVfcA`a<(TN zSyK%Pkt;yid&MO&2q}iRHwG%r^f9S>xH-tkqA*~=XR0nc9X0jT)1geAd7HRG!pz39 zEO&wNm;yqLMNw;}qnGLEl%a?w5;w9^z_Rc%?R|p{43L^ShQZ}o=Yp=0x%s<IFo;gJ z?7c|Zc{6+Wd`*M^SWZ4&O7pb)sxu%A(A0h$1P7tym48VDEW-c(gh?+pWJ`pZf+HMh z?ggVBgp&pV+|Khf7<%%Mv5re%dOF+4i*=qf_FUX;+6#p|HO9GIw+h?%!Q1FjqKl!l z>R^A6lh+e=5YFYl(L(+z-bDlrS$C<U^KNqciEiD}auuKNX&>cpebywz<Rp2l<RwL& z!(82`9*!CzfC}B*+#tqXC1Izih#k^K@qjUhF$ccpsHj<QhnAL?sw%9qjndmR;tPB- z^F}vi67t8K<&7Td-c3wEfA`gw>3$ZWQlM7;3nAg=eD5Z)lox__gdv*#tmQ)yZ+rD) zl6IrCH9x4R6`i{7#JDLAd3UU#%G|b!%x$mAs1<3i=CbLpL7^`TdY4~GAtS5LUMWs( zHg!J68N{4JuL`-G#q%>QQbxaRGz0`G42p1`iB9M=w&W)a0)$hDPNYwAo(vy6P})DA z83kY=assccsHn7kY>ebV4Xf||A{Kl-6kKHQ!4S3kB~3lm5bfcp*G~Urewu03g`=t# z&gJpH$ri+_mH0|=;ZSR|J?C>OYQ;eJi#f*gf9HcPn`QO7#;x92%0C;(9zTBK6+MrO zhc6HRJM9D=N84**v>^KZugi}Xs+8%v?l`pu=1EIMlACzRChURH0b+!aPw<QHd9|B3 z<mLfL0bqPiV<QzT5XgQ}0&0<fi@i2Fcyr*(2{{@s=5-kP_y{8+B9K|-z(H2}U%$@J zpPhP1XF?j|f4<qaaB$c&e5!#+i2w2Hmxsi4Gn%zErPqE3H@30T7o4DW7>KPGThTy< zh&-+P`<2WysHmt&`yTAaV5D4GVTO~Rqg{+F!Q8B4R$Wqm<hw~m+tO#iq<)GiQ!)-E zVQT%tA|`|e352;baB;+;bPRg#v3glZjo|kc8WYE@xxe^qaAxbbke>-tanM*}TKU03 z!P9VyKL(|@$XDlD<}=XP=5EQ}))stdU;51@W9;!a<!!Viwfl5hY^v;}om*d~NZvB5 z6g$$W=?Qxz6Eps5CggthluW4PVK1(k_h!RE(GKfcn^*>c2#p5&6E#S}^!}RA*Z77W zJHN2NQhAF2M&ow<=U@Ny2|`WM{=DhD{OYC}2{|e9pFM50PF5^_%xJD2^tcVcQ?Vv7 zA~GruWBd!<yE9Z_Xoi3PE<F3(+2a`Y%`q%{JhJk;Dtg)jGZNfrEKCc2c5K};GNI2@ zz$EDe25xAm2OlQsRUZ2w4DX+>dCyxis53K*pu>KyGMDx0;YAY-9G6)Ce=ZUy8<t*I zZzsvWpGseLNq;CQL1y66)*G@TNJ&YNk-kz#se=nuJ+#4XZP#h<Yrw+3_`>vp3Mof| z0+gj#|4SyMpR<0Zg0oDxPMqvmd5cJZO@ZTLsD48X)ddy%To>EKmjN|c@<OlH^!)1h zq{m(;4}K0Xr3v=R3JPZH1DV=ZGd4B<jZix~7_x*>X(T`V*N<bl=I)@skweYYzzQ`7 z`v!9NKOV--Y*Qp!d-KaCfkn3Z=;0W%sL9!DnZBqmQ+|ooPdSzz+-9aoM#aEoX2{PV zZY~^B%lv+Ru2P?}#j~rN^SB)z>2}7GEk`Ly0sJ8Pg}mcHrM$oy0v46XKU1vtZC`TV zt-OhsZ2pD|<pxUFd6hYybL`n*+B0N^@IGHd)tkP*Vf5I)A0Q(B)VeW{p41YtzQci) z_Uy>VU&%U&9#PCue5e}SmmqPnZ%LcCRbFV07`JNT=Dp=0D;rKr*%1gi&ZobhZp<n< zcr&@Vj%=R<hGPr<o(c>sVt>$bd5Hh>^i3TeyKu6lg{#~zG7^efN3wF2gg<u?P^#Jf z@9H8xWupbtJI6O$%pDh*nnLTffSO-eVgER_Vvn9{{^EUEIP?@D+nu4qk`AJ#Bfu`T zo#1F1R>3@rS5<Apd?|(+d<#F9vl&l|_myd-G-P0u>Xu|E*8c#N;^W7U>4k+op9HhO zbqYOO6f`tRR)&S64ARo3k@o2iSb<tuf@(2Z>n!0BF734eh2&lQkh9SCgHCL2$jg7g z`i}2LG`V)0cPP1b2Zu+i;TO)O-~U>|_3v;GOpvALhQAc{HldKk#660CVPdPR6!b?# zC^8>C-g8@fpqfhtMJ?$z>L(QNa=<;W+FJNqC&9NVb~jhWE`By@b9Lzy(*DdT;9pcE zgW&A%nVQqL-Ttw!8!cbvfEAaJG%A0QG_4uO98ucGWtIPI!T#v!V_iK94-Yb!cf8gI z_u650S2f3}E3|JL54-y^ed*q(^3DK=P%1V@Z2lT$@8kUQtI~-jen+E)*2lnLzq=k0 zI^d8$@;P_HcA;{HNRmHjBc2GQUB-&}Q%$w==4o4-&AH>Atun0lmdlnSbpZj8WJJQ` zr~J3^g4*T1(`oHXt=9Kjoz0r9v2@Zg5PY-!>6Dztp-1OYOX#!gmJ`bz*c(6yguGWF zb_MdxmN+3{0xarK#pS;v{-?9y)7|K+?Y1B$!=bC)rQZ5pa1bMV20j4353$UbxvYl# zlaFj{SYZ`JnwlxzDj~y^goRH-Po7ulBk3Z*y<-Irp_&V7*i|F#>+9>)L3vU4-Y%cD z<{x||gUxHEB^ZCeZUP!oxl_j&j1D3*4l=HvuhbgV6S}KtcaNG>6VMa)!}ZY!wVM>5 zvfwbh(Tuija#vzg)wcCmODo|Pa$r)`E~@bu_e2XYC<x_O!GW~2ci)-6pXNUd*F8J` z+c7z*r=se~tIW2>G)K+LMaaj67HR_*@`4C~7+q#u^={*0=PM6$Ve}g}(8{0F7DxBJ z3d&{w{bT-3UuNov7Zc?0LEJF)MYbiRkSW7sOn8^zbe!{J_G5V7mKcx6hgtoY;VP}Z zfdO3n3p*qHixJNo?U5tB%aAwWS<w<o|L%E1lQEg1o1mD-j-0Wtgomd)LqQH|w0dJ6 z1c~e)EZb_Rc0}Yd_BD(Q99$l4_#Qp1IP@z%x_wg#P08p21qI}Oxj~FpHdf{0(<a!e z31^p<**$r&5?c%iSlFl9{M-0~M)B}go2si_r!R1@KgeiJo*ErW#6r0!bSWYOkDzGt z-HN!7&`IM7#|ZUg^sfH}CBZ}@1Ee`Gx6CuGb8x(+|4s~YO+DJ9dTU+C^$mj#E+7^3 z?^^Ovy`6NYeFoljXvBnQ5cTz5z~xjPK2!vL5<Zl_e{+G28QvS-%<ahQJus<H)jMTN z;8+DS!gsQ3(=BK{#OApKTW`g@DQ~aH`llvVY{E-l+~_H*e&e{g7d75lSQG(k#x)p< zdaI~}ongF++6f!#$8(N{1H|Q+&$xJf_Y&MO3Ig7_s}VVA{km_5|2XHaKDTaPicNm+ z@yZx8Ofc}_JF_JpY+UiCl~|8-9lZ$&0$qzJs&OzYBy8}q%*ryz4%rHhM7vU^z6G%u zFwD2A`D>6dR<LZqA_$(HrT%(^0&p~HQR-FqUAD`l9;ePEuH;+6jGI^1g1`FBHTqFB za__!sYmPO&x~R~6`XmBUXHe#?4ZrhEjgAC$u{{cMJO1}Ymn2;%$6=C(8qr9aS5CZ` zlSpz_@;Ll_gGpp|WYn{+p2@?DqKAOyHdT4cC4b%P)265uaS#JQ5X4m7LtEcfNH6Ma zmb0?9arpAiA%XdzeVtZD-;3hk(e*zz@RIK@Me#D;zfX!qK&>C|TXB4&8>wGF#!Z~9 z^7?NwAOf7TT*3OEUr<nHYl>fmPjN9pQBC(fv>_jBQ9a!4@gI!KGb|0?lN#}Z8N}c3 zoh_ko^PRzV)LTDntMKq)f8;6H1p%6a9Bl^GTF8~r)g=RS5<G6`>x9l0tf=m4TLmXj z%R*(A<hM=lZ4;iFR^*{x%+EYBZazO3b9k!+Ck+-HmB<k7RjQesKm2uFENxtaYOW6w z@}C{u`$Co4Kvj$yx8~#{cz1dIwC5lr?r(p;x-k7%-l!mVnOb9E4a`q4+rsmC@bD2% z@e%<RSTJR^NP=zzEfk)<vodamEha5z(M<$?L0ff*joqxpG-imB4BRT(lb*@(OmqDF z0sGgfHNsdBPFD1yNFI!P0Q2xcehSjKm7Xh<Q~QMk$I#KfG`8=rwa*WaeC9%=w99Kz zk9Pq`X4p%yDnHox$O<1ee^Z*RG5dJns!4)jY|H+e0E;UkV&iRO=Ruj_y|us5cxxim zyPF*+p_r9=<pJss6@8R2eM@!i9c%+$IuptY2%OCb&$sW<d812KRUI8(wd|ovUyF(% ze2F2At|N(4kC2Aut<&X^@c!WScJ^d5@##)D98ti1KrsP|Q42W7Dypg-un<d~uMjt% zEk&uQt9QXh1iJc7cRJy`r<)zYSO-YsfAB4-_7@c`YYYgalp9_eO+!PU@hcI_%y22< zx5h+GC@Alnjh<~Q8y<}DW_QLgiN_hfvg8=x=gcc8z<@$!xLBm2$2Dhkb3b*^7Zd8B zU{)S+%U*@QfcytdH36CC?dn=R_InT@%aRiHwC<hP5z)~K(8u{0vEwXaRx{n~!TbK{ zwSDuWK>X;(rVnLqJ8HG!1O>=(G*jm%I@fC%;-xoxT|Vf$?mKE8yFY8`{ws-pz$K%{ zqpH;)jgml)(C&+37lWV<6ZQ>_Fdem9>s}fuEoGWA6_fIi@n>g;3v&?M<Tty_%xqCU z;gEv-Zee{}n0Ho?Td@ItP+MEun9CeZ0{!Cp9u{3$taDq&y36<8UTpRxHDn%<=ZRxR zv2-v%+?CVz(7o^#nLG~pv`9$k<>i{8UlD&jgA<Jp-r&`W=pOz^bM(Jog8V^fPoDhT z6>#n$s8v$z$e--WpR{~Xp?uIC#Yc?(dYP=@=8}l-#KXGy<WRgv5`mWKLbB1)$zQt{ z<3V*Ykd5`-MMU$-8$H_B6t!{;(NyY>OqmgoXXdpf{%8?tEUIrk=SGgnCI6b|Vj$9M zQ?gw$=nfruED}=u_B9A#`}2u(5$MVVt>A0-C+8;WwrQAPDdpx?)X*TfiHY`a-Tz;Y ze5<;;y35vBv9$o{<JM0sOsAK%(*G<GHC~l}WzofhhWGO@D<-3&XK{k|jgxv<1O`C| zVB&w}o|u$m4(SC*Uq?j+udkoq@Fd&Vuc%R%WF~Nl0);b@u>%2K&m~g4hBw{9qoU+} zeVY?qc|3UNsHqcw2$TQ!)O$x-0_m~kJ`G|n5bb!pcgiAM$za_$uXT;gAh*;K!STvZ zgMvLiL9_(M79k_FwY+|G2@JjH)+XhA@_BMqTq3VRo$v`A5*CGC;{**t^gpj(!4(BH zF_`ak-gT<*rQ<_nQm9&i9Q3S_Boc~xPSJp+2M)ew$ynAPX~>#=tC%SVDT2oPaY}Tw zCy0P?kMOFVP13?)%3XVa4?&=i=X79tePtRR^;RBWq9uz}R(}4Y%b)MA8Lip5*=87t zEG<7It8hTH>cDS%YCs>b7#K#_`gx)-h+0~_&gXrI23@A?s$`_aqpoyx7Qpg-bR@qG zd2yK=wyJgYVwoai!+~EK#ZqR)GMzT}l-qxEeVZFmgx%+8Fz@KCFcOJuJO70!_1XOR zoa))u;0H)+7OJoHb;5Iml@qxwGu@J2Vn9G81{}!i$W^e!=QTF|4UI803ilMD2AB^d zO;a_`Zo#&C0EzD255-M6-pb0R;NZ$>n=;Z;oXxOQkW;0FE-dWj6|PI|Uw*&yN`gNM zS(1coRA~M)qHeNk2+9uWf6LOz4^DO2Nv4`SdEvH)KOp$B=O36YS(`K6*Ftvaf|C(j z#%u29+)rViYBwiAg<|)TbfAOiL#W8Kia3I9$TswEV&)q-X|-}-V1%0I|8Y8fMYg%C znB!59h;~FnGxwss0F!)4C@67c987^3wZu@m!1YtDcx^ZK9x#TG%Q!kZN|8<Rex(UM zx<GHB{zcjFb%TNwto|X*Pl+R~s%k0c+&_eRc%`azO2(t=;5hf?>6T~#_tVmJ`YJ!g zWV0zq`f~Hu6m=VAL3crT#EF!Ja=laT&HvQ`*jT#4Qm?SGvhdhLNU5{48CMvkh|*?Q zD1mvg??-3qA2;e-_;1bzT4pR{&GpC`%XA5~w9ahw$XQYTJpYV+bbyMOduuASkAj(~ z79R02f&goGXG6x<Pm=oGyZwo7`JF%WGhH8t&A6m!aS&&iSwpt_ro3&w{exYZ=v{n8 zPNe{mB`McBkA8f}&TY_IYbAOP8G(p|ye1&{q0oj2yZ-c3C23bRSB6I6<1D37Isdeb z3~Ffb$|)}==!v1};(dL9hYYGT(h51u3ypQ|e&1<&YCt4$|IMSkgl3by7J<DSdpmRi zfhQDnr)^bOj5S<_b@m+~>33P|#AyDzRYH4swd3S}=lJ-TotO7Ct$$&887<TtS;|oy zk#-^K2nr$~%kyV`*$V;mrIPtmaT=4}lNZqr$GQVnc|m!+PHrJSL%CLOB^6ROnE(a~ zcI-EQJ~GUIlXTUPp}1ff_-CR&!>Ck0hv9Ah^-hZa%Y?6U_t}i7=eiH%A{zl{e@A9l zovD#CO*MF6CQ3%4C@aeW=?NjQ%{+MUz|7f}5Q?L;pQ*+y$Hiv_hF4-kwKbmQH=~4> zM0+$j=0QuLFVWF`31B*e+nVv&BZB|o4Po>{lAwP~b`?95(UBLq&e+HQE^<^YEv;}1 zip%jm|JVlbkT<?$du3s{s2^u6NJO!5AdsE;_AvUUFA3FMzuez-`ju^E_~!2Joen3z zJ7y>;zpMzE9A13>Y^(7|xn3IwBVgxdaM1MA-}kBRy*^+}{&Z4nCzx_*%B32}O3aUi z>FgwrmLM-boKgAOhm!ARFi>|OT<BO5Vi)J<zg?g>IiWCY+=>u8A<OdHeR>I=nhVBr z4-sml4iv=Q?P%A3j{Q4z9!b3!>U|L<!|O}EJM38a;@+EeZ*~$~<gNvI57%e0*Vx~F zTEvR?fa?fh^AG=i(~JFQ>g+-9i^zGLxO;T|=oAfnQnDZF`tbbemq{uYEfz5`D&$0f zj2?m%!-eBXQ)Mr&FU$yt1&MNeQ8TS+YTBk!2ZF~c=njg-K8N`pt`<OBB(22n-o<T# zEk;u_E-{NoSbIhv`7*$vlv{VG3Z$%5Y3+8PM@cJqvrUA8N5-u9O3>_O8xK7;$HP(W zXKo4f1p_NlX+<3`G3&xF?xdx7z?Yt6C)viaX{+anUDA;K+nkOOE|IKvR0YLP>>%tE zzIBX{ux>nOY-?*DFl`SUXII2KHo_JTDj*l{-7{fyv{0Dm=BHcWZBzZxYs6_#Ms}fo z%H-+90}VAwewLE(E_gl?1`Rw+^qer*6H&Sxy%4i@<YkXUni6mL_#D*E1%8~+^{urG z3-dLduEim*x0g*QX=-rwrPdM<z{bawYwi!da&W+Q|9&zBDYl>e#JBw37(Bhv?zg-g zUT;7&H&1Z8{gIgXqObrO%=K_(E$fMXd!(kuS2(UFjg|JGmx}u9Bpa)2s*Maf7Fv5Q zX5Kbxvi0!TYzTOoVfP(5LDtHWB{4ovKP}o-qgTBhD|N_D`)@mp{JSS~6D6wsdvt9W zw*$pEcV0_K3<g_2g|QcM5S!+B+>2}|lztR7QDwTZWoh_Q4Ga|&re|n~zin{pU#$P$ zruax>5TCB8??=vagWFDFU4ihUe6O}mdw|)T_d7LKZM{V;vT$6tyX+`0Cl{BHz<6JW z__V3gN0i>m1VsBP{bQ_bY^zFkcSxQ#3RBo685qQyOm!F~s(TWxQPOhh-}=s~D(kBn zN88Cg@dUo-Q#2mMQnTrh$(-nX+FPGuGr%vGCjJQb`N3{p+iY6`Iu1JuX~7Mz02|w4 zq71nll)-~3>Uv7qf3k2d_Dm<&fQXT=KW+ac8=(Y|8ju9?{_U6IvAePHx1fM=GBh^! z*6uHVa>zYE)^b2pAe=4msJMB!GeUwB%NrJ0)Bl56q83F6K#LkquPWh?DX#-jIrCL$ zb3Et&^1o0}HPN`p%bP(W-_&Fn-Pf-HnQ1p<2`LaYSZw6ICs)M8y`r83KR&Wna^VS} zv{l_h32@kyKWL9jk2+Ef(vPgZy2X@7|LkK2F}i+zL-V$3qiBpg6u?D4QA)8{f0hfm z-?{mf=rcNX6~Fwr6Zeo{H)MM~Npc{nV%8vWx+hl*#gB)dlP+nVv$W(p-wHbtIT$6L zx|*KD#>Pe&UTC3wAt%QvC%1C=`Lj%)4I#NM6hbL#g-1t!t#3W%MlP!b?@gfW_H{V) z^?1!8$29oU$-ifAv3`ieU8>cB=m{Yi4nkhk;vK3|4V;`RW>p;iTgj1=vxRG?PU-ui zO|lB6k2(#?`Kk#d+CL+@hh5%iqb9IoEV7_e+Tcvcx3=`p{Ykdtap(7Rs{A%MX`r6j zC#vz+nOP<Pfa~{=+1GCutdvKjy{&o!EKbODHMn}+jJ5*07TXtw=wn)5-W*QPjjv(D z0`vID%XWD$YWOd%>#&ADfgs<-tfpOA6AjwCC7i=<x^W+3qG&e0Oa<<6%xG!ryY|10 zvYMdVJ-iCWIK0{lzLi^9PM}y`R5$lTzBnSH<FOfix$S3q)Y<g}2Sv*~di_ZkYJwzO zr#T;9vD?Hs!s+p&b8p*dsBe5^?YNEZrM>Y|E+L<U(pWX*k4M<L_y0r2YilJTmJ{9_ z0IC~pvZHnnB?Sa(Sfl3g-WXhZ7gV=UfBybG<zoJnkdQE-Ny=w3;r}r87GPO!Th}lK zilTy~k|HP}-Hn2D2?$6dDcxNL2$Is>C5?0=-5?FpEfNp?(ERf`?|I+vKi59zy3XEP zxbJ(dHP@VDjycA7K#)cI4J^&}R1v{9bSt+s%s#nsetB2R6kM)M7YX@r%l1s|E~+LU zw3s2z`Ig?u%g4vEs$Oho^*w8N9dxUiL@Q*U<HFyyS?R{dqKzibvEVmYpVfuJGBM-< zLEcI($ISK|+r1muXy{TkjFMqPG|WHutHHwk)1>*W4%;CKmR;d6stBn}@qP9?mF$*D zOPParG1ttQ@T_gTABn!%UtcRMvyXZY93I`D@A!#Qe7wD%(9+)VLH9xBAH$Q+p{@Yw zqxp%e-X5pd&fdjDL=S1X-h_v$8G=Ht_1`2Bnofp~yJZiJ;|HMN0IFPSeL5*X%`}X3 zViG(5L@NxoWun3mC3XA<;$n-bAwpmOD2teZIN9o@r@N3K+0nf28)KjG(L*|GE17$O z+}3DzMECutrgld!J&Tu?Qm#ps%}_|%Dran|H1G5G>u`sF$BvAwtmM>}>t9er9#RuN z%Rf)qCBw$4rngNHFD5IUQ)%u(;0K+uG#aef8iLPraw6k%?hkd&Ya3B$l;FjI5)?FM z-&&gfT9cd$-FQP+u6+ZCHSb1G$&gQ$2?$@n-3g_i$(iC+k)WU;<T23KgwhKjXY~2W zCl>FKw()&mVfHE~Htv`=43<R`mgOVBOA9wlzQtKu?e#rO_&qp$apBjI7CUtl!_Sxl zeh#n=g}a0D9>-1KYbA^WX<&7Dr**3KwdSVxgO_m({dU4@c1S!smOuB&Qt%=U1Ul|^ z^!~mFlB)Ej1V1=TkN>$p1TAEk{wyZJ1mVBWb=M8HdWE$_Nc%aH(Pf8$%_V;IQV6Gl zYQ8}P+0{2}U@(Rau;7`X9r@k8ySn+TX)BtTz#}-R*suESd5ureDW&SiqgS77T{^@% z;@!Q<Kyqw%wCJhP2MlQH6mOin{78`FX4JU_m>yhf&eqICfb>Vo#xtjnQ|2|2>-?*~ z=W2h`u~Kw-rAjID3|hPq#62i5$O3Z*>!rf`hpdhU(-pRV0jT=*>m{m&*g+2c?I%vt zeSvouh7fWbL6cD!tj!01M`F91^POuu-@W00rMq#q7HuAZ?@3F7JedA+;eYYw)(fkt zH9G-{BrgBVo8ad|6l5g&>?TRa0thY#Je@*A&54hUyft}VIgwx4*f>WyaTD!-Fvhu( z{aM2?CMZK*mZ>v9GhH{alreW*n`&-*&Q3U&N51N5?}+<WdCYajEC*bwYdBQEnFHLA zVpKEGFTAjSjsEuSjdvs`j!h*=<;(oXE+=0#WGkf`@cmDs*;?+F^C>RftHr)ZNn{sZ z6vmz>M~ll6P`oN5Vt_I-w4ROlQ1-Cux8pS`Nj+Or954675D6KH*Cq<<VU#l90cDv0 zw$&sJNanlycTw^sb_HvIh4m*2`9kZpQ)1wy&8wf&hss7aeU<&U$+I&T!WZ=-)|Q_@ z2J!RD7r#g3;++TV=kx?L(SHR6vIlj?#tD}wC?5Iwz0`S&cZ>3AN_@P?>MyjU59Xis zoiXfULIMk4w{EkqZ&yuR`!e{X3;hYbAO3$x6ss05d_h!BmpKKdKT)Y)Tzvd{=0}CD z#Awc_LE-<fwpkvUmaDr4(nWTQ)D?BNIma|yVal*dH*#@saRF)S#?|Xf+=!9A5|p<! z%CI3ODXGCC8Ois}2iIZxi{K(6x>@h1uCw#R(iMmv!mNh06i;$&tlEf#Y@OwQVZsuQ z<?R(>EXX5h070&DUnzM~s7;hBxmQ2$_SN{;C)~7d?6mGhx?=9}cxvy9Z~OHZ?ib8l zT(_yWZeo$$g+nz&5qQgvn*=~zVK(;bXlq2`&&dd{?PNST(zD>EiS{cMuD>sN$H5+i z(QRsojJOkq8sJByD42mfHS7`i3nohA%+S8qC_aDwT+h<-fij2khYxr}0x0`Lu(t;x z5@=d~n>JJvGrE5VW>nU;uSj6M72fCng2OfMLIz|7?s3-#d~A+sKT<F*U0p`{#f%le zF4)CAA?j=Yv2(&)#eK9CU9}IJjvq)KeAse4<|fgV#QC32Df};t;3aHO@%%Orz64{< z^Gvzk`v)zH&q}tmYw!1R-O_q{%i*^5f8l>Iu?!37c|(WjwTjW01$nHQ&|L7E=N`$d z^ZtF5V@gKG&AIbcuEDXfTOgL>BmDEjv?@?5|5v5M84UbFL7{EHW7|$bPVN>O#6HP7 z)q`U-a%O3a$}WTE<jVu<9e%ITi~INP&5x?;w8796HZJLxxr-yG;~~O^vOQ}38!&kF zpaVyLlHlp(l_DN`rs5s2_%!6!l;#ux397L0@XY=dJ+^XSyNK$MgFXcC0&^Os7OYW@ z9~Bh@FbocolXF4*?y-FLP^*8}=Q?m8A?6;ccih*NJXwA8K(7A|deO(viZDr?LxC<? zO_aG?Xt|Q{q!V;!A`(CMS!$5fJ0^ys+T0O$-(=)jCM;#1QBjO^e8OGU$e(<UaUHmZ zkCfXna+d2p`})86^aSib(GOhfzYDhBF%dNicnp0d_TO)6`YiAPv#MJACD1w0g`%nu z4RC&b|48#+owsyiG>VP{Eo(oFkatUsQGvbf&$wwGVR>%9!o$Z)g-#FV7U3@&lDK}( zR0z1NPDW`ojTo>%m8WkEEm@?yoSZaCNa*nCc}eMcXG+d6*kg-Ji?Fbq?0@|kzm2=9 zBv~&?JY!Z#$SJGAow($f0Xyzi`ZcJvhB%?+0%3o%`_D?~D@VR?cn-j&u7Zp`k9(h< z%z|cQ!+s(Hb%+}pW|tg+_#h!8^BQEZP>vd?sc>-5Xc55@@CIFnkPpa1n7H{2lT_R! z!Fgi6x1kqxx>3~f#^@z%4(-!EY1Gm#AD$afvazv!0ckjtP9><i0Gc$V8DJ*e#C%WY zIqqA!_pSLcgHMdq>G1qTLlHhO<VQ(M3%$JfJ|mdN1doIXkunEfQqWAqCMRdgObAHq zf!_sWK1D@Ee%_1#jz!juc)q2Xw??uUJ6Ncsu=k*M@$DWuTP<N1m-t7=-}90D&eT|O zshM01&~^`Y>Kk2^+{v)kfZZIVLdn4yPL%a<e-J|NwM^@h=G}x278`!*uF7|n1)~@* zA^|uWbU=R=csm{A?#*YL9i&NXKqD%s;v4}6&uxUD-}$tA2xAZUkhKDLFf=UTb67Ku z%lVhUULqVEoX@^w?iix_qF{F*?k3I$BB&zzH{iw<byVSmsJ*a3g!Qb{X7~AAaz<uq z&$GE%SkLb^nOInrmHJ1vOfnzEUH?j@>q1@rQ{})h18K{25C0YzKuAx)WdwS`Av2S; zh<Ae;at(;aD^HX)ZC;+);MVJt?d@&U9Pciuf8v2;<9`McLA}__Q!p)!2$UH@WaG<J zBdeR5UXcJd4aTYbg1)s$H%1yx5yNqa<zw3&)3Bm|Yz|a7#KHcSj*gC5K%jnk3yhP1 zv9J?a<c^M<w!?Zr#*a~;a$Jk;ZEZ>Ck5s%`Tl~SyqCPV`jG|a#O=?d_$VP0zHUZi( zuvwl0q5wFfqJBkO91&`!@`IICN0Zxw!ciq^yZ9&2&7%eh50aicY+TV&F9>({+<xAm z>ac<OUy)D(JrgZ6<)*@_H_bIHGWAFT^`P&61dQW>pL=tlKV;=P7683IiW08?!Oy)$ z&7<gV8;}?IF^`3~$EA1DU~=Vlb8nncQ8h)lTl5N)#oSZ2&<Re1loQy2dw!IUW8+_f zuOQiFo-Ye4?`K<m9!BjNj3`3|RUO}~QrU^bdg7Dnliym;(r8OBZK4qfCW<)#Viap? z-Y6<uBagqY7h;LLCBcvI=*@H%K)$uLQ9*3QX?tcO?!uyJuGc=bKxvQwQ$9({Ek#{V zVNtF{t0Cm_m}b^}Lsqf@&PjBgmay=3*f+mH6$9o+QSz+N25tLv<F<-@qk@714V|g5 zT<{I4OxMY_IM9cy+wbRt?kOx@<WQ&K<WX>PGI`v;_?_q_ucpv+@tyd&bFnZ4@X4T_ z(*v+=FilEN?<wk>r(|W_0x}Fr3LHgjLU9&>Z}x(Y@`<Ek*cL#yq8w8T3kxv+2vwmq zuaDXm*cAX582R0TC9@tvuGi^s@^6p}uSL`lGhMCqbWX;XR>-IHGKfc6K7RcgV||b< z>v568^z8DK0J;`QU#igv_}k)1QT&l**)M0+Bfb9$TXD@+NQZ)S1mgID{l`>vwN>W_ zBriHSrAwc1U+3=<NmYEAK8T^!>XND!H*qIXp9esRuSNu-74<fhrAlB4xP8%EFC4ux zEC%kXJ(R(a6S0D?q4PlzdE4(DZ20UT_5_Y3BMCXLM3inEZT|UE2a}%!xq(!3@6pH* ze_!gz+{<-Dh|N!vkk$PDI@wbX_iujuliKX?+JIpxsx!y@b+Sh!FV$QgyD}lAroc7F z_GtNuv3!3Gsc$Sq(4vcV4w93>hedn!BYOTcbHFV@sU&N=@3!U5j<5E~xi1mpzoCnK z(v>;f3DO%oKpjlW&AkhWZi%@LCCovPZ`UFPi}o(ci#$->2Gpq)xU>TLt-rtj_xSh# zI4GzYVhEj8U|GETTLcTt66X$`_Agzbq4cAuNQY_)CeSAuJorEg1XTY}iYlPG0W;50 zhM@@wfk2Ottl0SXZwKPDbjd|GLMPPF?Zzwqv&~X|w9T1Ph+<(%#GI@sP@I%FvfU8- z$*Qrr+u1C~Epr3&*FS0rj5TvdP!OC)#fvtv0)>`=@qu(s%LN+r-J4&tOn_P)iU(91 zd-p|~oCvx%ckfcYx|_zJt=YV#-B>>|0OeHt5?4|8J|`O+WgxeyMW_L|{AFZjrB)R` z0@vd_TOj}zq}iCc(L{W%3DgS=aRNaPaQ3H6)beB}PVu-8Nk730fd>!DSXkZe&OH#x zSRPqEZ!Vacc!C_r%4A&BE2&IwL#(Z??ySaJp)9!Jw>k!R$dZS10R>l=`EG#XQ!wV^ zakKqi%jMK^p<}PP`HO8p@Jr>K3o&ebAQa4%>@h$$@(V5)TU?$Y#NWQfv*#s+>BJ1X zggh;Yu-4Yrn}WylH{PnMQiA)c(0LP<;iNXY=l+n@&c4?L4+!A?w3y-~fie^ZGGT2% zE=Jo*WVnoK4vG$-|F)ybb(HTE$|h(h5#fFto+vy#JcVXK^8h3lhpwDIe4v4Q4dr_r zmo+##`s`2?5>eDO3{6m~slL8G=cOPn>-C{$(;nk9+^)+%=%<LiL*(59*&K|~I)@la z(V(`3xWJtt%+(p$i99~8!i#l8JjhYZO?g8HJhP|2gkEABhT)0%KWzS6>?0JQ)ha1` zj8-;jA)Nal<Yd+43D`@gJi&(nNn!8LhA>Lup9$6*PZ=34m6L1N*G)nmiZAX*Cq)G> zHtT_^OX0r@XpYclfyeRJyEniohTZ}?CSeBo<9@S={lSTR)|bsLXu>si@847G?eC9o zBJd&g19buE<}Joqv_k2UHU!M$pnA>jr|a3pQ|N=i0B)=l_L%Lxt7Bnhz5ZqJBV<h( z7C?_z_g0q@8)JiZ4)EU73sWBetMA8;AHPoa*NP+?+GOg@LbtoRBuRukNx;Fq#JuP! z%E}r@XXcuZtekciMd2WU49!b_caX4Qti^Idq2Yjdc~6>aE7m|bfqj@Vz5(u7U@ed- zW(vy#9`6$s7V%V53=9k?M-H%r|5p28+9zE+_$e1P(uiMxwen7heGfh6z<x|@Y!kFM z-^u+5B6t@6WHo&{&0Stju6e;8BdAAnkG>m<%f=_uh5f6T@&?l@Q|s1uXIhn|Ac+Lq z+i=Hby$XraDjtkbgY1?&e<VR>@h1AMS2>EVV)TViX8;253sSr6J9dqYixU<#L|11j zb4~b_iI9k1!-OF^D){#I;QV-8cnom{iG7)_ukM@-FSRsP9mfQ`nCWW4@O<+mIkias zINqdO9S&1UN{a623g2_yTdJpp&hD0eb2r{8=0@XM*3JZ@&HzN5Fmq}P>1Hgi9TEP$ z9ZD|I60n_pV~GbK3xFJ({j))z>ptICvjpT`K}#cu?a(;GRRe9J#3g_^Y(vP?w=%fi zXMTP@FDo%1|8)(FI_`E+C#Mt^%0+D{FE3^Wpq9qK-m@;TsHkYf=Bgz`uoW&X>xz?2 zhptMPk#K4})52PZHG(_opJqSvJwP~Nh7jf?LqUBU95IB`2LY!62GSxV|B;3oVo{c{ zkxe!vkXZs_XTrQf)C9P7(7*?7tfCYdC^)U#?~G$|ux@iOgZN~I#2YFO^7ZGEz}SLs zo+))FQV|{g0>^dcd*FHoLG4Mg_mg6FS<E5XVVD+7eV>{_)2&n!jcpmcgiS#7H6_K& zEW@!tMn*0rt>il4A4ca+WWW8m`+F~!hT_0p_2J>E8?Yz<5)X0yv>8E-$l=aU1;Xf} zkdW8tP^!MZUcFe&jI_53(R#(y7R`$nUz&8^QB8#ioKDEb+6b`lPy~*c)js*ZsRYZW zubcl6|8HupG+}9JQ9)hv-_M;{o1Zttz1;2F_UaSt<>lp<!07{}mL_9=&-1v9ek$*k zu_`q%zQ9~6(*j)C{#7+v=TF`CIzb!YKf4FsP;iC@68U^#ycIq=LQIgE8KvF?D{Veo z_ZZ57Fms(M>ucohJJ)JzY78c$u04^i>~#Q-U=Yz5Ip|%tm)hI1=4BS(VBp{xKK+oI zf=AZ(e42QOK0g}B6-K3ManU~jl;&a%#wE&tS*m$^?zPPL)K`2r*ByuCK;sk|2dTrG z%4yT{KF?{nmR@6^wNtmF>SCXxlW>YKs?3vS*ZRvW65qgHvGytc#Y5(&CiNv_d!*n2 z31opHj+qxZ8wB#ddU|@^vlCgxn!EMnr_tP1<12j=qf<q(HqMtQhvH)V`(wI}xQ>Cz zfNI@_1nBHlK%8*irXJ8zZm5?;0{;m34KRiV;awCOJE(ymZf=_YWN!m~9gw{hf<H@$ z`;DFNmY<)XY`_2yhtC9#KKeaT3`5nXZf<;n=Q|>xn!fbw@&?3dnmyZn%j2It(<i7P z{SQnHK|{qwqMT+$HQXwAO_wu1^({tofnr{YN=~N4=Ls5%eopF9C58yguSPEwsbKb_ zkZ$IE>ibHnHaBx~nK&l;l0kV?y2BaG%haUHu4`Z*$e{qXb<9QBKtc*gd&XKBm5JJA z<ml+=;|y~)KW+YQAoj7heeBAkajf8$06men%F2=tM<yoT@jET^@b4bua*0+L8yUR; zEGf#4fh_iI?BiG(dK&LW&m}{}LH3~2c30FCd3809$yt_c{2TSR{xIA2VpbJOn_$Re zgX=wd^W1Btq3RbF6-5US2=xW)`ohLPuq#Fll}BOJUp1X^+a7fKueiOJbpmq%J$?P3 zF8fB36-=P!1+WiFVxYvl$5|9kvT_GlOcpf`z<K*_<#dM{<2rpuGrw7qJcH^T!g6(N zD;6Jc6#IP-OthMqg?Vdg?T7CLfd<`&k+^4>Q&65kDp+|?O+-rS1A|*oon>0!iN04I zW5ipw=w*Ki`MzvN+XEPh1Z!x?DS)Kk#Hjk^_vXh(-JvXHeSLD-CGYiAw9fK%1Dvrz zq2CCOZU(WMYx27lkavN|=lXE=v&jd*P=fksXlMuw0V@r1H%y^CY<j2C&0+ArTmTNC zTt)u&z=Od1Q*7XH#Lmu<l3UZQzbFZy70jNZn1BulH`<dUAa;n0-<C@j3<AA{u9A9x z=lEwuDtVcnBwT;y-e>M@G0s41j!IIp0?g)6lvuS2!$N=h8CJ7qm@MoiD0SM^7HfDM z6`G+z!jq+vmpZ=Dv|s0IACU9$UeB)uYv{DK7D0KJN|73n8NUW;hL=VVf{5&~SoP28 z^xAv~xrLirC{SK5yVggXnzEDyh4tdM-vwHt^c3(l{PzOBSMUG3A8BCu02f!dZ?AfP z&H88)*vKl)2CUbx({%LyoJfJ*HcW|rYWgIqfZA^`3NbxRLigf@f)bk!F@07j0)|`K zhs8p8m5^C-dF9R^5UJo&gCpA~t2=peEBpVjWwWXDWk+vAHTEQn*8rn{lV+I!l!qw7 zznqkI`I$P++)tLD+*9rZ0M{N54hw}Dy5YYw-CR-+s&u>hg52#LGzOGn5l;0eoJFUW zH_v4{z8h*7Jwu(s=b+M&no99*EnhmIlJEq4>3|y!xKV`gcS}%$1#ijJ_i=>lFg*m@ z4qPJOy1w53d!9#|2)%t*81E%W)%_Bhuh>%Av<S{s%xT@;oar3soBKXvWN2XdoPS`+ zeaZzjwZy|gYk`G=v|l}h(HDc022p51q=I$o8dCyNB3*7K$^S)k(Y%jN{gcc@od9>M z$vX5eB3}Z$r?hGS1Pc_S%+1ToEF6~}{f~kzpgDk+4silFk0Nkx_tsgS{Lg6SYmfqm zCf<`yM^h;}{{a7oI3%`OXZ7LGrGySkv-2On$w@U6H{deC^k%Vu;aS{_6DVUQopsr9 z+pXS9x@;PToas9JZn&74cyIqHHN)DoQ*HR}SYL;{bmQKeeppsk_5^yMXGaJTbMt&( zd*sm(#HQ;Y+64(Tc@p0q$=?3n_(7Gy*lkFP@*ndLpzPmDS0`86+&;Mj&mO80=>J73 z`hbhwhjMkSbt5&E8i_<BtwHl$S2<tY-T0*im|jrKsY_RUef!q!H<t9`PV$vyvgh+% zJze1|8e&F4pmVm?pDY47P*!$!<`xVB&@j@AxvJMhIMSC^$PCD|yfb+%z2V-+`U+b@ zURvDdJ<IhQH?BDsos2;o`g5X4y?I9i2Nd|JzE!vhRJQ58a&bBFH*ljsIfoa~gZiZV zsyDRm|1)9cvF1-`g&NugMT~#MkQ+iT?|(%h?rRKsj^TplVP-jcyA-974BODr{JbuV zC_iy<%RRqxx&8BP#ascARppxo1dlTo%G^Usi=oqTU63D{Pd^2{X4K*B2eM$6aaIxI zEaOQ9-zIbe@TAb2g<DW%01R{3^QuzKY_q9UKDVq-kEb}qI%s+G{v|X)P2#08n<1qL zg^H$6)x*$$lUF)v`ZjtxG-hB1YdQRkLoX+8Wn?RdhL--7bukhr)hrV6S9UOlrO){_ z*rBljXVd!hVBIXr!pS+Q12v%mufM$PzWQ4CquH)e$4~$lB-^9qqrht2kD*QcALz2O zj=HM=P}H&{D^b)UWMyY;?deS<c7Z%jchCy7S1BxN6Wgb%d$`abLRn&{)figd1*T0* zLV|ajX?3o%9f>dK3p7(Ury_@?_v=Mr7mSJ2)k{{=%)-Ftm?+%`9WU~G_`+M?{lGV4 z*{ysd9{L^pYK%eU@NUo{tlarKMmTF4bxjx8w5adR&TcPy1~?j&eQ@EC?Fq26djsew zSs|am{Rv)^IBd&@K9Xm_Vz(VG6`<ysZkP%fNm<EG`-i3BycQMH8fTgA0&&Je&6t>k z?-gffXX#Zb?-<XjT7W5r8iRn%F~sSg_B}Gzr@3y*>T{19qR|&t8*iC#`kzQ>^_S30 zjn%A0dtMeEo;#&&_kx!Q`u>fXmhBuK;v1Ro^Ft#QBJtt$i%>`!zQ=s8DpaXw`hPil z#pvcTEhS|sKR{CJ=D5(V79ipTMr<l{`Dwdo;f1%&=?O4%O>_C-wO_ePgJ=O6nWxs7 zmQ=(3{=UMycNj4A3m%y6V0Q~e(K}^e@^{#L;2FQJA8EY$8csd*@tF1FUIEuPBz8!H z)9MxQ5!1Lti@I5+O+X;5MVH+<V}0Y$6>pXBshM#U{ge|nRHvvd0Xrk0eF`5R?^V(G z+#+Q}s2ZOENPHOjEj7G$A?RT8gSO`mKUSm^q|Q<18PC5VudhG2e<#xPVvHCHdQ>=x zQ={!hZvCN=6EmuZ>>6c~rL2S=(Du|K1R72z3bZf@>4+J!-7lQ4RtUT8`&Pj>4F$+B zK)gk{IvH{q03!i{GNYTqgn$Nj1vsRyhw?1Qxoh&HXg9>A2j}yLy>QJdSkiZN{`D*C zgA~BW#RsN&8`4k9%<W;L?p#gOB97^L_IH<(si-L2&|+_Pexxr!a$`Ph3euZ#LsY1% zZ!|w>R4Gt7Gh;B_Xjb5&qoG?4q%Y~B3MjsQ=e+?n6;Br;BqBTMx?Hp5ylbO&gZ8p( zl3mh^uH9wL0gt(H3+Bh5OJ71$v81;MG*M^Q1kb6dZ^I#YGkS`ApjPeZ=s5A`&t*#5 zRDXZ4i``nHV)}H)P+dVRiGFa2DnlSbH9j^;($qE=Z%$aI7(i6ers{mriIRu@cKi5t z%J5&17bw+p44(?+=!p;D(qM=Ge@8TX?BSzF+!W&iD!ccovnMWfj7npNN)!WK!~#4r zjhzQ{yB42iuk^(ON$fyO!0l*TL64D<5w`(R&Ap4F4lEP>$j>eN+q2Usi|xZrDly3L zyq?l(WUlfrxW2WGcOc75SsnASX#4y7rFI#nVlY^KLLo7!Sr>cW?0)Okt%&2zUz2~? zd4)fV<j2e`vvPAwyjNIIFpH8u>f8=pJX`T<=oN69X^B+TG$|h(hW8rttcU{tgMgfs zPuD)7{-lU-LD+a#S%D!j&sP%1O7L5glan(rH0YZ9Nt*?I45h+vdkiZCZAZ;Nd_KI5 zTjG3$xA^wCXk`p5JPD8c@y<`=I%oW2QsTC@NuS4TMhO*WbwotOzljewEvE8X4ZL6a zg&TkP;MbhioIbYFe<$vXT)O`3w9A-ufA_NS{tWz-$XMLDIu~4aK8!>$@tr!|7e-tx z!J~Nw5F`z<jKiYBp0ibCeYdjs{9}yOY!zwtnWi;I!rzi56Yy0457O}F#k0cX<2mm` zkHUoNh+Jc%GL389#L7xluduKX-X%04hQ6&58+X&0^oM+hLrq6KI+$j4KJ9xNi*9|d zqxKbxQ@<vG31K2mQL?_pxAnh&C0tE;ADcYhL%QEx-`aY{B@{hm+w<HHa@!B1>h2z% znz*ki<en+oW7^!!n^O0k{b8)rA^7Zh&<AgB7x27_bm*CzHaoHZD*@<+u#E{z^+`3s z#>~aV#bAy@FIK!&+h*3+rJ1_e?xN%|fr8~nwjXB4@>@wrNF<~sDcJ;+Dt;vh!_*dP z3s#j)q)liudtKu#e<0L2Y{le45iIU+Ng;Pb{D^C7;%bgTb$WU_f<ZOom_SeO5X{GQ zV&oMhLq&&+i+?lQ6V1?;BTFXDvoi9%r`>z{w;LK7{*LfA6MAc~)aI;93|FUxJq?KG zQd&POt+Zf*O#o3MGN!&>fL4+gzTE;;rfr+8SS-xUDVyBZBWJPd;x9iQYKKfYnNthA zxcG5QP43Yg)y+_M*}f5T@cdcBY33;Z=|p<|mA$~XJKxX%<o5e9K_hrMuRo+XjD|8> zE>J2pUuQjX*j(D;up)N|;@hsdQ99ZCk5I+#$i-MmMf=vrY+q`C!}DDY@Zp=I9rqmp z{)rlwGQ87Ps8uV`C6St2=dV_3KzEt58ZTPe%Z0y)hfn%g_U&stj&hE_vZuTCLvF6` zuG(Dp_V(Wx=1BO-b6bozW3mh;BqplWePDsrC7=|6hz8P?i8z!ZaB}zjZDmfPrgZz_ zI4}#Oq~97u;Fre#0U=Rt5vQ+h8^+Gg?_4gtnJ~oj#unH3PPB!#&i)J%ADS1;<+eg) zCT6S03S_A&n66^s+ZB=ViRFVI3Y?Pz;=|+9ODFZSX&$?urKL+_Q&ySj=_0hIT<+DM zOop?5(i(>=+Q-|<!aO7nA#pbU<*-9C4mtV29wto5=C|>m9h4Fv#sTH7J8CyOKP&LM zvE&w}<Itu&ZNCK1&#{}Gec3u>7p1796q24!xwW+giT8f<Kf)^Hwp)iCIqATK#6FMB zzpyk7Kc$$Up!=BVggB)5vdXgfx57Wcoc++~Oq+4Cmzbp|<3Do_C|ecXF<D+|YHGeK zalR9~9=p7{rl_d$8Fo?X&re_5Z#|`aI+$Aqg5mG@MiCbF_7Nb~18y^bP(&ODK4$x! zTlQL9G<k1|D~TRLSAt7>EF5ILZY~9N&W5iQ4XH_|Ur%?(L(~HX=r<ZYd5@e@xc=o7 z<SD~&r6bjIs<iI63#+R}|Jio<Zg0K6db7G!tjK;mu5zB9nPG_w)N~(ggZlA3`(u~m zCf^g+rSa*jp0jJei4R~rT7%x<-C379W8;A>yXk$qwceE=uDN+t<b@Q^<@On3abcmU zB(o<X1{jC1w_baTGlM1&t8(ny@wed-F*kqBIL-EvUm-%KVVb$Brbcc#L_~%ab<~Nt zOT>);*ojn*d}MncwXcDoD5!?Klf{o~8W~p=!+nxM-+I%=!NG7nEECSo`(8FhZG~X? zY?fxE4jLPN!GU6VW2|<oGG^JXnxLRXfS?d}c5z8nF!9rR^a4SF+uGLVlWENO?1ccP zQp2~BJ=UIa`4KN|AvU?ojkRA*H=u3?HuPf{)A=<v7Uf-ab7ayKK8d`m++xRLA|l1O zCvxSaw*fv`-`u>}Zgo^uUH#tJ*q2VjXEtSRF@Q0vCX0wko(c7BR4yzdOSbZxKFojK zXL^&AS6NB;W$;(r_?WJ~ev8Anc1K=Oy{Urz)kdV3O`q~OiBt7#D6-RvV6TTsQ!ZH0 zS4im0n9SpN@Y^wqpQO|n>ia;^Zzw%V06Sp?3-4oPG#63i*BBp`y(TrkJ7eIe#WF6@ z7UiFgELS#*SrBkJDhCWH9R?%d_rflWsLJ-u?v45xwzL&M0(iApLDN)^TeBVahzrJ- zu9t?&nW8^Q32}YZGuww-?3(ScsoQre3gbz+i3`;Ea*#n*vtu&voMS}k*{LG3PM@PC zd9Iphdo4N8^}IOQn7izbV$g6tX^Z}*`KT-2s!kGevsuB}zg+(m4D-;A=UcFx-ydSS z*Dsjqx^ErU6}#ZA;)jJL2t(`m;o!p&<#Aep7elPWVA-a7g5G2D!Cdz+ATO53?m2oj zI;0kQ`c@+EwJ88dq1XADuzG5AdU}TO05i+NDZXvQ*~auc$Bb~oYH;Ao*0xrKpDRL2 zuWM_$o&P=|_t<;bu1QH${?$hTGZP~CXXh$6>)FY*)b6+MJ2{FoZ82e=0K*)xUfIp& zckFccwY9ZX`bsMb3F;NB1|y*HMCuTwek%Mf)VKEbT9OAN#2|vA<nDjnyW{dQ^l|3* zlai<#cDDYV4%|<d>LC_m!PNi#Lr$)VNiJ|{iyH_~plq3_$oF8=bkbquz!t4QtfzY} zfBDy^-N%m!6SxG^3KY!XWI?awwz#-><|m?Gf8@v21Kn?<qyIb(Y^yu{lLw=9JKcFj z-(y2v-iCKJHw(jv;qJk~@@l;0YVg!H_dkKXKv84Rr|4di=kKpaPP;wzx~Yc~9%@O^ z>dcnGuoAOJA5YPjz@udHl?ruJZ_KBDc_ecyH#d)7{J#Fu8{_12g_eRt4G6bo2($m( z>px1~Qa$TD`V!vP^ySLsV&tvt1Ri30+fwG_xuMC;K*FiP(7_KQM0qk6ghHrdFViq{ znc&?vH_Vaw{?7}OJYE;n9<<<$-#yx0jf~b=sNl1L`Xi>=Zf);~&uYKF7E!EwdA<8Z zcccQ!qSyU~2Q3q$aeu;9q1F|$_G<O0*3uYxG}9ZBFo00G2qrFSRNzU9ifwNr)ava% zQzc^?pro8J$uYshCrlm7nFODgKWt^JLmvKN@Z#R+fG36FhD-WMr{ve&gX0b}ryy!L za7JD~kgvJ^n!fe*{?VS%$w`lbVGaoCfQ&0hBuTl5@@UXie#cJ!$ZNJZ-oeSq5vJe! z9x+=l)eFI6Gte9cnPWL+1$kw}W@l&V8+FeQ)4A4ja!9={BBG)d71Vaa<6;kwj_72k zgYl+*Wtc8LZy+z7lmQ2vth(LCeevVoy;pf-IFBEiv~50b4|SOFy6Tv-adb4=p056N zEP+f!PImzhR?Tz4cEugi!)m)#b-ZabLTzh`$~gx<r&$kbEiElg*RD(<-fR#P?$>tY z3=w?3Q6o>d7p;Vm3jVB=&v<;ik8eu#NJk1dfs2SUq6N8gxGS1BM&~AXmqM;Cmd(g^ zcP~J}IBzh%o$pmhaIm7fid0)vvI@UP{HjIY@*}$s78c6?%~eC=68!7yFYeSQ#XMp& z?l)-L!~ap*t|J5?7ijo+(RfPQ3YT9hw*GBwlum4K`*qc6#d22we6{=7qWXDF%~kEv zuh7R9;4r1qYq@ALLZotO1RgLRK{%Kg7`k7P_qw}#oG+OMUhI}9zmsDSY91U6eZg4! zxv_qStFU&pCVAT99INr{2Foss&^k}+$ouS3Q`IKtbnoKd#RzUK3>)6!@^VARd2_{Z zB^yWEtb+O=Xct0$2abEGpf1Lx$`va`(|Xg^#)g8IHLi0<!u8B`(o0tejy@baUl3@9 zWPb;_-_g{xK&@qb7QE$t&?QblsWY4{FP>On1TTDZ05d9QS?PN~04BW0YkI#F5PQFI z8w<8f_x9Kf7@o0lbNe+WU$Izafkc%q^W$UdE#J+FY7w<cQUap(wjQSElnf#jd~r{M z%@N31Uxb31a*p{GM~mC7o+$dI1j99%oUOYdZMTTC<dcI{(%azk#jJsa$kNJso1su` zV9MkxscFd4d<HSAH-~y6kkwO&x<qkumk~YrZOYYw<dDirF0MKIeFZjta771J<@wmw zh&@pvtA@!~zFKcAn=f4O_Ube8o=k+{^1~I+SHvpv*9nB(v*Bxj-Coy=&e9KMiwH!B zTtU2IkcxLq?oq|ovySf~`bz0IrInS`&uD$}1L+~d^ZLENHC-M~BJu#zR8_s;;NXnx ztnkn%n`x{fJ<~rhR>#v$5*HUA5%cBCjhwC=NKY1*ms>&Hsf26)_wVnv+7i|nyg|W} zpTvuz@xzB<GFN$286wgHGTtAp_54?*^*Vv(2q${Twa))>H7*{iYF9eaE#mF;am+xj zK+#YM&un<rZ)Hh~^9b8dr66*WRXE{hftz|4%kuBK0<~|GQ&ZtlVOe<cbEn5+Dz<@9 zAx_rTZ^*9t1Pt49jK{aNP*uU?Y+5S`Dd{e9-`HwO+mH%R7fPqU>@`-T)wtn3@Kpav zc3mHk93zfA$;ik)lyH>PCu38G;>`&AB^!XS5p4rhMUnsiIx!JD+gBf7{=tI>-4cga z1Osl!?Pnd%2NEZtq5b5%ii}wmq<l`_^*i5p^plE{V#bkr%cWB~YZv3Q;tGxJRv?ui zn+}wZ(9`e>mw`H@^^Oe;-Q5kiOG{5zM$@o%vk#(2_iauJxzF%h;L96i7=BNRlY>5( zYkCsI@W>^YkE7(Fjol1HjK7gisHrG7r|kIN0=pE_6`Q7NLJ+w#-70Ivvd-VSfZC?B zzc*^@!n^n>ZH*5$^$0AIqPv%!=^~`lgC_R9iEQKklXq-f;bRF0Q}}AtI?=MgI|r0k zqq50oRH2En9?iAM0XYSwdHWd%bSBR@NMTX+_|&DbTVt<z7_On45JkT15$v^uH>e|( zHx>p@?D<|0N_{qV_Eu=AJ0AwA-bo@1gq3voBrKCM@6rTEu43YJL!!yT%*<`*=!8Hi z9B*1lT*(d>HWz5trnkaQ?CS1(`i$1F+Z-_t6x)J=E#yB+7Wk2%Ow`-^P$>$vP`E}= z>e3G}KBZ*%0);(b508k5(hS`&8KyKcZWLluzk*~1`UmV*W~-0{a`W&!WapFcr=!TK zvSLK%Ztm*()_WiW!6kb-N(mK%p|<D0^zCTepN_sf!6ElJf2d=1d`e}&dH6_HY_&JG zrLKBEKhdB2!DO}uhD|eUMO+*bVMSpaGyvS7s<!>HkG+DwQnqbk2+?nP#-LT!@7v<m zimdL-Ck=uPL!p{}wC4YfLNR+X_DK61OI+2;YIKYZJ9+>{WG&ZN$YaUt>FWX4_PpOt zOH&i5m%2@#(Wxm)bJj{;Ftv=1MuG-|S@zS0h4?dj=|KkX80Mp+Bgpl`9wm29OvEU< zlk?kuFY#wR+MH?WeavQPk%KLau`A@bHQNRWNE+9_^?%#f+vBN>jEze5PVNGdL48rP z1@Oz5XGs)zeDVtjOzy1QdfH5h#%=!>8w!!$IF5jzcuqYtvw-Y1FXQDhApCW6un3t8 z0+tR+3Bc7uJJxF<tg5Y5ntL-)Gcdlew&65l{0;D%*{gXEUS3{|IMP<*4MBZa-j0Na z%$%HJk|uYO3(f);!}K7i!I)1mx3PhNH&f$j*r85-c0)rF%sm>`oWWUj{gULcF|GjP zO#}4g0h#>OF4gW8mu!xk6R)hTi`#HMdYm2Yc4a5)G86sX+%$lJ(QerYI4~#k=~y)I z$=cg*d3jx>+cFi=tOapc&2KLELSA#md&J_j?aY)oQ|q+9`zM5!fvF90LMtW&;;IK% zXp$?ya+2>Q2Ft>K%Q@t%3lrod-M-%NR@&#|0d@Pcd}Zb3YCO^u-q_8j>KYnq`$t5V zhkqI)7_O0$kihX<o#jKo<t+DY^2LB4lHMfN#C*CeH2G?8P1B_>5;9&*p37;SWc|K) zGc;%D0lCaK-KHnII$)FEA5gu#^XqhAe7`eSJVJkb&R(E$+7nY%+v6EAmjx9+Zvvr? zrvlIAx^XfNE_q8WqP~aC%jGM6bfNBv{|bT9exu37+D7$8QY{QnwtQf<T^(X`S!Eia z>43CBLQ;OgKd&gIq9Tf^;rz1@|K)8oxF~-!jM>cktf7<uX~$c;Z>wBiYCASm)o$Oz z@1cG1VhJnc>QlxDRZUI1RhoJC<ZF9Pc6b&85MkiIY+ZsW^6NXlzF=7o`Uk-8L^YSE z&jQ>+V%<PkCs8YLWMpio?JE-v4L#a?Pf-IE>+`Ttrh?VJ%2_I2&N$?(7oyhFLhrN8 z_LRP`pOSxG-V5mgO(_*u0>FSE0n_7*&$0TE4K=Xe4n~<N101I@Ib{qAZ|)qh@s<u| z@r7l1W@Ke0FQs@_?Xem+A0GfU<g33^MfeXoMe26{5o>x*uApf;Y$<mLT%B$dio1P{ zg1i@18OQhKyO`Z)D)Kz33IXZN)WVtv9|=_&e`#1XwlQ$cT>mxTbz-M7+ZZ-ia7v2i zb>1jcVtG-sBsdNQG56Z0T}071oSnR)+Blu*Gfdde&c}nkk4Z^09mHP%Ecna$)%_)| z+W_xPl-h-`)_5#W#9P&OeP!Y*&NCzgtPSnM!0)|YoumaAaMwSS&O12~5L#=xO;*-v zY;GP1pUJ4@^ga{|BwSV>%?ca7qMi*uTBpgPayqLO(SWqHtUpmn^4v2)BlB9c*{(q{ z_VXd@Xl;g9-%^TJVlQSuKSO^~t*5iQvpK>ltuBoOV570q0)SwoV5m?%GD@w~NR3Y! zHnN^@IgB;|tYGy+Rqy{UoK4!vpS4*PUt4^!?2bxGBPU8qqjmw0A>BWROm(#{vBQnL zt|MrCt`lAg&3Y`XG}tXjnz7;aiIbS?E#&2*Huzos-QG6R=;1^?+LgB3IxCs$a_W*` zbU^_Fx)1u_`>v2JJ|ZE>$j<f!Q+6C|?3Yk2zbL9wq^-IJpA@ZgaLxL%dQC%yTF7=Y zFG%NM!;=IKs{(~!7Z(@WDT&PN%zYG|1KO0)`BmN%G4ED(;k-`UPBBb7w*=)^eLx3h zdPm=t*VbHPGTda0>YkxEwFk!0dr-s<{hmnC6i?u1t=GhO&jEzwgwg|&?S>`GFr2XB za#Anp+=9FnpJ?s*i;!94tIG?Oenr&Y+eLwKGgz~Rhdp_bpHUz=e2(q<eeHgA_pu22 zs`u{Q<<OQ8y_}t$Ye+h-F)LasAJ@4tKRT|nlKZ0Ybc|!8q2VeKe+`l-=!%0N8|0X1 zC}3sf_#Wc1xWHvRCxBhjjI}oj2?;G5c8#_h_P2Kt`qt;wfL4S|J+7;*)ld_;Kuy#E zMwVVsAbY~Z$Qg`JScEoDh`jt<IqMt%iT@7=(-B?{5XeEBU&0bxO{zt_-=a3Vb02F3 zs<rbm#6o=V0UE}=W2@{3lHLEy1qkQ$67t&I+=PX@oE@N)gTjwM_+8@v*2`*>kL-fX zbEcdB{-uF@3Iae0vnd5p`6}Plhr6(q!e>A$Z7}`-PCg9_6m2+*IDjb9i^*i?qVE&_ z9v>Hf_5NC}IX<)C({qc$hCNd<_v2Tv367VC<w5uLLSg&}iR|d>3o7FBERf+EU~xYy z*Kt1)wQM|e+^*gLp&<{1R>0B%X0sadgtxHzG%lU2R=4T;Sb<K*jYiM;ANnv`nSWux zkVmHGFm1*(#Gn^y`4FZH402grHWDkV&iZR@?CqCN&5G9Gzs8_~=Pl}OGcbe1Zg_J3 zW6c@>DM&3(T;+ZP!b}3Syrx@U`I68Lj|adHA~M$ahDt&tTZUW0_Xl{$m80&acXdYP zG62E`?IKYS*7*-)z&_-mghA07VF%pPgXaRH9HZTFI-nh~sJ{et+AbtCwqL3Hr>pI% z&r5o$7qW<t54&}Sr>A?@blfisLUxfz<E~igs!jhMU`{{dr8^bZngS3@=jz`$|M}k* zdk2U2W@cxJ_girmao<&Xk`gjB`hj#2YK%T$3G4jy8e`4!Q!=$f3{@=`e1Ov7&iZ+f zpP66h^$aegX=L76)%Kqas4mmt(p@2BTm$E?Rm9aXU*)Xli*ao`2GD^7vc8_Nafc6~ zX6Nt#e~?%K1%O2maMh7zVF?kvK>2n)(P1h*Z(ebBbJ1siynA%?{Db3fmVF)fc0Iw< zV@f@OcA%Vy+rMS6oVLeAMbO37)poFwLS1=PQ1*EKW_PezgielkjC~z{ebsy&CTtdF z==9_kLWU67oht>XhF`!pkpe}ioD8?#`d|zDSvf%Stu4slkxr>w?iGXEVRF$P>h?rk zi=_B{9-vG$cYegxz1!(05kNbS<}_nN=;iuPp5T6yu6vxlrg_4igOONPo4tcEwK2PC zP>Br4*pju5k4Hns!9xAv0dU(MNe`&GPKy;(&e#&)#v)s;!|bQz=8iE=^89+6%pEOz zeaWn9K;4!AQNK?n&wp~0>1xC9-2LKs)T8nG6G6tLgd#iVgP-DRuKkL2^>x*UQ5x4E z-ASn`j=4?l`8}`ju@zON^@8yB)yf4L80^`eC03RiBghu@mYkPU#bGoqrM5O6USHc| zOBn=O0CscUKjaFTl0md@SQ-2&GdW*5X~bsd^J~0nY}{YVz6`9b<--!#!-i-=FJMM1 z54W?^`B>}gpK9f%qmN#yn-amzYP#j_jlD<%5#deNqKBRR6GqMl4i!Z5SOW;>TX1+6 zmw~_79AlP|R`MB$b-HyE+K=k73#85x%@VR}fJ2s<`smk+s+OF*JXUhS#b$=inUmKs zX;H%wXk}K)9+&%YF9sAfyop=wlBmSi8;WPqzeT9y%mO(1t@KZEHAKKKpe>>?mR=#i zS?m~Za;Zw@RoeH)7M78nnVEs)IKt}jT<j8feSd)4p3S(oOwW;e0CJpLUj|?P-h6@z zivS}xoP#=z?UuaIS%h)2TNKpLT|EQo02^D?+ido)3n$!T9fB=o3vpV+YDB5B9CESA z$<Rm1est14@$vEarMSX?GyL1yYKt&VE2|qxn+Oi{dkvimww@0E$wYU6WB@#dT>1+n zpCfb}Y{p3m#1FugCB|0P+-&kI1VbR6K@q-|p{e0VX^^3T!IF8>ySHFWcom3hVmuds zz8YjNw2TZ{`DuX}tyFJg=`^*p3KDZ+11o8QLS!|1bworIGqmJdTL`_=mCbhd1q6sy zU7Ve*FJ0C&R{lV3wbt8atiJL`m?QudbZC2Ei%P3%N@-{iL(v481q!giCsa_;MzvEQ z|A9^f+)oR@^M>*tnqe_eS3eVklpWe(Fj)J-h}t_wCgU%Gu#5{_i<+0EJ(HzQSWs!g zsfPd1(9>l==PM!uuY|S4+Q#OmW3Dg;)J;$y>|yTH($VTcjr`5`t9P2x26$JY7AFMo z`l2E$VI)2RcFyQ1J|AB#?w&h9yWHH|z^vU#CldmeCbUuDb*{A6kl<SY*It>4qHW@~ zc|qbwY~ci&YnRtFZPxLp?Pp}6q`3~?M7U}7deYgHoqPSd8N5wFLMD8+oDbI4-vOl< zxY**c-M5SU%;&7l%%$meLsiRj)I`bp1|A*(HW3+b>i7=UUiOcwzup3KJZs4<LfYpY zA)e=?PBTrpkju@kQBzSDFZA4>bI~?beul3>=V`Ak4&{wk(Z;uMdCOW13OOF2>}Wci zC~y9$$E;TvsED$-hlTZG7)>c$sY_;{73P)x<iKqgv;2Tuuy=K_56_%Y7jBJj1Bq;e ziDDg4Y!}2Na>o|dul^xFm|Q@HTqFUuKj$(lq;mD&?%h?y0SzPVe_&D7p2Fk<{>9et zG$=5;??Tlys;b%7uf+%ON3lnTBg_YM_6=nI$nZNDv1c7(Z9uZKz-i460dg3s_s-O7 z44m<A0}m2{0DYk1ZiPL}4{#WySEi<B*0#2K&|1HVj!wEi4Sn@un_;o9UwxtT56#sg zk|`+r!f?VP9;`xL=YDvos_ES1)6D}=&>HA~H4ls<+&F~uCKO-UNV32+O4UjY$hC>h zIpo;+8jTO&ijPXDZe5&!YoC^m5p~(>cpg4WOiZNLs0oA&^QV5t1I~4>R0T77&jCPP zxOsW6FR_s~OzfcdL@`owF-61dRg_NEwBGGV_}6LIZh+Jd>KUQa#SB|Fz&>DNrY1gW z3#It52Q}Nz^757Q{r>EltT=f8^NaJzh|)W-y9w3_6z1N@d%hBc-S=ATbqV0@-2<i8 zb`&t%?p}AKk5<B38pB~m0AI$ve%I_D@xMFw?-;^08$o-<=d^7AX)4^N6ICV<Ln+TU z!;+zm`_fXI5z?IFvlF}aG&VVP<cU&fqDr0?`jXWXV7scwiNkK;$HKybi#?Xhi45Kw zbvJXyPyV#K{mgJ_#^~bW+^{bas`3Al5s-rJA&`h>Qn~;>u$F8m7(mF-4t(HlwImXV zF!X8_-r316sK%4y_H@@8v7m9A=!=PJGwLf(<Q(e$MvJ%QOdZNWAvj7(xRCOU!=b^! zWfL6A8_VhH?|u%af>~SF*sR3mU_l%PJt*KCo6B<6Iw7E=6~{H_8V-6H)-xRA582QD zJ{4+wlB{7_iw^CIxJr)w2?Tk1Wo5KzjVKzh*2AJ=zs{y)d!-}`30{iBNtBe7qhR0& z>JyDuvsu3z_?!|xPX3j<08_pvN>#<v@nql;5!vEpBywqSQ5bF=v__AeN_H-;QdkX0 zLPDb=v-m51=7j1@BQfFbwN=vVDtXr0*8UTk2P<cG#ZL1(3oUh53uiFQ0>fKP0E^1P zgeS~Vl$l#CY#JKxgJoVZs%?IDUJ7%DOA8C1ib9yA2ekduzfgjH&-wbg5Wog)khVy` zA4EMEq{2`c4v$Q~*3=|{j!=TbksANmbg8qm^Ug7D$o>govfT>4Dk|CWCHLy|K+bib zel1{Afcs@+W#I4&#dwgOSr<D!X=F~mxP3(Kpd{j6n`I#jpXfU3uHg>qjpqy5C~OFZ zeF|9QM7bLwYMw@ywYb`u4cg}!nHg%+kpyt<xIThf6U8q$*91^IqN*`jNWDA?a${(O zZ#bXEX6H<)i*E$0@bmM3+zmzOpPVpx^>e6dwdf?Dy+HHwJQ|qZ4{)p6`HTr|hRc4l zg7ZG9!m7=?m%GSaj&b>m6WWH^<3pPPd3ovVx(v;eKM`h&fzOP0;v*ZIpyweZa7Ybe zc3m9HtQLRRZ4Y?pdF?{m?7&aPdZVwhWN{H6GT8;<zdb>f(-PA9m;f{7yV%{o0)Ql> z7EyOr<pP34CI3Q|(Wb43@4FxDig(b<sWz6y)oxb>bdY&${?I2Xzg0S!?~V|MW<qJ6 zVf4@)FX(!It+};w41u&aBxXRQ(Zdh;7TZ-@4^UmJBospP=FPib!K<XbF)UyD`{jfQ zymuCRm~6*Mov!^ZsrL!ev3zU!4yE{q`p{Uj7xPtfmB;T<cUgkt=QVU(ex?{$=D$I% zC|VBDG9CdwT^llF%aRVN+kbFRqR@nHHZWhyYlSd3m|G6LY}6MYB0fm)+CGtLx(}^f zyAc=2L*6Q@?w;!;sp<)7?6Pg^xCnuL5a^$JZ8-EAv9&#G<3E`4jhHxDOB{gKAOE(# zxrGHSEyF9T-%4-!XC-INIfvnaAt|Aq*6gfaOUUchQ$n$<T-Et~0YEoq;?p>30Cq<V zF8ggaH#an3<y39AZ$K5yzpYp%t)iKB&PPf4C0g5aJ!TD6;KGsA2b2u{iLkrodF7=H znxc{-Lq$?)d3k0<VHALLif`V%^zsq{)PbFolgz2z7NQn(Nr7R6Hov~!6~-2=+s#2M zTA7_qO;j%CA_E?)aP3t=*->TC_KaY7uq}jgrpE_6yWsctH<oqVVuf{^QZTFcad+z_ z#O~ecxg^S>Cj)v26j+cQ45^`1x0LfGVqpK|>p<jZx3OL|P20g|(~kQV*$z$jmoyyv z;<*rf0~_1hw~GJHZZ9o;0jdRLRUPiVp(ba{f<Ybz2Ca*`aPfE0?}VW4!Ti#JW~iiz z3u`}}dD@UyR8(}Io<Wmu#ftA^Vj?LZKLi5{i;H?JcM+SLfkg<f0cZ}jn{#TI-$yn= z<{jb1C+k%5?&?a`Y1We((Qv`Y=eYf{@|}1TZva4rq)3-*&{eV8J%nzYq@;XmV`Fj; zQ@!TnQK4B5m=>wUxL3THOU};MxroH!XPQX+fnpJrE0;UFx!H{iI6WjH>u#4NZsbti z-TKd_I|BM^)yZjm^|^8M5`xQ9yc&LD5tm1w&gGmA+{n?38gMf_1R`{Va>VZWT(a@Z z+D61@oA$uRn(hm2)1EzB!0A-u>FJ{2=TCsb!(+__YA%4QL(>No^u)qL0d{%OHv-%v zfLDu1u2x5E01belYA8twLWE}DI({V7aSh!ls!u}UPf<zb5%4E8@b*xu0)e+yHo#sb zU_;}JO1fd6nb`*`3lyp}K3@0WBcN<wd~Y`{4eoTC6<POBu7T~`McjVB02UJyQ$X_! z81bgH2>v=RJ|So%{8-d**`3xk^Aj$ay#wepP5<syR@H37l^5LgXq2_NhXPM1F7=zv z(dlCvKc0Sdg=PT&;|ECO{%Cs<d<kkk%6LGpO{$)IV=MgzXct8Zf##3{nd0KC_UwnZ zL{KNXZ*=}!|FClL0@h|B8hI7AQB+F?xdn6~QN7cEeK=&*OBH<1dpXp*2Rp4TEniSI z9(|)VkKJnTHQjYJX_xhtXy}t=<m7zws^4P@SgYEKnsUA@8ejv$T3ub8GuY@AmkV4T z>$<!1=jmw50%5<Ppx}J>>hc4Ny4w^(rOjx$>TV_B<ySh5w)7AIu;c8xbH0AgJaE49 zxTLh?4(9!I7Y(*rN5oU$SAT3Xre6g#Y^Bs8d0}Zu#8m1ZOEM*teqMFQSe%3wMsQ^3 zE*6{!G-3=hjG394e@S1te}gO#mfdFfKG*I@a`NI@<2lc`j+21dtft7!81F0~6ich8 zO}^ywK&z9oy*nc?156vQHJod^Tg&0;*uv)_JLn5QtICFI$2B|&cJ|=-c*oZwuJ5Wb z;*Lg~UEjJ&8YCfU{|MDuu30W1F(mxXZ@#&?x~6rFVH4w?6|~K)({ny2xDXQv$#?b6 zT%&L684l2}s>Xjb_n7Jhn=}vdTSxM*$;sFb&#Om}@zL|x-GRl<usvTTwldPy{Rmu_ zxZ+~w%hPEc7l1q?mqPdtFd%h7p$a?u`}(7ldB^*uUhOk87ctdZcB33%6%r7@R2>5< zIi6P&2$#Ke>d5^8J|utA>97+2)%cprZYE*%*4Pw;MBm9zrJr`^yc|_3+U&$c#aOJi z`B%)KMTJThN(G)i6<*gw{Qc_(Q@&$fH$V%O&WHV_x_VqmR1F+JK14$}a0F3T)ZS%e zH?Jx1Gj24xe1v`95B`eB{{o6IFfsL2#_0pjqZqW>0ZVPa&o%SW7tX`^3Dcb&tTz>V zwg3-(aT1zeDktBE1>S|~S_VwmzRKS6Jo|0MvvzKWasSRr9#ey2lpLt5lPbUA<L2H0 zBo`bR9}4LR^}n;f)mVd2?Kl_kLv$F8<|^x>0Vqi?V3$+A{}8~VY!n|wQeIr#7Y8s} zk;u%aEP@LDR!~o5K)(Jv{$O(ssI)FsZYkX=q1e$++A6U1n%#Ft3C$V*-0OtO8oInc zI%$AdmXnhQvsJ}czdS+85JljFx=6t|N764E%Ssr7MQy~Q04m_pqNT<Strepj>}GXT z@bW`6wYQ@<G~a>)Q6#4?T_{Qs0Dh~b141nkR>Fw|&jmTPQBPDHW_7g84TW9gCiMPr z!ZN6Rv770Z6Cv&OL?b39hND}|>`D<idS%jS_ZQr_wcKmAm1JC=t5MQ;V^gcazz39< z0&Yke7KmO@R!T@ph3aWwyjR|PK;?}s^cgBc8x|WdYYTL0>Erl4IVovuOl>Bl5x_Fw zCzeU!_&(ph1z*_j&j0X_AHac?>V*~_bgrR=#}KD^hr+uY1t4JyeF98**Jc;i9(Ws{ zfIbD;pYH?G#U**c_6RfK^dWfARG=(l*nBph`<V!ZB%jmPTRo^tso4a=%OcnT?#qu! z#1?)B)IW&bXaLvYEa83&3CafSTt6uk`UVe3_<#AD3AM(Uy-pv){{Pr}?|&})|9xCn zU6quSt3*Yzl8~$<ltgyO$Szq~$;$33g{)+jRUygV*<}_&_6XV8D<kuBoLryx=R5v^ z?+@P}UbpKNp6ByCALrw7AIEXr@Au=>?9ktcu3p217(vQnJa<qi932tw#l7o?)V**3 zpvw8pHK+Un{0=|>rsS|DoGJzI0L&Y)<lJWoI^7!Hx5~zz&%D!#jGIe;+`LN`?5r7k z=O*WF%xVnI{haf%HIczn^vHopb_*o|V;jR5`}|1MHOZT#AWVQGH6UVkq$_fVTo3p@ z@Gp}%1V8~TcmrR!hU%Ms#FULsOi0SgF|jd_q1<)rdQg7jTmJ><ODJkt={;XG9K26< ze`IV-4;_#TRzBxro4-*uA=RNUCm^`n4G^X>REA>e+v9^_d}cI+`qj{&e^dR62X^=0 zT);<=Yx+k9%PHPISRPwGaA*MI^5jv@GgYuizV5OPaq!_99bMvrC3ia(v!eM&+trJe zJ!QlAd}7=f)44Ms4$Qi33m&t7^9{53Lud<uB_8_v4Mj09&Hy$coUZPiDw0L#vkO_i z2r4(9m_@d7og9t`k((5z68M%aiQTw)8ua+)3tr_RR0nQ{+Mp^3^1ll12-LMwYVJb- z9pEZU!=?(pLMx6NBoyBSWFr&0eHZy_LK&2F%hYu55sPatDMB7XDd?W>9>o0*<O7@U zB=sZ=6}|{tGpNrIXhm02KEV$@GT8M7s`yAMQ{rj++yo$IgNLsgmGZhR$icjc!O6?B z84^dvck^YCB29i<s{+x3IG_*+2B0243(wOx&#z-R8J>%K0|8^Wc{z!(@zFA)bLp{n z$q;Ukw6(QSWSrgUBlS2ZBxm#HDCIXdj2Ofb2z;?M*~%Bu`Vs-s&n(^)!oph99JhKj zq(+cIOWi0f=Nh76?NKyWFqM$F8m(;nl1uOD=9N4NW=T{=l;Hj2zWZ<S{#Ti<qFgi$ zK!vvb+95F7^&hf!d?Vl7%a)o@;u64~av+l8pa%r;lofoF+wdlrAfPIN&7&bnoM>)q z!{`3NIG{-NfU#8|RY1t`AJRk|i#NX@F3&j;0@4~-Rp0}$2RqcW4(rhAY;Izfkj-`b z8;M@VgYUP2l5FY0L!m`OUfYQBg+I6E@c28Hb`j56W}FCrfh25DXw(DQ*J}W9i*q@| zcDr?)*dAs7prcR8i*o5NGIfk8C;VQdAH>%hncj^-_DXy}X$;OT19#@p_~p|l68pdH zt4zZg5Ej<Q+w9o!W#47`vJvUcg?|L(PhhMj<3A=YGw~lt$e@+n=d-V0>AW&D^7?z? zC~o(m1C2V5^Tm@G83YgsJ5Z%YZZ|#iE<(z2dyf^EiS`%zcMR`n@UV5L7YBju_WU2% zlE9<n=#g{2OMU<R(YL>k2|KBIR+E##-0={f@B8N`u=jT9I%YO*GNnk**=I9m_M_P? z3OQN6zrGm3yISu#EV{}Fhi}T!ErY`ak1lo5$d&@i9_Tl=ZiQv*QhmLXpL45gnFP6y zLemC4GjLtFqBpiCN#mYuZc7TlIsg}*#IoT?G0`45;vtvBz{A)C?FoI^04gE?`#riS zbWva`d=Aww6<fQP5O22LP*T#k0^u-C&`t{r3*t0~mJ!$_2Rkz^hazgG$xTs{o=cn4 z=9^b~OuTu^J#(|a`yS14Tnb7m(LIO0sO3bc*&GBp=z%REY;|Kbu}aJbu=@XFF;82< zV*_jkp#;bddz*dp<r{zMtPUF-=7eCZLYL>dmc}<+?NHDm47Gvk-2H-v5A?TLN{65% z1p=D*b}yC`*$UGnclE9$b?G}|F$Bo$5idz>0H6cYk)N+pX}jTb-7#?g!APMXm26kc zeF9zbjrP+Qe+VVQ(DX4v798s&E$~j05*>e~oS;83QdWN({dVi-%(iaM2tQ6#D|+NR zPVUv0pIJai$^l(n*Z*+O&Mt@8lB7IPKLXu+s<|DIl+=&T&Z9|E)g`~4z&faLU4i>p z-aLAZZHYHCJ`TK<HtK2hMP-J`TFXpUcq~((YG6R%b1_7e=H})E=Wh9z55aJ0J^6g+ zC-kOLKdKwavZQ1+Wy1gIBwXsIh5ietkweRp6)?;%SqA`YAlWg&TR}xZ98RE}x*Za6 zb>i^J6Jiiqvwa9*VOURD0ziW}8yFhEy{y|$alz3|AL3S0SLavFk?Rd|7|KlqSpGQA zh_2sdCI<fBaB2^__y3ou%Fa##Q58MMHlz@nn<S2d*tw#|%6odE*f<IwAxH#P08tx( z#^_pYW721mnwfwDBP?pqEt54Bcn_2;1cf47`f%ouB&npLDU8An0;8obv;2GKj{Af9 zs_FSQ{HOwfC<|4jp^zgXFTMuv$}L0*?@DamB|4mPd=<oZ%0xXAj&A_SvrOYzuImUg zcG~A0f`f}N*i}0;%9d;}oE(8aR?p5k%flmv3Io_yKu7*BBfo++BV18jAu5t^ZxF`? zg=S=M1NDbL)WuOLABXGxy=kC5rp!QJCg;wgqvemwh$J9V!v)<~>%<f!4~)c*zz0ar zu)7@srbdszCAlj<Ff<^5l5nofaeb&6+`1SOaZo+zOyO`e?dEOp*Ow7ZTD8gn_V)gK zN7rh`Aa=>t+By?kE_}Ago^sp+CFhV1URIZSwdx9Yrm}g~J?Pj0N`9Vu)ZUWrgTO0a z!;TPGcE68<v4R?_L9yYEo2&<Es>ve9{k;PC9)(RABA(non4Vh>7|x65n+q?07}~3A z_dLqg8_*dH*n~oA?j_bDefD??5iL~f6H3J#UN%D0W^9V@4+tcT1HD`*A_JIam~Y0) z(9-TgN9rR-boFY*_wZ3&V_>0odGtRUOo0#^Rv&gjMD$gX2rT>D!sz&-;5?v?kg#ZI zY-te()}mv!`V8;8J^h*o-Rr`_h+}%>^ZVwdFy_gak%c)R;-!z5m)9oIG@~`p=!<0} zrG$0?*&Fm1&+z2VI)VV)O_v<D+dr{K^n~L^sJSasQ}pN%GUp}PY(_5sMM73qD5%4O z6mk9uWWaKiTy>M6I6!;ZOp6_7$k&(L!O`dqfD?#xmx#$mI=M(#{c|s(Wu24Z< z*39Q103#+Y;RE2TQEI+<Ec)CxW8E@I%0tvwVYC#TriP7-?EkkGpr<$rMy<s{P2T)6 z2TlR0C8?s5S7XEH$Gf;f_rkJr@$v11dVD5r=6yyp;8ZmMm=+3=r(27D8VLeS7vkEt z|5La?=s|#leEC*=mB=zUXc1+b#IcpR38Hdgi%OSDGt<+%Vk&b6E&wq2W?0l0xB33v zl!@qu@^~o<>;Ti<I!jH|1;A1|<*h40%uX1Q+kGhRii=53=0I)5>C<dPTic3_Vzo^s z(+d;0h)8C)<;hKpRr0~t`&aoH?^{GE1~Y^Eh5hKCgB~!>k67#6m^FyI;N#<KkyG`E zO3cqcN;pmk@V^-_(H=kKqY|qRL%iu3%RIL>x+IZVEww$kO;wSOas*T>Km|oqzxau) z9np(C;3Ea!=KW94ZK+N6(c*1p;{StvL_!mKYBN3!y#dfe(nB6BtuIk-We@c=>L8|1 z&?T+y)=NHsvMcKwnZ&hzjg2uNGD6tC85u1-x(AQuQslCAYhqhA3j#tDX_#T;NJKOS zFto9;6eRu<#35&gXuiMa6_XIxfOYnbM`Tp+=pt0a)U>oJeRHKlpeK<Vr*3XRxx<^L zROasg$v=#5vc7Yo1npuyKJ{~Le^2H4YN&Xb&Yf(4!`=1?(b3;wWNoO#1YyHOOLOoU zqJgt#>xpQ<?R-1oh<0-^wSl62^+F1nHjFWmE#Mdy`EI2j%gaQ5wA(M$_Cp^J?`GvD z{gbOtHiMkHFv0x@m%?8QY(DOP>ELatmq<)t>TnvBG}UFaFVo_<f#sW<THNsYKcKsy zvgIp6K)Mw*Ap$!+BXHTO9#Yvb!8(VpxWUv5ThA*=2%{i69VolAMY_ddnF`Gu?N_>T zusD}ctR!MugqR@iJsxu~iyuXRWrn+I#pAvoIC$(fVNpe84sX5L24rDdV%PGwBpu*j zE!I}p(E<P!j|h6<A}yaC!O|Pt1dPTu15u>)-Qxt^M8tz-ceZT2(j%bBs9%A_R+pKF z%hmtZX#&Zm8&tR7C1#?1yuGh0s))jg;K3m_uiGD?<~NyEqoGbv{`^Z{Xa*!LXJu z_LjQ0gSD_In17m>aY!T-VGRNc1js-Z0zZOcQP1L;0&l*Bf9|%F0!$(n-S8Z;Y||cV zsG4mjJHDEjXb1Q<^a=X-`kr<yBdp8}Vtu5JL~gsed*1EYT+Q$XLKqLWQi!+f_SC?H zVD?<qSPI2O&Lb#m1=A1H#q5b7Df@=`=jSGvk16e07s|DLbISwc=2NMG_bj_{a??RI zK7#M^%Jlkjt@;FFMAT>^{xk+ZR=sc-861NC8uD;6c=jMdrGtTG^sS$O1_gdZ)fH;d z+Mc8lzTIu<^X5*pRJR0UI`g)isHatZE`f?vq$H3NzXSM(mw<v$K;wwk&P$^8+WX{q zusrvE{@lhiInwK?9?Oh;4mOR=0N&^J>8+z@{1tE-cis5__&OxkU<+;m9fTuC0HOw* z8F>suSHv@4m(|(_>%X?L$i{``gFS<QDy9twWF}zC8)Xh5ExGAccalxW3vUMj2iOfB z9zKk5yM%*}je??8L~P-gP|-nPNu4?Jp1HZXZ>kgt1q7nOO|N8mdMm&pL2hz0?+z>C zh|pQtz@QMMY5!?10Uu<ZW=C5uTy1p+yc;5ujt)Q)2#FBOF)}f8nZ0u2IS6BV`>W1j zLO*g8Dfao5#Eh@CUn)WkV+!7e;~oB&WdN~)Rmw1^MPk^u3!YdEu>>?POhe=2G6*yQ zB5b~f(6h5t;)Kp_Cl;Vq%a-GV%purO1m7Tl6*W|)0hGe4e1FeV6VBDx5&z60?f+Gf zy;bB=xb>tLwp_>3VX)8PcD42>hC)f=4He~ch>>k%c|l<Ue|oK8JiV}xje9$qJ=G?M zpeZ8X_H^2R@eE3waagv_--s9y)Km01PNQn;krn5qh*)fa>o>Ioic+j>n9xmmBdTzP zJY{Bm<NW%?myG@%dk^}T?K$ZGr0ffMtg>UvyCfB#*Ww9R?4%W%J2C^aPi2+Y_y*B$ zPm}Q8E$QYqKDWXkve;^TO8LOx+DDGo<{x8oxl`}0v=<G(*W^+cnK^Uu@+OUcD5~d( z(K^9%G0<wbj<plLXlL$@TxF|Mfj3aq9>h5>c+N=R926T5<KtPi1ntW6llXi6dt;7C zUQSX82o1b;U+Nr3Eyq&k{2Pb)(IBm6swy-mAoPJX?c7y-$lNb#JZR`h;8p%`BfhKy zw(x<!Bw?)SX&>L*$DL<4;w!H~hb9>U_s4g~#>O%-GCvOu_ek(!6E<@?%f%Hx{z15v zL#If_NbFRcT$Ez=$mnQ8y1jHq=G`kmMcLAbh{nxrb1`+e__^aGa%gcg^k>d_M^~bV zNnOfG^rEMv=f~WSy<HVY_4N9yl1HtWgoGmMJ+8}zUwmWQ`2G8vClX}1;Nv%MZZWmM zJR;&IB|^S3O5IzxE~iWue);m{1g@wTUwMj^m7Y&H*sW~GkFFmx<`c4zMxD<8uwe}O zuba5r3x|u!?e8F_v|1d>H0wIdzz{8!h?H=*LgdyxlBQ>7#@P9F$LPqioH^;;&*H13 zs95r*?F!>Dxlg6vu9WoZeY9PpxphEah;*`{rKO^)`S=vy?71trn+$1D#L~MJw%u(` zyxODfocqG%Nvg+LJjG>8ORiny$4_w3`wr25Gw%G5Wc}F1qb5-X3o9w0&Ufqh!{A_* zn>lOQ-JwUSL+$ZG>-aVwQS9&Z5BgV&yVrP_S5I?r7;OBzR#slgs`ngytnplRfyifk zV%uMzG40WMC2QbL1uLRM{{{(++k-ucNl7C;IU;Ba%!p@cG?Y`iaYL+T{Rnya@fYpc z8$CYZN5#a%@jkB^8?%z2(ctjA+9ih-#nMc1rdAkVw<W`^-6iiYYj$+!@1vJG%6UXf zuLw9!p1FGUs@Rm*(Dfhm#0IL$XeOg7vgj_56tmtz>Q2d1k{u9D>C)|jc7)3J_Yso5 zN`}q5dcVWQboA`|jT4xJAg?BN1Wk0JQ&XRR`E`xFg7!v<UC?P|JlCPomLv_a3bBJx z6!Maip6Oj_o(#B}nwr{;+Y{LK9<K6RYwd}2?#M;mv$zZcjtQAD6-Ha1IC=Wfc6ajn zs*FS0?1d1dreK#Uz(9&kc%9@B_65hN@7OQyGcz|6{Z9Ye)()5%xVE|PBeyNsF6=$d z6Uc2?M{)RoI39V=o;|z0cI$0?UXxmCX>3dw|FF)6R-MeJnV(&;bjPz^xw323X*KnO zzOrW){3m_n#jX9x9i!dl(3GIzhqb4qIZzcV9rC5Fjs-WmwrjBwr;a@=XSMFh6r?E> z86r<{&)09<h%vReUcAjk*rh2uS!?Thr+v3}C-seDZRgR}gu1UvETmq$`)7lyp)Yk8 zdgIt;r%Pw1o<*D#h*Q||Ke)1qh(tN>T1eaY>9U86ENH@JVytg!O#XP-g&;NHaujd- zw$6Fvt$jy%Vs1Tt8h+mX5e^-?kLEhB@Z~RzpEPjwK3HU99hv0!`_ZGn7U+J|6>VR^ z`d-iOZ13ou8uN=t(%L$Z4;&(s<c)Au(H|jLjAJwxo;zF&O8s&+S-Vh5TbowUZi>;s zb+4I5R(WYxbVI2fI&l&Q0zbnr(5i(Cd^XdI^Kr?}UH`p|-&;4geuakrt_)t4K(K>1 z&eFMLeYB&M{*p}bc2S}++eYK!kBjv!EiNDC(Hpu?cl`3(#j9vrc3j_aq9Y4xi8z<S zW%(>&!d7I6Ztj>Fx~3RQ%2zz*CH{I6yZv?#cg&mo$g}Z6ctTmoNi)^b{V_LB`N0zM zcw%$odI2FJai%%x=_NgtQBU{Ls2Kg(yqw&Bmm6v-Bdx6PJtpAbhUY!U&7EsMhpZy| z;33K<b{ZBxG=HG`m&4n^;J`qNqjb_YWd6ZMtXg=*YtlE>FVEmEE}wZ33)fdH_1^{K z6yuFXoBm;uV0q!kNJ&dAhnb`T{8nx0W@HNA6<|C+$G)sCChuWlVuDdRaq_|=jU01U z^aedc>}Sb-=8Xkg;)o1C+uAe&818P=l1W`FSIfxEa_|84<pm#8^MN0_jV-cb;u3xR z6OX+z$W8~1(rM*qW(Jmex_f#&J27nFo8I-K=9mbb$g!~V>-{E#@|*Lot$l4J9;?{f zQ4?e!8|DumBX(m4|9$i4&J1BbVf+WF4|%5KaMsF3(9r}+OG`^i$(_7-I{YZV`KeBm zruPcA`{LYnU@rg1(L^e#tE*$tdmCz=z;2(6KKV8G<rNj%!>;Db0Up10I~6(`kG5rM z-cw0vW{g{PRh=I{qn~eV(^zTF4s%DZEq0K=eLRN4F$kE}oc1H16;toMzx=uUe-zjU zphrKE+~O8tKh6tWc%zaKMEyO*P+K+m*6rJm;M_FBa)oCk+c%f&<<^q@{f2N6enYsc z10fU=cxO50U46^*W2-a6bmJWvWS8`6vcbM~n^hTHa_um2C0uab_N~Ps6W7oP3;w3j zH#sV&iQ!r+Rl#d{{H8~#se8LRj_$YHPYN`RzO4AfmX*GY_9{Qy8z}LM1-FS?Fz}cw z;?%KRkKGNH(&Q0Q<z?|TZnN6!5xik<?CX$evoSB!mt+z#ErtB^&AS#QxgIMORF%B> zfgk=O5?B;0GgfBL$<43Y{O9`<o2&Kz|Kk5!OX3li`0-<Cl<KN?MgsSgoI{AWw|7<Y z3*wcX{-U(63sw>_9sM1N-Ig<!7?5Z@UTi&b@PPjTxAEP*U%oS7da%!$w5xhm;9}f8 z*uFg}V=ZPHq_lK3kFJuPE=XJvxHnDmx&QH>r2xMmGdic=+wc!b87Ze2lbUd$fS)s; z-JZC2*=;-_quNbNCo{eD^M0|{@a2-;9giw^&2={|p3Xllx_jFyr>Wri3unjYZ$a3c zYV`Hw_|Z1$B_dpmRFY@1ruyffvlETRH~3S0@fgPiZDMi_trE?WJfHdg^;$2^x2>)7 z=h2_im2$_8M;ihS%)gy?9?HBQfd&ahFK71kIB#e@X%)D@{7S%TczXD$2pe(V_kZuU z8mheo31L<C6ECWBhLgwSA}{{A*19yGqw|v6j(mo6X0a>Eg*O79I*Z>z(-C#8Fp7yq zE?l?vhd_<a`Qr41lWq?_uko4!t>QNSao*wgug_>qJ2O8YG!6Jq^kSTKq&R(P&#~GM zI;z|1M}p)YWd9x*ZB8)lNcWTu;n?=v-~Vz>au<d>{DdUDM&qnsAOoxSG2R!)J8enM zrfyt%S0M7lo@|KAzV8kaP`1R{EAD&CD?4{tS<UTX>yJ`j8@mfHY-weK;DNAxJIc$; z6IX4RqFmNlQJ)eGS*-U_esZMvMAaMm?;~zKdFqr0#?c?7q%18dCwrNrOUuwh^EJkf z<(9GW&GwwlqwV^pL?e&kBtzh*wQ@t9RQpl`;RhSrhiYF|$2TdVb@MigbY8c4lUDA# z1E&m}1--O|9Jj$WE9V9SWbewe?XU1Tx|%*3vMV_E-i)ZGkS6u{JFn9x3gf4GM|-P= zbzI0FswWwA#5EFn>!<qrOvlZ38&O?Synm1c+@fyPijrEMDJ#j%n>Rl?eC)$VAZa#k zeRG^|fp3T3eiiLwB&hpp%+)Zw+mb9<FMS!ijCD9dz;VbTN{KAxuv&9kU)H}V{s93> zlc9A*OWv$g^7H~s)DOL=IA?2r+1)dl6t|fh<uPh{m@JfsbitwLT()V~BMmEl^#@r$ zuaCc3p+!(zmN;eb{YQp?0q?hamUg|JH+#^){OydB&dBPX;FjQ~^!TeLQ!S=l*@qtf z_@T)x6MiWnJL$c-_VJaS3)bUJGyf*>vB*VUkCcBPcD~!CyRA8=e{Fv^3pclt00$eJ zS6Y8X->-3xo3h;M*>}ILKAGd4oJZa9gRGgi!LsZQ^AlGMR19)w&3lTzWy;54;hy17 zFRD8j{bnW!U7xV-uru|;PjC=s_DwSx=+romak^0~&b<zv2+?-%gs9e_He3?IRU}xN zMNTgdv8kk@a^!CFhw>Q70QBzD@9lfiFuS=^cbzVXT`^y@gbbtm_(pPtF#b<XO$|vZ zx?8o`Es}|Q4YBiN3-Vd+I3c{guJvvk5rN%SJP9FcRrVZJEpkE+Luq*uK8yAmV4$Lp zm-ii+?jT9GxI;;O=xezbmGRII@9GdvB6mdNr+?EquiI5B+D*2+%v-R@wd~)C!?^8d z{>>gZ(vcrY-0rvczX5cE7%#=z<w<9b#ddwYjwu#)b|0u4Jy%zqYQBAwl##j9wQMu! zD=qM%WPYrbxD1Jo^W34i!!<-7tIykaS)oI_XsKwm&lC6bPhHV=`_bf6ZDmDWoyX$y z=PSFakMrMex)yv!LlpNk@*|$xQFQUF<*XPo&zeLFL(ADFNpW8q&zCQ$h4L2}5&2$8 zb4QEc-6;jDd&sCb@3h!u+_SSXoc{EAGqJnq9UdmIXqJS|Ccd+pIu3uB5V78yA5|_| z9%92#*3gTV=WswX$Lf8T+#aBGZ~ETiiF2o4;Hnrz-d|l;%n14B>ySrZzI`iiY6|SH z^vf`wdv||uezG+zsWTfD)zZUq5$%W5efY%-F5BAjQL@M|!mxdvlC6M7q;<Kd;+qCP z+FAF4^T{-CUM?yYp?CW@cA32sSlk^0gWG0iKFH|t51J@aWM)cAN*`2HY9~5#;<fVm z0+?k_UbvvHUPQz_8z1*rj0ijDnaZF^9xp!OXI+bJm<A393E<21d21hMg!ntEDlUq6 z2e&-7;N;^tOaeOY>Hed&v-;HncB9889(4%)&SU64@;NO~&xt?5)bvkqk_L%KJ5_Y% z35(7GA7_P?rM?VKT8Bb?5l#jyFpQ(s`fq#1gGzz4B(B5eH;JXDtdP|$&D*CbU+fEY zXN4t1GcgiVv_LB|oU3gw6gG?$wdOnhNpBck>8$Dr-RO4;=F}kn6rOAK5kWH=oS`1A z;kC>5o#aQpJhCUdCLAs^9jfbd;m`8YZ0#32HCWN)7_B!*s`eK~`3Wz1fI4|s#DD0N zBiCR0b&Hc9e=l8`5pxrto)6L4epYX2FIu#eJ_};QYl_8b3Kz8T#V0Nlciik>h94yi z0$S>4n{`*L(hbjb)ui|I!sPj4#L{R_Q#|XHo%?UK_vwer2uVhDJJYJW(wBJ=uL#<D z#tRo-L3^9}VCHr(r;aaFD*-I>%rMv=loN=~8KGQyznbDHQA4c<Ip`U!yg(-D;8VSw zm6a0eMNw8LZAJ6@8@9Y~J~tlj+24ibx^y#V%rXB|k35ob1__^mfI8vN4Gk~41Z_je zOn{|qKOrc%@<xB`*J=v=MhfMVeY8ABuq{+lZu%s+v$bTm6s!-8`SEZ&_)Q9tyf@Q2 z`Vd(s21X0mO&%k`wt&EA+s~=tjry?&A-lsQb-|HGjvT=l9omrs1qKNm;_9-mlxYbT z?n>M&!Yh3l_bVsbav#Gt3orj<h}B-SvQS-rXuIu3l1dQ%bE$obdH%s^tqXR<>lp7W z_G{@*N=r?DU1#EaKG<RJDM$KSy1Jjn1u~2W+C1|1jh-_v`6#h`($enQ<%tgcy7{IN zC7Sv4?Cf{`R~Se-a!mFIu4&6hUijLcp<h>D+I59`jP57hYs)pgN?+E+hNf6n<pkwH z_=;`!=7wZBwDQC@T-MSuGw*aRnDH!{%6;qLrRK4wFs5qUdQZcbZ{=I`6qQv}oI}+u zCIns6)jd)AbYFi*mdTl$>28D7A&u$!(nN>!oqLa5g2&}HsQLNn-|b6({%|=h-AhkT zSIah~h99c<_D!~Aaf9vDsn-@8MT1XGwF(~i7p<+l2nvc#6XNF&Y28`0a4o?fy<;BZ z#|=5II!}wa!sUfm+;~k|SNp$;??;oAnU~9_F4&FL_|3VlN(>_eSh9FOUGJPDXm|PY zHm?v4jvNtA&i$vx41U1)4RMD1A&p+RIzi-fgTBQ_%U<!Y7EdK(cl~v5tc6{_^Ual4 zdZA;00-B{&N!w{k^80(rUw_z!5ODb#w^q-@o{iSSgZWy6WMpKy&uzDz3cI{=OU7IF zVY>N{oz};Dy>Ev1(VX}2uBJYtlO4|gwD|KMvf)4DUUeS6o-OBVGh$gz2R+*_vi`iw z(N<*I!ES87e%GL@#-FeXI!8fAV1*^|{c#?i-o2&qbcz5aS`xKN;ZFVvEWGp4c96z3 zas4qimA{>!-<0dpdQsQlMpen`MpQz}TGSZf0j!3}AI?77{s|c-Wx$5(Q!2XEy;E|} z;-aHV8_K1tyP`ZjNe>@BtXXvLWnuopIsJxz&eX6k=?`+&yb>CFGfyR2aGv&`?8lED z5iOtN<Kr;}q#;>L5T+X9&;B}*je*(-L9|c#9xbsS0onJ42GLkW)=C;0nu7-pd`2es zwYr)Jy3oce;KhrBqN1YjZ)PxK;)K(iQahk^39X47RLNH6L#Ynm?&@D_)iPOEE6twh zTr%pA*sn!9HxM5nCVsUKy|d6@h~J|7&ZxVRrL`?%@4XU+)|s&pow?4bVxeVO0#Hp> zUJ9Kg=d^jP=k9B|zrFT7SM)VW$<L7FCQz&1%&^_p|G2U-&W>(*->*st&=uluEG;jk z8_k>?q_N9CxIO%W^5MLQV-d7!1}G=G-txCIq5(9<vz%NN@X<q2v;@Eu;NITUyibws z)<y~@aM`ztG{3VsdWM}HgHc}F^>i0>j5Oa5u<r7UN}=o7m=>y3^qZMsq0=)lseUEW za`AToHMil<q0y)Kb!23uSf!ZN?>2>Go#JFm%_;4|k<K{IerE4z=|v9H&Vqe9bUpW5 zO&UIu&W|+@|9;shc2#0#J#Z0&Qcm*m1<Pvieb15CxxG;SJTTnNFK54n--EEz${(KJ zJAawgYNnyQDKpVCEbJ(X@ndM^^%o<%H0uhqlM5sc{iM4D_zwt~VN<9A?pRr0^r9-2 zD!kat+<bq6MN!}CpE((O*F8Q*`8oL8BN4|Sy2y1|yMO^<hU1}WM#jcz5Xz!!n0$}0 zb31K%gtzxz^gW^Gz5fr9LD9;usbcS36rtrY(1=w`vzyXJbj`}nt`89;K|7-h>cH0k z_+@$qhV5uBa^EVH1m3G3CC+0lNyN{AOoLZ?i+u`(LC_l^%urI((4fQz^QVfci=0=~ zQjPxg{<D5mWNnp_PHycv_J1V1MoxW_Nlvj)(Np7n-41i?gTpCBOV5N;=5PJ{`EMEB zGYNTlzqfBO){KF$okTI4vs1iIiZF?U-|@k!Ahutlqv^N$cVc@R^&|_SBQt^9I$S&i zDHjSO-ka#;X#T+~Jpk+lNbLpNUmjAif4z>0ar+f&r05$%kZYZMX4SlMSOTVtCyxb5 zT_xa+{9Lxvzgu?xZ!N$I1_<mX+s{yZf)0u){g07|E}kvk2;Qra>%<iBPUd!dUG<XX zx}Ve{EBMCPLvwf?m)aBiT+I#?^IK2-$fA5W*_9`fdeM&GPCeV`D*`urlK~9?p!-4c zFVMB69HWe)s0-0?jkk;hfl65+|6qJ2Q6-6{cy*PmaAlqu;A~lpScNZbHRy?d(>?nq z<4i)5fB))!jPi+@k>MyPY9%VkkGFp`?(YfC!P#V%eHoMXt+_nwhnm5|pIo2s7#d<G za8yIQG>d5V)4&8js2hrtmVJcRmZvN8M3(fr=&FR>pOV9WjZD~ex15((RSj8WF5dMC z3K_MPN_C$#6%~~Nu2rAn!jNJmn6_XJ^{US3ZUa2L+QQs95+IT_DQvEPSLKE6KX&%H zj>>uoKX=h(2?=*q!NRJjkoBC}JcMq=>$7Z+pOW9khNp3@n=Ep}oAoB8<lP{@5wG|} za_X+IA;O8Pq@7XDRk?E;WSzmm!7;J1X{PPxVp(dns5rInls`LU{i}YPh)A)-Y3vYr z0q`{u_H#r2VPOfDHSl16219gq@7aSy@fzvq!J=x+W7x5>e|*@l*)`Cnb;G{>%9TZ( zk&zKDs|uM>!6p`AdRn}QcdmjF9$$8chg~2Jd4=qe%8s7ah9WIT<kerB6I5AGpFRno z!N9;E)1oz!vuOFzV|VhtfnQ=({{H|C$go@!_qnA*q<;(H?K^hvn8mvOYJ0<A;>x)q zqm^p3ZLB4w^jou!Qk*>3t-c*tzYlxAIarK35>0XzCOVWfHEW*fs8Afz=6g92b#(pC zmudRU*}G3*@+q0+bpNCeZY<p-lH`jYATN%8lXxigN<R4^^)_TDl5&#F6SrwpvJ#Ct z-?6`Y_wG_Vqw1pVuHx3N{V`wOUvpY@eh|MV?Pj{q-pKwt*LP%}l>Zzl8)OT~b(lZh z($aFC#~L$-9>xqX;%OzjCoX~~vNRrg>%CnBtj2I%RGhdE4Ud(%xPpRzgIT`5S1_Wa z=MfP}H3iN&zDNo%LJ}-e(9Zdz({s<Fs0Gc>AhjCk{?dHJ(1kNg{abf^p(X+ZKC=$p zJ4RxoGdIB684ot^ITiLkDK(V>u<n^NXFehW0&Wpre2-R0O9+)Kf&3GT!i~5nO4On) z_dzB}!)J62@F9tCw{TUN75d2&MtQl$_=8Hk6yg};?*)GYHw_F7ymw~)h=d<4(~3Bs zuk117$?uvY4N)N>62NZIGU*EXF|li8mZf<{&%RqvnVp>t{94_SZR`a>k!p(epxP)G z3Illz_7>Yt&|suO|J@2@Fbwj9xsa`;I!s%E=^93Z&Ch7w@e&yodOl^EHL3_OBk&1z z<_Z^d^}Q?JZ1m$JS29O3kV_1VyC(2L^zPl$Irl99>Hf{Hnj;ap<NEFyr(B&jjN%r< zL8-654xpTvJ6l!t41)n-PFYW#x&%;pU_k8pbqatV4&$?Ad-ixddv@~lX(`fq^i4x` zGbnX2Oee#HI_9%yDIkBkefu{4<a8Lrpa5#U?d^{!^OwAN^LVy>yFQ!SF%iq~%naiy z!)`~V9tJK}f3vV0e;7?eRYQ*O+=oFy&CV%nr3G|qAC2h0x(8HGaC33@uC(`XKd9H0 zl9uLWHd%wWcaw0VEaE@*aI!G3|3}kHdEs?2fuWRP85fIlAiCOe3lq8MQ=Lz+$VUt; z`S;&QQV$}d;?V8+6sbjzinHBk?ADRqsHIzz;wuyqnnPR9vD`7amaD8|-j#P%$lakP zTsYwJ_Fdaj?>9@mlZhxPx1yq(ctdCvDn)Id5UPWptnQPpV?GBgQf<4``7GMJ?KGyU zl53r1T`cam?^@X?Uh78fFrHq<!R}y>)4Z&{syqN@h6mT%u;H1{obg^-dO+ZbDiP;h zBlB#=4nnMpR1tN<sNi2sNL^Efb0ic@h>P@4|BnHbsH%92j0uF>y`dUvh?Izz)!iM5 zf(N{;sOo8Ferwl_u0<NHm^z*Fbs7vkilTOslBC)5rY{AYnVnaD|NUA&A(*h-UnyC7 z7CT(2@=VlPbceiO?md1n5OflJ9ej<_Q=5nj&d=D4RUfXnPXaCgBT5Pvgwz6zt!AE+ zr&V0-HvKpGnE$$3@Y`_k*y7<y;;Qjevavu+apX%%O0U5xu&}tl|Ap}aRm`U++Ts~t z_4d;7g-3Qdo_5^;r!cdB*03cfBarF~=ogvriwgaJ6Uj5nSa-cvFJ-)tq!$&(P{sVw zI@6y!iQVi@xqq&iU*|wN!wx|WK>%ti*QDJM&Ar#G+F>la?)r!)Af2=U3+9eVL>SP< z$i$?eu1>VKV%NwnL(4?aP?kSGZIhCcnx2`lfBWyzs;9ZAG}P1AFNY2XkVp(}A8oQ5 zkcA*Z&Ar$A7n*kbMA*7x$Bwhc4U7eag*Q`;K3fU&s<Wl2SU-q=JUiS?D@#HzDEiUq z&pE&vF{NzBe@#p6LI>~)d6A9Ze${yZh0zB?>PwV>BlDE&v@ir*-p7T40s93V)t*+> zk>7Y_93>a6UFfjGkMx~m&g5Wi+K1TozjX3#&0?v3Hbe!Va~L-wkf-<l(MQhfo<OXD zr2MbcTU|RVylG1jpT_sR7e;=%<0qg)#3e|Bt~xkez<Li14b9HD(@Ar3z;;VTR)tPd zeXaj|h5Et+BYjnZAlD0B?!8eIG0%?Pb5)@eV4E@nxti?qUr=EzFBBrk(0EN+5~r8r z!GJhB&&<vO<#+}AurSdXXDyJEovq^A+}g@=;>1IkSBm4uzX2D$Iaf);5pKUUdZg}g zRPcrvq62Ck-RJ2^h<<u4$XS58@FjI#Y_Ms%%S+(i1P|Ifx$V<iCNH(={=Y61+-SLS z&+&_`j}?vxV$aq#L@p;)lGI|)kS+s+{*!=h<&!6l824_RYIUtnfyZK8L7mB3RdC*_ z!Bc}N0mMRsf?t4~8`Xc@rYG+A8SPN9lRN&-avX3ZWIcEOBQtf7>fuCsALl;&(A#8C z<0(jdqn;umv(9WLPR^;K41d*3$L;foZrAyyHE!OVX^)Fa>kB!QsFfegR2`i9;Op(D z<kVHE^rey2Ewy8<DFB_Avn|?_6OHb-F7F%rgTROO$R&%xZo+@VWrX8sAqTxTG)~=; zbTiJI-p<OVzqQ9TRv}s(eJ`Z-`V=0%et5#bncoXj+>tE+pe}7L4+=_9xs8r%Uwogh z$OStL{5nvyx-6Y%H&$zBRdgj*@q3&q-D}ggO<7|t!AU9ykAFiWxu7{%^qc9XqyUwp z5#{1|zgLLfnQdcAbjr7gD)Ockd^PjApNQle2BpWlGs19$*Hr7^>C2-3$lGudTwdf; zZxiY}n$@2gN)AeUt@u6RJA3wh;3sEJXXmwDJIw)iI2AbGyKnvWb?QR~319f-Zyq@k z_k`vyL|1sfExO`-_>B6cTeo_ZlK=EW#aq!@8G^lRY|4)gldY9hcvD1qm-K{=qI%HO z{DMbL?kh{>kznVPj+U&noQz>4ZW(y{Fg8~=T9>Vc%Bb;uf&E43Mw33@-1&F9-Z1%L zcD0!Ag@rgfgn{|n>+tma@AN}z?_7l<O5Te8g+JoA=JYyzrXlo96V`Idz@@T1!_Ypr zvHF;_P(@^fBV;q%em;(;)4gSWIX|Q$4OabdjRu+?6F@4Eb*(&`&!vrzpGVLqs;BKi zGC%^9OfIBWD|Ei=jC!{D*EUN%y2Tl|hzEN&;ys%pGc$&371h+PflLlkad#^v{WUTY z<ji{dlrHu)kqi_StvmbmK!YgfE4OjCKv!IR=Pq*EPe56s*>3B@*Y&GRvV-PTu~i1i zn+i54amDI*w75@0n+yMgo|M6rn@WWaHuwugMRie_`Fz`n+ka*UH47aMq2>>&Mx;UX zhzQ`=`}+ISKIoS>EyfAwu%i@@zN~Q}D&pFN<XCGl9Tlg_<b7(9)uqP`SI+=hHy6qW z_CNQjU&5D$NEhhx3jjJ$r0{8jl%Q(hcqjCG>6-@MTy>QWZGM4-vf7O==rJgxprG(1 zgbAvrrszy3RX$2eN~9Z-U3oTNzg6p_LE+vbXCDHc(}k^Fn&~G+)8e{FAsG~%;iP@f zvoT?o34Iup)$E!*xG9urDNNPNvxAHtjU#f?wB<XgqMZND&R$Srl}=KbYn+X0OEusA zP3V<KgMhz+KjD=A-M&-BsEde`xQ7iA)p8&8UU647x{0&?aWdOlM4G(^x<MY(`sb^U zoXorPBoVX}Z>$TpCTo?VLBsmm3OMg7VsL{Thejjy2_~i|*v&*iFihb3`nucGr|0h0 zoGMzHB{TlB$*w)8%8p$jV1*WsoWQ8YhKA6ymVZI?(%&UHHQVv2RV~BTr$PXtoSK({ z?m(dk@}$jGx42?Gb^0uGG5<@@Cxm53GDvb=P3_B6g6l9Miuw$BdEupB+s(TR;=?m6 zHiUh~H1l127DXOJ;UejG+FukG`h|xd6JA?Y0?$$YD=k{Ua<<IbPg-8y@ORsH%{*(* zzsaa5E((V>G$;~@1>^%k{a`|5r<Zi^TUimbqvMsugH%)!_yMv9LQb_T(i#%RGt@oC z$iy=9CnRb!4Jj7XrWOni3#&$YC^_X)Xm9vikTK3E`SCK2=^ul<M12mo2Yif-j2BbO z7jGK<fkLzbYpKp_V#zSPQ_yz&=QsYII{<u<juRXo1f16sn&F_{rlj}<2M<*iNyUol z=+F^LS@`6I1%nbd(x&teOk10ja#r-|B#<Cvsebuk`RVNa>N_)rYu*7nfrd$;wTL6d z??D7k`>9Ink?to`Lr(4x%t8fJ!CCJIkZk+Cz5&v_`EhaVLh6}{-86ira0&X=>1WoA zS-A~rKlRi_f#--;j1S}(K$TyE+Q}WdpI&c6$gKG)_w3*rs}s*e^h$Rn+A3Ji-(x~1 zoE(w=RwZHPZhtvK@T%h`XaEFqhXnOMm8i@Kk}9uKW)rZVjk&Ms;vx)MrWdh;nz}kc z9Uvyrj?{i&@9-uz_9{p%yn?%$uFWY4=Plo!nT`^6eq~|kT>YB<@mYTUIJ2;9LPc~~ zo8801`)9MN_EjtsohzMhEUi*<@8nP|)JDjjMte5?LXjCOTK@kGvnZlJb7uVIo*n?x z(eX-3cbnc{hE4^5|3HLY_pR;%`=(^AFw6dm-l-{^Jx8J`PljO~Gb5uIX%oA8<|WJ+ z<mczF@T2p?kTdkHF+f%3pzjtPyXwe!XK@z#tLITs@})cX@n$D9-+ffMgUv)212N|Y zTXkkz!YmFPrK(<dK5<M|SSp}G_JLzrCyC68HO=LJFM|{RT-x<Gr~8bF(9|`F!90x| zvsn2l;VPS{<lH|e)^x_|0GIy#>0S0d3qOZ2xN~{nPCUM0LWX?kmujkszV%ZW4eKPb z=m^qOx?c_Xn8U)aug`n0`~vxet+(G<4uM3&M+H3&ts*giO>_>cg_vy~x>$M<wkW=7 zej%dMv@7!v7+r$R$Qo-66)<6zJ{*)a)S7rR0A9&I{Ke{xmV8t`yQ9G0aB;FrOkDh& z^{?xIo{dmrl6$y6?)yZ6de+^xrfm9Q1M=2n9R|ch2oGMoeCY|?5p`8)q2o3`)*28R z>VakuXnDI!7nCj|3k%Vk2bUaah$Xw5^=jWyzUP=$D;4_|Vd*BARJ!v;KmgjyyhG}U zfHM_P*oZ9$!G*u0I%gdh8w+RTm5Y|V&L}dda^3a!PA=?GLMesR`EF~nEY>`5?YN-z zoh}a>5^MV`GHmkKX-b>xG*+rp*<DNf@XcfQb9a^~vdwzLQz8qG@aSI8jg?zZCP%J< z)VJuznK7_1NMY-9Ha7m60Vs_4Yh#yu^zG2lP$Tc7eqMf8BsARDA1||Y5(6orc&V^Q z>VMv~cU37N4rSR9%(AcQVbBd~LNCk7kt2A#1sjX!`PtVud!r-=Bsc#4OOe0qa<ert zOkn6+*w?D65*Uulk9UH?^z`v5N23YMSw!a|$!phir@GU%CBeg@=W+kkRLX&1_+OyM zCxwM0;oR^?tgNh`Q7aF@K8z+o+QO&&ry?L$t~EiGK=PoXt7b1$1`EAPz{w;?)d5Z# zkLTy>#42vnMH`~_0K@hIeeN;-#LDunCx1k0hO=B!zDGOm|7&%-TA?lP*oJ0Z)Bd;@ zM?xUz?s6Vme0^ax2rm$jh}77!7H}HZCJA_{Y{i|Qz$MZ-)UHLAcX5r{HJ?pVNUrsv z;XSR|>Zl_OWeA6M-Zk*Nw7Kh0r+%MIwsC6BGHF#Sbl^p=bNw=p1E`R*M4E?+g&^0( zNU<e89-f$Y`m)J}+QX0-qPxU%5RYuP9H)PNCWI!W4L~aI+1e6(7aBf@UbzAYmFdI@ z5^nB{`})v$J*E|MI2G_dC^(qtP7eVA#xXE5GZS*(2M^AphYfOh$xYeF`Wvhn)P%Q; zjK0J-##KF;oc6f4^EVwyV3Ma+in$P~j)BgIBEevlP$Xn=4-po9%=>tHc=XpVV5<Ci zHWL+KJ7-p2^#pMY0uU;gAJQQHm$_j6Z73;>npe^4c$?!GBvu)T<Zm2Nl~_@m?R06; zbmS|zm^<?+33QG-e+RRx-#@iLv9`RhUAMGiAI(ZqVqzd^@1&4nMGbXT9kRh5yJLR} z(ZP~n0AN^y#+Y4OgV<C*LMusV-TLLq<~|^!1L(C)pVJ8vU<~9<OBZ2h-*^1@@x;VL zo?1cI^^3|0D&-*c@b8tUw9;hKu$u~L{3jwcux<Nczwsv0oL6iyrMx=pp@<yuCdv|@ zQd75{yOtj+Zfbf4Qc*^<Kql=3JAz|A*J)9Vyz@hNf=Ys<l+;N?5-w}YU_JaK@<Q@^ zkN*7iJvvc6OR9hHgL)D(ev98UB&c#aER3`EZU#SMoOgbyfO2@SLUELeK#7AUuvwip zN*BW~+Pr{V0wMLMRl1?=pa;b3XoZY>(uDNHedyt!z;vhUb&`_^uMg-E>J~ezVTU0b zm1Om=AyKZRmvSPz2#^kTk^syYB>d{5J0BPCUMpI*gDBw{&L-is)>x-{7Nu+2zU$qb zA3F`zM16{d2vQN^WTIx=-@?Z!#_)UE6^W;XTzioKfRvCk)l95d4-qV?k!TdY{lm?& z2^LjyO75+5{=!~bzR;W=`=bDdK#eTcbG2C%tut4vo>3iDuY5;{g@E&)wJZ@Mx!r#o zS_c`?=k*Xw@xJ0Qdjziu*2|<dxfdfGKIo_@U<1C@drK|gz$kIh@6=~OU`Q%v8V9Hk zd&b5xApsvi;|Y#MyD^Ypv$dU5H!93Lhp$5lLD(T|dA~zN$nef4nM=X?5PD~@jE)QA z3MC8A>90T)dK;b*R^b3zBHz1r7EVw_Jx}>`P(y>6@t+5j`2rU%97Mm0?+r-^8iFT5 zp`^O3Ibfmn<B8sYeFqAjzd5Qq>ZnA0!ReHqgr9PrN5YNMEh$=c(0qNVtsPoaE;f;I z$X;%3KBJu%>b$aeOQSM4^vjXh*nFVsrfnbpg<ew;t3o!+$@ocx<kZo|<A-U*p~yE+ zHW!l+W9xk_J<I_}>(HsOyK6}8xt)I9b5UQXG^~y6t(<a=*)Z8Sx=YBR$q2^gXr~#V zqaUBoA7;NPh6jcGis&%Ikz$)WB{ViNGK0^XWFEAgXb6H!Bhp$TLLj6`uDwn;=G%-0 z>OD#=-P;Qd`BjrOw|%Oq@usYlBa&Vsv&_BCgu&<NowQ9~??k09wMOzdo`g_@;80)& z&1dWt0_>?=Jv+6lJ8ZREWLfALm4vkz5Ba|1=j}%skyYK2nLd(j`a=}%`j6fko%a!e zN3yQwZ{NT7pf7z&agq55G?;^{Q0RMlddHUuQq&0=8XDqe%O|_?c}sE<5)x(wtcs`2 z&>+W>chm7h*#T0>?a32FI{TPRvHUQGa3i0}%66R6XsGGxiXcCJf#RQkh_-a#==_dn zPwAs(0TCE_#h&2cAXimY1wc$nM#jL$hjIi4c$k+$j(m_G!;4+pw2`!zc+tm=H_%3T zvOf8We(P}j9tT#BwCKuN01}>Fex(^%EaiX7_lqc8w1k!X)t=8H5#ZNtx0?6BQY-iV z-zFL+zH~yqAe2djH)gGd*3X9|gj5BGAc>=q<B)S&`IZwd;P^DlHIZrk`bD7GBu?|+ zR870nZ;IwTc>jNr!P|h7o8aEyEQS9JQ0^o@_Qj%j?H$+t3O7<p=#PF@(z%v(bi4wv zx$SvmWGzq|0hiVDN^x?r0KS!!8t-ouwKrw=f;)xJe;ybphS}2s0s>Ocvr<!EqX>YA zY!IbD#v5_L<}Y0&a_~0j;~w;~l1&O;R3qE87d<KQLv5Eo`dGI1Ok+yOpfO^uKFfqy z$FDUtH?%3#n$uqpy1u?A|D?0IVdx79=RIluPZn&h(HKgao<RQ)SwouPFfHkiKL2r% z)F@>CK~d~y&V-`9BN65Uo-A2>%J%O{G7R;7tHXps$1`)!o*7jj({Ite<d}%dv4<EG zcYol^0c5|tc@dC4UI(uMKoHOTQM|1P8Im7hHdej&{AL|)Qn88#46Za+P*G?7t0RjI zy;+gurNh)W-JN$HGchm_hcVz)FXD$Tt3_6Wtss&}oilztA@5prk%a!}xyq!Jb@5=Q z+s9U9NS@e$06x!y@G)`Gh)yfENoawhq`oOWK3#aV5J72KYh!Us8=v9AG19KScmzF) zc@cJ_O_J27cOU`0hDyhguKdOAb^P4i(I5gaxF$L_R+)89=SGTl1YTh;I8XG4tr-5L zBXItFeTIa*@Y=YNc~?QKDJLtd{rFdrP4Ur5W0ikIS6M>CULr;=MOZyp_MOt&B`c$1 zoxjH=!1nUQd8>uJY^q6T?24?E3>PG(T9>Tsf=K8icXD%cqrNdHd0>&qie`HD-!?bb z9-)+b_3D-I*?X<;6}Hn^(7oa@7L^>?Fu3IR%=hGLEs}jl`3Hs%iI`Y7ZsJ9ToYvB4 zgkRkMjlcUwh4n^r9h(cmA~JYNv}HRV)vNSlI(7E_j~5R`Z)8JquUP0XFCnZgElrlC z?xUWR{7D_$@ZF}@meCdHWT>Qe<9()qp}xNVt5?r*qWA%xA`m6iu1?GCaZYHpx%Yt? z$%PBEHez@;bJFV2oo^U}sbhTLbau`)R31Usk$P7WGxeNX1HU9R_~bndZ$iz3dB8{m z;M3XiFD&Zcz55KrH9GNp;rybiO@X-R+}$Pu;v@!vgW1ume|<UAq}3ND<(BE~n$%YJ z-ukkC0c|pFW~z}Ivv+Uqo{3th(6E@kUl}se5u1>1)?4u8Jcg*QjP?**{q=0yoCNoT zirnqH_TDM^NGhLIBzn;o*{$`wwSb|m@92}}c$cy78r5viz*K_8XF-S1f=+w%{2@Bc zD=HpjQ%O8QPrnUSj!*X;eToiFXv&bNnfn5vtv>q<f<B^&&NTm1q9gZg?=HG?MxRb> zLKQQb{_?!^W!&FjzU#Z*G^NEWnd=}w4PcS0_|`0|mmd^#XyxsKC5kjimKVq50c{V~ zrYOa&@;-TQDk&++W7d)R<1TrJdPkdKhtgZ+5`i$Q8+GyF(^>$a#wW&eorn3rEJ2{} z13Q6WoVcs9GBGAoexv$_MDJS^e4$_`&;*FQe|Wez8YrX`Eq^#zq~khgBfPT8O-g`L zk!-WZ%x(|f0k$S)n)EoM{>}bpkvREA7<ETW%V7<T&OPrVDCE1bY1*<(sL;2MrrN73 zR_lY$T6r8@5jth0Wn>Ys*?se&Q|z6%k=5m~l$e+pT}Ucmq|oJp3FaMp9MzXFON?Ax z3VNmvFl<KM1p<&`;r6~4IXn7HJLe2KLYR1v5c93ZeT@qx1pnT+ph7U!Q63`-;J64` zjE+USSxB8%b@Cm3cZibsenJQc>v>1tkoDFI5$0(Zz5<GLJx=a86Po%+5TT)eR8(EI zS?4_~t7xr!TO!XhtfMvm@$oWnChTr-adRtE#a1f|X4&Rl&jLO>tN(8;0Ei68$dyVK zk1}-E8~tf%Zg%clL}x0|8$4TO4wTc3hDR3X=gYr*@z8Pk^CU6xjLY%}3k~mGFnHH< zZyo3`(o4~km(;#loioCvB=h0r>ez)F2`c*%)K%{Ed>MkJq`Bn?wB(qetqf@=j?SjK zBT6^|A+D~O*|(pcAGhaPu~=GK0`#emS7N~@b_L2lJdY+>pfL%(4zzVdoJAxkZf-j+ z*p6Q-c3I;oSuAAl*;>w!t(vZN6ch@f*AD<8*f|k@o6H2|gm);H>8~U_6v{sL9_8En zFf)^f$&HP@=P46NUZN4Ug2HzZj#dnnK^+T%5CSYF?X2`Yu7?~u=H0uynWhp~uM(Rq zDvA!Skm$e5EFkc5s%XWRcnGLKL1vPZZ)nWcp=Ur&w}ThagCaEaOSpj5M@XP-Mw{qC zWTHhVj?)zbgLf5fCKg5W@1XT1g7Y%hCtLL>Iy4uoPl1v<xy9wdCF14VJ_)qxD<d5& z4q?|2$Gb9aO+Joyda2#bq{E@(A1W%PBz0b#gi~kEIQ_CgsrcE1TjCX2dy_SD-?~i@ zl2!XT1G(_?Z`>v>*o;yfI#ixgy#7Jv`C&RbKY$CkA_MZf(9k33DaBi|Pzc)kS7Y3M zoCKn8Z;T}6XjA+ZYipha)f5$GQ5gh12=~wk;C}B4!0oel>M6EPnlVvu;wPJ=VzpXk zIcR9bZ3WQ|Tbj7&4RT~g2(PYs9cK6N@nPcO3B2M?uKXYufCY4S=UmsFfTCSPm=Y+t zz4<OLYH%RpLUS$|gk2pS9fQfp8n4*|j6%~p47f(BP1v$;M`yNKe^a~?5#<9*LBlt^ z^wmGZQBVTjwT|aRqDoKyFE%To`a{xH9b_YdRLXj!;Rz5-K8tQ*=)oy=_U4b3F)@tk z85z{)@0~yoM&*)4Fb&h~R8cdZSLn`KPha19I?2ta1GE2}SvKr?wD>-h-=TN-8>kxJ z$-H`-=(lF^4dntD!#6$g+al`AyxaTTINLmTn|4FFO)&q{g?3ZjdpHG8oq}|Y%yy!q zyug0$-o1M#pz2_7A|^pYqe=)KQ3jVA<VXfU!aIT5YGjs)KyBS7AUsXC8kPe<lH@j# zPZ^VRGh-)?|LWQrrZuSKy+~*tU9n}@U;*3q3usW1Mvh8eL<j~ypaTcY0MH{AX6C10 z*|6B}zfY_t`CAa6>}FZVjLeIAcDJS0Z1aw1A#qfoi3xm}G=RCjP{R(of%W;U#>Pg} zgN{?akEJ-oa`NOO1aW;66S4^^N%hUm<&BM$c6N*RrCpTWpsV=)UV*{)xS;s8Yr7HL z=>g;#7#PsKt;iSu3djZ?eW0thG~1UQxx)#F?@2r3<RXY9DO||$FiJO`?xlWPb9Q|z z<t3<A2>+z0mj8>ef&T#Jayq$q-y&xYWwAgr2!XYq$U0(63dGr1p>G%;2!p~(RWxPx z$K~M0PB6L@8!F|llqjV>3t6LRD~DDt*j4z2s)Y&qPN1((?Afi<9dnp@&fMrP05jIt z@?#$v8`)o-yY8Q#Nxk0<BC!qBN-}LSN+9k-@q2&JKwqB=dUYBBKE*0%Egz-3u9y7z z_%UBsyE+`Iap)*K(k%d=6NMy%Ks+MPCUm7=6V(NhiuYfLQ&Y0Y-+{J<1c!L8Tvg{M ziVtG5n6&cj=-Jt21+rCpv=f(Y4nZ*W4)q5>*A_S<KP+(~qa-+cq7^4f+9?klxU8UX z05gcCLM96eF4jgSwNYJ@eZ}(z=dG#^J^gOCr|Z*fh=ATzyng)>dcTt(kGl2!?Nve_ z3rCOTE&+!}u;Dm*C!u&pTnwrjs@pPncZ3t@Yy73ArmUf1*7NU4$D3+u#5e%g@h&?} z<@x@~nbs$coL9CTXxC6U5dQF?=fg+Oa&!7PxK&GQOs8U9*zAIbw2hPRd!5rfVJ@ch z&-JJ0#Pt0HU0kQ<2KF6esuixQER}drG3-=3Lcds4XDDfN3eX!8D-#nF*rIwP9&DcH z0RfK@Q6LmIXo!)7T;Z&F$$1(c^H1_*t`4tf#vh&7{b>4>XFdDwk}F<5UixUhM6_Q| z>#uA`FyxFkF)4Yu!{PVjXD==70iz!ZVDB3Kl%tod^?`@z4KO>pq)IJtn=x&do~4at zth13L9FGy*kI3oEy_wE$*adSY?hI!~0JKrgT@San`WS5EQ<%T_!htI&rFfMF>O7L6 zwex<)-0x;aDx>Z%FBx|%<<KXZg#ObVp!C8X7)!iPu`riE*WPgvie0;Q1#@Ve4$`@P z{nP5-bH-Hl<PY}?FF%|wPBI)?<n|Of=I4{OuW)(cMa7$S7&IAsyFC+sbyyD6A3%qE zy7mmJNLm<Y)3(%qpFgJ{;<HTS#+d1ekrB@)PyQBJ`%Q`C;+G_+o)iqrhEB<KedS(X zYinEDbx=Xm5G$SFHqnWEXZQa7hFDAVYDqKe<jYiN2V`XM<D;b?qv=KjuC#sUUftP& zuOIXBi1Y<q$`P*HJD{9J!`>@#MLDH8z(x>v>qC+4SKv#$fP0*89dl3Y-fxBxW}&ZM z-CtX_Id_hGX>eF4#@Wl|rWja_rKM88ZA%Md76c|rM#X-ogTHaf{(GJEXqzX$w&V7P zXvdf8QtF_RqV=t8hLVVVFfsu~{>S|CSJtlx(}}o;z@_h9PtCOG@HUo-I2Y7i=&*gd zoh2#_V%mktPU%JSu5CsTPEE-=%U>`YnD+Ok=6^cUBPYQTl7WkBYH7~QEW9Zw2!EMj znC>#+aKUDL$EV*Gae8JJve+mnM%i}Bec|{6vl0{DY3nD3M8OI4>9K}&k%>CRpg9&O zC@Be}iom27s|#y0oYoRA8NdwXM~1`vT@KBU&>aP3PA!NT-MV#a@tBvhpc7KZ8#k-Q zEz^(%yKbxlP3X!Xmx_Hs+vRxn!L+V=j=4{8l_QFLpqAQ`tLZd<V8>+&TF&nc#HJ1t zu@hEsjJ|gM<)_b~kAKrOMM17W!oj4|K>C@4{<vsN@FaZc=y*u=Aj-ik!3XRrf(0#< zy?_6liml4;ksfzv|DXWXAY|mh!4*VXB%jCo_{jO%1ls+fBD*h@ZoNKnc)U}4eD)-^ z4#r7tOEvv-PTcnh>7~)Z8&%cS_WI*&iZ6YHjv|e_CbynY^U3z#{hF@5e_nq#I>m|M z4_|1{-Pzsaym%bjQ?c3(hMHJ3_<FxAbEu8?U(5}aVZOo~pqxJ?`S;|m_{WOzF<J5^ zI4hUm+<2|1Y#UYg_1mrAq2JH*-+SjT!4S-$b9#aji{Msy+0Fbi#oZf}i_ARprd23; z+y+J~<=lae*a7L#R<4kRjl%p1l-=W}u0KuqOgg;R6jlW6#~HzD{2p%%2wmesYaqo0 z753mW>LppfO&X%o-=2%tKmG|#^x`h&YSz|Izd56m8$J+thrE*3z-Z|@$>^)rzjYUV zyDsQ|kWyAOx$rQ}-~46C-2bBKJHWBt-~Y9TN~B>#Q7R>6WJXdXGh~nKl##tj$tWWv zn@~wYwz78!85!9mWba4T|MfZF-~U|4b*`h*^L(E7xbN4xWfPj@?%WY^aNsjAFu<Xz zi~RG)TegK^CU$9QDVBm4C~4p#8*h`Hl+{v>q$s@rFRxj?+;SsMu77ga5944tuF@R- zxc5zl0bPILa-UwyYiX<ood*wUB@?u%2GkF37qS0zWAw=OII(DevmTs#n!~2>v>`<g zii{*zbfxt7_j#?B`*iEm4h*M2=RihCKp+pey?QmmepE_cDH_TYGFonviq>-qvk!(V z0lL4e(YKyz4R;W3NQjTW&R_KDlP@SJr`LRz6}MbBhwKdNV{XFD^loZ$@$b*_>MpNN zE5q?mr!`bmKFr$<6c5|V-Az*DkIRSPCL@Cb7X*!vGq2?93#GUupoJ40W9<u7OMzuP zFev!CyH06vs?6cN&z=BsZ;p2$=Th@qFkge6$a%h=2gE%Y*nGmD3Fq4-ZtizLkD42q zoXK&H1iU!baSBVG?y4ad_zR+gz(E}dZPR7j?<!<se#a_3{pcQ9SjFkx7e`c)MCj*> z`}QzyE%_}GOw8)IXm)XX*8Y1ij1*iM;7)R~#hY@Ne!6^rtcMEK#g+A(q+0z4lTW$^ z`uneeFS+$KtO8*vG~Bw>WSqs363bdW={dRY$6sg?bO$T{^KDJL?stEf)tpXJZ85ax zn!VRh!1qZzU(2X(@aBs#z;H_qOCC0Rhd@IRpAe!{QB*&i__DVVAO86rKc7F}3+)9& zf%my+0bW7)kJE7@L5p5C0wI{GuTw(?x-LI+bXdG}&M`yt`{BJiru=%|DVh4^%&lnU z+xme6%6!;<QA%2RtSMm^#0zMYE?NDN0z~c)*>j3oc0BR;IP}>4Tzwjg*P;T1*TUik zL@UG0MGkI{tMZXOB64tp`<=XmeuZ|O8}jn{e~)?~<10%V2cq8i0f66M?8lgbd&Ayx z_IBdq6kVlAXSZY=qZxB1ZFprZtvsw@M!q$M<UTq%wlzFF{AX%DUHbVadCV62TJ`$3 zNC%;xd20}X76Kv5XAt)g8pN)1r~Qd)A2AEyz=x=g`tPlueyy(B)Ta?n(WPfO{9TdU zrd8nzM$j(^Cxt4cr|0MlJb5PHuQgXkMSq-rb8Lt@#sVA2Pwc5!LZDiKd2SIcoJ>vk z-}=<Wh~bhWfH2&BtUa~EtbD1)sULpJUUWWBy%)>gLo7Ki>yx6I_8LBkPwKh;IJ58R z>Jn6`anDz7!pVV~6NSYs1AHi`Rjc5@#ULboP+$MI3ZqCjD7O!22iNG|Ws%5lx3CjX zij({CMPbD0b<+nOW?Jq~uC@kf7{N^0wp-yt!zsLb?4Z1XcINx~DaRP~Z9Ltyd3W<0 zJ32_IHcPWhUmoK0n6%}w!W&XcdH?CtK3G*u-6BMnQLC$D8tw<*?BU_jE$o~u|KUuU z*PehY|Gk@5^J~vOK7r=woCz?iS(L@;=6ymKL`x#QM30HSA20kAMi2b2={$SY30n&@ zU12CCdZ1UYsLRUAZjg=;w+YRx1k-NpG49_>-}``0!1SPpdrbP4ZJKInEDLxwut<Ah z8pL#hOPri7V})Bc8H<MTWvcM`d-_{j<N5<BFYAU|?UH1T9nR&>nM>$^f{6rHN_qJ3 z-P0z0W}V=&P5}~OWMqT}RSfN{x4(Z?P0b!{ZS9S<d0C<&!L|lL$AaI5v`c=wsS9Pf zs2}8pD$aQ0zb6!NNm%@CJ%=iHv7{QLLR?~^m&Qf$Bt=5xaXs!De$+4J;NO;ffUBUa z(6S$R_P|SfO#x#QjOPE;>l+wYtjrle!HV&GZ*U29{QC7*Ytyzax9B+@2ap=ZfB!7M z&|_#ET;yL|hrUwhSXo+<)|dOxN;Hj$rKY7dLbe0V@%7}NAZMh|#;AU^K1YBQr%%r| zOR`_ajZFr6v?Je+9oHpjVkjAj-y-f$-^8bM#@TI_kJ0VafA4E%+FSMjcA`k0C=fF2 z9^Ye^pZrhmxO{Eo-TU{Ju)2X7xpS5pmsEVyeLUc^)O&whI{2}dFILf+qiMf+<HmNl zUlM@_aC5xanB=206L4C(KzPbwT!$@+&}ZJfxdRvn*|(pT=N?6(R03g`sax_CKaRIU z08?46*~;YLomyFS=9tn!h581qnDuzuetc9!(*(;q^3s@2okH%M8YTJ)bp4QEq09Dy z31(<$D8WiNE-o(Xe$x|l$`+$PP9C7=eN32fot7%Px*`G3DSc9Lhe;B@>wmk5LfToE zSZ`&U<4uLTpoh`Lw!;7wDk`e$XrVfD&9y^LIG(|@3OvhWoQC@_@`C8mv1=tcL(hlY zK4;(lwu`L@H>*4e^d+88+o;VO%K}^q?OWjYG=O;m9R49%TGnUgkI}fGTP5z3w{L$J z4X9rX)icto25tVuaq^=~M=x+D<SM6LG3iT{M0rARS9NtSFaZH{&KJw!y*Nt0j&E{e zSA+Gqg{4a<a3N#)FAX4^Q#`_+4T~LzExIRi%Ay@8O}v=e#)z%uvDqHyvWrUgOorhw zEe6d&1!IU+gRusKQ&SD!0-3RPk}P9@AWav{9{@f$2;fU9Mlc+E0WS6@0EMARk)KJe zc|8U3M%>Q_?`E#r{8jvwWBTHH+=ujs-GuoXzhY1mbQ%T{i7sy1{b<y|k^sfO38_Vh z)vzTWLXEx+TQ+kvV-m~Gemo`Y=jXCQD>zuTV>?#i^pM65sX;sukjlN?c3RVA&&aW; zbqoydzOz|110@TCZXCQ5_&A~LN`4jj>Q%+c{78~=8UutUX&NJ46PxWTW=w4>#QUC- zEr>Zxyng|x5ij5GKLJ+1<m=)%2_{2pwIZNsb?|feczgfglg0T7^BxcjkiMq@Mtu8r z3lE+K;3rHd+zemc))$ol8bM}V+R~!1x9>Q=HSxylV57JtBSWYQzDM!|5CFqF$)m;- zxnc>ZJ@(-^#k?pyfLE_WbX6OJqPpqj*%NQGb>Ulx%nN`jKKk_}J`WC~2702g!vz3- zfC)I1xA*Rbn5!?~NWlVwBXoUSX#`J+Q0HL#i(${<JZSxR_XUt}ylgP<x=^0sco`TT zzH3v)-89FB)!qG+q>tTw(BpyNEmEr4p3eg1cHjY_mArA|2EkZ~1u$qP*u1LIe-#>< zX*qlwI{SAsE+fCqdCa=|Aywga>=AHqbQ~NQD20Ty^Rv!2sC7`yUW7v&F5~TrLUmaS zT)+QW;$M{fL1jxoUvM}LLiH%$fsdaXj|{ul3vfsTkGX$n=uzzM6GB2-d;2uMT9<Zr z7gRk-1-g$~{4@mgzyTj^tT`OHpmNR7kOh2YmPuz2R7Q{1NEQI<PXF)Jx^`pP^1oBd zt7~9&x~D<;lS(N{k!i=6>v1Qb%|55_{@{@#Vj%Z$@vxjbmn1gMqg%22$VClr90BK* zQ;91U2<XlfB}ptf*o}1Ik$wd~#;DEoso)x9?g3xe_Za2T|8=R@g3qm^Zl}b5D#%~} z7NLtj=DfMS93|`)gLiq^pq3g~(o>C#)u11tRNE3Vl$@EF37oC8qvIHM?O1UDQ#WJ{ z@p5NBXJo{Km;0vA0l5}f^7nap$H2Ry@r5q8w6^v+l5dr}CN+o;?pl^LQFxYZ`=VW! z8y&5gJ<@Za57Zr+80qE**<2<aFWHMoPq2lQ(zMvJoxPyj#A|^B*5~>2k4@u3-tZsd zJ;)}YI2Cfvles2y>sCL`P5HW|zVb{AJ;KF=n2BJlHv-`U9*Im67n784@Su5kc?CyD zOJl7Ot|Xi-C~4l;=B;!M2;d|})S_6S;Pb$8aiQ0ad+{P=c__c`5V22%CO5?Vy^AOa zK2)x)dXaLsNz-}iq@|ge6I@&i?qzn^Q+_|iQ<N06v}Dk&K#VUH&hZSGz!kIZZ_f{( z$H-V_{0+H%u92t~X!EC@61XpH1q8ALe-EopC;Sai;CE;Gb`7W}|7;tzC%FyUl8UsC zM>t-oWNG!pVzF4On5|Y3#X=b{X89UQ{$xfY4;CyW>Qz_wd7U3qR>?Lz>?cS&J0Bmr zIqO*ZWab2p=uxm&<ZfEGAQJ+&A)h<%^z6a2>+YGER(?N4|JPuts?z+g!9s|23AzN* z+I(YrPL3fC{0l0d9|r{m5ic1XjAOsv;=;ld?Sojwe%F`$D9}&vo;{YyZ}_vJ^&+<C zTJC?i5a(pWXBX~qRvaq**f%I1v3gmaO~)SDz%?zWr^tFZU0gSu+x&<V^Kvr~Oo$d6 z!MEJG`+?!Cb31jmn)J<^&!`I|Z{G$$6^HT-ssSNV|287j!_4d=fw~k3QQ+0T`S}1! zKRkKivA^A+PI`8~ihjIS%YJxAP3hm;WM;f1!FNP=HxO=(ED9L&&ODn8)piX>SA~oB zrkWZpk!b_nHF49zYMS9V`GB(Mnb&*h*o0{tCsr~$vyG18wkIPru=XYQj%?(;%-my? zES0x(wmerU`DTg|dUT>ESIfsd!lVx$;JIr0tW$3E;EE|2(Iaf<JkL?LIu>XSGTy+N zoiUw!;U2f;^t*uK<;Mh)W<nXKe$d0{Hckilfy=uZBOi9Qk9L3ItPWrt@nUp+0|nG& zy{aDt4p#iuqb2ysgjy83fVZ%E;N&D;ad&qQip~v6Ke2MaaA8;7u5{U%hE|EGtEn{? z%euk*DLEwO=kC;KyK%ORc+m+>w@O!SM^o`?@%o$Y1Nq~2?GcwwWv|X|J)FS7EKeWn zKQsB~k67~S6r}wn=Dj6JD2pFtc!5ObFt%dzqzo5`gy5f3?%XI9XS_6!y@$f4-pVb8 zdE@??XvoRkvWNcLJ1jU>Ic(QdU?R+W?cxX3$I#!uwNPv0h>C~rlAh1f0~}FVc{#zg zK;DJx7BqP^&{jh8foz8}&g>)y_uYMEn#NqTGEw}cQ7cv*U-i!8J|+V=`6E|ZyQ+}m zKmZHF&zM!&vgLA5U37xarn}gBA7rcjLXyIu?0=&hahp6?uDNTe(Gp`qLO&-YeKj)v z=L3x2bew2E>T%|ruK9MO#^{s`mpVpu*q_=uZHH?Q8#?nmH8}tJs^WdEFAq+07Ddjc zH6Haytj}y|mqH=(7WQyL0g|(pzC&187*{NgDJCe?K;5IT^1@sj6rlyHQ~B^blHCJ- zfl>ry#>vZ<0|S}GEs+51N*dUu&q0G;vw$@C;?s)F{ywQy&*k?;)pZG4M>3<yuNint z^9EmA*tkDu_FJNBJfi*d2hD@^5m%i0eF~?tTUCI;5wlSshP1a=WbEDC18NS<@4Hw7 zj_`#MV_U3z)aMr9KX3*?-l@p<$CjitmUQdft+<%GSEX)CF&GyDsk=ja_T0sb@8uNE zUR4)4_%YXdMgBU!$GwMob%Up07*DqRi>V$N9)=@YLd<aI{=YnLL{|^Mp=9~LJ{9T~ z8p5ockd`J3l$;p5qSnS;pyn_zJ;EMhgFG1=Mjsw(g}MZ;e!%13V!DkN{!lMH3JBP* zD>S~}zH7&LD^U$W1Q#!#G}@Ye2)$~OLZW}G)1H2k&k((j@RRT)8lC8J0+IUS#j<wB z`!&F-nA<S6`5qTmN~BwvWG~27-(j9RK}fxh9Xq>YN<dXj4Sj_#7MIM!Sg`~VmSDp4 zh>JmWew-FthcuhWSUFL?se|SM3h7Imi7O`mT!N|d#>0NbAzW4Jn1K7A`iRZsgX)@f z%egH@!w9;<Svp1!h(l6dzIj{7`QRF2NIOK{Uo`wNyaPZgx(a*-(|pXNa`_}hZl%}A zoyNB>sOJ#gL4p-SHTseMO#3$rZi~tf@fpMUFUx3?%S{m~*qWvtI~X)rUGzQTgkUo8 zV#!c81JaKH!W{#Lki44X@}8ZC8cxX--*MUKSlR_@<$H`kBs|4I4&1>gW-K7TBa)>N z9R)0eKmp2<cLevwRJcFgb^mC$KgO9Vu$pfK%!iZy-B{bU*7?Qh3|3{->O4J$D~;gH zj^ed=;y$pA`1P?UNEQoR3LTc8+WB-G6}cuyhLcKfGVS3zJr>z;sns7#^!``Bcdu9( zPyLKS(2;P2*IB{b8<J==WkYaX7m@ywCmH0+#tNDAd_4@14v;qtr|<DXkKqYwH#1gD z+Sq1hWRQ6W1Q-ENMJ1mB(>7uT#@f@gLtdM|lV3S&u5ACDc!5YEB*26&U^IJ7=xz}Q zR7-OBa;sgAGvSv<B=k;-<KMpsH{O9M<9u4dbzJu#gB{+?q4o!Ji4W%0?RTxw8gX)O z<j$gD<L<q#4zv<2E-1xQAZT$93tF=WqB^BwU}(S@>@AisfSL~p5d&jmg!2UO0e>|t zDIac0$|e*&T=!yN9USf7%>n&MsFwcjCuCNC>Id3wivODA&)c28rmuLaeLnTv`n84s zuLWoURf0AYk;Dc=@BKU|4y5ILfA-=C2h@OujZvBg+5p;4X-es0KwxuDTG7gLlwg#H zXaM8>Ui3+8VR^H^-19(rR~_ABQo^jhM#CG_Y}ba#mnvF(<Z1R8Q2~GpqUc>Erg0U; zu3QE5jbFh#54y<G^g)6d%KJUntfjaBW3rq+w*x#0nWrCpl@Vsp183VD)1%%f|L@vN zO5ey`ED##ASzB8R<F#NyCyyQg{(`2aCJhMTfDX{|m}!_MFFpO7le4n~v$hd$<Ig~h z0VGFRr=qIbgsL2`t};Tq{nENy3rH7Pv;+_4t~^Wpj)WAS=RP<mv{OE^u&`t~#U0m5 zDPT~Yf!KSf@*?}zABep`98m~x-v06NI)up}WhCExW@&Ct7d;9-k)})|Sr}7@$sfr- znL_LCu!f*3BO3Y~+x)z|OX%ysvvn3a@t{fAzH3)Ii9`Fpjov^YIuFwdJyA2F{UpY4 z<7tuo{$^qQ=thc?o~|yFG}E$dM^`5<$Zz?9XUcL;C?;4{H|(RoBxlqG<AU`@k^PwN zzr`^x2ye+m%e^w}#|HB~&9DSn3WT<RRfZfV!2DsKQ`-Qhzw8?ozUD|XH9Zo5;B{mQ zgkHDHe{3t??^)ZInRrMh6DVN1MLJ+^l+<~^2q8qTVDvll$trB2`E#7QC?GD0k!ha} zQJ40ACOt)Wf4zTs-dljmuJP;MvcCW7E(PW>T`D|vyuz1g%|Immz_bFi-KcedF5J;$ zYeW^ikCw|Du@tN+!*H>`)$Vikr4#lC=0*86R)GjM=HL(dp6n+5Kna^-tJdz4>bjBi zi|O2k3&(cuKUOjEC39uUYns>cw>LGRnHlTKWd}6$dw6&(s=d(34%$5*UtfKgSWJ2g z!g1lZK$1fsF03JELu$o2l-<z+UUghJ!OI(lrqp(#!yO2nPPr$yD;q9u8-rr|Sthr& z*<GM9&`IAKP)Cg_C-)fWE2?bJw|zX$UB5cy!3zLl+1>Tz5e0-UOn6ESIRe_QeXvvb zMP4ByugbnEF@(bXG<&F8qA=?Di%iK7j`Cez3dOE2u398cO(*Nh&YJMPwsob+bTYte zI_BnSne|PjcOv?!SViZfu>s$h-cuJ^89n5=pT-l1)+*ET9eMdLt=jPGLE*qZ(oORV z3C%v&<9^WmMfd2Dm}r!3L+z3OUrm?zTrK6#?O%tf_wIm6P@eR<MnB+f@^Z9$S7!|k z3R+gh!$^+*Ny_#}6h)?ZU{l~*qqmY>K>LlM@lGjJ7f!EPz$v#fvrggQGB_?z@_+H7 z9HV`p7KM|UklEnD^N*mwXoCLySFX7%8boNV4G^q?5Hv6Bx~oAyq7k$REDSVtDRR}o zsNpjFj#8JQt`5Rya_BJ#bu2nlJZ-orb}4#JBmEXIpg8y}%rUxa=mneb`>eOGz9)w> znUG)Kuaa-ZW;5P4{B&99N2d_>v?>A%V_nybvqx4|SB9{_Aw6(Po4WAN0AtNJPUE6W z<zOhl5{{2gI7VRqDBdcL`{=E8%-W^2$7>(C{HBkr*LB>K%>TIXdrnzVRI5H6bfpLx z*v5M1u7K-cUMqPGOeNgKsRIa7Tpwq!eL}{BPIBheN9a$lI1BGRuyg>E=@gW-#4IGz z!%ElqLLB)*kb#YKv%nnG2eVH$$q@o1#67e;eWVDMwLN?HmetiI|C*oL*N44vLAxjl z(CTI25dfrACiyno;2Tp-*L~JtGK7`4Fx5lnCnl=enc!lKW~mZ|IAl{?gxv!oUQBWM z0e}skoqO$!CRP|OZT|!Qzk9xwcXWismoY&i#DoK+^-ZPZ5l$}Wvrl&(Xzp~KZ<8*H z-e8M$UXTbmd2!w~O1$m}n}zvA1JX61+#7&%Y{v<%Q?FF54AULz3{6Z-&_C39SR6Vw z+q^r1=b?<;y@N#RA4EzEV?86Oiw}Ng9A<P~J6Y||NJPpZY2^ADL0LyDstwb12jc}v z>wS~op2Qx7jq~(R8&nihk(d2+n7uAza}%-9U}S+q(FmE?OJ5Zl5WYrGfie6?FKR%D zM6+$%Q*qj&Ns~#U-+!CsK^z%5u?ogx#>hMl3W{Jd<%BQUPn&MdWgYt87k|r^C(TAg zL`1^E6pJ-pW0|(j(L)mj`N%h<ZZSw4%t6=~6chXds||ZbfKxsKZZ|uAefZNPfWS9I zdm!W-*5|ev4fY+~C&t0PR4d9>W5Zvm(wcpOk5ARZRD|TEmTmGZGuSF*(sZp0)v6?1 zbMT7#9utbMy}WIe;x{hhxserN<H6K?>U#iggA=8QeHoF*Gw|*XyTqZe75mkhdgZ>) zQ@J+iS27;1UUXdkD~%!+_oHE3l&Zax1Cp%O{-(D99%J3iSzVYaM}cwKnj{C7ts1-^ z1RSrvzT{anx!u}(_Rsgo^0rBJhvjIy@PECEz(L49fL-@mX8f}r&}&ro@X%Sd^Oc3^ zt5?<Acf|4kw~kwZ(-}azmu1>@#LdkO#`y<a&Rr^9L>#}Xh|tQ86($qmL~#7xzW%@E z=S~|($|qIywZ~p@HD$2>vwCJyr+j(x^)%Fqt@b@dt5X6EvBHgj8GhH2#3+x=5h zGNBhWy&>R1AQRd>ff{{|=zFn&fu%@>2YL@IL-7n~!I{STNY1ohlXPvSFJ1k8y+17- zL*{D!l+*koj|0Avd(H&cU>m<`4Oz>H6ZPb<{`TWRW4NHPWr!(oRp*Vd5#p;k$4oPS zjDBcxxIUw@?s2UTH!9X!hcdSiGKhuHcR#fh4l=yj-GdfA<lpjiBibb*CI_G|TwzgB zQ4Flk>Z)o4QwvbJCO>dl<xDLVLu_(;DizIfiRQ}Uwl7L&sY%&OLpwH)z74mD<#wa! z+g#mn1H=K*OunZ%tSz8DMR0rgrSWOrx#NzAtXQ`VzC_trLxf&p$7}5E0}6B+5nGTu z&=yXugQN+@l>utm7%2kKO}c)V<D%VvMmFX*YLB;uZ-bPByrRR87k*uiNBPRF_z)Xp zd*h#&EOHQ}GU&Ta2oXfqlJWZ6<kNyi6+ALTe}Vx+_{j-B9}t-o*iQXDc74N$dO90& zTP^GUY{@`=%+0GrSVDfFxWmmaySo~bK22PR*NrF5uf;ZB`Jy3%u+{Aa2T%Ady0pOq z*8IVOz)WNTeFE#2uUjrG%LO?=K)Y(8b90vHv>>=cw9YfTUI#BQ#-A;Q#G+@`8w92W z+uZCx6+=Lge!qzcyK2LR4}yP_t{gw_1j<)G&pkbHPq2UcId%E4FU~AT6hq`&Puf|$ z3;BmiDFX;J1Pk<DCj5DE>}GIk&<s6QpCCXo!~5B40DK|M+KNjFbrzxk>+l)O^Z&t{ zw6wH(dGy;&p1Bc48M6a-F5ii|YNzyzCA4mKX^!QMG#PFP*C*M@d<YV`F&V%#Yr-Vg zX$mdOlCP5uJ)|JRUaG=^a->uV<aUNji2-7RpAfGD%fx;p+78)o1HjgT%a*Y}t*e}b zA8>?E#8r(mLdAMlK<UnalDqA*BiG#pM%?#qw<V_7pt$ugQh`ba+Lg-SRL_~HL;t}r zGH?xn*MV&`!)?=*Ftv*%H0|lbeWg+N)l=hQ+0y)9$6gz-xO`SizFb<$X!+7!Yh^v` zno9R*s6NTg9`IrPPL#yjxDbG{`<?Np-M6@hg-3|Q*3Jh0^jo>Y&F!LZqX2$7TMaso zbLY=PAh0!D%2O%1vcBGry?8AM49_L=UO}Yq$M|TmKydI~mDkI9-8zhXp|H+fnT-4H zYv%uy8pTfkgx3M7euV5r1S(z9Tpc^aM~09TAmhsYHJiF6EHtTF`Hp>`HMO+-#S%_3 zPi}3?No`GeI2-nWT@dle<_8OfBU<((PBUDO-3F@ml%pG0B9)B9^10v|Le?X)MFiNY z_y{RqI<F0`P`C>iB}hfbzn*7hJ&P9)XbxZl;EUVusE~k06!vRh18VVkl3Zt(Uy(ve z9`tLKZwhZ)x4caL6?oSpxBrei4V>luIEIiXub^i6TZ^MbCjNrz&2-(fo;<mh3m>9n zn2X%@aUb3QUu#Bbb;2_^QTBGqi{-s>jUUxlHr-+qt*0}?jX0nD+94s?(=BZ?ARr`E z^lL^_Lt{<O2JAnmW~7tAdj<(AIy<~PfN^384u*#N8^3+)Up?HHKojr2*)!5V?SAd$ zWN6RGH4*!TUgvS?e~Xji*Sg5w%-Ie9%}yqii#XKm9qpUJN3&Y-pNf(oMmg?d;LWQo zf|fy{F7F6D0k3i(LQ2=~q$=C>On64J0Do=U+E-6Nz(4_vN84V0ZqPw9ghE5);bxo3 zug`mwkG6X`@7<KC=-mxBskanMd4WG4jGSB+=JG@H+H0C%&Bk5T#c`XJij;28A%Eq# zwQ%n5d8w#NcdQ-U8oUVwo>d%5dysrWKPJ8tNm{*MzmqO@Uig(2d6d4nLxZ}utx|j7 zFu(UszepiZT5<|j6b0*EOIC2!<MBKa-@SideCkS}=xAm<fESF=uv+_VF($MHQ%3h3 z*!MoBQuyKJB4yGPEZSfxp)3DX^*0T&fXls&YN6xMEB;9d^D@laIhnOuaEi27j*NL@ z(@4br2~{IYhEB^)L#fCum@`hB(v?+J^~>|+fs>$RI8Cd#EYn7mRMr3WEcX%mLF{A} z|JV<i(|!`>aME~#Xy8g$K?Wmm1`I%5aKBFQ_A^eU6yP@!{i82&aOgG--ozpD+PruJ z%8xo|ZgAkG#3jx)vZ)n#Lth8RKoma#Hy#r+=hK>Cmid8IMkUqd{P)|p@93YL^h@z$ zW7cMnsDA0cmN9db3=J-6Zk%1U*mj-yOU{h`e~;JgwqvcUWop%sNpfj38B4CP=*=Vg z-wx;~<UZ~ZANT&T{t8lX{mr;_dI49dGbT<~W>1~HG|K4pBk?Z&?p+5M`#Wa!@a~MA zAg9{CYp0%p@uJ+Y^3fuS<NO}zgVJQ3qo-X-Q`(_y!8LD%VHCq*NkDfO|8R6>Hc=Hg z|Fpa<c>9N|Q$UI4zJeVdWb2FymD>k|ijW>t<xg{df1=vVJQSq9e6)6oMhBi1@9F{~ zX*=CnkD^31!&)Nb$NrFU<>J+i{2P;g|CDXiQM<Qiqy{=(zMFVP-sWUJq<OyIee-kd zwZU?zujD>@*snC%eGrfm^62IIvWsNoifqP@U`LBVZ+>ot3c%mBB*ni`bhK2pPgcm^ z7K=~#y^-A%0+hpPFh^~iuatZmdE@V{`y?djh47=FMQwOpG}jaO#72H$6e3PbfBm9; z-2dj@PEQK`-YAD-w6q-hGY5M&XIvWA9sF6Qq(5HOwqFt~GQI)YH|7#Pbj?aFA*aQy z3cED*6+HN?Y`OZSGPX=!NIev59$=o^B>OdD(*Y>`gnvi<Cx=X4Dz_VZyQRA$FD-?n zFHH6<f7#uQ-7(Rb@1;6#NNIOUW^cD29rvG~O=%o&rXPD9=(hWMyog=<>vvQtc|p$4 za{C<Bf4Qx`n0T^-92CpnZ6QgJMW7?)(uqT_j{^Z%$~kA@=QMSoZ_t5!2+RQDAyF%R zT|hHgKwu^M3R(H%%ibkyg52oBRW^}9z5JKWloQ_Lj*h(Bm$<pOT31%#1mAO?u0+7R zSah)ShD@~3-FItty{=wxJR@tm!R@ZF=r&P686m^8n_8hrZP6RL_tZ_@ZB1)t$hyqf zSQ~1=U)!_dbb>vtUDG*J_iOqHP@S3FMA4A7VCG{)F8f6EiSa~J7$IwOrQ1b^5Ms_x zlPP<~s0m3T+S#7W-nf%-&NIEcoL3e@n{&V=wfrbNiEhET`O_XDS0RL_tNtpsXc4<$ z$~Ly9YlJ_<U*xp6Dc{w&xws+cFqXHS~M*)YYS4{2=bEK!V1!s_Z}~({;dqn=~BZ zzERHVpV;mVD+ySB7k(pBZSF0%pCwntQ-i`bEnL*WVI?^AubVtNYRXlnFi=8XLkEQC z4*q)!L*r*2OLoqYhTn1%C&z^7zH<K#3Dwe(+Z5?g=@QHskBo@maPD{%{hDC%1|}xH z<MPMJFo<wZ3dJ@c4^0oU0R<u96W|c?!w$Za_kptIVraYlC>kafBtL>?utGwy*MUBC zTlXIt$F20)Dv}j%S%0i??`r>|Tqu<X?IKzS{3Naqeb;_nc~Eh-xw+-h!-=Z=>Eb%X z>m*;bt7$&HkB;9LOfMnfKf<o6F&suP+t>_P((7*AJffSf>qKUgYr?;R%VYa(CwuQs zT43_bsc1>2tK7#Sq$gy`lXOCsyjZj^|2JJdP1+u<nI{qz0O9W2%Xs6F+$GGL(~u}C zE7`J*W^wLp^c<0}Q|7Z>p8Y)sIylb&S{YT<&a30SLU~tFvY?lN!sXZ%-DB>PTO}lJ zpIo`lfxg|KyTXDD>f@((62xa~#A9Cuy(;q|9a>9Y4A|u;_TmV;?#7dqwVWxQ=*j&( zw0{en55~AKSqn3H9bjbQJH1j=t$FL~H4}{q&1LhhBCz9Tt@=Mfu!TlM{0k_)fAmQA z@5YwMSsPiyp#zeZuhQ<B>5yNmD~Xw?&qz=xr2h3SK(J}nVDly_IP{GiR#Q?37=+HQ z7rSVjT(J1!5}Wy_ey}92xJ(x?SApQ1LD?=(J)?)qD&zV(I;DsaDg|2)Mr<eK0{iHB zU&3$%O3AUk1ol6|G=!?$V2w133J$@hXP%h>g@drgdi22Fy}Grp&Y@BNtXF*ia};Hq zo!5#lrlI^QRCf%~%Tku(llYZfBKPL^W^UngQq?Iz8zk9+HTj_$&|6ySp7n~WDu7N_ z(VE(Qa+@(-$LoqrpJvP;V>rQf)o;V)e7@;EM*gU~50&n&maX`;_nw%4z*3yLy2#iL zSz4In2>XA6^}h?}zApcjnOCYuj?d!;i?pISRzOKOP8_YrOQ){pZ@DEQO^mErm~O`= z<^l)>iZu*c*&u}=zUW60*vbo&EupP-Nx+BWA<G10A|@l_ujq<JhF6QTdG23DJ3@*H z%4GRd{<E9I4_F*{<_PU&r<IYz&>|1fjRFWHifbZI9t@+X7X^^5vOMMLILN+$PZl~Z zeVv{sggR-(EByI6)A31(Q=hNo?lj|PTPn+x^&Q*rB7j+NV_W2^KOI2ff-ZR;Au<@H zaqjps5g3czpcOgu>uQ~PuIq6N@j;TF)uMStnb)&S7=@kHSKGR!cb9P@itRtwTsehs z|Mc``$w<$4p$Z<oW!+O=6mDZrz3g0~*EyK2GHO$;#JYTCa1mK&KYIXe1Etfc*KoJn zs2%^C-<Iei=R`koJm%iy12FJktYhtpepp!8#^Kvh^wBXYJ=A+|hRpV&TY~n45^0SP z0ReHo0kc_bEPJ#v!ulMSr=%g2BG5|^-zJ?I&ycwR-{G!v)_qfkS}ibVC0MPa!xq$V zXT7)O(e6jP#I^;PIarB&pxpcHx)Fmn!AUrb*XP>fi;y#I+evW`y7>#*8T5~V`(PPY z7ch=&K|(x^s-5bteb+Z#zYd*&_O8-v+U=WotTQ(GjBsiKUR;7UZT)Dd81xGDl4%7M zyBJ-rEfn1!3uBSqpv~1t)4FPDd48Lfqa#10g+Otn6Td&s*@7`PfiW@u8W%?rWQCeL z8L5xma1|+9C|qk$Ey0{_K=dr<&yU9}7TKp;idi8D+P{KPBu;L0yB>VOfUK0$G*6%5 z*@a)gYdSr-e1FiQ&xj}%;SK@jo|+;1PCo8spHrs-alkJNzlx0wP(IIIwAr@|WHvY| z>U-l0*Y_erJ12SyL)(N>wh)el4{Sww<k$V6?zEo#6$0=QWF%wW;gl>Ai%+QUosr}Z zBX3rzkPD`e&*Y^yyyW5gZz9lF<nV^PmR3Vxf;ca=dME#*u9kz>AIby0LB7r1sg{~1 zpCyq=e8LWvA*+#pS=9577r{&eA?EP6z>kI3%)I(AkUKs;UgeABY4i~9U;}{uPWr)Q zssu2*O5j-tONyQ;M54VHIqCg16~DXlUzCwIDW61L%pQ9J;lRY44=k7vi<VqI0RbXU z+_<a)^ae5gN@e7dyn@2JA!J3XWS9_T)+L<4MXMVEN7%F$<QB6tGIYQ7pWH_y<N^7_ z>V}hzg{??J(<QxM`^HumqlpHco!w|ami%2!-ABU4$8Yy{pJKyQOi0MH=$=BS!)zpn zEh%a_@u=?!T=UMIQe;NGdrVJv^aWalhPDIZyTrlfAnT2J$GSjube~^-z5rYpX}??` z2yViF`qkGb1qE)5ZXCs`1g3c4F+M4xxryCyv0n)Z<#UO*T&v7E-Zir@^H%ek02x6T zruO9D`VT87Pm^}``<J?y{0jJS=`v@rQN;`;m-*827Q>ezA(dbO_}m5r!Bt8*>QNmy z5RxK-@{7p7z*vj3Ad!=d6nb4oG+*65jpPZPp+A1~g4PG&-YMgMcKMX^t?cE{M=b6T z5)7a~29|g4M~Mh#_-+khQ@~u#(;N2%4c{9UtTorkpI-w>qzdkx*)yO&G1iR<9n6~& zLfCSQ>(NU^SLh}P(8qaoF&DKn9O2>IMn^!W=;@i3SL``t-2K6F&IjUYdS3g-OQn+p zRE>S_yjZDB&+qJQ+Laq<e}z&&T|moqZ1_PR_1?x<sI%bP5Cal`lZo(DP;hN8|EYIk zB&aCvx0301x-pru5X%kf=y5|UUfEcM%f&;7nwRg~-4srVkAFhao23_YmNRl0O}y+O zv=2@3TDtuKdj2<7vB2T7C`{5gH|C6ydEsIt*$@p0-n*IOG&D7U>Ig9!6e4Aikco}k zgS3aH>nUh7C_Lp!Q_u^^@rkM1Ti4dss$|(yYP+l-CP4U1S)l|3aW#IIT5Jp!+fNrK zcb0XVT1)NY9Hid@AK87Mj^IwtCBfF69R!EKR>JfHtVt!)(yxI$JvdQjaB^H4`Gt6S z{OzD=oR?~h3YOlRP1j?s_qvXlvJ~=3{Oh$%6wcXjhl)O0z(!14I~IM0tLhxNAMKU0 zZ{J3X<`a3rxT7Z^NW@Q!hD~5#fSjSmq@<;~4SFA#SUpa-iUsrcL!e5Kor4_F1Cs)` zhCgkZUPTLC(a`44Xt@3ulTfkngO-p`1}#72lOv7uZX8ZiCYUhW5V!92xHe9PEh4uc zn9!wFuTGqKm)%O89j&L`QJSOD!J(itClI_cm&wlOIDwSF*;SX#%^pmyLrM8y`Lw1K z)ws2=QN?%-Er&z1J{3^Op1W7fetp9R+rmrl6o$G8Ja5f;_Tnc{*MU2@TYF0|@>bWI z9EAHS(&fQ{Zrt{f29FfIMJNiO{>c$(C`QR34=IIf*5UHRO~3#ODk^7fI_bIe4?=Bb zRPmXz;Mfuq6b;FR0YC@%J#DtL_L&sTl#w@gSVQr2Z}l2s4JqUIBJdoQ_De9w>}0Ke z?<_p;w3C9ymrzcMl%k;Rjro_;5RoDo%07%H06PpAQP!MsWgv-p;cpW;z$CN?V-ZGF zjRfE7F#J>bk)>r>ZZ<pKiS=094zQeBF2i>tu9$wD&rz~3LaRq4Q#d;d0w_Gi$$1Fc z6|ex)zbc6|*(~z$J&*D${o+3!vIsF`xu+^AY1AcEd;X*C&qECUx8E@>-MWC1O}DZ4 zs{BEl&vy4l`{R6Rh5n-Dg6TMq#A{d|Svlq1)9eC&F_qAzs3vA{;h*lSGIkBt8)(Tb z|1B7!8Y7}j0RMg+clh(?4?$i5&!a<OOhDO)MhT`((?*cPWgZ?Q=z-TrLjiZ6*h01j zYx1Fa&ek{3bHNr!q0FP)8@8}>>A=$cEZTqjC&V*f*LQrjC@+pMkt8kSQI&fgFj_Zv zOBspMe%Xkyz7GaU<m%$;e|bIy!1G9c^ul)5{MQt~c5YL=!d@9{st~2UzG6p=9%~Y@ z3;zVyr>hz%SVlHR0C>-3$exacAJdsO2`J3G3KivGJ2!=p(3)*1$#ZJI@sAH%Y*PNt zL0+;gq;FSSil#VR*09Xvaoa9-P@Vt(T7ZPqyPA+0i6;6A6|VmHRm|<5>i<bAKjQ9r zB?-w-BE$NIVk}~LJT@bXJlct=4w?<ISJ}D$Ky9g%rcqxLe8$48-#0R!4p<lC$i{9( z+xfmC8v())z5Jj7q6`O{@5x~i-A=x>$kYAk(o2jwnDD!Y<D6nG$|EuM{#feC+`buX zi)PiGWcOD6Cn3b){P(W*oi_|>x*_v=OVyVyIiJXM3)3`hXLt-wX{#)StWuiF{*r!? zr?ckcjb++LIBaSaVVkY;m_0<~bv)+s5yg%`(Wg>u>k^V1>Sl*vd{h_;iBdmTo^Aj9 zV3C!`P{V|1VB^<@FBG(F@<dA)n{H(d)mnjRanIPnt%@6E#|3mQI4w`U)4OjFrk&$V z!{{Q%w?R-cD41RQ76i~<o*WSU_U-$<wh7hm|8$O!K~zcaEp)=>xEg*tn*3B-X^Da2 zI7ELSkiZuPg><A@;0zt@$>)I{@~5qGUEP=OZyCft%RSAJTCNkZb>z5MnQoG&Q@6q) z&hLM4UGgD8<f53K5YCE)?A<s&C53HrTUTGEKz}Bb0z`eJd!TBxI}r)s_`Y)2)`d@b znZr(ancqofJ0UzmL_%NgFrk2H4jTtJ)poxS?F#8nq&Zyr2D5{eYrt-K1q7h2e;yD( zf!2r!U;w-(C^#jYBcGQqpq`Uym4WzX-HsWZ))e)lAL#86ji5!Wah$Er|7H{8hgUB< zZWb;Rt;uqq3nMPus(|B-r1T*q)eKhE(?Q8Vh#HO;3qRP@th>#-(q5stgJ-Yx5)J^1 zKdm&;rjQ?aSnm#0YuZeOEMQ^0D*%be!NHMFvqQ3F8jqrX&bhvPQyK`|w_4J}f^0ko z^;{D~5xw;Nz7J!At*5FhJD<5YEfFCZ*`FTbZ&Y3>q{gKHCU*#w8%lBOqBEZ~vtMT? zxAiWDcmHXsc*>dBfMI~{@=2}X)q6?`)AJiLk8?Qh2KBIf!K&kj4w~yvwM(b#UjJCE zOl_>JyFb9rWZnJ}SQQz3GszigZp9nc`^ImPryU`hrcm)h-;|V;tWAU>;kbKdT5O&_ za_TS`(F9;!BBC3AKf1sKf}t+tCFc{gbwJ0dtd6TeOMi{@<`I+%N$R;5LC=;YeA#u? zX+gi^rH(w=M*fuz(?`~iDw2v0xi~EkgEt)bSu6Rq2qQ}q#5S|3MI9Z#HtY+8!V8AD zmm6jn)YR|(R5eGJ=D4VUCGXNDl-5LGrhGWWC%_FPM-VkPF4cjn@a_EY8niBR2tsIj zb7vb$wCd4NabX_q-e<c|_Ysq>k=0N57g}2tp-sAha}QGUB+CLR?V7|Fbj^*N`+1)3 z<4DymZ>|cAY|s25AQXDA`r-HbNs;z}p@+_EV{U;^FjXWSLNb%~zn<NV;=2oj@txme z!4(q$O<!c8=YG<)L-@xH{>H5kkrGbNh;R;z!5c{UAaW$&9s(%|X~#5O(bK0-Q6zAy zVeo+^qJ+vIr>(&$w6fT)ZBu54XbE2XnG=w0r8SLjD5FiAtqam7{T)yHR@?BAD#zUF z(W86FM@0C8QLM8VCgI#9xmG}Y7|!d;gv9@fzUj1@oA~^axwihy0`xXpZYSKm%nPN0 z@s%03WY}ny*Ct>)scc=CVygpUis(Wi#p93juV@j-FK*Vqs;xr-rf#2!B=61ib#2X| zx#7Bk&8bxi1?hovr;0S&UP2?D06<TDTQ2J=X!M4V-{*-*8q%1v(~)_3ygfCP#paQP zZE0^qOzhEhscT)2^IgY6YxGGuOQ)S5<u%xzPp+NHKrnfn(Q*tS*@QrE7-05rStmK+ z;kjF<Y=KU{Z8Imv;!xE9Tq$jA>d6|SD4P;2#C`mI43UUf(6N3~Y#&`|mihaW!8MO; zEe$bmhkpcU=xt$GibgMJZn*@%C?Gsca=15^@owKJ&$Wmd7`9NIsJ{Cypsl6S*5VS0 zyt|sp`J<ghdIEGjrWLt<?0v55YycJ>WH(CNZvcMAad#GaTaYzSdI|j-WwxE_##At) zWamp=zrN_2&T}M5aE?wtir%02$MRe$jk+m+VHAg)@wMXqxkFzgN4%7hhcR622BY^M zSSXrpv0Q#_GCGYMXSf?aJ=-YdnD+M2b*ft@3fsf=?=yY4bu>MHSgR|$*T%+fhmEGq z<X0u@cFl9FCzwvS1W8Q4yuEu*^g?fN`1f^Yo?V_Sr(X`P2vP+6xoXwm(8n2Evl64d zQhQixKH4_Cu=)VD%hQ{??!5bO-;A$IwgjKZc89I5Eo)WJe*AclO?~8OP*l)`1!;m3 zn2oPooBUav?$l`3>$+@ua?XWs)}=@;UkiBc==5|VkPTGA2nex<+5a3nJ0Y*`uVXK+ zK&Bi9SD|wDT<qSe_9N%M*Sb#GEvw7vE{%oDYlBYqMI@~Plk~Gi=2Xn5e>9{-GNg37 zc1@OVtXo|svPFTZpR+la$D98$i+wC2+6(iDQgmXXzumt^-BW&TWx!I4G*7;^JiV!Y zD_@8aK&eu9_LIYQDgA-f3<CfX58cSc)iJ)2>Azz4-Dpfxa>ceM_vkt^!(p168LZ)r z7<?3DWr5MfHD_XouZo8sk2)<)Q8xdCEqV9eeS@XD81$b{Q%6KbvUm2gh{RlbBIvHl zX*Bz7C}5_lulEEi$8%y7XvyP}<bPXV><%c=3)<C(yiD`r&DWFax#OS43MqPr@)!Fw z?|NW!TXwB=<(Y1n66r=}>-=}DH=iH-id8)IJ~Q)>&yDLC<79ArTLb;t>(dRUTsgN@ zxRQ2$5FvNIJ9g8`iD&8LY-qRg?>SJM&u>4!rF6QbwfmHBfH<X^hP)JnPJYrx35hvZ za!!4t!t~c;JmVM6v7J13TH?%Y6QhUXPXxDYj%}2Q_FK_mRy&EIf$xCN6uJ&aCnvaR zOIlijk80VwfBeW=w7KC_^zZL^pb1~*8?=|c7e2@k(M)4u8Z1k#)eFQQIq6rBllmGd zz2~XAMwp+Q2R2pMjTh&igXYkeiIwB;`zT3$6Q<`=5Bnj?7TheGN0Qv5yunK!sSnq^ zzBshlu2nob9_##10^_pwU`{ROa+!2~eU`ncl{`;N1k0H9)gTuV<Egep7WX;3Ki-^w z;bvIZ##T{L{n@$G63v~2tnA2ZzFgw}3>(60qRFQ!5MYl8^IyNZ!kp?fGBPslS9@~5 z*i5B_9gF;IF)#L~G1Bc$X(1Bq<>eJ#R@OnW`f26C{`1QFZ27c{O!yuasfj9@P@kVt zE2W-3M}6e5u8GO_^U2y@Cb*sYH+GTA88;sXCmga!w<seW3b<Oz^RW2j1rA@Vwi4ty zLdgre>BTXNjX&z<^2*BMH|)2kn5KMMvD`1a(HI<hwfGxJH2EjTrAsh=G6Fj-?kEx0 z>;Lxe_8!lL^dDcIWN{jHbENN?T*!aKnOjm<J<U?@>>L;oQ(Id0l#A=iZoMICkFBp> zg}i)wJ3ek;f*&WjgtzR8OD7(6cd&%K4heb{^j6`DzMiS*6O%{LBgL^t$8B9XEB@!C zXzA;dH8*Dmqx?VncHpg3Bob)`DPZ%ckH%k}-%q#xW>ffI-fG^^m_yv58Wr8Vilr3| zDd%0JU7!E5C*PQ5V`7?17Nzb{t}&fAKlDH!9dKA&Sm~Kf((fn!S<9&fM;T*FsoRI^ zUT2!FUcty#-`r51zSLEv&s4#6zsrhX%U#PFK0|O(0Qx<uC{iyzU1UDQBK3xJ?Q*Qk zEDe-6$LMGdF)&=@Vq2{jEk4P4J{VdJCT1oHS&8bhvaPX6Lf;H5Az%e*(Cttiebn^N z&J!;}Eih;Zff+9#(`Xc2^gS3Ddi&kPh69iG=Ey??Vez>R^0qi9rrS5YDGY+Ctnuo6 z_ssw&)N?JJoerf6*I+cZ%(Pr_t{?e5GJ>+e9U@$!U)jml>AKw2H#WiP*6V!5w6_9? z4#qhQM(6fYUZ}rOwF_4yCU`-^dhx3!Q{Wq1dq5Y_WWkVt|FP?g<PCTn4ntv6@V_JH zCWWkd9WCBS`1nMg3@)e=_nWOZtQT&7^zXas8PD0X*C|36uP4c4;hgb>tez<#^bi#_ zhgqAdYaac(+vj*6mD~#t5Y&=+bZ>?|b>8rWImF%&P*B2(L5sx%W)ob-likIXw_;wt z(T;D76(Y6l=i8`%gQJ;!bLDi}#^O(%!(Ag*=VlB4z5ChyrC;Wb^9yh9HP(YSm+x}m z9b$WIzDN_urPGnJ-gmj_@==#)4VLzmPC)F!g3G(m$Zjq>L{DP!S15Ik=-Bv(o~fxz zWpq(bPtQu9(dKec7jzl+qwZeB*Ts%Me4X<_RzywmQ(H;XIx;Y@>2$)clcgv5wVso? zwye)YUKBfB%?xM+`DM`M-ZwM*Gc!<rw4e$p;f!u;l+YMyXb@_K5@ec*ik82yy~uc7 zR+a(+!-(TX_sq;{wyPUCem@jGI_g~d5V2${173{02-T_*t2)XTvHOwxLCz~2_-XnY zyPL`nd)@i?s<pLsw;niwZ@LD6#I%+&ue|=iEAKA<?(NsFYR57^f4;_W=FBPH-yho@ z_+qE6D&fr>K+(Z(8>C!UQbLC3jNS8Zb#;f+B|kA{6FOV+WUZG%7jDi)dyHs1YbBoh ztD<wuWOFgQSYAQhsvH|AioNJ4o93zK=9H9y+WX^2k5E$5aIa1A6oY(!CA>CELF5*r zdqfVtw2MpOi4qu;Ev&4DkXc_^Qt}w-N64fP@bRf(7t20HwMR?jY5iU=Cf$+d_V#LM z%Q}mY_<ofA-G?{3ot#$ba(dGnG$p5XyBfQQu+8Y`=+@S@&jYLbi3{|sEPZh5){wg) zXM;odDV+he=%;g(UB{FhyVZ{gckx}sZ`?k{$-{F-=t|7YkC}1T50Cg}5eDf8(J7+& z?|*bC+;<Zy!AZaQ=R!LiB^NKTau3QTZ{E0fuiuZaasQyMuG8?<^X9jMldLE!bG^O4 zr3KDfET3Rv;xOAyL2lGH<?{RYpP4oC#^BelJ*8Om+CHgXPjrS+pTTkT<j0R6JAl(c zU%0lETU=-u2j53EunSaE6p}~SPV#UnQ+FvpMh0Zv5%z@Q;@F99lV*;cE`g1Tu{u4u z<BzOtL<8THSj~;5Ia~!gRjYp*RWEfFFj}7%KFmxPP-H))jOv-Om>^w#RdZV=O7Ns_ zctivhBc1FGm5R^8ig{rqvxg6dVnUYtFO|Bp7p+~lPf<%L`lu&)iV6=O@HN&Rgs6ls z4sxk3&zmKS+oqrN);aS25||t8)2gVipZpi#6iiHEOm=gr#Fx#D%KsgsJGW<G-(ASl zb3a=IAAHr}|1E})8y@1L-qQ%tIuTssp|yt$R5(;8@~WyesG)A@=`jPOM35pbUEAs2 zdic9kzuG6A%}JxgY7~hw9M%tv375gPNR){k6dvDrx_ZNode2@#76;!2MRtOy!Uv1t zVr?7^*jF8+D)CJ5Rel{p2pL`tUb4cY(3vnyo!6Mv?2`*XYFb*cL(a+vAU5dWo&Sv` zD!;N6YHio~U_#KmNs7<i-Q9l-4cxAye=C3P0}XZih?b{ezwn!7cZTK`d1CtDal7uz zh8M~jj&{L~++8>~HNGUtVAgQ7k394O^?!>Z50?mx@(B_1mAM#maWQn<+Z^6`RF9Cp z??$3WvHf?vT_OP=V(Kt{8`glU|BmI>=Sx#}xBK9T&ETa890=6cH+UHyErDAN<IwxZ z&5No~dOhF1W9m?kxZ_8x<-G<OL0H&jVdx|;-?@C_<_)-$xSnLv3CYCr`EjU9z$<>~ zN>;<@x6#OpCy-kQsVTMV)ad9v1Z)r<Z4fFLaKHK@9=1_=<mH0+CW5{pqP)f4j<C4f z;-38Bn^e8My|-GaR1SP6Yk2(j#uNR}?Jiec2IGfRNW$cx4fEnnB9LPPU((u(wER21 zhtpkz;z`6o&^QYJc<NRxT=-3#JQA5XXn7S~y^%*XFgVE3tN>lmBO8n14X5cd{Hzhs z-p4Dl0;g-Itc8IAfGIJv4+H8BPSXBMg9HtM>42>%k5GwS*WHSsJ*Y|))Rb!D=0xG< zyJvpp`SiF5N{;{u1`jV!=8)S-Nh#n>el-6ogLjEYowm)f<sTe3w0Qq-pL(vjL98WX zJzIUrJ<jU9Fy7Y}G@gVewUN=;4rlQ=1yZnvow5y@WE5NNiOr{0bhm!Zjq4krwx zVUdwm)yM4!B@nJ;fO$w6+>;jI?OlRMC;*SYy1G`z5@TV8$Kkx)&d%=tbObo&fsX<| zmrGK#wzE4#O-%@SQ0ClvCm-zwYJpek(VLVveyR1E9m>Br?{bFlagNM%dAUjI-#7(< z=FthejbZ@nT5jt$MENRs#%ZoHQM<dfXea6(qSTXo%|<i@<xbCekfO>nFfdTAB;dyR zIV<ZFFYhrpZu}J)1`+~<2ff&Y`zL;X$Ju|AsCzgJdF5?9S`v3TRont=^zNC6!t$5Q z5&zMO8)CcIQ(S$XGavr6+W0jv=DGK`(=`n>Z4v@V8$Fz(8m2C%sgTlgfenUr_}US` zQAOTZT!IX0RG+{9j08o*+%_^w{9KIW*S%kKrLJtH^TT@&ejO-gYj$OQeZ4FXRTNhB z#Ri^@E!xti`z1b}s-*}e*F)!p6-`NZ9LE2e{jufsZ%~n+x=ZC%OR+~U!6jN+TDoAq zSD;{XU=^1ZW)C7ciO}Ez55jStknmKT!C|}Ia;7R3tR@qE#RUEa6}-ylds{GEx}>$0 zT5qUS=AYY2o%Veblixs#%iF46L&ZXFJXXG#24>s5XvGs*c2tLHDnAx~(w$=C*>rtS zo=c}<(YP1;`<9dx{bJzc`C&XoL^Isc(2!EKpeYh6DlUM9-22<vdm}N?2!!2&gYe7l z{rmT$hVcnB3%o3%WP7Bsct(&oy(^Yqj_y2r_UsABKZhkl=LZ?J^)U+PC_QljL>15@ zBf^^Lp<WVYhsvAG%-}3vF3UMf>j=XYsl}6bV!VSBT0X~SrWX0*!5DbedR)e#$yCPV z{lbS%fwH9TPM@4?5UWpfhP;jx00i&Py9f1#sw?>2B%D_fdC}khsMHlN4D1)8Nk3<2 z8^F%o?YcUN{WMc8yg^`6bWC5-v#S=n5`%7;S#!LOQT4d3k896{{T9)5={X$I<!eZY zU5jIdD^FJnuFaIcIvh$w_WxnLl5k5=V__cGBNK-jud?-vvEhU;3@ovo=!S9U&mxc3 zNJ;57jBl9z`!J2esm)}-rsktQ6ll^a_m7deInM?_Ks?)+wpj!6Zm(Jxhr#n7ihr<t zA<yu_&*^m>VWXv`n+gBR+`5z`uZYlSj2GQr($Xm8hdP)jxwV~Fc3|T|UqD{n@*vy! z-%4V^`cxMfJu=+NO2rwpU!;W0A`bfaYISS$*!LIh@_z11D<vQ+uWM)~24#`(<{BrC zW1_*Xd~t-Fp>zc3PxXylpBo-G@7+h>sWdmZikzh@dtdA&D5EQFS77(<`~B08FzL<C zEiiHMQrAEBjQB+h2pcQ$_wdLaW$kKgkc%rqn)~<r?Vsq#etKNM?#GWGWNXE{_Xpg= zlzZ4s{9jBbR=pP^s8#=Hfe&eEyLJjU;##<%Uf^q7)Kc}GUs_6vXi(hNr;5ouvgS{2 zaZTzIMpX$tBIeM>Cnfn{8cI4csgPFp;p4~n+}!1iv0>%aG;lKkLTlbO<Lv{NYo2n) zrVOBAt?qKtpN@Mj`MfjB;SdaOitUPehK8OmGRbjc-RFv+jPCkL%%QVa;l=5Eze!$O zyAc(dg{|cucQ1ziIycuEVWE{>xMn~CP}JFZ5_{kg^ZU>M%3g=*;{>b{6&>}(X!t6^ z01v~&H2B-XIy>60st^i8LSJ`Wc#^E7w&8gVL$J>azw*AmSd5N{bW-Xq$L`yDLPu<C zc6K)8;hb10ZO&haSk)YpUt2Z8v{H@UibLX*VNZjrs$j7}U2tP`NN~QDlT2`BA=o*0 zRv^aVFAb&@b!IyqMHj}^cEvyMw9mJ+fbXBAwASWdkXBcSomcSw)-5=>WSBpnWO0%b z3w(1gzN=y&YA)?H#`(xME1cz(d&9hU?fq)tS;>O;RkqUg(x;Mx&as}OT8lt$uzUZW zn@7%<mzC*u{1Fb~%H;}<3X;;f6W72m`b6|)bxn08KZIxYlZ)*n=->cJAp0W*U8=TJ zp!xm#_ck}y>3JVLh6fm=me7U3DWIeTW-B34^TFFBwo&fwYPeC%K;d#Pv!EdTGu=zH z6QljSEKGe+q>-c+<FtF&7lz0PDfbH40rY5uPY#A*h{Yu&B@rO?SbTH!PK?tZzRPpO zng5ZOr}^qqex<L~$K>Ri#)j&qCd$W8w(U^Piq&8lfkTUIXM&{mr<Lmmd&nScH&Myo zLMSh(GpQGrm$f;VEbF4w?I(Y>lOY0NEo<@&@r*&#k$z{&dfZ}q4AUDPb$gZ;W#IT} zT<<RV%bM+%ar@nRb%yFVjkKd7zbc<9&O{5)JN^s;M5Hb50SvA!=Ni{OgEs7YtUxR& z%w92x^#JvO=Wm0WsczTZo?V_lbLX}FO^RtGh}@DnP8}!OlZJ?{lOiX-4Gl9lXHAOz z_|^8Db$BBCNvX}wT|1dWYtl2aXa{HxP~fV4Yw%XbK(F$Ute^;ZYxv&ba6Uvw=cGDo zYHr>L;{l-$gOsObjQJ580YMK12osZXV2=|vUv*IQnS2okPiJi{6AzEFxU;NvBrj`a zF4&A-t=@&D#pa$CKLCZaex5LZ%mLR{P**2nr(qAKzU_fXD@=-FW@Gb{6<YOhbDpF4 zuSNA$yU}#Db~bYA%<ie=fwnKXdp8;Bsin-crVMiNj{-VmH{s0}4CcKl^B$WN0PWuW zWZxoZleHHUj`vmW)5&MLWAStTFeQy2p`>ND*x3}=be+x8%}p5HkfPFEf?=b!+#w@V zuKi-|VHsjox<>kBoHYaiSM7Rn;D1pDv=?ml?7n_680rVB(js(4ALQ>+(_i>O83!N2 zsfshckwK4_mTVP`S))IZ`P|^hlTj_ZnO3jzHYLUHRTlN$12LM3=v`!mSGcxpY;j&} zOtVL%D#T<bSXllXty~6@4z}pa`!7Vi&SawLtK+P6oVu$T5ZVA?Jp*k9G2Z5)29Y*` zdnZB6xvQh2pRY4`YRZg1pMOVsA=1)|R{qePJa3LE>_;c7QSDav(r{ip*cWhh?%02@ z$1+MvN}4^y^W@t!PQgb(^t9P(rB@K8Klx<6A;moC_Pe8`n3&?@d7pUxev!8K{6qHi z&H{EFzkon`I!(dY_~>X}e729b?_qRS;a9D$q&KC%eVh0)G}a5Z)}u<D1IqM<5z|~$ z!#=!H2NTY>KSdHOxtaFk3o>GswVl+n+n((@d*LFz@1Lr=bokv03!`5xP|uNLP{IAj zZe)8hwwst%i5p8|=vvZP5^AKspIY3$3h$ZQK4DTV?)4Y5pa<+EjiN^k1pXgU?*Y#B z{=bjcIW1{XAu}_h2+7DO$;fIb$*Qc3>^+OD$Vl0v%rp>XkC2Q+_9mNbva){ntMmW- zzvsF>*Y!Ck^7eW?$K!F|_v5|`|IEJ?-56?;EdRtsMx+?33WR}xSXii+xUQuo&Q`H> z2&fZWDG3cL96fMLz@-Z}+d*7<(kg$Spm;+}U78X=!(B~P0vYh6J8RN@Tq>J~HM@S) zd2Ry~^Fl)<gYSU4l$37s@h8)~U$0z`jvrw9=ih&}x6cn!M90L)=!(aNh`~f(Z>_#- z6(sn<&#(uO(dA}h5~N0-JyI7duVGEgVaPGWKy}0!g$VmOm9w|}PAVU9DNa8O)c^(e zEuWKG(x^qSi&5ECNd(oG#(RL}Yie)zxy|3c9RSl$!S8`P9LjR@mSD!6n4F^ZW8CG> z$8naL!x48R#HGF@iFB?hu5I-t`86+gb#`intZcFd&<dBKZ4q`}IUP)<qiPc8hnZ|p zyD&TY=L%$rh{c8L(p^{@32HjygAD!}xa=fz?$rBJlHap262CT6l9HA-{RU8m&)-Mz z5vVS&7nVboe%*jz$=d$qK066@w@#6GO*vfOghp>=!)+_JXl<#ny`6oXjP6gmPnA7R zeRl_|Q8G#z!CQXLS8^yE3NNY4>~%WlL^KwnTHNifFd;FTF!F38yl~Z?s11(j=NA;H zk1?B@p2`G<<vTA$OP5yMegBLl$BeBugZ7bmt}OTb=PLn!S+waV6?PcC#L+Yeo3cS^ zlk%5G?+Nqtwf;{FfRJxsO_KVw`+8-7I9Vd@_?6NhX+JYAE-qZWh7XLBQuE|;CD44B zbbj>x^T!c>Lb;={PF}-yYDfBrhIM}fpUHFnh6hZTycE%~>$Nz6)rAW7gGn{tw3@>~ z1QAINsWSy1LUd>|-{l}+R7&?G<1@tI<Rhpm*l+Og%VQ}(*8pGb73S~Y-IXovaB%;z zU)6mFK85Za-!@72i{TPx;-F?$7e)?K9jbzC?AAu(FB&HcDJf|x9cCTp<ds8Ihh&w_ z4%*n*VC&+URe%4M^y$-48JWtrN@hnJD&R*|GVY2R$rAiI9nWHG_61V*6EY`Cm&{KB zJ-vAO_TH#$lL6#oN|MwA>OQHK`*^JCe(m>K8T-&S$ny@qQ8`L{1r%guA}LA{H3Oc0 zz5)KlMr$bx@4o^HmAY+2z46NxYu|I%t5J0?ItkZk%=E&ZjJ~j_P;FtAx_70EhS_w( z=KVf3uZpi<pP}u5)iUZ2^sV5eOJVdej<`$Y_Q^1~Jjc_<H4Fm+W`qWy_s=ib9TmPm ztR)=ZgMNN|Y9i_FTT)-CGN5p{lnS>t*Fe5uR9g)iL`?pan{Fh*?GR&6z5xN!Ou-qe z-royRHzA<N_ofcsogi%kpMvhK)c5ZzFd+e+$jHdZ{%8Mg(4Be<%TY3pM);Z+s3)J@ zs6G-#L3&mR)*=}e)I4+_Wia2QXsE_fkyN2Vn|kOgQnGyZ1+s9D)G$XU5UMS{EdJ`M znjeNM7}WQaO#9qo<7{0uGc|Rz)xq@0qO{QVGXer6!86;xZ~I{35o|_iL*s<%K<q*p z-w$slDQPJJ8X9EEbV<`|C%o-oS%^J~Ru%$B_)aDl7srl_=%a^&>A)aBQd|*M%RP2k zwo|tW8aXhq673owQsZpuEcl&6?dA1#7Yn)Xp$_<E>0@U7%$YNXsHm#msR;_oC*|aX z!5FC2XmU=5VHBy&N12J$Ex6<F6Oy~EG!R_LP>T8e%!>p{IuA4OfZrdbq)bJC51h=m z3cli}0ayWV!eP~c(Eeovoz}JBtNmW-`o%I4pxuen$AdmUJddFZPk<~f4V*wsJv)EC z_F=!5pd(}BbpaPIN}EK3<ffjUQ~pla3ep4q7K1zc@V)OAy1n-bHZE-5GaMZ^9ET|D zzzc?f_76IEN<?6HAn6Ae4zNZXCr`5Q@jcsETP7XEZh_wc`Ugypm;GDT+p7iaNcr~d z$m7N7XQ#Ts92j#M|N1rYIxSTiiyJf>CchBEdg#j%s>O3m*;=D1F<XNnZnOOo;zPt! z$uo#8xPNdvF3aG4FpW%Y-{<wdMc7S<639`^`<Rt4w}w>fcdU_|)cp9oGynE86**c? ziN^q8&Iv}X|GSFr=Md%L6Uk?_PT)}Jc3Liq7IOFpcoeW50zJeI?8xhol94`q_^1bv zaarXXu!{-_3A<?I_(mzR@c%%(?jf(>%}rNywX)x2X+GF!DL5;~osCfz|D&tnH^qn| zFL$w39b{PB_y=NdLmGtCZa@eV%}zX8h2ij}gE$L&W_?7kq_nPXnzAAX(Q%;^p=e-0 zfN=Osp{@XHEvKV1=<{T1A@BK$>%fN-_Dkai|6w1KKJn_hw-A~2xvkPJF@+J8G2|M$ ztIvj2R8<pHI8uS2LvqN><<Y&~%^Pt*jM^e@tZrkuyB>~NSJ=3a!Mg)35=#n8$cvCm zCe|mfl3iuKz3?7o;`e%10kIpEHyggU?7!sxPknVP^Vyt!2!BGN!sLylIRRjot;nWX z$vSWK=Sl1-l5^dU)*H6et``z%K)R7oO`3|UnC-cusrfzrk{=B0bTNI5#XdV%$-obP zl2C3<$44uz0FrB){hJJwkVVYoGX*pbxE`0!6wIT{RD7lugteXBe$UA`&o=D-51F%- zYCsFXWa)v>(UIw4J8eEXM|P%jkxj2E|Dg{NwVy5Cohou0%exxmabS4vx;47;W%2=6 zVCECOcK@9XKZ^b%wCv|!B%{93q_VTMm1a~uUEx%t81?O`R6;|LYLE<Gb)AT2v?dDv zfG0MakvjxGV`@gN(4H4cE0JJRmyJ?&2^>{u%;3Dcu)vIziIj-wn{Sh#wkg?MOoy4z z-hr;}?&$nZkzcHf?(O2{Kexe<2Dj4HQz&2V4LGq+Y5cvr${(@k%lM#8L(S$X;VS5d zQWZ$H*)PQuw4uktE_>fhdQ(+X&BVs(1w8cXivwa5bJ3H&qq@q##4bd<8&X(2hWogq zz%BiFF>@J{>DclNj)2{J55By7qoK2t)Bl`^NPG|%&<3mWIv0MlZ-?kPasHAF4nBy{ z35L%i0?=I=WQmwlV1ksoZqSULHf}wMTn6i}sHexLrjp?1t*Yg)GeUtd%W2qmALkvW zc-`sF+5YJ6R)ELvGCT{y5B;UFHhzaFFVy@}m3DN*tJ0ymY8`lJJL7iexpB(c2(i)l zF4!4Jm~I3|@arF#Xj;9cc9Lgfl{NIF7N1Ea?EzG?9SFk6>9Z{un>oeDhL@N(QuX_a z$nORnnX6c}z(a{uoBGVU@l}PlPMbGyI5aWO8Msf#y^sPBhs8PBTM+fT)*7G@$-(^$ ztuwTkr@MQV5gz~OZb=8hZ63cG%6^MCzy>v)&@JmjH=aBRZKb&DT=?GVWWvq2!QX}v z!lW^KEGH|gytg+N(^e!;o43KF6K-L}KNs;`1l(k8YnzEFb3}(EW^G_>0&c0Xj=xfQ zIkM{wWS#rYZk^5E{P?22&6)d&DNd{j$s;|?UyRcWZ9AgKp*bpJCFKym<=<yr5+#%s z{3<!y%Tu1BvA3Js)|TSfqDj|>r-kmKa7>MWJ3mB(MahE-OX0P;fz@b@;uUUMf?g%w zd`h>B^vzv!ALax_nbwRy8@xFve%%FyEK#-Q{}I7I?eMxXJZ4xmIP`djw?^1XD^w(5 z6d~^}Cw~|>sYyfS>6<A9cwqd@JL<P6UH1BIZM~9Q=<wc)B{KL3>OFEYvPT-+27SdY zWw{u36c9KHUJpI6O>g?Zz`c>$h>Pm#G)OBt@)dXjVrPi3lvEYRh6Pw)khr7t8uMBG z;DvqzG=*#;Ij)X)d<CAtpZyc7u1(7X@KGBnY@C?Ffezp6(9DqOHlQX$Bf|s(8Z+1Y zQ3bR%<}rx8ZOPkhxTJ-zIXuqzae8U0PX<&2&em;{s?#Z0lvvR}CkDSMcew)kwDR1e z{@}r>OBI*O!raig)FhThUWNAEG{WlJ4V%NNZ(B_IKE(X-ay;U@7rn>W*w}F<QFnsW zSugZ($f-L#;)+aLeBOIr_q^)<EORY4b+%qc3%cpLDN>0<0Y(gu;1(kvB2kDu<Lk1v z+iVX+p<bXiP>kYzDX6MaLN<-Au^ci8toeJ!#!jEie0{1ih^+&02s+t+JoK0*O4I|P z0|%6V(Cs#B4IX741jPzzSWqQhmQz&RkKRJ?3|_D<TDas@r3BcKBtB=Mrl!7cW@fNf zH-*N7Ag5`MILlqN-~i$vca0S|Dvv*i;-KU5$A3teYxrD&-;hR*)x^WfE|E$w`t%r> zBd4Q#ztGdr*B1!sHvki0!sC;OEmppJ_mxtm!!}_5rLHERUcy92F?weB-~m#4&%a)1 zy?>@WKaIv0Z<R1$y1)C1ar4+K2&a-#Qg&-gXmh^hj5vMwAM_xXL0t2sJN{R#t3GDW zH`|71ee!m`PwhtqRMrnK@QT`PYAnrk9Mqca+WPZ8NGtYv^p`l*jbrLG>V%@7bU$#Q zZB$2o0jDHbiE0;e&{jjuAFd-o<e#9BsPgOeqL(UO?cGN2uujC)%!Ut@F4L5ZrW(XC zF$?@_#xvumyhICiKKxBa?(|=nE*w<STAknmihCD1%F8sxDZm4W{dcA5AvVM|xYNIL z)f2e1`^mN|Y#eHt&Lltw6rzQKM>l6_XNnf+4@#_@-j*qK4E)DqZ_g0zAZ7iVYz%I{ zdGWTl0T<kj4j%Oo0^W4ypI6sL^M(K*lv9*X0_qJwtKqJ5j+B&Z1dbg7D59W0;ws2W zPU3h?teILMr9OHjYO(J$S{i<G1C1=YM$9%xi0J*gBXyS5H$Oj%tOLgziaSa7G#(}{ zh{HC*#UF?O$Yx1mX=rYiGFIo3m|8Ks;{0uB$Icxa@jjy9uYk3GviVdN4ib@Mjs!s- znxE_$-ow`z3Kc1r4Q%(;o2>w&2906{pQ6Z}E|?MDOG@fFbBfAewje(rA`QabQ9wYT zEW4(L@EPX0Pn!%(8zZJk*EE-wK}LJRIeTzy3>9tG?D8@tpN(|ZN_KYU*S0pwPtuBJ z+Uc{Ok&azN1fAg0gEQlot@Zk?pF=}m;0@Vc;wFLjL-Ci5Jj(cFnud54Ip0g3x^0d2 zxsUbcIxvTHpCCI%=Fs30z#vgK8t2U2Y>%l4EvF5E&H0p)J>$cpowXWI++0?9VrX9C zea`o;&CE6IX4n`g?sHu}rPiUQ68G*apro`k?rzcUaABPhp6PREM!ntEPP?s_GdQ5W z+TM=%*l#ya>Qu}hrA-r3=y=6PZA8s28>YD!cEdSqiKf?W*@dxaeL*0OXaxy{Rs4dV z&ptr{eQH!eeer{=3qBH%d%+Hvk^fwX|GRxqa}jqJ0t5w6sa#=UH;)^0RUB>ct$Oq9 z{(X~|SbkFy2c>l@qh8aHfYruw1H4Q6sTy1#ZmoquWr=6cLM7c#KH66DkW@;#B6u&z z@;AnBJb6KM5NpBXV&(U>Ykzeqau246)7v6ua6bx_WW^|HC}?Mjmg$>PCPFh8mzL18 zxMOAxfK1z}^V;evfEWc=*Wx<y@87@UTxSgX#zQksPhdcpJ{$l_gBKbu?jlmuNdNBp z`!T~Anpn>R|K1F}sSqRbqPJKp-zgtRm)n+W@#Y_6B4!<PsRu=8AKuB@MevP)1OKw? zX{ZMJj?))zU7+9WDPP}sS_1FP`jX;J%7fiopINodaOQ->yS#@iEyHX}{MoY*A*h7l zSKTsqxrkOcPZ&BQ!dwXLA?t-$^NLY%+yV)e0r5BAuKr$7epGs*3)eqt0Rx<pc!+*s zr}Xg>!S0vpZTKcICD;#CpIDiiar@TDDjy+W6>1-H!ty$C>a(8m#BIwc!W=BSXO{H% zh0vGR2Z&>nlj#Xw9$Lw9Xa~@DuP^j%eficz>Z!q~o2+r_B3VcLGbS{rX9NUMZPma8 zNls3gtjW=PJK7oZJEtFQJ`(Bq3jBPfzmfriu8dd3Z@tw}yWx8+sd-M|te~I_1sC(l zGbY`-$I-=}htf#XW$6`>A`SWmb`S<JgGa%V-b~Y|j^H<FhsQh|V???Z7Z-6Uu!@LK zgSd^6wZrR0w}qIAUz0j|dY3RF1}a4Lw+nMfHAWx_bMy64iLHJpalXP!KXyr+mUeR6 zDH|Kb^2}c2(wfG-Ko{^1$H&lo0bkNZ#t31q4GA;_j~3!D7gz(Wc<1Qoj(-34R!e{B zU5B8>B~*6_bj14{>E)vY1^{f0sD?2cyx8}yWN1Q+%|YXO7R#sG?-v$k7*@p))OS+t z<Krax(D{w8Gu1p*C0}~;(Gigv4qj~U=xpe0b@UapuJ3DXbXVa_0uu@t^zM3vM6nN~ zq5u(Txy5RUQ7alZHxHRO`{yMkb9VHOKVSLLpJPAmQ|2xyzWV#H>vCVoMdde@ZCmS+ zE4eFNw*!5uS{ge#<j}U{Ipm4NJpcs5QbW!&-eP28;t$BkTK5c!Bi&JbLW`$&gB94b z!d$GoWLoaz_pYQMS(Y7tb`MDOXs4)KTUqg|XPYvzp1NdmM_?c5Z|pgey?f$+p5M+f z&Vi!3;Ya)DuMB7B2eTQ*XJ#n1%=GnbufMA_WutU@eFyQp&I+Racl!tRV+Lbz{`5M{ zh+*K`0k<Z2u13Qrtvx-8K<rU8;gTD3HiK_e1A0eniaK6^fSxXCJMc!J@PLG4vMUGP zAm38rTrZoLOy2R}^99FrF5k)NzFAS`=g;PM4Db4Sd+(-;q5JqLhveQlL`ovr4jmb> zH4&_n_hx2dp<+2&ee^GYD7AZzXKcSD*jA_MVsAIM1v3<cyar3rkk3N52eYU#A60}q zK>Eclp}{Rx2W20ZiJ6hnJ-B(&p0iYF-|U=7*PIh}adx&JoH2t<wWmZ`4GSw|GTS6$ zR3Qnzr*n@-s05JVHar6e-Rk^ebx_W&k9$hYrBH5uK`rPo;uhDBXv8nwCa04MVaS)_ zw2G_GVR_2#@BfgXySmopMtLcxDx;~T<&vX*{_#-n@R4&*rPKzFs{h2tJZ=2-<h}TN z)?b`(LUIPEpca&m7bTO~UHLXPL4}i*g<a~9=f&bGfTAXynItzN_j+oSp6N4GbukIf zLbpLiPoX4hz6Tfz!1Ess4UEp*c;MSzx7U`~Z03HjK4-g5MM#*GVh?>)P*C`<wY2Ph zx6mf#<aCZmNQ12`W_9QthRE)|D=3J<Q_s+?CI{zeS6Yl2bjrd}5Rou+J%k}hfZwij z>lh@(cYyzVTsMxgm$)6_1O*T5eeUkN*4Uzj`5#JgmUfJP6+83sV+PbrPnQC0Bh@2! zeu#;Ttbt@g1_dIDu#=kkza!}b4lw@JwaF7VXw|>V66ftzgd)@;3Ky2`(u}kr7Gk<u z3SC@X(Q>yR5Dg@O=IJe+A_!*8-G)Sl)<95s`Uk`MAfkNzDp?M;I)Cz7n=T4mq-hO_ z32~_q>_6DMb=+)yW521oIn8pPlLSq1*TdUZXFE^4xEvv7d=~MeZ0YY@Jqgl$s>AbB z%bgS(1n$v04e`dh^*c~UQAh9_AFx@pF<G@BCB6`2|8P*fd{2@{2b+vGDJw4n7>n`B zftk_zHHPB)LiN#p;f}+4&&UDDLL7JB$Ta@ryXU#>xo`6Wn3%$d*#?wEnU<Mj6X(<o zg#I!|o=W@sTCnZDp2{+1<Q7pnp}28nm60gs{|C>z4cGm15&IZ_<DLV1+0u^(KL2>( z>Mc;jc2ULUn7Ed5U_v*QW;o5{L9C5qWODaq+0|V;B>_C%et&Z|CC%*hiL0?yKx>)B zT8u|v7Dnj0;EhAYk1TfQ0dEaXsjqA>2!qCP7Np!W<Xs@tEpIqf9b$fhsY98C6wL&k zDI(KdPj7f<YYa-qs^NLkYb`vUFmS_x|M6q=qIsLqCsezQt*u|Z_S3ZIm@y#00P&Zl zPS5!bKFYHEoD_8)=ql^}hmw-=_HFh1CPqiT*use@O3*AhJDUPt-SEe<)x5Xn%*|S? zTJrJsSPwI#!xNG`yu21iA4a|HI%<<kk!OjtQ$l>{`+?*wY-6wQ4vTnE{VpO4PKB?s zvqOP*QgnYfZ?N?v=n5))wF1{u=!Q`Nqw}cke^OpJ-=>O2pm1f~4_D%c`~6JY+&$bo z*30#K9hT`#-aW7fh(+k|z!&}#6cr_p!|PH37ks6&fYu`zpb9B%n}w^;#vrH}&|YDw zu%{QO%$m39MNd>Xhuz{fv_aQC&a00Q^9BM}yt&*)EL||#1im$?mSuSV{?BqZ=c*{P zqG~TQ!Jp6ygl(=ryTU+2Mqdg^6*0WPUB`{rP7wT?OCx>lIc^Md7IUI&zq1g-xPQ%w zb$$Y}gRth`DrYw{f+1Fu?8yes;5Vb8U}8O)u~I<;1D^_~y`_&zf4^M=dVL8>G>BGA zUAb|t5E3w>dyXxYp_h{|t3!T_-Z#~kL*SDD2<WDUjtdrsyhmj?GcrGtpIS;gjQxl+ zvHw+nIC|x_yrP5{R1|o$A5b=b{i>gs;#fiCuQB9o_yD$*pLod*WQGY+&?LXm0pX78 z@4DzcAR)=Z@DJ7zh|A9)#4!?!5(0P*Au%&Fl*6cNadB~TYpdn_kQ^?TJ$v@Ng#8u5 zY2YMG@R*?AaJ9g>2NxbfBlry)Spe1sf*G}phz1ddGw|rqqaSl}2K)Po`7B^4g#P!$ zi4&0E>>(j}g#-*@i$gGqx(h!T<LVGw%b@)|e4_KtUB>>}W2fkPj84|3ZSdbW)vqIn z2G9pt6DEHgL1{C%{3ZkLPBhU+xo#e!r1bXmtS~R!Nl64C-@4WQ(}sg%q&!eu7v@>H z1qFk{HV-I52z<$#`G(BnXQ!&+ulezG`$wbc$vkEe-r(TT?&f*iu^Qc)_QdTmySZD& zUZ07nO&L<V|4{CU=cZ`TQ38}g7ZcX8_Q%lh!G#y`19yVc7H{1-f1F@E-=%BjE-o*J z#6&6HmZpZJx-2*9Ee)Eo(;YhVHuc&=jd6_2zSHdFN7_s%?f8YRyLh3^!rOh!i)ln? zI(>Yf<eBKm2RGDXDP|1B9u-}v<uBY=>LL#OjSXZ@jC>dDV-XRF1lNKf<qMcs1aYEr z<HjolAtLDGZF(^i@=)Lhif(fCr^mrt#m>Tgu4|{jnju5^4rU=x-)H3Hj8;%;C8iZ0 zK(z>q;Zi`BataE%8-Esw?3USCbC@?E98UE2kBdZP8F1s$UHUyelRX7EFDM~}I&W#o z2TT6iSTPz9vD@}N-Ou}jKX*Vs<1~Br)YMd}8P&%enkOcsLqi#e?ELlX7ts%7>3^qg zty+4)cVso~%^QrEJPA`RIw=h$?N{D&%abfz=SUAVeY;ervq`rA&E@%ohK$9O_h@Xa z>U);`3Hl<<PoAVvZaM@VQTUMfcyeudXHDce(*lo`TzeS6Agll>S(X{I$ARHMp~D;) z21_xUmddlpyry>A-w{qAPMAE~EL!Rlba_8`6we*q5K}p`&Ex>I#JneMEd<@6V*(d| z#(?rGR=>|4zvJ9&2d+20t^auF*ao)c^&2-l0V^tHeZ-nU=$SO)>p{SZ&VK$Ey~xjj z0m-XZ$y!=kD9_xWd$RxlO=Ns5jCe2TlR<ak!G8XEaRay!E^#Ob%Y^nl8O+ZY5#RWI z9e+&N4TrEP#s`XnWhB%DFD)kX;E{M&N9W=L%~NRiDZbbu<pbQu%U7=+;ni8SY1%#Y zX{R4p|G1z&(j%#&djzNP_fuA;$38e9@2J}zNO*j?41+Ule|DkB>vo&jU?)F%FY;AY zI1)Mt%Hp<kq|(PP{|Djo@c>Ps=>2d=E!rQ8lr@PJk0J<D;TU9jyvv)(FGTZt4PnGG zZ=V<NR1K(Fr84cP_SPz8h!`6o&j4j2ct@{<9%7gs1-Vvh|Lp6ia8O#33Vun|FrlHU zEd#_6<WyNWo&(OaFO^@R#5#M=>Tup1=IVbA53`EOGQjL1npHlOSVP%neM<QB%3_O0 z0>zf72){Cf!$3Y1qhn*euhR%pXU$-F;>p7w0K=oCI^@2OAv3_J{`ll%^LPT|i_5F& zTYq?9n$Ur$v^eK^5&+Q>P_`j5Z5xp~_S>+@hW3Vnq5>2R1AxluCejNFMPW0+>@!s` zQ|v^jz%dIjS{KKKnkm>KfIa_`^=$N{@I9F5>*j(j5Q$0g#$e<H{E`A2T)30eGR;Zw zgpLOQO%iqxhSucx$us-Z-c3e+!8K0?KAi4qdtYBY@aolhZS4Vsaxz_b<d^kr|E-Sn z-9XdyS?Z3naY|Qmr~SHr^oGpa@BuMTDTe{YqB^MR2w@fn7g_u>nB0KnWAZD?_7-N+ z2_#U>U%xJcMgjp!CCJa8kd(9&E~#kza4yq|IX(v%Pvkbny8bbQEopnf^1E}s=%7%4 z<1o>@n&^bQT{uVdPfW-=I*Od88lRq-kpU@ANm+@s^2crRN!M`wLhxCE0f$rS+2+WF z2StUkjBeYm2RnA|M1%GOSy<$$JD%PyALmc8$q#0L@C%h{LwkD_91LI`y_1_eVfozj zy@7LlOwWj;;O|rQ!c&E`en0A(A%?0GtPg(ZIQTU5Hgw%}|Myhx=-K~i0f+&D<m_GG z<A}MCw=LlCgSCU)Gz~ukWvf-GrTxe&ugrRaXEy{y!8OdZsiN-nDh!06MOaHc#Wwgt z-6uc!Z?cEe7J@XpzvtFL=q92^YTjz3M8Q*#oVhdjgS?H60G<fwOWbZe{s;H%Llw?p z&C3v<oa{wF9YCURUOG(YjgI~Lg|U{uq3c8>A6(D5o>+&4g<&iy;qbUu>3us0q#(^A zI@tYtcJJDSTd@CUY1Rg}7XiuQ;Dy7i;-S6+hiPAn+-CKe`j0ohZ)8Ny)RmxS5*J87 zB3~u`n>Sd%UNpxkSDjk@F*{aK%sTw%`FK%_T6@)V!Xh8;b?k-Zw#T)kA=zOv(6(~* z3MT|5!m4IvLEWaO_P@YAZKeO6@vKNFY8J}{tA_h$aM-1+n+s#a>QxX|`04&%4{D|A z?&<3<`Lzi{f?NKWYr(aI{I42KF*)P)m6QwG@YV)02qEaft~{x)2QXEEU3Zw0GUYm3 z>wg?3Ot0YSIqq{GOYg#kN5_ldbyE#T=v5GVkO}A@lup%p8cKXr1=dVG<U~`t`?k7z zD*9W8BDD3GoQHhBw9UyU&ua7<X1yT}!N`3Ijy(+Q9m?LC(B2wAZJ-b*9`k}rHGl)E ze9FUpff9d&7z&q5WtEX-H6%iIiI`#uC#tSnDzcVFe1NUWa*JZbphj9xUe&y+qW=+E z{j!>Zo0f=S0Z;~|-eokmhf)Iq{MpzzM<OQ|a27|LGvK!1wfGOT!{v0v_O<`TVei?f zX_@$wbMDfYnN%zD+JpfPfjlm=;f6fOK4#b#`XB8DVN{`4lHRZj-FnHK{qOoevO%mq zwiYFpUPgHkv)WuM1Dva*<Z+A=Rf9+uyhjm~$3hh2h`9ar%ZSLy!b*#fa1#f2CI$n9 z68mW!ZZHK0tL}X|xy6W3MYOh3AOiD(fB8?3Cgj8^#fr+gxs}v?_%$&>a^L_PWEnG% zfV-QH0QZ8mmj%3mwR(0^S3LIenve2!E7u8>kk)jeJ8i!KBIwKfA+liJC;#n6TC`dN zjrR!b>a4)t!T%di4MB^*majNe{9+mTTNcE_ixX19bpZZMcUTwFc6k-4Bhb2`WyVbC zNPUbla1AV6+LN>j6DPSjlEF=!-`dLIrMbA-lt4y&&G#4?4HH_(SKuCZ2a?YJM3L!o z$AJunJd2ftXP1)4yH~r}mX_MMhc10Rh`*k2DtrDsF(gy$Ifss}Zeqx>9Y5jP0+U$W z%pfVZ5s7ldKmi)q2mxaXQi_v^j#|ka<>uldSUZ$V$Uk{(fsPS3#&&D*f>G&wu%T7; z^=-njFr7fX873Ns!Jaz~oG&i($X;dOx`pJNBUF#2I4}57;I!ICnB=?(Qzb?j37u%H z{Uiw(IT`zGl%A>{c#zyL(c%kezh`6-dJMcNI5xn?=RlHP5(vs23^%Dh4m|q{!H=KW zN6n*P8TaMiW%2WnUf`iZhj9t22Tc2f1i!eTp+F0fblLvS7C6;c&@IfI2QDbg8c{Y- zc7Y}<-s8xNBP1L(H*ek(n_ax4XIL?{V9HQfx3v|7+0|>eG=%J9{&f%fHWapKG&4DQ z<XUU}C*{b$un5zE1La|v+<Z&I7~(+yCJP(euRX13oPgv!_E|=);rRe=*tL-Yeh99K z(a9?)Xlia|@tNr|Ettw2jXnE-diO#4BTT<eQ{81CUlkV@hgG;tJIb%~IR6NnaAfC* zRL&y{6_g%e#F(*_Rg=DAx`#-#!?Oy$oFr1_dPe8&-AB;c-~RYozz8KM=L@LNWN~>B zpgdCM2-&o%w$qE8UI#yeIM<s5Ij*zks<q!99Ip%TiI~d~+>~~45kq9}rFi%MZkAxO zQS|eu>zZ3z_Ub@+`ya#UFOM_h;`Bc<oPjSvlVWNHJ8-h6Bn&|AfX)EPK~fp*tzRXb z4@^vQ7Xr@heo%X@t~2~7E&I!i*X9|=RHGFNOAC}xZL67g{nO7VbG7<TQ`Udt$immE zPO7S5Kcc6)o4Zo4CxckGe*Dy@>d^m3rQvG0-UI~&{(1T4&6DJ0wip*w`S7SNK7T|V z5{aOo^A|7v3m+3U9-f)ZryOw5sfn@cCF~?@z5*acX?Gm#DyoFL8n}EgEu<AReZXUx z4ffuY6V+>LYp^z9Lf9V?UI86qGD-?x=4vBBF0H*30_`$!+&A1Go0z$%Y<9&28K;}8 z^={Wt-KMAWEO%QSG&S{D@_>;fWLkuX*PoZDBbl=SQ12ln9em|YAD@;MfGeF*{`o6e zl?>>gss{9!#WaJpk9l()2*HeVe)8Xu%;V@lGlDX-lL8C>e+FI#@HK?P1_mbzmZq7+ zxHj_Bp2oz`p>6gTRZ_ZknH(DfjXmxs4xwAe?M0)aqWT`b*l;99IFQbapX6TDmZvp^ zX;dk%OIX&jwx-zuDIf3yh#?$7fAYLJI5PVq^D`tOB9&Pe0%{`2rni?KM{dmDbsR0c z;Qm+4fUByxrA2ee&JD4SIB9pkxLh$B=av@Y!mHBM)7mNxD|u{tgDBvkpLcT1q$tJ2 zgM|4nc!9e>AH+#_cXt(pz+7B@V`KLb!5CQliaxC_Kt;8!sV}{FlGk(>riuv-dwNOW zbgbzG6STt%P){$oO~%++Yk0=IF1Z?ab>{o8#`a$~bMkdbGxjG(kzbd5*7Kc_vEyWv z%-It&!5LACvS;NVJ~r7SPcHfS%kyo!x|^NCq+2qRuFmKs21`>LN-t~%*}M<d@O=8f zxx~sjz}mp{Satrg>v9|Tf0F(Chr9YVvyXQfw;@552jDSelzZpV)x?ezD7&aWM_oH{ z<Z8azy*kz|?X5p;5wWo&u%0Af#7cT6e`rQ=JXTlL9p~cr8+BceX73X`gtKpbw0<ij zxPi=dGftw!R9{8gA27f?>B2E8(WpQ7A3WH|i_g<On_ZKWd87CRCQ0V~=8w_PTzr3X zp`)Rm{S*%?^C^$;vG01@0a|5l^=_bR2-1FDUmXxKw&=+DmMisrIx8bLOh!K{KIJ_u z?1zbs<sK^rh|8q2I*pBtU#Gt3bu@$WxFe!t#bho|T87J#nGDgsDB-YxrRhp-MCiD= zxiM_RD=u!@yv2l21H6y@qx&FEKm-l(MFO1@=*^InN?4$xCOMnvLFi$wutSsdrL*() zEz{FfuTxV?@0_MOwR?7H36j3eXKY-+k%J;42-M`pjT^XX@Grilcg~l5^j9(RO-Y#$ z2r&a<1tBT{uh^R244Q%rqStvr5mh@X=;73q*s`v!HTSMeu$<3k;x;E!)_-|w`(l8> zGKQ)5Q}5&2`uYWl^v#13TNU*Y(a|i3Qw^G0?sW=832-Ng>@p1hfg`&+BYrM8IOYNj zvFbNgg!vlz)8<mhgbAO5^~u$^IbiMx^957r?KT?xZ{TbK!{%823p2f(XX|CofBw`b zv)1VHU9(Lz$v0j7rZkp)CHp~-w7fCt&WfD?uVE%s-mi=_x|@>vx7n@+UyXWZhPglb z&aFcp7d?h3)BJgx#;u>LhF-s}dhwcMV{&D<Z?vAx&9zQ%+PAVS<Yn2OA4apqXda^` zb5>ARwwidK1DHXFr4=~0y^|BB2>jsDSYBRUW(<-NR}Y_vNKHe6jOQ@s0(EtDuc)Y4 zms-tYgcWxTp&N{jrbSSbkn4J``SdYrY9@^50T)SdoM>UYkE@4<IvLCt63UB7&t6ln zfVwhIqi%kl50xs0!4R@pvb8be`Fvs3;ncNM){xr*p^ow=Ytvl~pMgRGqgrb?0+fwR zw*aF=7?C4{dBB!ftC#Y!i#YoL!^h)H)JXAZbUFOtW_C()@{W$|4<FR>E=V|sL%x_` zLqSRDX~B$eHAbYS)zvAX)2ix@ki+Yda9BE_tFNn-pv;;XYgL^M;1)L$xYW5(!Ohwz zH<yL{kQp$g^LyvV#>Kj%Dr;(fS=o#gM*wictnndwihy{v3wP&gs046Od3#GF=6(#X z^;cjj7i{b3`DUf(ueNnwV%2linxg<!N<Nbg%K6McK?(S>%qM(k(@s<E`}pzG4~u+{ zFDp{lLatYM(=v@#ba&JK2hxpAP3eILls?#v&lPkz36FpF*V}aJn1iScvEbV?zGGwo zzaSvQ+&hUhbqZnkO_Nho<$}!M8;a`?(y^bP+O!5^ou+x8xZ}ova-@jy6YY8Ku!Jk@ zdk!4v4O%LuFVa#*_7W7D(ucQOi_oF2Rk?ZdS$H^mvy(B!zTeBIvh@6Rkos|HFMut7 z3gi>rI!DX%<6XnU!?YsSvf(_%$2!E@iisXwlva(auWxn9?u&jnpgXE2aK8-yn#}cD z_H;Y@X{e2ij;?;^D(NrYJv}&k!W)<8PcH4%y=iG_&PyEz&g;mIy>-hRPzvmCt1#2r z)YKFn8Ho>5g^t%862cj`t#btO2rLbJS|I#Wf6@F}U6e0jD>)tqt?c^7dir8zks<M` zdrSOb)ZX}`%8|}4lioInq|myyl7MPbo|le)4A-qJGhU|~IO;zB`c+zMwTBCD>1_8) z=iuK5e=qd+AFSr7r8Lb&IV2}9r?XYGMzU{DA;(0vpq~^|X?c&w<J=vv@};7ulZF#X z$!X=aY9ROO8KF?y=jSQ4VN#0Fr2b_1{M_it__*P3M=`M?vF7HMjKV_y6z`Okb8FEn ztABz+pGnJJ+0(?|1U2D%shK}(kG+gy>0|Fjc>0{TlINc(+M<VB6_c1t()e9)nJD{k z6a%pW%z;@ujN3lW$q_{DvG2eEa-_ne+#-^z*VZ6jW=VV`C?N0ws0}Lf+4*_&%eycP zhoHHLrrNvr?v)|662KR}xT(9lR<LAM5fK@f(S#X3I-0UmIo$-OjS7blr?yQ%zxfq0 z%h*!@fdW7{8yP+6@4ric(bLmxz}0^Lwnl3@HaYpFveLV~{T8&7&{Dk0&!+}j85$Ob z!-0syLk|ZNBa9C*BVH6;6$G<+^V{AgdBPqMZNc2UWkq%Mj`tLQ{_MM@?vXk^8fJzx z6<jJvu0<tsXSiGA#*GR;p5iK;N-&!n07FjUs;Uaz3#p`}BxYriv1d6O<5BoKDh%81 zp3`sJgk82o^&i%xnc_)87H{q58xa>bI^0)WyK%7BjHL_OZX)Cr11~zJrgh-`5Rv=x z-8&OK=N~b4dnskX*!LIV{6mWdI{`UELk_%OcW1#fXZFm~{bYDpQnK}Fb474JWyn<I z#@hJO+}+mB$cC54YfI*jy4y|{j?9Y*3H`NB2HkM|4ac2feMUW*y-3kkHoua=ekAT+ zUn%z#?-RarzU`fze0(DA$iL-JfAy*8MRv#oILZI~WjQBOZPkBg=JV3n6c!FIuW+fq z<E|Jb89QacPm7<n#XD<nhg~0rN|`{dbF>_JV|diDC>F<;(J!MP6N@+|w;3dLH8zqn zFfd>N$tr18i(`{~?&?Bhm<OU=5M2iF3EFRzQGh5hb*T(U6)+CYX<U*!#?SKe4`z3n zCZJ3PT!?0bo4toX7jEAk7#{Y#mde7(`6ND`35#dP>eR%<;Y25M^B|1J3`|XZ$C(C1 z+TA(|XE}_mA!vdqiSqgM+?)jw`A$pw1t231vkUoRqM|;3=THJ7BdMKTTp&-^b#$bb zkT8R9zz?IlQt!W(-p+sJ_a_N953?Nu<pYgOSyow}Yw~gd2=#3)<q)x;K*MH#Ts)|0 z(V<oU#`y#b3o)5qljBn*aQ^u;kMQWTDWuyV0Ubps&|;Wfo7>n_w6wecmWs1>c6JuA zzPr&H;rOD0hN8Ei(_ZiXeV>YoOZ`Q=JRTu31#69%=5FKJh%8(e{pTO4)#Au#)$Ecb z0R`6$W25PkI8z1&inb)ZdUdt;Rm<fEwGXe-(;pjwDrm%h+JY_R=GPX?_h&I%?8Z6> z6qVxM`{k$<W|M};FWqxyYUMNblJQd0(9ktC4G7JqP>L1tjd@Rpl^WGq3{3Asmrln( zktfFbo3o5?YHQYT|Dyi2W3}X%biSq{K+g{PPjm=*#4ZevRjWQdHa(u4Y?`$F#Y)iN z$XC2;{3^XpTVk(tRzWgiikFFlg9LOC>eFL%bc9|MSv1#DA+X-l2=8Ctw{N*{%n<$q zjdTnQ^|=30tl_8_7#Xp>FpffviHi%iuF?R9pkqPeE*kkV-1cxW(ACp}-?}dn6ft>{ zbgg=QUDVIdFIwE?c91C^@tvgXf`WoI_eL>3K6m^W%e-h%mT=tMF^=E%E3yR9`T~%G z#P|2o649;PxN#IP6;=f816|w>&}aH7r4+ENg1obLdN101rT)#M7glDPnsh{Q0g$V_ zvT~F(cxn-M%OP4?1rRp)07T*7{K%(qgB4NJRMobSaqK=o`x!6<!r#JSp?(DhMwqw6 zAQX{{4n=VT<ew-o@l}{KFMG|_1hXoPy`o(dM#>&+0=|6xI$y;c_!Dxv6LHREgwg|M z;841j+0q>4nva1N9|sw#nzq>!3&R8MnMG`wMOxWy{5&tHzu9ThH6<jdDi+IBO0N!8 zouC!Aee7HPBJu*}-pB_JJ78qIJ=-R#on?xX(1PLI$8iBl6sQjU$M1D@jopp4<8@6C z1Pl)4=Jn;kARj;(LV@_idFv*-PokW&wzav|cPkKH67<vb@y>2aV2*u!14`Q}!>X(0 z7|YLhyg$Of&(snZL4jG<_qMnd5e%4KoS`Ql>Vh5+RS7)SfwB@VeUJ}LPM!p#F3Zyg zjT4O5aCE^9om<xK{P}HaYHAoB_yJp}tK)UGwNj}njnL|VTEyZ2kA|O1SUcgbf%mkE z%JU!J3qE~%0U`(dDe;mLk(5M_o&aYqH)jtPo+zH{$LwsTU|D~r9<&euw|T|Ho=Uz# zDZ?)+>aW6C0oOHLA@III^dCYKNnz`R&MJuBHO(pve~ddDzc>EEhetb1!8f~YExX}t zDb&v_qK8W6LUCAVsQuc{uD{oYh6anilRrBk4b|;e^GkH2m9xP$IY5smWIIU}62e7x zsYomET52Ma8897A49Q%+ycaGQlqL_M6OodX{0HW?n7E!T-OVuDVGu{MUzI2U#Kcro zRPJE@7w$82%gZvauFMX|^E{b%*_q4Iv9!3;cZc!QT~42<!%{g!zgEs2qb@TrKh&1W zF==4%AvUh^o*~KgqF6O!W3P*nrzOmPzNuPX`63iYzwul-(79%1MJS{3%n5Ps*xl1E z523XFAlFHWC_NH!b!S<BWw^q-_Xpp_SplP~OIhyRdX&%(3yBDs8m)m`2lq2LJyJKe z!cP5EpVhL(A#&HHe<?;N>~oz=-b6%IsnOE4=~5{uy}apnY!?$3UUsZ%F-8hx6%~*E zD!RdW6pz;3`rEK27>JON5b(~VjSueKlf;lMbT0U{H9jVHwY1y_pVGw5qM)!30I<-x za|>S%E1#B-fV(FtjDXO}pgxh4l_jKC_s8-%iFb`PjwX>9E4ZJC<RE|0;QNE8!^5f2 zJ>V<`WP|W5Tw2?@t?I>4d|=SCYHW-h;~Sx&6z(1#1myCzg&ew1oII!^0EhPvOfsE$ z`}k-F()rc_w<LoLhiM7D>&jg;Gih%R3``8K0p%eZR+k#${BSeBg0_x^3hMV6*R6B0 zTf++gV{p%5Iveo37d`?01rGvxkViPI?uuc{g4y>C3<O=Hag$O5iUA0jFpj;t>fq>D zXB&x(H8|FI0dT`XM@3IR@}ZKRFya8!W!sw>()?T{c5TjTvbNXZk{d-EO^qq5-cdb+ zCP#_N@VEsVW@Xpe3%iOpZRXuQf~oeI96MH8k{w#LWIL&Ez}uwhylebfp78ahr8AE` z8zzP?sY>sH<tP&;*VT=0B|rK)^T$m`@rvL}+1T93k~kU>9)2iG%*(&of8rP0kUnu0 zBS-{iPU`D7FAFoH0aE?>vt~b-ZuWC@qO$H?3<e^xXv(OvvMKgHY4zt_GeNH-?MO_6 z#~*Q3f_#MJz~1CRmEEhCR`(q|2qUb@4~Hw+-?B4{vBu=K3-Qjo93FssdHU8`o9M!Z zf&FIKf4wybMU2TKqd@^s4~kuso}?2{>5<XX7r**~hj|74DWnPwuhSPkL?&-mpNOM6 zwG78$UERkZDX{dmf!~2f=L5il>B0piWCsd4{(e1sCk>!4>LYnaA*4z9YjCF&6gXY1 zuEm}~!F-aNoB9;2Q&H)_+KOb)9&q&jI1!<Fzrucm0O_&w8{7JF$UAHoep<H~CMVa~ zGOMy5!953QhvcnWRFKYY0~b#z)@$smz(&+b%*gHm#t^$zv9P|Jz7^%RI_lORSF%ul zFUN{3n9HAPym&iEAL6{p-6~yM9cohcdGcg{XopZ$N#-x3K7al0-ItDz2=JaXPy=DT zgH|PuLYNh~r8S7Z4K~An#ueY5Z^K1gUN{4BaS=0HR==8IRnGa?%NPhUSMW@j_K?&x z2@1bG=wsX^B8-*Iw0YdNR%WmY_=E-IFa_K4sRhUT&+&c-wehA=Ka;-sPw9*f{X40r zizvS(vBr0G<t<l{kwXQswie8N@=j)<v)tNgO|7rD6Bu8oc(;$}$9H!Ah>GB)r>dF^ zQ6`U$d3x!=l-{Lc91b#p48y2=^mVOSpWH$3vGjUM)O_n-sY_D6I!S5F=ziuF7MaD* z5~!e;mp2MlfD=tW+RtmdF(AMp%25_aKkS{D8M(LPz?GJkA#j`v1)l*<L2J$Y=@|+U zHtAxC6Q~&^y-M4^AP>|^((8hYj@XF)2=pg@2Zc=~TcwLfM@H<Ii|kV0y+g4D`|7d) zx^wt(xRmg=iGBgE9#tS?BLZC?qD}>YjjLbtOi?$89rRDcq;90Cr{p6)KT_N;_6`nL zfz=}J0@JWb*W{p8!R#a;iw|(VMvW}wFwcVfOY+nT`n8?RJ>Vj9b947pemL7mM@#Du zbw0`iVwne<V$vhAd>JB~rg1b*clGsm;a7lEi->PCG1-@=5#X7$6Z;l04jQc$K#0<) zE^xR?>UOoZF5TYh<catcY!;(bS?aOdvnuD-!YQWtRfsvvuC#u$#Uw0IxB#&MtJ&)? zO82$061c%nTu_NHaKRa7WNhr2%nG;qg7~sQsLN66{6|I4!Q}%m&}Gz3D2;@$!!U<? zRZ~+D{Q(B-Bs*8-VNg4FxDu8bCH=!rQ|(+Wzc0Uuz}2(M;{w$JuqZ1z9oIUpE@jb2 zLkiS+tu;@a0_a%_;{Pdmw7r&x@l6r^VSfJP!-peC_I)w6KH{O|t@4%?Ybtj{Uw2{Q zOk(28wazwfx#ARqWZ_t+=)ePRUw+IU%3#t20ybG<hB)rxI$nN$=FbujSK43f3xCzm zh>kPjnj+?D>VN(?j{7YtKccXcKwt(im@ldE4<HBsfEdLY37bDho+>`Ya{4(v!Yw|O zOG4NW)K81i40Qp30Beey9g6^<RzI7?14TPf@gSf8F@oK9Y>+mBwG?isgx{8^o^iQC z%u+V-cA;QvJZ{q$NG&)=givAz1NtiKY?BU2un|{ctr^GZ>F9>hyCx?k>0MN`BW7$n z(S4V-!5j~z8VsbUj;T4E&gJYO<}LhD&0(I1X!9}H1*8hV2)bb{rzrtZF)@dsU>Q@P z4y`~m>=<GKYKProzY&-|NMt5xtbY<eLl#U!!CSPxi$#zp%=>`om*2n7pnykdek`Wj ztZ4Bj99OH5^YQw%4+ce0s-S$qAG$E679x=Wi`)X*0@PM$d8AUBNGc0B4RCJm*nKmB z)aid(fZbMzNg#mfyi?w|!1h{_n&zgp;CT#D4qHL*b2kDX4>fBdTM9~2C9MneJz_mL zdar5RR=A;fv|6ruQnvf<?`=cQhC>_&ML&NQEWV(1<xm#ivAZeCR(%F>jGDLFn|Y%m zqxg?f${1Ro@jP%~8&H<{7jHQC88`0Jxvf4&M>~XI8pHglv(fVMzVF`L`{mS^Q1V_; z_MF@7quoUEsJ(7G`_yTslkPz3G@>=n+C($8?MhXtNt@JUIl)Q*t2Pe=L}CJvZ%5c; z11*0R6O7!NH9a$@Pld<fFO%;j@<g7fE$=$ti?)-n4}<zIlP_~m4~64V@s978?C%TR z?JB!(YM7jn8{}I}f`OaWm5@LV4zZ|So|@(Fl}4Sb1cOwv^}A0P0qFoSG1T=eCPon} z4bo9*!%_H`L-{w*-)|w;HjasG7`<I(KT^i$QTiDjJXRyv4Pwxz4UjPE@qq>zhT()j zablbY^+&JUmJ2{#2bd1xy9i*7vO8TXol@Vb1QX8E=>md+0K>e}(=DoN(U@=Fz8wn~ zP`kfYR7^|-%nhLih>VP^%c~z6(uJ8I@Xjb|ep|7-4<0Bw-WIXzcHNESw$C*)QywL5 z53v{xQw`fz_FR%O)i6C-p66?5WGV?#VS>{2`+AvZzLnHjECR3|Ng!(gG2o+>K!$7V znU9Hq=g*JO*7@}0^+v^pDnVJrQ}ml$Bxc$xcpAza5EQ~47T0c}w3Nn{O|4Fq+@DiV z!9edeWP#ZSKy)cN>6921y>NB=i<TFOld`3iUEbQ8zrrY=Pl4J{Sai(f<jnm9iaD?i z%_wZFp7<rOh(yK<l!U0fcvAaST7iZpxV<wz_*?L&?94L~fmxR;1P{;;{g}#WIz;jH z3-#(vml>zupFYjCc9~fKRU#;Egw-2e=0wijz2^B{GHf9h#&z%UvtK2?lL{ws$sA-k zaZZVxf?E2fBSl(Tn8YZ~k;g0T_V?m-UcY~vl>08cqeD#^O<tFi8-R9?Nq>_e#`(9i z)u!|iVg{2116+Q2|Js#X8dU%f0p$>3>F`X@O)?-Oqi3vHR+RdW5AY8RMD&*8f1C$U z56Rc7z2K9uVaKdRaFs*UQi%kd`<%AC5HnzMoxoSi_<%J5;zwu{77ta+O&CU!a*P40 zhvI7+7xNWmNE+cshA$_CkCg8?fFfQ>Rl$jZ;3|P<n}AkMpF1aSZ2Y!C<n8#>*|TTS z3+&y0@9ywj4-IaKbo2B~k=-y^IUX!~tN06f`ovBgjPVKayu1RX54Ug3*VN}0zlyC2 zm+fEvU_8q0IzOo_t0-3#>dnPudC^jbDqv5BCGXYxH^J4qMDuz^)cV3|ap=36<<(j9 zW#oS!iP4fV)1INU*NqFr(B|GJr1u}3b7~+eYVNZEzn@#<=&Z|&1$C_~y0jxkGiHc# zg#WY<p?y_$+cJa<@^Rl_p03jiwEBK~bD+byNl*Wpj_ztlS3+hMbAF1q*Ho9Gh51X9 z?-#?Lr*iNe-5YIW%=_Z<xV-$}EqkF;e8<j_AMR*rbic00djC`R)_97)@HzgU({+y% z2Gv%@o6O&*zkllGwF_G){HEgJ!*tA-m&0~|eX{M#k9tnWfl1!$=)$$qQ$D>XXgEmc zt81#tI>zTmoq^Fm3lEYtQ8<Ze?D_K-FOiLi?qI5<=qV^w@M^>mpr^9!0-ml<z!NrT zw$P?sV!ecNiC<W_8p?a+tA=E1<7yCiYfoG}n)d|5Bv-F!d>$Knol)D`8ro&oSGOSH z5{vESy6G3U07tyN^F=6^V;x40fgC|j=*v%^7N5oE0s56(MI(PKgPa%t|58d5X3k8S zzqEY$A|-pV{@XYH&er!iy^!*e;?x2bG>={`I)_COUpO;^?)ZpENIEQ^fbOxdSFJcB z=P~2Mhtl%$e?Q%R@Ou@<Kx$fA@%?Rsa5l#QWNB#`^leyj=JAAPF^K+~o71c>n<h@{ zCGl#2o&c7qx;4v*g2Z{Ps}F{pA#riaxAh~59z6<}9t~!bJ){#ZAb4Q7zvAcYPvPM; z$1gqKW8TldKlzJ7P2+aq-N-*!@mH>>oR?SkyLw`}ed<GEiq@aW?}+Mh|Hs3A;wS9f zz6_3rPJKSFUuW?s@PTRZ&+PX_g=6hGff7PO8IktIW+wakg2}X&=k5xe{kdm7BWY&< zeFa2P5@In42D&t#cbGTc&rnJI5#uWrKE7D>;_|N6#3RZ=B77g51ncDFq~|vXZi&Xt z!GluUJ~*X#v6*#4Ln_S;tx2v+{ZwL7;?-N%WE0|phllkrE&_csBNVzAx}~M#acf3d zc?{PiTJ`H{nsREFjx8)eg?3<eq|0m|tHOJ-*2H4y=cw*t^d~W+0t?5j-0<ElJ^cp; zYd5ebWaZ@!Q?r*{Hkb=@-5{4(k&yT~TCyTsvQ<8_bG5g~Nf0}pfKD-s>o<L!JM6l) zb|ADq4VE6I4`D8ws=_BB!4u8XDxKdZIIe+0xia8|<-43-M?YYER?|%=k1^fEusORM z@YGqKOq?+QM6fKVPuZE9e{O3F1N-*z_WP@?mF?|R5Cq|d)0$nN-nR>bmJS<>ZFBJX z9CGT=Jr;Ap+q3@<wI2qT74P3?cPyfx8mJMq#CRS8i{1V-#o@}k2QQXx%WtO;fq3bb znLyMvf;9gogN1-L{bG7DWyJ5Y;F*c-a0>zi(7<gJ(N?EDze4aAME{P|fY~9zI4N7{ zeI@K{DRuruMrY}rj?x`f)W1EFEMrua$cI`EoG3B0)pA`qnDVgBkq#}tq?_`0wEKj$ z`R#0mRh&iROuD4|B7!+vKi_;G`n={cg{0()clO!neY@W6+ocf}dW(uSaVf3f{_O8W zho>fe;-U)oF8)igcPC(rPjmZbUcIuKcDqp=^DLy=aX~RM)+H1r^DB$TRbiw6zorW} zlp3!$a-8IrYABp{OS;-1d)?}AS3-73aOj8BlBX@a`Xm-4DmPV4sdPqWMwM;#mk7G| zoq5A=SG$9#NZL939N!<jF=S<)zi@_V#Sa|V`%RZGVph<$*fPzkdfCVk-Zy>7Rr3n| z9Onn(8{h{!2M1ZG91Hp6)RgDdyT&pPVeCw>?*Rd9f`WGCOWCG905vOiE=PofctD6D z6F~dw_3QiPqsF*xAW#7Flkm|F;4z9l$l}ik3Sz8=tq_B9`yal2`*wD5b#`Gv2VDlN zcNXB9f0&N$JG2e{J1OiP^W$5%`GkdCN*`!E0DT$kU4?zC>*_kJrGVBSfO6c{y210y zNryVLxVnth)N67%`-BTDSE{ol7+Hl8-7E$7ode)^NPg5B|M+dZgFxK%4GqU{Gf-qO zb!~2L*7DTyr$iK-?AWZ2+d7fHHEsihpQ!y;wMFasw?-p)q>67eaXxwCM@-{1mg7Q( z$%<~W8F!=|H!;_~f4|<!R1R-cTnY#0lkEo&ww{<db^F%o>7mC(w@;nSGPg?L7mqDh z&uO$88L8NnTaXj>I$uO#?T`6o`N0PV4=Q!FzdR#Qv2P`Cu#zJ%aCFAhps8e8Ng?R= zbq_V2!Cf6%dXu8eWeQ<oa}zTs^5fmt=;$2uy0Z5N?+E5$K*UbB%V<wxO7it98s||2 z0L^L^Xl`h4X0O%hQ_v<s<G|O*2e2;@u+5V<d%+ElPmhlTnym+e8_nd;>KJgDj*<+P z*LmRR2ImddVOH>QyrO)yi2ETtM7fy#f_?@WyS!!!dz7gz=XzJ%Wy64>`Et@VND_jc z2U%AqaH$TjMa)PrC&r}L*jZX;&KBcMqj&ai%sfm^4!i_X-6!?WFCE*rD>+3q(Fz-t zR>D=ozNGXHtf8Nx-QB;;gL51mH)Q+SjEl~v0Q(>+EY^8m4miKC?PPfHc_#;lhMu0M zDJdxpj@X8P6Zv_0KfKa%5xC*f&-7FtQce6#sKyXWgDgjVOUq}FUQrj#+^)`1U}Huc z?arxxzzdZ*&jI_|{L@y_*wgbJKaiWfYeJ2uFZEdJU**6y$ZXE*8yM89oh#HT_V)5l zi*PQ;&qXqOd9?n4#dnU^GZA~9JC)rfd-?J`;CnFlbzMnd(7Lf28xis9^+z9AQ80HL zI7oVeON`WD^jo@m5fv<_&Pzy0s;lP}qy&~<*xu~zd8|6;0@EvT(dd`4^xNKPY6#`o z@swEE8AKfID9%X_tjZVpJv9~n`0)?(O1i?)nZOZ+H_@!K=j{Z~@*VRdC)u5!Z?5vz zB08o*&yo6pJn1*e*DcrotWdd_<rn&IecrYl7?@@39L-9D%z?<N?;bEgUhZ*WIF@=$ zvgBV7{CL-k`xkL>goHk`?RDKvNq95jzOZGPe)+NR`I|^i&|YKLY#Wj$nV^fD^q<@> z*uWI#jSJ`8GuuOyG&1Oll7<N_*e>r~4ihms?O>lKYbR-3KMsb)#P-rdXEZ)OMHY&J zAvpTE!e8x)Cr<W-c|RV~;F%k%bpT5N)1i;vmN20M<N}(y<jl-#x3W8BPcbq+LXubl z*)yzYn6i|WmqYV(_VV4hs3@X!2B@VmD^yuo3D|}O2F8TvWzURj7zQ>NH4C9c20|8v z>m^|k0s{;V0RJbBvjpRC(2}Q5&&G2s;>ZQ~3JV0e%a@5MdDP$_8-!rzhte0A{hk?y z*w_jwuJZ3wze3xqb@>pQ6W&zIE5?7S$`;z5nZkv-WL+n*zpI8i-n#FhGr)bSeY;S% zfL-sL&DYnu2u$r->Tl98GfD$WG)^F*JP)rY%}>p^MhR}tdmZmW&kZ<p4%VrIKYxA( z#|{In)*HcQFh-M8BLR^s9dor@vb+lQV9W6Qxii|_kWb=T<^F!s36bq**sElV)jd3f zr)HGR?F6j`2Um*cc5RUzzL*}zQ2PG;SZ5a_%j3}93`1fP5*M;vLPOho8ZO+DC;bEJ z<HU*TTOsqiPrC){aQXQqe5*ew#MQO@G$2@*uXbR7X@QMR(xsTaNALuok;xLflB))8 zSUGw&toT?gUs!`epJk_(+(=cq47U7P$TN;pJYvgKS+yqJJ=|{o5mjn9N#r_$@2RMl zApQZ$7dM9q9w5cfVj`ZF#BF^NR|yt?wjxA3TsbUL{+9mTyQKkN=+JZ1R8NieYs_Pt zt++}2aRbL_G5LiT!U8D15(^78WGS^P?wm$=QW@;{P-|c$f+QW7H4M@!0ch^x5C{7P z>=iaB$DSTLNBQ>ZIs#FHqoTfHR@dCxn&m&?kCw~g4UAdc{TKk@b<iJE{L_5H#pdgB zlJ0Kcei&GM5);$obzlM^g%X={fke16#7#IdcAeMm;|mSduviU6yw;x;zJ%DjmPXft zrjYOhD<SAP>rpf=M#~r5O?6gS)r+41)4T^uBnZm`CmLbE0@=5i)6yM4fz2dGZpQYe z)#P{=RNhcLXJ>2q71>VX5r)Ys*TYVBfyi+F-5>*y??91Lm29@#LR8-#&6@x{$H&Gn zKc&I38XFarkXZN_6H*C|D-YCjf?ovND4GsXQcw_}Xqa?)Z&Qpj^$}SYd!c{n>1hiG z4>TGXRlRwA$HC!PNayW!W8(&Smhe7{-4X{#FS<x)yM%?dcQstNa^vWqhO2<U^q9Yq zlf+GSUQ(3WvCH@I%VP0qI(pUz=G&&?DV|DMmY*p<yn4^v&TjP8#z9`8GqSiPQqCzS zG>x;TpG-+k^GbZoLI~J|v^Dn<+$UAmK;}J|D+&hiuDR1cbBXwnk#Ss1AO@Nz&NrO+ z9+|f-ja_Zu;`-LJZmGM)WGtDP9JR7qs9zMc<v`z8BDP@G-rjx(t}lXd>uecJ82~b0 zf-J$Q5S`VGLHsA+QSN?Zi+*~9X5TIl^N-1HYy%F~+}3uO%6?9P6m(4STF(q#@nw+0 z(4P)~k{dSGUZV!42IYrTxI|G6*i3v6h9E&lnKjEkaCVNyUyEwEb*5$ydS=9k0z8GH zA4z5YX-^M|{U)^3i8y>DHpZ2mN6+<b|6FOnYM#l|N8a5n-Zv(Wkxn#i(0hFSTDhYm z?f>!g-QisKZP<6ajD+k;*^!lygu5~dkzEo|C_7}2Qg%osWK}}43E7c7v$L{C$=+G- z`Msa_eUIb$<9?1q#_#+2ey-~}uX7|O4sNdWCqSi&vNxAv=}H>&u*+1-&qlV`#@b=J zYy9%hV3#>^A0L-1lyU2O+0UGLHPw^5kXy1zj@=Zz%dj!z6c=~C#5skV3>%qL`H`NQ z<^!PD;OHnSD(Sp7BLE(k`5I2lQx+wgb|4%>lmm<nc?aMu_NM=Y(-;<GKwYq(e>S>~ zy-WQH|J7n)Msh5eF6RH{?o`YFbiBWTaXE5&Bx~UK?{DA4f?roYDiB|nS|{@tQXV1S zyDMK=a!_yY-g`cQl_)xIKXKc}#zwlo|K+LD)ipOAEy3mLGRu5qWcr=H-QqHQ1;WLt zK@c<36Kvt#34TMxWAB6XGJ~i%Tqk+n<>zSol$mpkwpUhqN#stScqsQtMXdTaeHKjQ zPYazE6|PhqIfbvi8*lvL)pNFv4m~-tATqUU>cIZ9mdbz)#qdPj6-sXSjPz~@0~bO| zHawAvoMBi;TRazFi6wN6ag6KU$gBLhpFiV5>E&WH6QBpEh5hWcYu9dnjsb%+Gb@X~ z`!cyE%NTenhz-F)uMA@fLSzW(Csb~AAAdU26zMhr69!-g44*zg-PDArRKxEnLh+$s zN4b0NUUV4&@UL%vvVj5vHZlaE$3;cy@DF*?3W;SXBy!*k{39SHRYhy8b%wD)Mru+U z3-@V@X*@!K^QTW$+u@KhyRDu8N7Ae>f9X^0vQtN$y}XkjhFwu%+$(Q!J0N&~(3U<5 z>3Rho9ySOspFbxGiicuO%L(V~C*$4KE8`)SNZ>wl^k{fk<e}(zU6R<?*dqw-#ES#+ z%n!_bL_NyMAqk$skwi@Qx5g-O1o?ppPl9{i$SD5M9{0HlIxs>E(Z-=l>SVg`pE`9- zQ$^PBVVnxd4d{=$7`m7$BXlStLuQQZAm9rIC9mw;THoVcPovJsyubK(vz~14lO6Y6 zC2EX+Pm1(Zx&3Gl>8`%4{p87mu&7aSVPQ7AlUi>EQ?9V?d&)SSy)7->ky+tP8ss*r z;<WBm!&4nQUjHPbZ0I5=$XAr)jpT+7#wt~Y;<i3&|0nMWR+X`p-dB0Ap2-zSdnTyR zRNg#Tdq%SG#*LddOPscJ^lrw41bc>#S6Xuh^Hfdz;MyazhcMWv!_rAgtN$rah5P1E z$z^%Pp{l0MuuxqmUr28e;V1*KME~E8-0#0^@o~es9M+J4)1IxZWqDr3&aJ$n0%V2^ z{T^heqL&4YNmM$qGpn$$9!G>=Q^r<taB_m$+U_*duD*<RWNSXO<j~>6pY`vCfqDeK z+Bn(H<f_ur#~?nzu^VAkr@I4T&BPr7Y=rfc5Wx=pOn8n-OYg?9ad2<|90caQOj@U& zdNG*vurPlX5QHn3tJ)4C1#b%Gcu>(uL#LK}z+2Ar;Of&mtvM<V%nYPk7!U`6+o`g< z_i}Nc1OsE9?V4S>{ny6Ez>GOTEY$dJ<W!*{vYj|o6?l~TF4B3geC#>~o*wQYtS$gI zuQgb@eM3F`fgB-N$CbCV5Ir}E0bghxHc1eZJSXT^X#bI~a}|a*cn`2dK_IA4Tk@2W z6KmWR#+sGH)*}ZFzUO1{$oz7)(A#_NC?m_ecRQ-W!|Q%7KaXH~NJ+Wq<aB!Ix8KSH zS5Qt2+j85<F}ksE31#(l9iJgyYd#lOm$l!qdcwbx3(;qw_Rwh1V5RVaKE|OYDx`A= z9Jwg_-YeQBZ<>9iVg-$UG5qK;w<wRPCQ(g%b*ro3vXVUQY1)p?4r9Z+gM-r#QYe-b zDnO&~l<@=^cmKGSnp$g<@QDF=1ksi~p*UZ?wZ39A(RT@d3c5=0dSE>o7z}4Eb#CGO z8LSQgwqhxW%bD&?R;fG#dI?5w(CH)sf#H;um4!t`(a63`p`xRcv$q$8_KOc_+4<Fh zC+Gi8#1i^`Y*t{|D~PyI^M<<=zzNTT&~kUp1sntL)vs}ffF{NylMe#}WMsqSpz~f7 z5I78@kVPfr<w2^ve29j|@bgt3o+R>zYnYbKii-)IKdq?e9&@~h#M6W5p6N1+z;RyT z70aFN4T`xV*AnP&`LFcIULYp?Vpw+&o%GJ)3&raw22)dipmN8qb|h2QJs>D(0k$`2 zr+BLEz-z(v2wlJcG^v*_@5i<lH!eY%1iB7RB%VEfucr~S?JG)3N~h1BC76ErA|S*p zp>=?q-=Xuy?gC+Qp4BVL?#pT@L!hXL6{IkIIr02>KQC{u-S0DUmpl@Ke2z<rh5Lok z>u_)q+ve=_N9sv3pW0a>VycWR0vT@JJOktYn>R9U8&-J4u`?#VQsLxWjE`TXAe&Xr zekh%t3sudv7+*8A1Q~WWNBj;AF#r3={ZTX7AgZU*NEE?rXd7uGZ9G(bNGVXM*JfOT z=T5z!NT8s9-!TOzlfMs7oD@BMI$ZH%3jay|cR8uFQA(U`9o`nC>^!WbqFTBBmWm^V zib_`*C8RxQ^7@WtM?L#Y_Gc=s#QQSciy4e4gfsTuefz|m7AL$OXoKDor<$jK49TRV zaBqfPi2rndZ?8+-!q&j?)YQtNqk!zc3<rvXluOt$<AWtg+R*r{_isz$j%Q-|1xE;2 zSX$7t+wlR>1K0Mv@rRzu%Dq}zo#YLcU@#FxKBO0IuLf=3#z;)3=Ryhe9opDqK*4s* zF3#S4@E};M;mE<|g8&ZSY9{UJLLWQ^K^WAm$3yGVctDucUTcJZv>5M=SC+vMJ24=m z7vBlw1KYugvUziMnlYEOc-<aEHQ&EqgFWo0`|XA`%S6Z)fLe&1pHH=)nQ!k3Pf8rY zGze`A98fsg?9)nq<z!{ufhFZdZb!IJI<HI%cTbz}zSiLrl^2%+u?iQ)pT4Y6<L#L& z0=`aUo)Lx$ZAWAEN=ky#gHvoz|IS+dEi7ylGhTNI`@MumosQYrXY6%|pyeb>&$z#} z0^1AnU!w*eZjPuD_Ar0}0@aRU{|Js4vFfT)Iue`w{u!18Lk7cqraQ~Hu^H}lZ`!>3 z!EpbtF94Z;cboiXnnWxJs49IQgI`vUqGkU!ebeq`K5GcXmmpc<l}G((?)aH=+C-3* zl+HL5c!?+ow;?KdyOSeLEk9WMF3oSgbl*O}U$T*TykGhJ+-|~%g3Ju_6ifq%{-J<L zR3JM&eE>$=q3Yx4N8s;q94zYGez%^9Y|z?4eZ6lg9uW;IXE|W-z^+h!XX}NUzQcJ} zy4`&#N$&x8@_<<30=@0H!V`QM_ry1FSW(l-gDub%zH?sJ28@PL>0g%M{TCj$A71O! zbtVUi0S6*FON!Knl*l{ivcP<Tp&AR_Nstj)Yjdj`yf6puKt}_~!E>;293AuUXGko) zYOXMM8&vGh3pp&MCxxZbt|z-7M9`TJm_gAa>Q8$5wdYfy$3kkKRybelMXCgkCEOX{ zW!Zp4lL;Y+Kk|<{UPG}4Rfr_MM+sVU`XfiqI4Q&K6N?6TWTeBF?gGM72m1-ru@Ns* z(VepMeGmMG=MSN`V3=JjeCv`{yBr;@n{$#eJR;)GUq#V*L?qd?Ti|sc^g7f?^2Mim z^f*N@D@AZ?$4^--2xITW);BiJcV#qjrEsyc3O@;(5{#(*3{uJP<Mm^=9UQ_o-n*Pr zdI<W($K+4&<p>1FAEJzs!{d)leL)0uwx3}aW)B&9Vep$ti?JvBa}M%9<nKDLh5rhd z70zK{!b(`sgls?0cso;`;DGj;8+aybb2d`Y6Jc=zCI>;CEG`CnAewyhC_$q~CLY_b zj>#pU<hUQ_=H}jIWT-f#V77s%4Xvdk@Y%;SSAd`2#yCPeJXpS1<c-o6FK4GcnD~AI zX}XT<Q@Q-Vj#Z<N0D6o{Br2Vcb`+Bh)3Mu44Gn~<8f{DP2dEiASs?7j(~6cEaRr@U zYEzpC)q2x}e4kmE8l66K#`asyvQr~x|4iZ1!N9=I?Ohy{!3r|3rXzeb)_#Iy#9uhO z6Dnlru%KxVVC^R*m~emh{pG)r!})z~`@sL>0&sG!Ew(CyL_m3096W!t3G?7Oz`MQ_ zj!H_nCSbXLu~QYrZt(F}Ba2T^mN@>&s3Iy_e7x+BREU4zx&cdHE4bg_kA!tzpKa~} z(_{P^UA-3@YYr-zg~X^8@9CPJzVP$=BPY#<XVM-c^(A#z*!7rx0Szb~$;U=u=_#&j z+nZd7VK{u4MgUA$U<lq);)+097=AH;Jz)9!Jl>(wZxrY22L_I>$?&jZ)_4uBnh@h1 zySOoi{$yy!ZK{5TRN8s6dvd)we2Skx_MYbVwiapl(BXTCN`F}PhtoDe9WZxIQIVVB zZ{2?$JfCAfwjUi@+bU_=($jTYBU*tU*`{<vONlgW!mb|FIHnYF7z$!6K#{!2xkx&- zPcuI-&HOb9IK-EooeP@9z*0i5?f|R_Y}FB57e^#r!hlPFclKp6wSWjRPf(5-yO<n! z-X8|{85x9nJJwnPA1!7Wco%@It9Tu+cmw`&5Q>;mWAIqO5?)A<+Pwd*3DhEj@3b|@ zy!9B&O44IJ0T;1!!G30Od2!xfZ_5LULX~`(Vs%1emAUMZRXphk(8{pg_o|YT^`9St zn1@BGmoeUy&CUws<m8~Ip<-aTqNH>X<RIMsFr!qoww{k?<V>l+A$6Y4BLdvOH-PQ% zaTF`yb_6zq1Lb)K<*p#vVqBDkw0qBYzUSInat2q)HRk5pJiUefjCu7Vw4kBEY-Zv% z9GBa}s~106#aNR4;GS%)(UNhVS~2*1b7TR+EG6W6VIn~CFt}~LCfXHp-cs+Oaj#!g zL<p|v(xa+6Q&1K`E`vOat03h6vryW{8Sijd)4~E_I)9k2MXfc!<OS1Va;`TtW<io_ zFI`@WLMHbA(HE}qoRl5{tLtmn+-ce$hKWMoNWW6+po=G{r|6iqM#RrNyCqhz`g5gN z4pSYcQskiyz(Ix}^`i^)x9A5o01Yyxi~AN9B2EP8fV-cSL4=+Rh&W^ygnuNaHuRXl zQgH&L`9cZJo^_MNiq-5uDXG#8n3ADYz#8T1l`Fo@reH^6#x(yT+1Stkqg=Ur_dYi7 z+T$zD@{BnPO`V<Ha^$*B3S~*NPy=d1*Ri6bHl#Llg9+84w0O#}=^Q0A9&nn%f_Q6= zd3)~tB>pUd{sTJUvwZY{5op@VVE&51h>eZy`Rmt}(5Pxbz6px-`K{GqSz&oC65<mq zUbpxMf7#kZY!I4a7C0thET3EMv25+`hP4B8kmO%3dr;AYLqS^OtmiCh0bW+mMx|<E zdd1S@eO-+&@2*|M>!usZcra2ZWy9cwYpVA2Qu7|H`ea~)LPIGdeSNnd#~#lL&yVpM z=*8ws<(RL5PXu`%{A?or_RK*ca%bPM*o0hfxP@Y#45$o?`*Zok$rJb0{?p@i|KMYN z7?)EVH>G%|;O{v`nt)D?l_`GMeP6<YRYO=qb|*d6k&AXlBG6@Z&Q7Er1U`si6qb0N zrtnDFO(8LR2yCp4&a|yMuK7*4+oa)61S<>MZDf(ZL^<=HmP=?A6cLd{{|wRcX{Uy! zCW<^Ai&yb{!IvTB!Zz|P0x5-rs58m2al+h>(#eBnnxL>oMm5C@SweHvW{fNv_@;Vx z0>wT+M)u+J=eB!M?Uz@+e}CRA+=XLAFO?&*t}lVDFetFWFJ5>ka$I5wHv5vJ*940Y zY6ePQ-^2rZ$>=tcu_rtC-qs&1g3HRv#;AS3RsD-g(4BYcxgUjVe6)n~?k-(|vJBn& z{K5k9#~|9*M;0Kw<tM?G(H9WL<DNjv25$FvWb2?p+V?*2Zl3Gz>WWe;R?dzpD=i)T z#5@izHc>V(!Ai?o@HyF^oS>sSa4hEbj%O?_rjvX1?@TSnU0(j(iAjYprGJ0l0rr4? zsAWB|xztFPcfBMb6DI@uByoK^GZ)G|xFQJh4Q}?nw&hKi&Hw!ARPBNRECY4M?KeU* zqN1X4p*HZ<)gVHr{NFOfreFR}!O%|a9_{AIrM9+?YyH>UZ`Fryu>dnYG!~iWdY0iZ zJ@&yOD2)F-W{C1&;Q)Wo+iXuJBmTH9Wu!5-qw83)FJ3qbG!A<zdMrQlCbl#UX*ACT z@f;=@%q}gxfG!?dP1#Ajzu+UoJ{`NOv{xn>)>~_pV6?&a5rSAEn0Hi8>Tk1H1-#a= zf(XQ*1eo%pdS!qyAYcOPtzFf;0X)~j;vk$vWB2{U1_Pvb{A7NIrVpKy1a*wyOUK0p zzsYZjCB!yGy6%0lC5ERNVAn}6K(Hq&7D@9&4^!s7_G#g@?!smT)IO=zQVIc4QK@k? z4H%V7=TGth{2~-A&CShvs|N@i4$&!5U=9)9CF<&Jj+W6=fBvlIGH);)O*rQOTA8Q+ zbUO=rA<mLDw(a$*Z9`kzS6~8=ii+kYaraNQHg)(d{XN%3`jB03`=Oc|HGyUUb^ls> zwdos$ME!7(gj<Ewlj;Vvst1q)Zx-}Z$=sEf-H;u>;s0kw^*zCYYUBhR^GRDiWJE!L zInwq^jcDf2oIyYcC0^vX50uPIC5eJYEXEHWJ~V_(6Xd58C0sEtk8<KMV>hmPQ;+9N z&U)s<5STHlt7}}-y<u_2skXl<2HzY|LfT;St)p!w*(!4D8jYe#N=Urf-rDSS@86W2 zKg!4`k1D1twRr{u{mAI(Evpic5zvCYk{|W5T?9iMnPP}JlC1-)ct080;f@>5o40gy z01bI2C!a!Ol(nvJfUoZfWR8jcba(>r7_`)YX-9O{n0g0aDoYA#Hv#<zB1rrWzNPc? zna@9MfxoRcEA*}Q;R<|p2r>KX*RntrUaKm6j$f!I>o~=)$4u-?pa)|5Ybenz!y6y} z-ps%EypR1MmWWE61aLMW5Mm4%i&U}3Lxvb3t+Y7`@j+fdE*FZA<?|kf^y;;(LYSSa zAg4P7j&AGomTQ9)Zq-fE+YD(%TitXl{Ylx_l}i1dyr`GvhEcVC@S8WHhIVRhNu9SI zpmbaO#!LzKdYPb`(z`Xcg4ioLsR|@sV=W<HyDjBxd5o^zb>=~dvA*8jeiac)X=%H= z%onKdP+2~^@}?r}L++GKPki2eC`GQm?2Z3*b*5!ha;mkL?J85l`^pc^<zIH}`o@uI znaOpWYn^51u6lvGg?)_&SU(Q%g|AGG^2`a0*M|p(+entotgNpc#{G%)<KVCa^DxAS zr!?%^OWf<8yv{m*PYj+?)il;9pDNrTM<kuD`w05`Jv-gUrppS^lFQ^fOJdQib7FiX z@n!243wy;YjaQU()N(D|A8ydph?5hmx%&rXs{EeOT8IASlX=bY%`&_{MLdt`DVB>R zTzb_OqUkISdwwPUf>uVyZaaKvy|qblwB6lZ<4`}&W8q?pLKba>G2aFZyWW|&E>5V# zR;~U0ds<Rb$=*J<*$%rMu!I5ZRiKrcSoPvc#qO{!dZjzt6e-E<JUj{l52Jo@xPe}a zaS4R)k@0cTo~B5#OL(;~7|P1*2)<m7?p2^KM^aGmLDx71U;ub4K#d6j1PYAVkMtc1 zMZ&K;UY`}`e^*ez95B}L*%H?Z@%j8dDLhO)%#mR}#N>O$Hsbmr>h1%-rzSm1CYPKL z?!o_Av+D${!UOAkYyZDfU;PGX;NS2rT2(0VO(8qoKbDr3TZ<*`L;Y@lEk$))n0Duu z3Yd>Ahi^yuhnE##JCauX*AL+5SGJt1y)H1NgkP1koQzH3pR=giAY^@SZ?Et!kSy=4 zqPy{i4Ecje=eF=elK1PD`g&21a9jUko-oG!l6KHt=E8#=Ac0ED>fCx3?wdBZxHys_ zcPzH>eIydhp;Uz!@I5%UE%Pnn9U5*BD7Vb3lK7JbjCrFqxe=NZ_|NvEn+|rOUXYy* z_M4AIIsw1VJi~ze2GVoUm)Q&^pWJk`s(a!B*W$wEq|VjWm@PIR%P`tiXi*}i+;x8_ zr**<zOAeHhQ_6dxU4x?S!iCDtlQ<-1W~Z=OK?G2&jX+pt-WMH7)2*r8exqM4aVP~q zbYbV?qjI7QdJa^HSR2p#7pCA32dn627EiEqm&5ZmRnZ9$&>93K=o2ocbuK{Rg2k5{ z-u~fXYH(`?f8{-GOqI0lju2WgH#C%i>m~I|>SuugZ_0CgEzfW?n;Tqkp<QOkK9)V3 zGiL{tntvS_R6fO$>~?lk$;lQ?OmU+Z>Y(P9jnjmRSa62)YsQN^8}r$ELu0=ydH74p z@Zon(MOt{R()t=3Tj}*$TUhaztU5}wP{JwoKf!;fkgqv)E)mH0qJsnOQl{!E=WUkB z#3g%6Gvn%>$JJcVvF*}0>TWn8fAP}AL~#|lXqKSTccs7Rv(n=4)VHX%`0Ni7kQu$j zj-r5f6UzCg=6iR23QwIk9qxQ_DAcN_pw{#ZV=Z?r7Z<mHiTU#4qV#L-JC5Jy|9gC> z8l{IV@c5vn#N(6vDcNbeq2N0+Fj^XEAr*iY_z({}tv}xPLIe}_x^HjF${PIxpzEop zCxeV#>7vI4z~w};2^-bmLUQY`-D)}T`Wnd`7X#N7<X1>I2owTQG06UUPHo|HqF^=h z^{E>kx@j?^#>YeC3B__ng`sZcz5ilp_o4mf{T!R5&dtrkLo@~`Y#(qZt1Ah_by_cf z-mj-8C~9JW6a$hHLpQFf5V9C%5qyRm0=^d1q|(L@*7)6nF9$_LG|==kTJAv-!Knv2 zWg{aWzW+SK>=#6{@Vlg>wmCT#IYn>=sz8+8Y6ok7{@l=dTBov0Q?hlFaEwG2mE?jl zOacf-R#DMW0pb}kqtbj}i$jDK(KS^CGGB^Qg^gchzx~$co86Btv$32%)mwdKvv*d^ z%iFtar9u)sjw{Mnj5U66zg&&x6zZuZ2kVfy4^6DO!Pl=|82N1fIaW2XT4RKy(k?eP zsSx=g?=w9Bp0KKnPEQBo?!A>pnF~2z?L?N*?XDKXWCcC@zVSAG+Wzg$f^DN7>YmkR z3U_Hm7qWjMM9j-zev9?QjQh4Tu;XWeuqN~Y;0=~Fvb6PnphJcn`)x)>^F2y!G{^q+ zfX~1k(_20QOBFbjLPh!v!cVNwFxM(7DS@m8aGe75h``4$<>Ls|D6N0M^c5)Ev6X=; zwZ4w50R<YX=^GhQm{;L;gP;sKSmY9-2P31Q8Hzi1oc^vab!xcW)Yi^yvp>li%Sv{T z9Iw~`Y9Zp0bxOlA2@X<O#p;+tzS~VtO<nD;d8yd<p6t&*+yDIeGX+%a-$Zr3%Vs6> z-8^><jbY+gw>;GYyZuY2Xff=63yzihfso*!^Beoq3O7hj@LWvo5$pNUoj#Zf+sW(j zNB|S}i_sh}t-q)Iaz*OMUL(ILD3KnZd|WW|uP}g6(s7WJe|A7h;-0mw$b%ke!!9_P zoI|dVY<q4;jwV{&wET9Ocqt~zB-Z_UG)fRz__^#Emuo}=Rc^d4c}e9Xv4>Cpp3XE| zOS?~qyp3?k2TlF5Zp112kGwbYpC#l-2qz@D;Oty6eQ80e<rt-8Jo3r%E0S>*+iW$x zQVTte?e74w_Bh#F-!*P}^j8@F-npWs(iGVqa{qNq6?jeXw>&dSASZBvBXIBn`avWk z0P=&<uy^7igJPFa-~k;XV-~)IxS0sQJ?N1%ldoTZDBH9%RR(NS9UZgJLD<3b@{*@$ zn%)hIZ~X=Qn+=eau23In^n~^J*qD*+Ral>JVv>T;{M{vQ07?-5KZUXw`_j3UP#50f zP`~H$sTPBPQK>BXExnp3TBW{AnNpS_D4U~sGk|c11H7e~lD`!ah5`zy74qI~Djzc# z6=&oW{|d3h8w@(a+ap@1MMQGml73|klJH>B(`U;eB_RRA)43Sn>U6G2a{Ux64vsXO ztDTl8Nb_Gk#=t;%MDO9bsDZCr1a;|-Ox2II!Nw%o{=LnvC+V!e38LGsX^tgm9{<EA z{R4OF^72aLtVo0O>AtbR?3ttcGB(S%haB#Br|&W(2k4oeF?RYidN@H_siCLsK3}<k zpo-~x+^lckfAZKU`}KPaP@l6@kAK<K$HYrXH#luefGi&cb`c7akM~rm)c6=^jI2VW z+O0|QE-Deu&(zc&NgFAD54QZWRqxb{t=1B7*)ruc17-{=>Vcb%57*{$g>Zglw+`$@ zKxJ@T4IwBr9Jgz#bY5-UUg6xDEZOqMED8o)SGxW#T!aL<YMU0ICoU2dJw40M+rWx} zu|ZYDpz#{-&+S?fn~rr=oIPwou_PLV_t&$4faae+8@2RYWpD=2MZwq721kD|5(5yS z&}#prAzM=AHI5!m#H6R>FdB0_`PkH5VY)t_)6)@|z8@F_L~abs%;Q;2l9%{Gvn=|~ zp<$n034I&+{q~eufRU=uOtK|NljnOS=+B8tD_aI7W}26k8w&LC@>_!pi-Ya5I_Qnf zE0Q(^lZx)2_;IFd_G|yK0p^WMKSU%Y8;f1n!CJ?fp2*k2aW<MV{pcco_N;)InBzBt zyw`vEDzGLM9HsA8nJVNbBC<9{`Q3N?7ar4-OMU3jzW_tQgrjZLic`%1><s}G7R_|l z(&R(ygWku+LPGU!T(g@67XeTejGaj5xLJaIG<dXvU%&CndMVWZbIV-Uc{DpIdQBwx zd{amf`F`^ep^D{tk@>Ng4MgMX<b)mKk(zU-rzRp_U9`RX`PW6$p&aNH-z+gqUQxV! z##-G1=KP6yzHo@Yn|K-zfzHJYY-=P8LXGlD>lN6hU-1h7mq1P%lQM<!-TVGFf%e59 z6u*dwQP}i#8g#BqzZd-C)oGrrRaHWxuqDnV=sEF`Y5OQf)x?w}c7Ca#cQ%*Gh-Me{ z|9X+h(tGM2#sFCXPoXzzE3<48!keG&{7vO_U+rUdSoUt3pA>a#Xr!>mb-sJfb$fHg zW^2O{z5zt!5H=NA)5>5d!%$N;p%wSb?qKoOSLTv#JK?GXF2o&lrH5bQiXhVHGc#WR z!vJ1NaKS*~`M<0!1qJ_L{WsT7Rd#hT#Hos<EnEL5v29OodZe9#b3@pFz`|AN*6zGV zph3pC{XGc?!(&x5C`k~4W_)~TAQbrSVMZSq`z;IT0a_Du(Pic51$?Jv0x^FPKFP*S z(WAh6iDLwpd7Y&>x4CJ4`i~3(RDB>G5_@1mfIbE@UeJ}WP`iS~`QyixN&QYmy4BU6 zu`n|+`JL};3ELJxAcPsoJoES^V2Lv&+mh&0VA@4$u-=xa=2Kw+rUw?c(GR2Hj^y#! zABXLDaaLy5kA<3OM_)^*Q_(*gjvC6+^@hCTxuSfvs=eYmnU4Qpcg57G7pdc&JFHmY z6c5$g&CcKU2;E2MZ&O)9i?<{RrliB_aWw27IO3@CDn};FhL*o!nk?w-zp8rig^Hck zr8~PIqkQV=6&(F05b-k}LA)XIzCr$++^1`+Gx7@(B7*GP3AdumHl~{g&fAPVQ#s$9 zGS-`CGcr1^qNa6+EvGYC_Y%5{|DsNY8H=9)VhiROSzNlcdhnd}^RhdhAK2m#<#Eh= z^=>fLFYevD@2NSy_5`n3fKNN6|Fp9*j5T#tl-yJ#v9l|)0~pbh`H~eGswJCCmW3Ps zq2q`9`HNSvAZ5R6Yz)^Uv(Ga))?jg!mzM4TVE!&dC#_RRK;XFagIfnNQUTA#ZU8;` zHFfp7i{f*u!$E2=z=fS19Go|B(eYqE!;D1*2K~F5OSjTGkynzDl@+1ISp}QUx!KvU zb}v3EUoKu=nK)HJ0fF0#S&-CWN7IEc2;xM6l7QL-XIUTZ6mXbTSCbiODS;qa*;&T} zvJ4bD`rnD#Nt~!gh}F@w5Uvu~t=J&t4hbCG`};i&Qe%3);uv?`WB-zp5&%ebAC5AJ z`hL(T15A<)A%8OXOgC*DA9j|a@|ZtZX$Bc#3#{XGwmXpIZ9Lu>1<Nno*znkfIvAZW zHC})R*47s}Ue0YSG^s)B3m^nP9Q#1T-(H5nH@3G>g^>gmU3ZcCymUg>ag8Q+tr&xq z{+O*%p?tO9A)x0E><e5(%i4Wr2z!y6x7etfzkmM<bu!%_*<*}U#23N6t43qw^jU|} z=Cy&)!-whii@x(u8M-snSOsPZk!<s!obB))l24zKfH${AeT;>8tUXB+JZ6ql@w~e+ zgHTaZ`TF_|I&?ko3#0)h=K^{&W|xgp@*1Pm<WD17C0jJ>%QLJeBp>S)E%Sg<mew;z zS3A3=PkdXXaV@LkQU9JLok{vu*58@8{{|(C%f8W*^AngmL0I19eQ<xUg{fv*9^XZW zF_zdJxad`1sQPGAXHS&pC?!x=au_ux7JT{AOBuaKi>e>L0p@e8?w`7X|C5oMYYfBx z%VB=fED%_aFQ$Y8B@^vPzHtdiAi8r|(qAa2PoF-;ZqDz&T(&vnK80h2N<2VV2_S^K zY#7FgJX)!+v1m*x>TPU17$PrRHxBz_kn0XmP#D8#3CAclW(N$c1Gd*<wlBmsKZigH zJuT{Kuk%b1LL$K!u(Gy=GPAY4ucErz=ZaZ`zyq2v=@k|tCK6u&RtAnNq0}*scJu-% z4ma$t>FMHkP40jm00rQCoe&p~fW#DEdSL(Rxde3#P!khA@UDU|J(4N9zdjfL?NsDe zdN3TzjsZfH3fTCgnK!JnG&L(DEQ@PU{qa^|JR;%wiW`;4Hz=GfBgOrN;mL8KK@=4m zMl;VqIx60nSBR~W+}>CK$oxF&Wdo<Pls<;^wJrszVazP@@(R!RJ^<%oRR|d*T>4k+ zPYm5m>qI6P&h_}$$GbXTWtrb|r647bji2_2UC1L1Y}A`(Evf$R1~c^Cq?#@mmwZ9} zQe}kaV`_?QTBq8rn^%EFqGi6Upj7b5FB$5F8sD07*(wq*H9-G(B@1EKu*$n|=`}|I zhy8f%C;6?-C3oZgE!VP~p*t1HCC(BMX%+sh)3W@uTKvO*r%_N<?|uZ<TxZB^;cA)M zSX*#;Fo0%}l+Zo?zMLCB#$ip9x45{xzX!;^r8duc1FD+JEwzC61MkHiavGyxPJfx1 z2e1^-UsxJQVYh!s9LW6t+(SO5q{LxiyldY<AO{Ggk9r=*OXW)#v|3xYeB^cJBdgej zs~=qyuzJ}UEh{SlP=v4`IM4$_2|NJsse>aU0m@1dEFSFY!GWEHGAGMv$plxCQG<!z zGbrm=g6VmOm>PM&Ci^cw{E<phzB;#|iHSV@$q2_}w8{wh<MXkM(v$=7=)c27j>9GT z2-G5YU*E_!p+OsmRw~{0SEs0pQ_;_RGRv}{hExJ=4k#%pQCZKs%=W$@!MS^?chY09 zo4q`@AVQom#p`GB&prNApgCQGQ)Qd1uDW_Tu5Htf<O_Jxp>>J4!C+7g5*;C8udWu* z=JN6J`8T1JAT%OijULG_PRVeO-m_;9_E01tmQPj>l9EDKK!Z0C$Z~L8EsR8q<5wO^ z4msDnU?(=L9UYnjf2G~AH)APd-A_?4Fro8yV8ii_obioMW-9rsZ@w%%Kz8$jYXm5X z9Lm9ReZJ>PgY)y_ol3K+gb0Q+FZ)$1Rnb$Qqb#Hv`t3HRK1r_I_?nk|{Wnt2EgZs} z#*)9>dp!4uUUg|2mD$m1aF$otyu+bB;44>)dF9T5yg?f+nqMNVpBo+p1T?%C4s4rT zlAVdzA?HnM^Lx;KInoKx&rH$!v69s_{@rs?c-tW#2ZaDv06AO>fMNieKu`T{QVF0H z6O%s#nU!gL-q4-GFgQ*j)PQJ`n6=<u@$zMBviu_QSkPXu;{`_z5V8DO4?7(>C?CMK zK4e{-W*aj+J&hC6mOKpLkmyuy-HHm<=T`JL6%xw2LFrN#%3lSSD9?)*R8(R|=!5?s z7l0C+j>6S4e=V0ygqD0c??3rl-#`g*>t8^ITP@jMm)csblA@xe<xnrip5dR>rtJ-7 z9K5F`dVU8B4*q8T<gJ`Kt%HY4EWF{lGX(W~DeR}=e(m8AFB5~mC@aZEX>Mw4$V)y& zJN>>KIvLcbxYX2x_!|jb5o}!ox~q4T)-0@z$0UF;jzcM8_T%4s6Mw?ZGOjDa9Rq*^ ziXd>hZwPBL%8q0T<iXw@Oqr*&OC@O9d$Z<_<w&M4z1g#($j4bs-s=-N6&~2=wg2do z*aglQR}UOkV8FS3N8TQw7P!^WGp~H}@)e~MT7pxVDd5H@am8ll&-?N9gnq+B@bK5< zWgi6r#*_E&o4<?8Hq5VMzv`7x6<44$cDQH94hJZfBCjYXl(kYz+zt<ZEaN80y1i^E zs_vp!>(6pmW`Cx7SETG4(Kq3wkA!$~WWo1|tQa>iIv>6REWjR)=s!;IY)q6=QMTAx z^m+am`5ii)%NsqOkb(Vln=}_O?=H98p3FUhI0$$S!B(~F%L7&d|9}*#b_fPp$C1_o z+Bw`&>}rOY&MiYHchABiTKJ}UbzQMTG)A3BU~54@c8MG?(7C|qfS2ULLd<p~&JR{f zX%iejVfqDmI&ee40T!cJFcIpG<v*Pz{Wy)Jr2aQZ2~IL*_xY$97jLYPOm(NGh*NSJ zvp6|uOW-~bnK~$fgepRIXuX0?4?A!*O-(zQ=BXu8{tvD#Nwj?g-5;J{2gJS;1WSU3 zdLzdyJbmb#n#;Pwx`3^PPwUYHIyS;J8)t2+6xYJ;j3Vn%d93JQf6<ZL@fRcrWSJ`f zQYZG(AoXgw9DK40$(<40*0$G6wj<iTM9!Z-6<GxeES!2UNqXR;E9-ok1-PSdex4_p z<fd?w{cLSLJNWbs59xa7P>0~Jrhm1ZvGl1NJkX$Wm@X<nk-dGZJKyp%G0xLz(P<s) zo<CINS_G{7zL^POUs<?#mL`M-HRnZS*fXfHJ%T`xxjL4w*io4#OqI;395sS%g$+pu zkMGnSy7HXIS9o|hM9sdQW;fJ!+5Te;<O&vBa1c0K=g;EcD3GbnaO@aq(CvbssIn}b z(o`Ae%D65$<JK(N{^9@r_BrLg+g4pan*+})D>+wnmJug3d(QNVk3yKn9v!mCduK1e zxe`t%Wg^%nm6F+HWK-ywk>uWQ<$%QCBroqMO6|p-wXueXD+&s+P<4fQT9}wXG~7s) zMTe8vY?4iQN}`X{&<F``3h?&cN4QhMpm!5(37{Z0BosSfD<{<i&f*1-<e)|_+?cP+ zqTMy-6o8uy9TL4p7EHrHpMVsdLF1=>eoKmK;(iJW(Knni3{rMQ`A3{8ozDt)`LJt# za7fS#z4J!kL4rP2U;jVYdcyP!AUziF5TzbIe3&q0WAKHwsE8@evO%h`=`GN`fh82q zRWiY1m64H=i<{d3ksz`mGniZ9JlMD{`xb25&Gi)+jGax&M5Vn7N1XoctrggXg5<At zFL7acnS+(}NeE9`Dor<xRL-U%gZtjSbE=haW_mc;K?(Ok^v>8Of)7V(K0dD_<}B4$ z_vGfWk#@aer%UB4P43G!z@+*=i_G{RjiT8@f*K9mIG4}stS*JFfY$fVQhb>&#T!!d zr66yix<d}mj<V65#P$l}JU<1$ld#!>(|h?-X}q$uE@qf(rfUoR%U6NE`_<m(T&j$h zExpp$RTD0?RpK6*`=dDQ#?U$=Pd_?1S>E}*kitJlL7bo0o?W+!rSz}Bwnmx%AI;Z< z<N~{V*G<<yYqk_{5X5WS^8Ls0Kj3IyfISDG`$is?-%7EGc?a??TCi;pVml>8WOo>; z_)XRRuDua&g+QY78w1}q21~a8MdY#N#u)j}{<Y%c#fGQDubtpKdGcLhp^L5?;WZg4 z;r!aiXFs?H0d5eBJuWJez)OCZj*he^M4lZsPoN>wH{3+y4Lp7giaHoQvI;HC$7p>! zZ%+*O*P`FNxd<<Uu`v<T!LQeTrKY3^cNgESc_B7jmFo4=S6933DqBk6m|SAXP{oRF z$=HAA#o+&*7c}KqM&r|m+c6l+(6j@O4P!61WJiZYtQA(*)-v2S|K13`6FN-LvT&24 zoxfq=43k?t3Ak!jLRIgnQ_H-)T7^I#eN$6$W2Uu>h)IM`B%GM9!YdOn7_O}cU{P%? zNNrPNqxA2;kDi-KwoaXgQIE3J`YT=vv%zdF-GbC1(9b7d_tM)({u+=T_PxO&U@YF0 zxeyz5>SjLKjW^E>6+-(KZG`lP<Q<$G=6|pTHFtIS>YPZ3%l3rF1&JTYSzSAwL-+6# zNhNcjomlC8NKs?@Qspq$$K=!xAgX|z!_ap`Pu|S`AJPyK{EsJuBvG^OL!Q`6T3SVI z?f1c#ch8vzzwj8<P=}{iNH9a>4mgb7y?@%p)gmS=Q{e<|JAYqRldFfJB?8^<e>+)9 z#TH`g_uzn5(R1qp8-%-zkmRY@hXS3ry_)-DtPPlGaFx#vNG4lUTM-;i{q#QeI_|FH zX=U{*igQJd3r58D3`$Lu7%dlFFg)IAY!8J`+l)6NI{Qr0x5jI~M10H$R1?A`ST+;W zH5_X2j_J+kP5%B3+X?-(`BB-F33R^r@LPI&&nKCfTUcQKx^hZ62Gc3%(P`KFN{+a` zbp3o^>BV8nZ^|w1Pp+Sl_>>+dORE@moy&hRqN6;L{#grI`!xOm)(IHiaWY=Ke2Mpe zplIdi9WV!6Rtoxy;>Oq8)RZ59{tbCxIfdKo6CTMeKr}>S2`VJ)a@juz?*dMxhLl81 z^+}p3gtiQBCa_;6)<;-XEts(Cae3v~gcZ{tlX5!(INOhg$0sPr7}ZF~xDjf2!YmbK zO4fWliB&6W^f50navad3aqDZEk!`ihCwGjF6f$nw--CO=Cm;})ri!*?6jS&A);~w_ z=sM!kzE$;%(?(|>ptc#FnrcAlyHFK=aKzDCDK`ct8?jv1tP20E3TLzQz*cl>v_bFZ zUsAoJ8}dIS)yzU290qKsk5F<d4Tzkre$lMbyLYb@JwvIT%aP`1Bwer6Yd@y&J_!t5 z6c-aTFjYwK-WPT9WEdT7qk;<pz%jaUozpDGjw^jrNtaD%|KvpVz1Z^)!z{8S`rH_? z2bO7fwMi6P!bLW8XP9m@(g`AF$32ztR$%LYh>J(;t6PoT{U@s;(g6*J`w3npJR%2Y z2fu~(>akHFj1PX{MpjneCv0}L9(8~oAxl<(Fb_yPr?!D<9Gv#E{}Ya8oz5YLLLt+< zN8}*0B*Ahx$uBA*92pk&7KEsQfq@%BzwktWSL2leuQ4$F7Cf+0ersJ?n|LtP@pM70 zE8=pwf0A?AQ(x0kw)~PE^wPN(9Iy=p3mSb+@a3l%B9UE#{?ht)TVma@q`$Vp;*9pa z-xtWSsXu=FYqi9(>KPG{`9|@Xda9niaI3zaZ4&Z*-rS1Tbu8Q%R_(<q{G~n`NtzjG zT42OgT~nhEoeqAd4E)*%n?9*iPOgCwQJjU_<7EKn0kSanifzr)YOm-K9C%3D_no1T z;0YCh5Y?o1j3mQp?%R{L1txFE_?vptZnZ!4jVo5@+A6mro_jQB!m#2#lmjgLj)=RN zl^Tqx3iarwl_=db;%GpAhTX$pb(ISamv*%<h_;57DaMxGcc4!g)PJq#vuF2NOJlkF z(z~bXLSt*{E?NJfkL54A%U0|@XIb*q&9^A{_@3FNIf6ye-{ihyremrmZoZAYPgIme zdDBQ}VWst}L9|*YW}S=&dja=eR*1H{9b@U)-ruBmsGq18TgAgO9;-i#T?<r%o#NBM zo(8VEUt`igwg4_FL`-IS`uBSUp`mnuzToJ{dchLPQNVFv2o;&>glVT>sXGU+Q26#$ zVBZoTovY3bc&-^K*62l>i$Twdlyr4c8oqQX>F-5`&S%tAf0}ZIj>RkqLB{7Rl#-m| zTiV?HAh76a*!5mw#Qg_rcBKU5`kaOd(dRG_t>ItlrI}RpUMT)?l!CpgvD>IfQiP|z z;i_~0`Y~KWHpPMA208FU*6WYxr#eaN@9XDh(C|hWMUPfbuU{dR_$ISYX0{&@F}?}W zZYCWS>vkh%<2UebVzK9Gj#?9HR+62W$#UtnpgFgO`oH%bPr|KNjW^+JyR{!pDG#bR zM7kwi{1s1qd4_W9gA!s~-n{Oh9U&1z?*it<bKa)-FCSL@%nL%PdybxFcxY$$;h2<C zW}X-zE35R3QiBSTQ-A-4(H}YUX0wpWAcNl2*tq`Itt)N!t~*X2kt8So0~TUl`k^|H zow9C!)qrUHaF~&O&36li;pecXb#QiMRe0Ga=<h~4ICOsLPF0W~)*`nS+AKwk8>27a zoJ}ou`tt&_hckiR5`Fnp<Nu?4tacx6gcWn!h&l+nY57rI=nd`r-L&qB$DAxiZLVo( z5U%a@x-Zm$cLK)D&oq;S-}oM+pnxLEQFCKpZDAa5>fQl(3zaR0$D842WGQ|pLrI4Q z{Bc48C&>C6Bb-u$kiMYb!(I&fSm{%=Lc+p^Z6*}0G*ci$-w^7<S_#u_QvM3PDtYjP z#LB&1ch`AI@9iPk8(+ttrU(w#d=79B({a@N`P8?<<BF~OC4v25vwF+M>RVe=0X{H` zNShcFIa(!HxEHGrP;SMXb6)xjr%1Epv3odk7-an5Vs+&}DG{bLMV-2k(D|<UXXKwn z(|1V){yH*z==Bfh;FtZslq8-;IVj4rPT1`7J>ZKP3n`|^6n#%Gu_ffWr1c{DjhouM z8xAJd;~kH8@7=A`R6kY&4-g|Ti&<~T;mVbkHy~+NX)bG62`RVBNZ^#bb<1oUp_k51 z&%fk77|5tP>-z3eIpu0@ma*XahD{qC%K?7xq9BT+5h8PX2M^M-)wmWFt&WY%I+*j$ zXPcf>lrJm%crSlyBQA8}W2zA@B{Yl+W0pU4Ug7T(T4?iE@DsD!2vdpvA6=u%T;gv_ zSG(_d%Wj*m*sOF3Gi>!uBhl<dQgvMJjHw!2fyJ?!gq3~1MZ6WA{|p$Hgkdsj-Jo;- z<}vq;eyN=VO9uT@$>x-09-6TmnRgEmp#KBRa~R~&jD4M0#SM1Ry1t%dX?69>?OMCM zkEeHGg!$8(M-9)j(nEGYO;K_Qsi%ueVe{M$F!a;0K3UT3`thSad`*J+^SLSZ8EPpB z9j_eDSH;nBi$_~kUH|ZC%6?m}FF0UbuuyOhjW`uCs$K*&!5w4~mAECRii^F9PD@3H z9S+l*LnnCz@cJEtvKL!!#;^INF0#FG*O<^m&x%q_us*e;UY~4eE3}|L!x%7Y>6rCv zYDy;cd23rQn;GZ}#0>aZ<Ny;>#Ga!~9UZR=M0>9ybQ`-skQpIWIooXI;Z?a;Get*6 z+k_ETsh#U_VFC{tPElw#&c7X%y+~NuK9M`9>X3X$lumTnCDVIT?+@K_-gPs7+jA_8 zj1IE{7wY-c!#=yZo>$jv($d$Dge>XE?28}@m7d(J;?#q=nWy88K0js>u(untH9Iu} zlM?F-=@Gl!OoVGHD#{vilfQ%+Mn$>67H`Fi{Q8G@gT!kB^DPQk9QLP2&h$`X!HOpF zgmMuW_-I9Oecd-VHFW%LjSYciQgbMRn1FwtiP<>!P#P*Z|7b00bNd1zo5yv4z5)im zy2UCE8u`sMt++NWoA*G_?lIv8$4j4pfYI;oE+O1(-`9J=B~X#Vbton#CO9h(3p{}2 zU^T{?f@Yt0yLN13#I{C0_c4%gI_%HEiX({ih%q!qBsWG&D`;r|Szy|cjopJPK+JpG z`7qdnrA=8^mN8wM#xASd8~-E@`P}F+?Pfx>&7I^6ocbRP*!P4unIuV$cW&ng@9$6F zBN2Ll+Mbc4+12|r0@rYt7c%ox`5yAG0M|%=sRbeocnMrTRm>`5uY2zpXEx{fMtJrT zTixr2*iZsq+YQHS(qf0+duW>VdA@<DD;L}THd?jmrddhJf~&6k@Wc9sddH>EwD}ad z;)iPG_U`Ud)}FmwMnp6y46N{agVfS#>w-Onh<UHHssR;PAFz{yhQMUflwe~?JM6xH z@;<SSoKz6hAIhiBWO@3W=0uxl+e^HIIXQMpqVwSfJ+mo?t(H#({poM2=r5lp*`qu< zcKXOMr3ZJ}tm){u|NQxQz2J42MpAWh(zhj#RS_HO_Y!=8X%{b^6~1I9g@4(MFl$@8 z(+^bq@Bb^eFCysJ=;l7=yJam@?TT}oL;jt@<LgSd$0ii?ADn=-3{(aO9Dnn8Xg$XQ z(R)3mjx8pf)$(8N5Gwpp^W7t+TgQrzhKtqef5qzcL-rNC89&dcokbfP?LO`JkCRh; z-waL~sysV%bf6Qh6K-b6^kAAY22l=%63H?<Fgswq4KlmPCuwE;z<4t#{Iv?@2=l6* zo(Lf7=-8iXr;OoXeJLnd_{O~T98e+JLbH)}xOZFv<sEm3tXLl|7pSwb4Eyrd`BI*$ zl8w9&OY<MqmF?-iI;(F-_C9l>WHq<oYS)_X#Ye1E#g;#FoXn;R+aW@MPoM@1-IgXM z`PL?fdQqGJ)DF&gZO1f)CVlQDACFQNsNUE4*V=+)dAZ|}@WF!zLEvY)m2OFcN`Xg( z!*oWQ+$r0w)L<QK3B+YV8vbLsO@vrQi~~!kjqP_@^pdtFR`htL#qV^l7vc~~r}(n4 zpET@<?9LuaFMqr~Qxr4u;qLrl$F`2n_W%q(CBBD&N43vo2;b7y7XYA0T)X<|tkWvj zdhr)qrnP$Ze}i?EYv+cuc8fk5^YDFfOJ<L~hUN=;hMJ7(%bB-yxU#ZhPo8*87a3{A zcXIGY{8g8M^L^w72hAj%Ur+dv+`IShK1H1&m(9j#_K!tT-84M$P1^=@65p(NPYU|d zxozx>nCW+s<LhXoGc`5sFiwt{E<RbCQ272xfGq2?V&v<h!UaZ5no)mZlEKP7&re6` zOyr>)7?uq>|7dKSj*qHq7*f4L4={p?naN$@>L8xC<4oU*!)9mN0+h5^9%_-M^ud4% z!5>y*^^1;(+(V-Ya8u-5<qLKN$UC!W<<Uy+RujqAcCC2-SThOsEo7+PKsrhAN;Bh1 z0Z#f7YPN+YDIBAK^rq>)0&F<ilh3N)h(YRyrNbNhjQ8f50g)PFA9uC+R2jMRtE)eJ z(s94hwNGm)z1z92FuLlguQ<cYiQ-GM^NSZ_n`foA7o<SwpNnPQ^ue(sOeqTb@jJm) zi)dE#VZ!j#%L@-`&r1quxh^;~jqjCTm?I?<S^R3wl@D#s1ABX8tT3|NjP8ls+uGhu z&U%@6^Sd1<%8jn%R9LEN(o@gpJV+p0o9y2*Vaq|BA-63*A@huias~eMJ@3T)`~rMR zg{gY}w*!k<C@PLVD|T+~>)1Zv+2ORCoWGm@mocWHCWDyklfM27My=&hbt~?xuJVDQ z{~+_zdnL{N>U#detn!>4>luO`-92dzI_Q$kW%f++@LYN3H<TPi!DC|DoSSocuQbBX zTYg+WS6H||Dd|$%cdLp!j8;tak4WG5JPKZIY%(6n8|OO3{UQD1^J$^Jtf3%UR=AG# z7HwI)pn6fwUz_kgb0<t-!9XAnAb*-d#wsCv6slY%yMsg~+R6Ek;wr|A5``QF<RA~9 z$|%X`|CZ~q#-ZOUkD{$?>Hfw%$a45ekmP_?+IH<_7yg?$WY};JR%E~&K&8k!QVz2P zAWrB^m^7*ogMr*C#D42*1}^J>PyfBU`&?Zt;=xFe5P*Y#7`PJ%d<5H{@O#$Oq;+(3 z{PKl<d)lwU0NLWkhJJb^ak4eXyd}si8NG74q?(d=-X%`7bWRvvFuESjE7`w;nuD(r zH^!l3ZWH<-@2@Rcx;3ne|Kx;B_w(m7$nz3IqXQu(VE7vrFNv5)tcTgKx*?R`fbO5~ zJLd2RJ{J1L#wXsdYe%(#1#}j1qWIN1U4JIS@Ef@PAtojSOaEoB5bfvymS<pSD4cdZ z)09wFAyE|rjaVw+K@pv^qGrASBDC^&&JLJeeN0Wo07XedQ&AbfWb8ZBsp}YEDKVdt zMAiRo+&iGVK;KDPf9X>@yeu2?AAD*4a<(9S>2V5(BP?3g|HHRcwKe4pHP{841=-TB z>dv0ZJ3uY^0_)xvFJ7EY=oE6=I=@RvNwM(+t*wDz{vH=4_P{{0y!_JxBTsX)gzORs ztD!?(KLpI~Tq=38>sxB-m+agou>}db{5luTu7IGd+U_@TaA~DIK0-$gSAt%fP6_-V zS(UeMGxMpCnFPWTZjIx>@?jnl89A0Zc8h%6t0_1%M((P4!0{Xzmge`zvTod?s+@YH z&OMsQ88hTt6&<GLBDFU1lDIa|E#P<rEFWcNPWb%!aK?2rbq!7K5NPwMpc%nlOy%aP z4&<G~6BB27w(8)uwvXB6IX3E0J+A)AY67}i2CqcIYy^8#P`(0|DSf38oQm;7IBmTw z=pl3KX8oSWsr%++rbaDi#J@W9^vXUp7(dpc<*hd-20V%kgXhtwaJhANT?c`5Ary}S zA0bE_z(FHMZGVlASHU{S9Lj>~#>O$M*-D@pL)&!h1Ro#PpQNzsvb=nAUXc(00fUFj z{0BIAfOi0Hf=zqXP0h?_PbCg)_(~l>=tlj=q@-btN@hO`8PJ|%oo1Z<mVvt;@1c)0 z3u|ceq^C5?iLX-sfW%onQSHIqgLuFZ?CCDxV#eAKJOIM41z9?=`T5=V*oinlKR*(X zG95vT+B3IVzRdZwcEzP)1vb5Y7x#o{gvc7K+X<e=EjJvT67;>VHQ>B*V~rXoA`_1A zh{-z2tQFpBy&Cp~FeleX0I!40o}Tr;XGf=%F4&&o+}sQ(U-=k7{;;%Ey8V`9U~_$q zZ_bbF2fe&V_THE4NEsGpW=^Id;hrf9Epc{uyYFDyErmayH12kE4y$TA$;|alofALt z)$pEA^=sN`?zFE>?VbzG&3~@1_N0GI&&?hG={(IYcCzc9ekRIg_uuYG7N4e|NV(v& zx1Zu`SDnwA(fm63t5f4gKc9{%PSMx6a(hSxaeWUL^l$QEi$U<{e<Y-&Tn*b7Bi2el zk*M!53CMb1JZ8|9X$X|E(L^sdJ^gE0*-qR>h(?3-W(W+PLS#+?GY$?9uTggYt9F>g z(<%nkF>mPaFmk)Vt|!!07aqw?Eyo0&wdt|tXP@J3Z{PJcMtrN4=kKY^=kEDKlS29i zg14#q?2m_1_uKco65g*ivX9oVzr*si2^Mw1At4o(ZVOBx;g+^4OI_90?k1PAL`^2P zrq<S{u}g=v7v#LuzYaYVmU7Ojrfm60G+5nQDQO~1V4=4`ggBA-MkIPXe=bmGCgXU* zj<_Wg)tzL#zpp`jID2!fYGj1%(zq8bTTajsu`>7%Vg6xfVex?V6~W?2OgsVIC{88h z9nYSHLxh0JjsF8ftNV!GLX!5)=c};Nk9+&^(R{6SEa~<XW7p`f!J0ck=Vd_zvaYaI zM_2vowu`N}mW-lH7PNV2>~MozmX*G4C$e<#U{<-kiuz$na`MZ3eoMh;&l%_&%c))7 z@2#17#+tR?dihi^4b21-BmKUM_R}NT6ZibI(#F#LN#pG7UU9G;Vy2aqb(M&I@<dVO zOugU1Pvi&Q8FqDY$njmeB%PBp|736>EKy^^r4XY<Yt%)KNB%CHM$ZQ5T{u(Ymz-^F z)vqr`u2~+=ISo^a#T({d{U1+8J$)c9pyo2OVU-}TaFmkrf~@Rbf=<jBuov5GBKk2h z5}#?+L^o);-Vis+$3d-XQ_=OiH9>h8eh^kx>CJYSg+O@##SoVg<61XFhzlJzEe{Mi zLyrRbybW~qKOu~8<UQgmV~|{#a<;0spIq-q)8O6GI9lJu)wP?)X(B%O_*(9b?_U%T z1NUS}RM)tw@u<gYps#P<qTALM;dw^M-7mG?)dbykM5sR6Cu840zPE)ggX0K{@=i*c zj2v3eHhvTH|F{57$jdQO@4{V)5&a*}i>275UeC8Z2|x-oe3GDuu&^9@D*p-qaDQLi z=njQ^bzpKB)P)c3Z}qIaN~lotpsbVpJHZOeQP4bqR~*9^!MY^zV_0Al1XL`1e1U{V zIdWO->_o5=fRGV80mO$9oR=U>ltu4X@e6=!c1=^)=!_^WrXP^md;7+8ql#~V2{Ps@ z7bEayTP>-bi{$VTesR9~?LPUeqtqO?|Jt~X{b4}YP;)TwsiCpj_`tvVie$KL#3p~$ z=rOy6c_W17!CmPeY5INVB*{oFJ{+9cD?0xXkqVqj^bJ0f@MV`*xS^%1WS~e^rI|MN zHcJS)oL6jY$M?8dSOz^*2~Jn8c_UoinQAD{U4i>YI3;DH?z`BBm((C=wb2!_l2wW7 zKYJNVP0_pkPvVutkumovaTS#t7am>}4mM@Ea#g-4d4{0Jz~u@;HU{4*ka|JgHqIvF z-)mv}zlug<RBZ3|<)xOcvuFS2w0*K}(Hne7ZmZvzk^0v};NM&Vfl^TjxdquLY&j`h zSyUI^9E<^#XjR#$RA7~efWoA9#%zDf-Y>ym-hkla2wD1%9CIc@(gAV+mgtuS9v4t; z?b@=vYFFwhY|%`nP#vW=`gS_HAiKAI@|3;It-rcJo-4er*z)g0aHr!;)XM58znfUX zYO#7q`?WQ~m;`yUP(4r{I%L%~p1-|yft#BnRo)g}ht}YvA*!(ont_1wT-n%nDdq?F z1x^ytPngh7-O48l43P56SFW586jV862$!S(STDvwDN$2}M#Zp@h4AZHU|>sYPuAPo z9IR?PQ*RMkdP+*drXmpg6_n#YKZ}^)z=`dP!^Au9)!A<p2-bOz`bAhl;g;HU4WC&R zvpYCaf=*^&+<}yPey*IFkivsWwSQ>6U9YJ2(oN>F%8ts*X8aV|fu}(A@E+GFuFLiM zzpy)NLJxLIz;*+VO3Ai#vke&xS!gFeJ3t+35WlMQ!0N7s=Ih|qtx49P^b=As?EwLY z7;C4${@eCdwJ7>p+zYv;=s1x0#K^nIFy+?=F&kep=VjPlRCXC1_<Hi@&2!}jl0kk$ zHTmZ_s;bspHl03crQWTX;0iZ1bg{gBsQCxInl`z1hJ$A0$P{gXgE)-d>z`~dzCB*7 zd?xZ=&}ubxMW)0lX)am6e-PP;jTLdaUWYQeQtacWkbTX4^OfvFQSk%Ac5f4M_a%nE zBKU*9f1AJ)pakYFDD1?X1j|?00hLLDL<hYN2COlf$=?_ikbwh+kgWe5TySXPF=4~I zBunxe2wtU_$(y9Mk04){s40Xa3Z4N3jWFb!^ji^Pcu)4p<`YAKas9_47i)PLjnP8_ zxf9E}tqRHgmqH~V*YQ8_aza;{zC8EclnX8|1U9{hj&{2-cNENf<kTU{Ci2|F-(Jzf zNHippRyjGVF1s|{wX&M^ihcq>=_>9JtP-=zSE?uWLk1Kotb+g^2t5VPpI0>28uuu- z)73o&vJp-BGBx6DbkjHygh(J>rx}P#8-Fp1^8yld-nae&Ys8>0|Dmk87qmJX6LL}r zP4tJ@WH1AmW%AA3gBjQBajJHH{hurMUi{<2wH{GOVmLteYgn-~y48IS6GU2TfwSrC z%0d-Dap3*Wc}761A(*e4O0*U173g(2IL;YqYJNgr9RXdOM;QHbnx67xrlFZCx1*pq zlXtU9xrD^Cpl9E+9*u`ZhCK?BGLo>02_ScHumb9ynl2zoPIkAx(yQ$gcX4Zvx7*#P z2O16!ks9<oDjleqttuY{%rg3pmx96YzG=2LvCB(4#VK;`HFkKPOg?d)<P|(EMNUF? z@ilh@&ERMHFYQ<8b3JfRVD&4Iz(?zkh_`_*=JN`5iL_h8x!d||#d;2dd(bmLB)Q+X zG4jH@YfxNV0DMLx<%~2Gta4GZpB*y=k^>G0cZf-cgU^5L!`gd-+F)&}sa-NR=LN5n zc=fc*g!Bw@cE=boGtS)KO{sW4VS;gburzm@S$lzhu!psUa=`MAI*q8lLB^f@1)ZnF zhyu6BBS(%R1IG|#SXeLIJ>6AUz7oK8_H3Bm#t>a0j5V{$b8#hL4&0avaxbr~{q1KY zXuR3f64OmlQjl*0E!qIF-odmNdbnRGwvue<<|*1?s45}NojN*2O4Wmtv@y)Qef#$9 ze-HKi1I9LXz@&6_cpbnm_=3i+roR3I^a@|ToQ;ec7x}OIC6eLN(t_sat?@O0a3H6- zc4IC3q&DDha9N1ZJ0d;?{Tf^@Wp9}uRn2%Mcg$_Xi|KbC8OR*_Nyy%>-4&WYFD6kW zfqmFP<D>Dj*H4_hauV)0O_Ti%Pkotc(4V^L94Wa~d?e`c4j5qjOihiNOl2+p8xX;? zbm4;S|Do!?<GEh{KXANGLxUuQ6ou@NnSHX#&dA8hDzf*cWv7xPBMl+R&dexeCP}i% zE_-E<@BMk+zt8V``~GqMI4ZoJ<GLQ#eR}!`SYK1HP(Ik~>h|)4Sg>X~1=Bv>;IuN| zEyz#~raS-;6Q?em)MCZX!;$j(ef96M#pQ(yVENi>myagSMGQPrq#a0CR4!jtq!qbS zJo*DOaOi`G>vkJgKu^~_w4D9Y+MGRf=S1n&L_218c;z@yn}qiRl~c6D#5j=NVg>8i zDHfLMH=LMjzJlU`+o1;E=#8aeQp=ZPwY!LnZiHE&(HUB6Leb`7S2U5^%qUK$>|!7w z#&|+{b>;Hj55d2WJ^r}**F~!Dd)716v-@KtQ?OEy5i13JM+lPOeQJ6}Klg4^yvPE6 ztxI}(br2rM>UOV25O&@T<Tw(YS>#eHHzAsceD<uV#BE{)4}}V<Nuj9KmAKz5%qWqc zsC%YlCsZ(<@2x2@VIx6+$ZUd3WB-8zGC;cZU+kTmLLC(l+zh*ngJD~USTTc$;C4qJ zHc~Lwz(jMdH#4XuoHKp@Kqq|!CotkmcvfK<IQL(tbq!A8fW(1<2bYBRJcLjjQE|jy za+}a$@LSXXvxVBD(K$9onpZV|69(i@mEVaWp)8en3f=%*AT~>UXs6lP^RP;LEe>3m zb2RZilfXJHaV>O)`NA7F*ViXmgI@i%x-YLV*w!6B@$IlqRFs~&+MtBsUHp%7O%0z` zy2cd)fl`b8eqX<mc6XkI!>=fs`WXYmqL}!Q=avLTMuvo60p;ZY=_CQp?uF33{Gro< zLzvQ&$fcF8>$1(4TDR854hr~QK1VNNYv`KtpwQ<?O$0)IO=!>XflOt6T4~hN1{BL{ zH0`?Qd?;Jz+^0kSf7h~B;H9gL6SC1Ov_AoF$6!LFvCFBW;Y4WxinV^``#>&1RJV3_ z+i33*(JpDbk>4_e{<wYn_oEo^7N!&{<KE!NCy^E-7A>1o_BWoF%&vKm7|qX>r#DlK zmk);33gN5-6<PSr)u*PLvnKv^^jQ_3CLBt?ekFG|j#?2u=WlWb>au91K&aY~%R@9B z6QxTS9J(+1nj~EJVuoRDB=f^Gle9GBO~f4$loQTSPz2n@*@fQH)z-DoY`r7L+;?>( z28itev+hf`AXhpK4?lpM9q82siiCpMRuQv-0le+T`L~cCBuWI!VXs6{7m?3{vk?IT z!TSh?gHX;xP9J*jo<(blD%8~G-3&wdCS?V0sy(bOvcqnA&UZ2Us*WJWWG$B{`2LGB z_(B{Yg?*!NXIpyfe0&z~o}8S7D+OQbERX;DuGKVI^HiJF)A!l`3I$ugSSWURt*et; zHbgokDVfl!()8BWM9CH1=vp?bZXdyrEY5xD6d=sP&+OyvM=~;ArWGsl`MrP2T)U|@ zsHR+5#6WybR_~zZP-v`1SF(mb`k$Tyo&q?v$?^dJO2py7`qW_M^aWx>Tr^j)UhbBF zG^Il0Ec8r}!2vO&!JTta<>S9Qdf(a?&2mk?xBVx6eg3yp`Ek{mdy)Hdf<|_RJGl3Q z{l@L{-~-Z6b%JXUK9Qv2Y*@unqtMJ>bzqkKm&44K>eE%@H!HC8vI1fos(oPcR}}FF zrk0l>pw>x;@nOJZYs91@*Ye==fGts<rOET~6Z&uV*eQyH!}J2A7P+}svAM&i*lZ&W zkO_%Bz(A;~myq(Y|6eE?iDag8=ME!20ILK%NQ4A1a~RlvdsD{G|3!;xK2=0UF_CbO zEddKhD012h3UsWl_ZK-0y`t)e!wQZ*oP6%uL4Q~Mxw^M9kKc6gJBB`ZO?J*s{61Nf z8hnkMe4aPNA^+2c2DgG&D5?3F%a~s8&zgdt!Zjr&zn^O!ygU^Sp=Gl@{nnS#TO#{s zY-&*f%*Gh-Xz9K?hR`nYE{!y8$Wg)D(t>9OJKygVdJruTj#n!vqxdpGRFnxk2p=z9 z-uAh6Rc}wHhurzj^Z)LSwCg!SZx`Ro(v&DzsMs2xvMHn*-^bciRw!cKHM+FrKV|oQ zF-7@%4{ej#J^FKelezWxPcnsb=ibRB&D+@eD9X>r9?m}KRbgCuB++FwVeDS8OJeha zZ^d&5!0xg7v4jCKfFAt{u&)CA&HSzB5LQ39&Ks~Ee%RgqaQ|L7)!_N#Uwem6>4(oH zz5cOtb)^CykLnSPG>xZxCar&5(OyWG4|WX2Bta^y@vZ$EhZase=4zxX@e7H*pgaG# zO7?Eg2^nKsj)q)`xC4^3HcM5)ZxW4K(p*-q$;mw-dG)(|KOLm<BGNIpEB{H#KDjNl z#jZ)^>1EtW+87W~akAWGyRdzAog|>*)d~YG?MZB7XrVAnF!FS4zO%7eRneS217!g? zjeRpMEgI00@yC+Fj8MM4In#<f3^*cG@y27E(Ut5oo5vnM*QRTtap{ud<rcery;9zb z>}6$Tw>#XOVxM**8_E=JSA59i<kO)35NPB$Hz*$z6huo;UsZeE$$5>mMgjt2QZh2U zSMVkrUgP8A`-q7bOeeCgj}<?YUYWfkla>>&>f7Gd{!*Lc&+j5zX-hjhf@{t>oAc^r zT%GDIIi~aJZI52JQ#viuTHdEL9gF(BY>}|Gw$H(K*nsRht*!OIM$s{79!P7hQz}WV z_N44Cs;kr+`4Cpi;BR~7bKnqNE#jO%Sab3K8;y#Jku`OC*)qJ{bY;J}F!Dzq#y(Tj zUmcNfL-sUy1;tQBm$yy!2Vn6^^xaTo@LSP1?@K@K3&rO{I6I2GdwvT5hLV{5xC<K? z-R3huvhX=58yWS!uULnHgRs@Xxq0CM19jK>+8PRa|Km2B4_qi_P83Q^_$$@;Gc04b zsM>H0TSn+<H#>=ucpFh|!`s1mC#1Mk#pA+5xUW}JjHwdm=~cFQ{O;zqwklT7v-XE? z9}DOUnDKl0qr+mZOg<+Nksg3?F|t&B?hNeTS}T;;9B$nh3fMmD&_YIeN_Fpmq_A)e zPENo-!1V!qg;nDeJNxgq1KOe)qLWjd;xqnVf~dK4evOQL{`m3Z<>d@Ou4u*~EUOn7 z{j?8v?}Y`zb1;+*R26X^K&<a!1_lCJ_3j<dRx@4|UOa_q6+RgimoIJ}9yHY+K#s_L zCw8JGA>@I<+9(^@^<$T=af-IPt6Amc<{r_Be6sehj+_N2j>foNJ2v)`==J`P8v+pe zx#s(?iSR2twQ0zrT=Ukv%=xZu$n`gCr4QNd?(8_f<j}l&rtXvPKObKBTy@FGbY8&5 z`Ey`XyfAP5{z@*jEjBLuH6_{<LfOs57XB#ew1U_8UJ^hF&zh*U20s)OJQ*urIBxpV zRAOn^9NcCe#uc#gD@4R}5Lt~|7WQa_7ZS%MxasKaq8dklH>x#u{=AWYo1@!sdzA5^ z)W2=ImnR*2&e|C~_F$*ikq_CM!c@quJi)<Zb_7Sa^QJqCSBqtePN{r(%%w^7Zr;c( zP~GH&)}TR}w(~&c9{4c#<oKO&ZX&&N4sGFxl&btP;w<W1Y}g@8|GlhLbjWFQzWn-s zH4=`FFeA`5ZP23xZzPm05qY7WSMIm{tvp$t^^*kLAS9~9m`5a-xlImiJT1Lpfv!f) zx|q^V8DV)j71P5_EqCt7F^DR~Cha2Ixzm=5Q>MEc#r3j&*4eg)djv9^O;jz^H!1Xw zZ?vxrRn$B$Srg;erbF6>3*P4YDgP}us8%q0<>31{5W<!D1M_v#kq&~ZGldNg&ZHSU zN#3;{c#x*9q3Ko8uybMw0C@?)gvYNRr|VqNXWu)wSy#yLvZ8_!$*@xE8v-vGy9*uI zFau$?Lz$Yi9cde6R0>J4qg4HEZGlKA2b`>M%`PZMSyr|xf$fdaNT#RW8SawvzF$MQ zb>&*h?h@8|xt9IT3ofu19PRQe^}F<%U2m#zEiTa^7f7(l7N9AOb`@LoYxBR<Adlnc zCnD)mThGML%A>ChFDC~11kqLuGuOJLM3fwxQ^>(}!$thEed4<0erINDd+Slp8mG88 z-mw%otq)h6O;mM?xA%5oij0o}-bo1p-fGzd6EukNsm#pXZ*ytsPEaH!MUiAixfG?2 z+N&Gq#4B3Sf4{Ayq;zydOpeF=P0=Nvw@*kf?|n8V&c?}eTvAYDn(tKTo4*?EM!wCs zo<JO#<ZtzJR!np~pZN4SoF?$wYQ5L^%Tq7GVj<4b*JvG?*F19HGW2r(L3b#DP2m0$ z8ouS}UZB%x9%t=ggw799Nf4)f`S|f>%j<ZxRAwj>fJ!ATV8j0O*lym9R~SpM@7C%V zaV*61;@l~^79JAv%4a{?^4K|fn8bOz>o|H^TPfvpZ|~TSZR9gNh{t20@59WQt~s`> zQV0Qtor|wd3&d=^Os>}N)IYS!$bSRfu<zfi6de{3Ui&rP1^-wb+4#VuUa|9OSmy~K zacDd=*NVIMQua@m40eI&1nbh{bHGqLi%gl3&!pFMmG3lD?o(RUJRCjFTUw61=iJv0 z=8R}=GanDVTw8C}b+S}7FiM?_4pu)v0K~gH7|x4?+kaTMYO1LsKA&di3qi9U9JckB zEWg2Wic>HNIU|cWZ~Snz#m@`xOk5w3RSgHI86RS1j_Eh)Gw#D4`cA*>nnrT~Gc9u5 z*m$qUDcU(+;segve&)oal5KBpbXXL1>C&2wZ|)2w9w$TtAXOM8gG9*W@87?P5c-=p zcVO?k$2tVK2=?3O?&QTqMNb7S4Y&y#yW_7Ni~$>GX?Tr?pO<f{mo5evS5}#?uI>!! z=_0N>c1RAMGpynw@h}9v1S4|-SKiI0z4v2ZlL`n0pnG{&k`ogQ*rV!^{DA8Zb_@w2 zGEE)&d2+8FHt0sT-e|qy9IujM{&)N+6u?tcM(_0VYOH2+sfar;@iS9aQp(g`r2E*g zNErGbAIB=Gi6k8D%G4&mEH~`!JR5#zW3E?vz9y^h1sYP5E<8XtY}uQ^ZmOu~^?B5t zL3WUNqK4`ag9Lks9oRTR|3dtiknqIh*+}xmi;nv~o&ThLSvN8=`n<Y2IdXE2pYyyq znP7|Bo>0;UrK5vZHT41H>JWM8(`PT?ZROw-6XU%5RsE}$Num3RFpE9Y)5__k7Whuv z>jT@GMp|~7z64Q(Y2i_9tm5U%ZSSLp4$|=a8XP3r&k;F9(dFaqO>D9G`EDA_y|~mX z<LOx|!%^zASQ|bU)a72F>Q&x>!T3+TrnV?2g3$xrq0pkLKLC)z{_4y%bQe5_J6_?! z1>$C2iw<_d8vSx92?rev$+tgZ3%I?K*tDaPNnm$sS@)lTnD#;EqbD#PATXbnkrBz1 z!Eo@<^B}-}3UT~IXjpg^O-yOW^zX@&veBQ?O0;C+vE~rGv%OOF&!0<sm(=7e{=sp{ zc%|>4#KNLLyS%S@Q)l9h1mVA4Vt@4|S3NMJJ(if9p5Dt7K84Okr<Mg>`4liyFe)$$ zvOEUo#Gl9iXJR5LtKva3xvv@^I6SUc!OrOU(z9;oIp-ER4&44WJvti1q<{Wb$;UwB zuaC@Gqq>k2L{%SV&6=bf5nEj-^OA_dMGhbyYJgBe-W6afG>na<n%E0)T~H^wvAId} znZy!uK5YE6e^Q@^nHdZ}k)i4pIgE>ntkSpK)SJ6DWj=)G9ptFzxVtyFk9cH%mHbO6 zU;xe|anKaY6JZetF3nXw>*wo>WP%Yyj9K98=&*q4lF*w0nK%`WIVJDdxqFs<vg!-p zzliYg^40>?hZx?vo78j+fBH1N_ESyQ>wzva7)c-Wb4v3ZQh&^4FmCn%vgTwZMKI~# zSflDgj2TtGj~2JfQd1N&7^=@nUbaw=ppD~%Y6EW?J3C?RyB(jyUJ!E>Tut5V#Y)+# zh?+wfZzs2XrQaT>Caz}C7r#k}9oa?oWpvb@v<z1u*ns%@?qI`4W&I;i^?nk$KEHd# zm#ebJigfV9+mahHz5(<5!Hj`pvMcPZfitbXq2b6<Gqf4V47&1zpri42L+E!bV}<uI z_ET6LYhXV61O~cUVv|&QtL1@w&Kc*%lVQ{JH{mfw$kms3Du|E`bZ5K3ruj%~-$DHq z+rMVH9R8Ho)t`?%nAwUnDW6kD>H<=4Ou;3<R4@qg8(F#M0=7z9#t7~dHZuU=NIxg+ zAw)+Hkpqrij$c>p4-bTg8uFy3r-uUxd;n@;Xky~SFLNcqBa1PEz3|4VBL)r|=440C zoqU_r;6ZD_V-MraQ`&K|mA!DG_Eoq8Rs#%)5Ffn?co9$^K83nv%n;gb+H@nSnGX!r zoz3QNPrM8ZF(gk3gGBB@0Djs;T<A<%dN;(%j;BQOn=Nn}fm0kZq)@YU)=!rx#rP$@ zvnypH7fD@ebNA(fFo?2m-$_wlQzI-TI>teq-JbLP_4T3ny38Hfm_<(uDJUnk^b9Ym z8Q+gooXUT@&n0O;+5VBC0AKEqnKGZ{1A{&g#bRowz=0p7o`gcSjdN(i&B^H#PQuXK z*nDTi1P2*8afZg~aVCPjB#RlIK~&Y@6Dhb+oX`<__~@~WoM*M_f^)oBNCI~`^?^Nv zu#Nx@B_(@*yWlY7J7r_Sj5iDX7SN%Cguer=U@J&sb?TK{#x0*+Tx5}yd`A2`)b~7! zixZm}3VbV5Y&T=KaqszlJ8a^})n6bgFpy3LwiWq{ttxt?T>Ut*;c_b|C}b9|80VPn zF;1lXTZ3aIvEWQioEG4U3TrrU-j?^8q&7w51XB8?Gwm~p_SzI|M@YctF)YfyIw$F7 z*`3`bDXQ-CmaqMfEBtLyiHT|sGu6Xcfq{DfJP<u(QwD|R*ROj_@fZ)sF(Xz5o>ISI zZ@}&t_ROrTLKck1Rz3S`0mVkeCEVa=L5vA~;9Gh}S4Wo99D%dhv+>s?_zkcZfgP|I zxkfjV#;dDU1ZI#p!$1)KX=ZD}W3u-{3}(SRqBm*lZ&nmC0dmZ1&w0(iZW#kIKex10 z)7|aUMQhK4_YKR`Ip5!W%t^00j#5y_FT1@eNr}7nj`Y*Ry{t06Suwl*m^ld%Do@^H z(KKhFoMaAh0E?6Q+`j?&AH{gUy%1?W_U+DUV2m=$5p31_5nB%E8yXhE4*qpQZ%4Os zfqARF`42RB))P{et=V8{;$#bx6p=1Z1Ye*>w6(fWC*9J~@o<`U7(9X?3l3)L7Q?y# zZPah9%jq9%@FHy8^4HeqM4;e3B|4)l?>9_L;Y3b|QncnQ6V^O7gw$WJSl||F6WUmk z4*2jZ+oejpI=jK{ZDxU~0W6!f4;bOI#hO7bxpLU1J%d^%{6R7!bJocR@Fxk&Ip}?F zjxa!QvchDL-m9M%G_*D4+^6rZ>R-4{!Z@|L51C0+9F)=Oi{53C9PziJm$>$56~wzq z@KavN(AoFwxvi#88E0kBK5TyVP0h(KvI!v#!2)S&9{DW)8Mj84&+r4T8Zg5FA`yf| z85=uvh#xm@T!Whmc^rgq48tU`ixET3mHFa1d`P@DG_hK4sh8e9h7jO@9pq3fc4|!C zev7$Y#YV^;&@QP*jt|;O9^vs;N*=sJF7*qDRcxD5N^q@yfdlVQM^5o_A=K5_tf2-u ztLkfF!%D96*ISb4ozm9M20)E0y0rB4s=huVgX=0&PxB@9yquiKk8Zc#)Q&yTwY0Gb z$F79<z=oLOf&bG2;P>J2%8^7#4Ce)T3<b=!BlMSv5$Fo0Mfo7kJL7RTUaGQ2QBYFL zejjBaaP-amUWx6Vg@X;N!qhraZ4o`$xssP{)ybHjZ+tCr9QY^r0Rt-=Z}4zay~t~+ z_jQxN5SjhWCC+M`RTyZso3itrZ6QH94rq#dm37D(xEs(t!q0G)(9!F=AHmXg>r>-3 zQ{Au~MV)l?^pwXt*y1Z!Gv<fpE-(-X+1qhW<IT_MaG|5jKmoKUSSPTWa3>?>u8Ct@ z4Ykx!QL<RIh^c-(&0%4PaZ`_~8+q1;<(HW>0!kQ?m8>6An%meYYswtK9Mb6i%UNhn zGU{m}XE_o<GOrvI;IMui7ndHxAs~;OAtK}nYXFK6XhVsTNOTjG-WNB(W5hSqhh`|q z_uf-G!j=RUyk-3Tis$;bUKh7Q7npt%jz9Y?(XVLW)BOlebRNT#IESOaB<VW~hC>u4 z4URhx5nI8RXkwGd<$v>5c!??G3Zwk|=&-eE_dy}Uc-vQdY4_VlC<vUnx1l83eQV;M z{f0DFRL_L4gZ56yhJRs%JnP6HWyj&NPj&3?KBO9S)OIz*Jszeqd-bH>Qx3cwn!>K> zux@U~u+bVC8D4)j;hzUQm4lu8q=<Aod&xJXzRHLFQ*qf}#sILik93zZAlHWrc8B|c zv7SQpC&u4nv6)6wJ)qSfQ{_XMaF`uMBpoiO(5T7~9j50i%|@A>wh(6zrpO6b+kX5q z`E#X#jhtzFW@ekW!gnYJ2`4$GRYCgUGa#j-)(yD;zo1F<^@|rDFZ!x8bo^{@Z(j4f z5$fINRs{e6yU`HVn<>G$jJ6xr*3TTppDX%ycXVWb_dkt?2-p>`p6!HdiTsHWqf*bv z$x>VN1+$Wl@Z@O!cR_>7%cU?Ba%6Ff9O;f6h(yO_-uJBr3W){ke$;u!s$6^DV8_1c zhJ9Q=bSlj-Lu#>URMwdb6(ERXV-aS30#p&F``zb-(c%Qx<Fx(s${KgiMOTg&&}hGV z%fiehTQs&a;aS3-sICzLRbmTMdl(gCF39s#HPKto>Z#&f#wB)7sQtj0oqgMHH{JuX z5j??u(_v!4j*T^t-DynnRrr~FY})JMWPPi=f&x|~Bt_5*o7vm@@AC052Y8r-btuEQ z5$Sncv?NVBzUT+zxv>q{WVO40s|F>R<Wd{6vgdu#*?~Dn4WkWlwBnDQe7oz%{g6Wn zGqmVkYbTW4u)s1BRUZFE#LNKRG&%>#Ml35K!r-#ib<CV1(mXFFf8P^onV}HA^zbPE z#|@A6t;7@modbg@<=O64{<MEWEZixyKvV_9qjKjtjCY$35J&P~zxYyznlAg&B(M{? z6>wNU4}uN@JUl!d5gST>UrLM5(&>xpi^zY*G7a_PBg!b^u<NzQi;C(f9;%wol)Q~* zlkH%k^!67QHGWNv_$7T1b0B5S59*rF-cTLDEw208D9j(YFgyEi<h!eO9~Z+o1kURF zR;-2Vt|A$1PvJspqIbg^V{w&`DFj16DtkA2D#pZH-!~vU#Bh&>EAK<N@9tkeK4#mh z|FQ|J#@&_O=pn)>QY6zwWFKDdtx(@2eK)*R48Fh4Z%s^X4>sO0`6@Q)n-i&&+~d}6 zgrLD_&|J46Ex3mxAk>~{^6~jSGb6&8EI>JJ&;yfH@t{=RA7vz(z}}LIa8%4&gEKSg zxH~XJR*q+#_iY?;-n&NfdwSY<wxIw{H8~-f>b`w4S7gqO_=dS>sumx9YCmpvHNXEx z!E5{CG!h@CLLTg^pvW|wbE_}f2Ja1i6qg{Du{C8Fo3RoUdbu2*7sd(KCglLSwqPD! zX55}zw|07a`*dt~`se26T~swr%uk4+g!>$a{A!1LY{1TOQxUM3U@cJ<TO;s}Oivl% zZ;1>d4?N#WUJlnx7Ua|@`R<>5I5el{`$-hX|N1DUPx=Ab(-(EP+0`Yv1@EbEEmKAf zc7N`)G`qZ6y`P8*sH`h1EzSI#92&yyBiACS4nbkCX7cL+l{?>v#@Uo2Rs8Vh9%XIu zv7l{ErCK>ZZRPC0Y^&JIbT_++ZOn%?<>x=o)t|TB5W+yb&qiHYd5G{3HY`gn_n2E; z%<TYri|CIISj_oy!j^)iH*P^^jjS$C+Dy#jf>)X<bqeyY;3$PIu2)0NC+@yC>^{HH z(eadTr@*Rsg0kcfjD-lX>@2fc&Naw5Tr66QolC!1pDIRWnduS>m!p$Yamv_-xRv{m zw_!Uzth0JF{cFJ~UP&g2+ux&-F~FTYckZID2aV72Od0F0fXL5KRfc7RW!Q#w%K=V7 zOdm0S2b3hPwf^0md5}d&l-i>(Iet`2*MztjNlCI+d3kxvqGw~@)QwmlxbApWM4R?z zXk1sCV!L}~<H>R^PA<=>zYzKiJ*dBQjVPrg*4#Zf35kA3N(jG};^v>m;&SKWgrbgf z*Z{KMzc0O2_TemY4?rT<e{H(v>8WS6JhyZ{@)aJVaqH)?Sp#vmkk1O)I*k7d(_ryv z<d$(&P9E^U{0SK#LMjRIDzZ7yIQ0cz81>5xgw=tNc_K%fm6J0JMn8x1wXIg~kBk4T zZRB-e<8w5-*>k@3vXqd|HGa3^?~-SuadC+~nuzd*uM^=-o>OC4a}ikqvQ%i#yc<r# zdw|I@mj);Ce*rz1%Gl;SRrDPj8`~AmR*=esO#Q=opWeu|0Z2u>>~K;UV-r{P<>57R z6zD8vbSs9ap9D1Y>Jfy5n5xcQ_PC*V?22%L^}n%c!-n0WFYP{uQL~(8p*TTZHmNe; zD)vmnHFPH&1AtoglN~a8zijHMR|I|tzam6Lv-8Tl;bsPM7KwnKp13B?u*gQApGs?F zYQ|X`YjLhu>nNSF*_rFa=$`z!@@C`Bm{giDsy$ma8(H4>io<3A+hg{_@Wm{~8TY(= zLu+d)X1m~p4c~vnl3-kDv^m5`C}eCBsaRF*^Ix|^*I*WBN!BQL`K3hfaSpH+(CNl4 zpA|fIqV|EoqeO<U9UUjPH~Uj`<AR%lR0~WZ@S-GX3hf=$BzMd0aEI^*s@p2WnB%a3 z(mao_L4)BE7kS>>RG;0*YoD$4Y&3OO41AI#pHE`k`d#ufH>TdA`g6_x({D*Bvj}c{ zrGoKm!xzQj8lqawuG@hU>Z~|9>~li-LX^q$QCd#!B~Hoo^v%MrzG#2{-evZ~LH5Mz z$TiLM_K65zD$<@1iNCYij!S-}GbIViau%X_rHPv1H`Bz@0ZUZZR1;Ti&)D1z!MONo zOW=8dd~C9vTsz1;$O*u!(7iX|f!FD|&HOCC2t-IAB}~@OPZE~c<13RpK1_E&M-x!+ z%LYR8${Wl7V{8!Mjyr&(AOg6dJN(1NFlJS&v1GHv`-WFnmNWWm=fnD&I_b#o4<nb# zMz_<4osO<wo)wq`%hQk8_=jHcBQ@Ca`B~eJ?-|x^p+)22;Q{bRzn3zl+8u&7d3pH+ z39m=uGo?`(28B?l@r2F9qt2swOMN+SJ8!dewu~mEH@oOs=s{F%Xut6i?+m}1MypPj z7|-iF6G-1h4irrIvz?jj;@%{xB!IdbQ&knQ+y*SUi+VVkiaT`IkE+INjJ#o&)DKfj zO?q1rhUpqmi=v`ZaVDiWIuZZ_3ksR=3?W~q34a&86-Mr?`G{$IV|J4`un;+C{1VQc zfnUQzdN_LwZ_J26I4PUL8PzbZ^l~v=g_W6AjOc#Gpibku0kqM7F00}N!ufUm=MSh$ zuP#1n-h~rx0=IZ5r@`lszef1jM07=n7vliwm03}h&>2E#1$3GjqzqhGz{p+2PC)RB z=MU#12zVjOGL0YT-&WH8pxbKK>esfJiH?iC7<M6zLR+}SOrLAidVXP{i_Q|owEOei zq?9{aU%%$%YP8<SfBg8#!)P0cokQc}VNCjG(|rb&%+@ms`;N@FlZq~R^t#bt0(rGk z9?BOo)ovURfrVs;)JAP^&s@H^=U)?JOW7|$^gXiX*XEgK4Mu{Q<a2D5xQ%QuN~%72 za|1L5Z@~7!^i7>4Ob<g-E=eCao%cZG*pcr-0}B03?&aHD0bZ7(Xe*Tqy71`H<J>oU z-(-wk(EuOU>ZxF5FwL6ZCe&u}hX42Y^pP(7%Zq&pDnHgnVp4gSoYPN*O>;bbo5u-2 z4I?@Z4>-sj6!Uji6VBQiy!`!v$x-R%?S+Mn+W75Hjl5-FwA3Z?hpUNI);Wv_eRfB@ z3ISP>9V#0g15~oTI3}Ib<?vUCvO5Y*DV0zc{r6;f*jQE2;UqzIj{0F4Q~WDcd4VVM zRt^rSXmWsaZYb5x%&2{Gz63g>WXoiHDuomtDB@%iJKOk97hu5HN$ia1rBPT%fIns+ zB4dNd!6ibqptdAnr9q!iGbLM;Vc>+0Z$0))mqc`>?bB)Ia_qX8WK{(2B!tu4s#`pA zIq2f8n!E_XM7!#M2x+W)#))S3zcsHVZz`4h*S0GvUF1JT^Nd?s5f^rXxjhPLS!K^Q zg~YEL_|P|~oKB_Zxe#;4BdV)QE1$Tq68#+S&x}d9QA8S0Yq*+JYCl7reZyLaGB5Rd zV41c`=oB)V1`Z!n`t#{dg1E>18UL9N8}kt+Jalsz7`)%SJqb_;p;a$?>s$Vmv|U5` z!r<yyqRIOqKo|qH4;#_R0)K%F@*B%6B~9$tAKia=h?`TTU-ropyQ1Pvij1Y}GMQ_l zQ9j4aL)@Q=?Swz*;tfqs)0esxZ20Nf*?eJPVJm;(okL0^tm7;Y0KxBd>V1DpOC&_? zhw11Pp)iIn6j+rr!e_&|`jtuVbO_5We5_u8mgflKvtIL@jePjzr~=GIHKnD1!>`XX zJq?!*taD|Jc@vjF+3%QgD@cIsoxz7g^0_kX!R)z$gmf|9WSbR~yUgwvSRdfj&YkB6 zkP%rb8VgeT%lh#X&raYPV#ibZ?^*quI)O*mdZy^OZb8Dr4|zFzH~ZC!-?8KG6z*OC zFn7DEVRhu&v8Rf*BmraMKcILjE)?m@$k4-y)~#YK`ega`P}BCWTIsbpGRpqTZI_7~ zG+lh0e=7U?`8R&WRG;t3F%2LqlkoDhZ_g{O<AH%E8ilNNWLWL0farAyciTiCQfhf= z@J-0@;IU`)fA+;%e=Z5Xc{BC*)aLE4YG?ZT0tAcOf024QuS@j?KieF!A`gx}gs0W_ zzjYTX975P>SmbyMZaol$=bQ$2L%?p<oG1x57HYj@VcP*ZyD=(KVT!o47cWl2VgRoc zi<Fcxskq5Mm@%X_C$)@yHie?hKCp_$I`i_r=cij)H4RwdJ7sApqT-A90I^*4Uj>Bk z7={qH0fNVl0?T-fP)?ML8Tp-X`|C!@)2WzNRKjy2#y0W~%$82=A~Q@JXBB5lkeo(E zO{3wR`<SeS{-Vmo1g*8+)yxH4tv6{I6kRx=5QLq90dGxm&!uBu1z%`$h<Z%VYcD&0 z)uN%Gi2e11x;JI~9juN>Aib!l^r^nZ`h0CgT!+-~MEIJf+V|L-J1nxwYTni|P*!`` z*ra1P@&989#YO!DQ@PCzo4QMuj^z{1n>K(paca_M%<-=urD|($&+}V%$660qou7Xp zE))s~#AV-s2F|(oc!myFh#k%`pDx)6-)@?8<StmBHhoBMV<kw52>>9cfY=&Cs(R|q zr-D`1#yPjO`nRRx$msb-YNgK!hCC}fvE&{z9a@*(Pi&AV8V16R`+*$dCS=-YW@ZvD z*tQ#@ZsSx?=pzD~l7Zp=^XH7vkt1oV1=bS)wWm%|x+y~U6X+)^D_e}{NF0-BdcS5d zyBz6`qRq}TKgqFwo%zB(QLp)u(3#jTC&vcmPx5=f3)hijM}n)WFk`|TGx=IO;h95% zazS02lau>E--l_Tx8wg&7u+w3-h1jO<N?;Qc*_s#^pWpH-~ur~-l|p&Jt&-J6!z5l zYGH1!nO0AVWjvN~Cg)fKHCGQe52shZce6FB9c$AkBP-WFVt$L)N6XA-sw@Al#QLOQ zjwD@%ig413|McqEy~?jNL!W%#PE*mnB^49n&3c%rmm|YBtM^t^o`^44FTgy7gnAzz z0=G5x{&N}wU0^*GktmE-wz`A7rT?OtrXLS5Vh17RXNp$BPI`Mbu}SVuio3uazXe7X zjP38QObKl#j`%s}zRiP~#~kbhRL&{7$f!}*IvRU-Ibe&ed)GhbaK)#lS~Gqi$Yix^ z%7oc_vu)wawIkhN42U-gnQRca)glZ_8F)7|uRtzo030%S{@TgJbdQ-6J~pq7x!OR9 zX%w#Ph7@7CV%z_d=TwtOzXg=LXt*Id@8Fwd%Jk)BTA=RMqSMP6ED8C)`;+TP;DE*E zZ1F=P^zw1N7xBUr6B_Hy<sNmP3*xv+<Kq)>2oNQ3+L{)*uWvY*@IpDJt*t{F|3l&P z!>136UL5|LtmL9BfGy&B{MQ3^jgsm{a&i`8g^z#R+c*rVZ!fUz7%*jo36@De=T~;Y zYS>ho%F+IEctV=iXS9|_<HK3Y)kP8%0G?!&saoab=Tkd}J$c(9{0mZyq~QCHOdd8@ zl&<k^U@51r_P_&7Bp#!DT|>jvB5ZVKrkOBAK){Xc@QuY(>C>#NLB#M!c+(Fd*=IDo zykzFrua5{IcPL+FMKc~6C-wx)JQ?HmS{iG9<aqLyYI6KFK}~VLl2DV)aX}OR;wL8C zVz-2L>SiYS_4h7Q(7TNAtK;QCw<uKS#Jy4A3WqlNHrJ}(a&IlZGq!DAs?U9WeG*F@ z<}eTpfS?aqsSmOT(gv-~5qkPYoOxwUOrEosXPpA|(k!)okC=?GGyKZ!SVE258&#zv z)dkvFwcZxH8*|RSyKo`rIDOR(SE`6uI_9HC@9AARux-RmY@SFZl#Nb)l@*}b)Gg{s z5n||r38%<>?1Zgahi%tsai&L)t3SKdAJsnxVWWg&|1NkCUuvs9eE}ES!L;2diG%lF z)A7~K+ymzQ$7Q8fWK?g&Fr^&t0A4poKh#N8Xsth*2I<6?FK14d;EOoDd;V&);75iv z&0_&U`kaij0#&A0cT7y%zf-utwl^^;NiX8QS(;9gu*mfve6#PfpRNQbD__ygkXas2 zUy)h@hPD~SxP2G0NN3~0_5Xt!^AFe|2VJH(Ccfz-vlNfN!rUef>CPx8KwreYy+1)> z0uMlx4B`S$f>?UKIe8ss&iQY$<P=m?cMW+=Tw6|1QdR-5CHlzVf<rhnBK}LCwVJn@ zul7oB-+wrLm=jaOw7KQ=z}9EeuU}vMJykZOInnm4F-wq+FY5diM2AChjDi9~L&JM= zA}X(WLCh2W?bL@dc&B!N5O)N6e59A}?2F~a#p=q++vo{1&>@1?`11sE3UXPwS!~az zJj|o+zQ4IC_w&cE{vUTeE|9p(%Ic|dmI+a3XgBPkr}x&)d~Mps87CoWeJ|p(?=2!* zTTB14qJmCPB;BxK={~um&*_YE8`X&1eMt7|LmRc8o?%1zrI%H+?ECixFK~eKET90i z1zsHZTctl_Iv{x=M9{ac*kILG5zVHb|B;%xfm_!j)??Uk;}!t=1$Fi9sK}icKZX8- zturuqz;@3{TlJEuiHXi3(!);UR1`u&@9b<XGG#yLcz7sPR$9$1zTUbnU1bxt;=lBv z`2bgc9(6z7ZQ=mg^PT%WCZ_%QybkWW9;AmlXvyfn;tpda-VJaV$EE!fXpB8?RaeU; zdX2{FKQ~~dA3i`arCW`m>%&YreW1)O&9vc0-ilH)&yDDP4hPs?i&rlyi0&>u^6xTp z@B4gr$2rN?zd;{LN>mEs%~*4cP>`AxuxW$A8*0m|h?w!6FzAQb`3{CTghLQAVhxRh z>C&)2)oQ6ren!F!k(*jri1g%7Ykwy=czMTwd8DMKl3)`B%I82gCn+Vx^SFZloHJwd zIkm+#t4G4k85;v_)$VRe2bzS1--&tLU-_<CIX?by{F(zNd+VQU#$%QKRv~R?C|B>_ z;nKN8OL0Ex0lD7-pJDpjVvD_<ex0PwJjT13+8IBc_F1^Ap^JVX2m!$ns6Bbk0yyFI z-Pe|Mw@VXd=avQ{gBc*<-fx-m2x;Y}@hYt5LqQQ>5qLfvzovC)l28jYIAPw<-?~VY z`AYuVQ*+L~-+w(~y4fu$FOL$u$D*U4hzL!C))zra(Ws6?{!9Af9y2Mup962Eq<9^i zinVg{NM(^o=n}HYp84|$$Elao5hA-|>=_xKbA>r*iOK^!lu>JO_F1Ll3z;#uuEpM% zbr&a`>Sb6#Fv5OB%{9?@55S|Oqy(BA1?lK$euWD*orN>a#4?)<NO*A2jMybnI}5k+ zamb8bBA@<TGf3f!Dk|{a9Dy2SW0N=L^f)Xq@LRmQl79fCmjCv8|H2){jhko>f!Nz? zBw81fK18due{ufL<@BQ_Pm$jDZ=n1hwd)C&$jP-<ktGqJFc!H~Cbq-&@qNP{=R;5T zIjuk6)}Wvnt3(cdD9ASKla%+nySf@Sm;2R?-5F5&Ls^^1Q~)~@l>4vq^P>rm36NC0 z(Er(k8XDj{L~!y!0?|QEHIB*QOwQoqF!^k3&IF|5i9uJ-(qyOX`SUxmDTBLqK|y#P zLNw82gtFIE#QSuHIAHSBaH8n+>J&J3pur+nUz7}Tcd6|`7h;lCd-7~|N|tS5aWRF_ z<<BSn{HYr~`99Tb;E!U!zdM#JE#Hvry;mUQ<2}E6{{*SN!H}f&NcTsJIU}F9N0XK6 zR~KTMPU@n(>HFwweJ_d-?i08h;2#yf{%q{EwGqXF5DBG>{czG%2#jTX|AFPB^bgy* zs%SRWYodNi>0(?|{D+W`y7|G`oGPjW_8s=7Ep`ZFJON$F<{$5uO<2%?JSHW?r-x3p zmX~|Fx;ZTmR24OuMmusklaR!joBzozWPA0VYV%L4LU-`Hj8)Heo@0K#v(`8GIm!d( zhn~+?o2x_dhFSTzQuHI7hZNec*Kw3wCY2cFDpyaG2-Qpje?{E#s|qbR*AaaJAY`BA z{Z>;}W`_J$$mVA@q8E{tVE!W*kEU1n^u1`hg#I~_pQ*_?nT0XE6$Vu?&FaH3sz-aj zeogHxUG3LMlcMbT1hI{crt5{f7iMS8$<=WH*FA*f7J|P;^dKw(-}?I>K;S~iGr1?% zhMN;{6ve`E<Hij_KL(TnVI8^9%l^y~G5(XlS-!m#Q$az&kn`KG^a<dTFy-+2hI)R^ zfRX<+N4KJqqO!fM@N#^yc-(AT?H(0Fvm`4!S=V5;`Fh<uQ_s`ONsKk9xji$v?aRHt z%*?)<KR70%m1@|cx3uEp^Bl(1INLL-+&yV|DF?+RBob8Pd3<OgZFyA05&87@(|8_B zg<<{_ox?Fc`e`E<t77+plKYx(#1m}^*8g!sN#~Zr|86aDoP5kzXvIW95jj$C(c<SK zIdF6*IXO8)>GpX5^|f<fh6pwQBEz?~)Bpmm+SoOgZ?0du#va(La<n_x&-a^RvfPiK z&g}zLPn!f-^rnCPYh%kDeEUvXG0S3wURhjwV*{<Evs{P6=UG1W$==3+AKC|)nP}Hn zo9Ez#I`0d2#q6`O@~VmLC9%SOcX8uB<I0BnhCDQTISQ|+Y4{pS1eZ%xn`|x7^!ZMx zB80sHVXdD5Mk9e!c$E&NNZQ&|Fl(Yl?rG216=eE`Bf@Q_bm0)(szf{wBGBnWQ7zM> zpY=Vzqu|n<@18YJ$xx4(T9-#!+ZG84$Gqk~Ut5~guU%;N_}<=r-MOM3PMF;7)=k36 zXWR8Y6vA-pbpVa?(9V7D=(wn+cBrt|9ff%9A_0U?1Y+>Vs27KA2I>c9F|jTSy&PEm z2{X`>qfdNio>yE@w60fW{tu&JQwHdFZ@vqyv=>#CPP44c4}X{R=#`ycwRp^VIzROW zV9w#uF->hv78OATQSad}v+k=8M_Yf^B=S~NTOVD%$H84zCVGOhDs|`1gb#up#%b-8 zy)CzT|FqsqZ>ww1kagaYFyGv)tF86=70z217BR9i+N4cS+TPGWyV~-=>Pur1g3=*+ zMZ)gtK)Cd9q=Te$E7`DoO51Rf`~PVHhNefqCi*PXjx?wVjVpzyAC5?Sat<K(oXL<n zUU)oF@T3%b&M{qRy-!q5{f|9YmO7SPm=&XPnU(r-4A~Wg^h_}S1PD}mvY(WA#=_4X zE53^$P;%*&?88AB4Vt)fpJD}KjM#Sl^Upr7Y0+_>P`iA?`zq;{KJLP4tE(<jsXhO- z5q8#HJhW$zhMV=rtA~8^G9nP$OPBHH-{~P)Wj)%y>&^VeT6g5KuBU2->iUR3?{lY* z*xIT~37J70{?>+cKn)RH`9nL=YmE+7G4}P;x6)n>-y&gnffXGMp<6Hz{u&ypLPqp8 zDkR}QMr$0;4MtcrRuP}ieb=o5Ovmk&rMWp%B&Hy0N`Rl=x$RPZ-->Y!S`xGN_(p^s zXjQoJRp{&F>L!CR`@^A`fbP;YA`e22=~HcYFa$w#0;Z4iQQ@JJWh|LBWWq(52VkDQ z*24n<(Y+81Hxv;+7l*4g<q&3jzvn;cU{n<4e{#FKaS6j1AgLQR*ag^L`J#1prhJ*F z-+S0VChgpL+wIxlAFQm$qPKGC7)Gb7g0nb_n!bF=c6A%MeP`D$clUEUnUj*VgM*Wt zoz5QV_7D<2az(Qeaj_*I|K()#ys7TzH^)dfu+()$LM`FyyNc(pD`mQRd)W7rfofM* zNni!+aKm%{4_oK<pDp>cg)`3Pvx`sp#^WXr*zt{vX}HR8e{zk=7QTAMX4g;6|G$)* zpwWWwGcd792V-(Mt^f8tgp*$;RT{V&_Q)FJ)kW+bT(9TexfXqrq{67u0Mg|ETy+~$ z4gmrOm_<$(1lp;p>QePU*;V|Uao5t)VrOSdz@H0Fqol=BQWh&~-<_;SnvNIYf%qN8 z_VU#~2Te@WdcD}z5dgs(WlB%+DM~|Qg;BK9QJtJ3KmW(ty4I1SK{~7g9OWc?_pYEx ziHOR-AiY8HKytq0OcaSo6#Lnb`ySh~nTOq_=;z8hpsXT#9Z`aVkbyy1I|i}mSpFSv zBUGD6rz3o3TwEUposP>M*Qd;`85VA2RW|Nl5F<a~AL6brZftDKx}2B&v{w>E@z&OM zaH*MS`0~mFI726RM`!2DmK&EIq&pmNIa6k=E^oO9C*#E>Rp()M$CFTsg=B~5%Tsw4 zncSaO?2KcQbD<5Ldd<=xDVf^Vx#V!8a`S+-;E~YXF%JGw+l4o%+i=9&QGiBqY1a_u z{rfG{Id}f8UR}8RR{Nfa;0yi2`|~6WzXVK7f_Uv1AJ@|g3&=`y%(y749lAX6^Q?QC zUEGTQpVP-&T=rDu6HQNLj8kRf9*9E%``%PVE@f-+Lr7Ry0ZJg~A;4}hp(v}<JDQv3 z|L1D{pW+O|1zaY>zXtADj9IEbWl-qxY^?$qrQOM?)Tk6u?XGu`7J68KYQ5jK5Zu*s z9Jl=lbu={#*Q3DxES3VYcj&eFd9AuDf0*s`9QlO{FaH!|^6=cdm)+d_!0F@OeT*kY z#IJw-=C{JfPfq^d{l>Df<NCAv;`H=$XLzm^rCvCvgEZ9BrlyrM0--aYIm_3}W}FSZ z68sov;`?b_qxhoO2^YVRX!N&VmtNYv?Oyf$4B6TULcw+W=MMPkq_;s0c^04c>eZ83 zrSk{c+S*WmipX0(8lua~u3JG#sUhJ(0J0CY5)*wVT2ohQVrO=Jo9>XZtDxpGocrq+ z`toI+=!xxXNBV<4J!(2Y55~%TJV!t4jjz|NvXc6f`3;w5ljW{Y-ety)!_%>gq<YpB zk08ZI!0wpPxxe%Cukzhqxn6~wyXAqjT1}$l;}6BEl-+w1uImjvxyWMmGb@#k|Isdc zd)h~K39e%08oI%;Nz9ovJhQIX+0?ux3vN#QX%z(QL`C07ldiMhtouU7=>4uMKaWzM z?Q0A4{_d5qzLw2M`>QlBuVs~NuzR|WLPlAM)_=q4SaZV5>^F{I`@`$LUyq*QWbj!z zd+h({ze)&lYX$B{1u&V^QI~f{lspkX_36}Zl090NjpP-6Rxj8AnB7G}j(#Y=s)ltk zGP20%czH$ZPz|BThrbSkU;=PgoVkhiR}8fB%Pgei1niI5`(XdtQIq5pe%C-p;|Fv) zJ{ITCKfWNJ)89^WCtw!2|3!VqOa~6;%rA{zXltuGeWd0V^_4SY6BCL);~YwMwke@g zF9ywO=;>qQBq!XqBu0mZ?y1vhBW$9nkvEUyY~(b+__uFw^jW^K-%I+6MJrm-qj`k? zJUT^)8oi@pdAHjCdkm6azuq0KWXW=O^bXV*zP^Ts`=Ap-&%CkM2sNTrkUFMLbWzJe z!|_0JspH-K&hMQv5f8}ey}gTu7On4Ro!w+J(J`snqksHJJ!9J2`I^pEDn6sfCK1Wp zgv935`BQpV3=Z@!7*;Peo2-kTPCiYDTGLIo!=P!8q$yvnbff48{mOn>DM`~F+|q64 z<@_uAHQA}|JrnyJwBh^3%-otkr-6)*|Fo|zQzT!xzhvM<`$BSh`pJT-py1++w+AX3 zlxz(R*^Md^4;B<?dwYI68RevI&V1|8q0+PUKfc-cCOm6v+f7aV^3QbQ(wAMdA_C^N zL6=oNygc>K_;`oLm9Q;{LWd$mM%Ud!dRX2q88qFfXiKm^7XisaMn=TIfa(2YMu7(E zqYLXXDAl{0{f!Up(h;mp>uc*P8z09YPcix{>7P-AF`=`#lPa3(W$bY95h_|a=t@vL z5$^3z3<aSpd--o^bDoBtpuoJ=vo!O5!c=#fL0-@)O4H7a>FM2S4eN=DwgE}y3>B3! zH6K1Wb(O_GC)xYm+4=+B>{^cb@aI|=i$~of%(Al84B|DP*Sw>4sozv^n6bW1|Iyp^ zvD@|dj&}_fAL8i)$VhSj8>%Uukfg|kRw)IGHa~3E@kI&{x?T}aeTZn(EDj(K)83;l zy|7rC_30!G>Ov3?0+BsW1&hQ&4ZXwca>e#D+2BJ)fA!kP+DdhnkJY}eePcyeX|tC( zKP>2gzu#8-aZ<66!leq@<BN$d&sE7RVjivFm4)_0&i)ildG~6_6!?uqza@QCEMH2~ zE}cskSpiG0uRZ7Yf6%h{U10-*Zh3*@j~YjaSoxIlMDevX(a}+*^K!eJ`ueQc_OH84 zPyarBge9h-T(M%yZA*wfq(!;A3aaFSx16P6Vc#Miv{EptD_F6MMzQks*4BoKdp)|H zVNje=7!$o~*E=-+E)2>aZ)l`T)D*VmxBT>pR4uK|Rzy&)y4YpIMV<GFUs>JH4CeH_ zg*bm{Cgpf|B>vgh^(H+_7D#JS-W{knoL4#qLJduGY<nKnK4d;|^q6oY!;_3x*y=&d zEd`V_UcRq1`>yCGRC)(TeWS=^+B1xZ?rOk_?HdUQ)-OB+`|dxeqvezO>Jc9HCo^pz z39g30_4m&i4d&+`{{CB+@$R>AUeFN{5gz_i1r`1<IF)>$yLX>8VA=kVsOZaz#Z|JT zBsq7FJeiD|>B>EcyqsnuzfN+Iker>FEFJtv`9gxd?zhK8i^gq(E1oH-G+BKNi^j$f z4t+9pDR#mI$BFZ+;vE|w@%2!{?7G#l+f6Lx4)6jHVSUYwsaXLsw%d(d+cFTT9AXre zn3=#ipCHBuGIY`d`LBZWM$%*$hfEb!@cN;JcdL1%lgB^iet#eDkYRA<H2LFM%I@cU zRAPcN{;2ngjENyCi;#@}v|v*q%mM9fT{rXVzF1I3?h>1NN77BSo!j2Sqz2tR0fxbB zPXt#wJI}ugooOXYC3rp?2g<HY59?={(>%h54rON~MVT{9C+s7K$uvBM=Fk59wvF|% zMIO@I3Az	OUG+WqFh{ubAE+BSWLFMNnX*xT0-;OKa6=gA#X8&^Hkw3W%9y>ScFT zX^9K$&o@-FS0P<frnKIhv)Q{~r1$slt=$im5Hs4iRLtgV`7^_)wj_T7jMpjnctC%_ z$~@OLkX2XTq(8fU-eL~&I5~L*3OWWwYkiKlllz%}AZ$izb&(QN0HH8Abft)-5&H=I zpb6|^ri<M3CPNS4@ry~do<ZCbMPxCwP5R%w{AIrREf3BL&iVbU4c=u?m@9sU>~GyZ zcN4$QQG50*1_upZG6+ve4SxCCYTkWjbe1Kj%-Sjh`FiJ`ox3HMI#l_a{Zw>xrD!eh zreWy4qH}6SZ~xdziYYm|98?Fw-qIUroORuhiDEBxqus1N6k4R0gCg1WbId*qnbbe! zEbsSQHhQg@7THm*^Z$`QC@4TB2xIrYf6Rop@7o=+BVCD0d}m!~J@$=0cwfNDgojTK z2lc2Nv^VJHQeRRTMI6Y+AN7DrOfU%gL?Ek(9iNZn=R!FqQ?v}gv=($BDDcWq-YGUV zl310R?h2poi?(RHbVQECDaoPcfGvUY@^TEFQ*mK40uk5Y8n%{f=Ol2{9Iw`E!uB1W zy)If<t3ZBLlab|SWIPj8Cs&h``!+cu|Fb57w6kkI!o2q3xa%b&)#_yLUWo5}6CcTp z;)3O+1~-k2=skI?qQcXZB;AB@CdW@45s0@tw$u#7=leo`9E#B9?D1*z%GI!N$3{<i zoJz&gE%~9lAm6!<x3UgBeC9Lc94LS70hV!A&Y-^(6C508PH~BZ!?O3)<Js7dA0rNw zYB!w6OZz@UWCSiKGJvW7x8M6N2O+2kr23@V=QR<UZ0`h(APFWWua=g@bLSlUV@%8h z_-~h_lGsFto&6{#8oT@|DXr}Bu3~Geee##7)!5Ydr1)>I9T<xbbrKL*n(9%Mzk2fM z(2!iBXjRmSXGN~=uUaQ)D+Ff~Bp&MV+)>wh1)JFuSOm;o9p$~=e6oCDe!<bzwKT=d zhZ6w+a8yEI1it5XhjCqnX-4=#G7zEer%p|7)Tr$kzcQXOHTJs$j+Oi#x0s_({mv}c zGWguPLqhJ19GRb)Mvd_B9|-)XR&np`?4m&fgykVmOD)~p%F0U3Ok6}H26p7<|BFxi z2(Jt3AP5r|bX!`Qn*2@VFVSZOBg%h_n|*J|$+_MiJ=Jsfh6D=@g|8vqno8+puNBQT zp!ezy<W4j}9Y24nl?03LiHxL@m;3f-@{1n{`CvytvCKzD%hQF{`RC*>2-sRH%6N(D z#FSU99<^)?i;$<L36{%Z%PDx0YS3)j=f+TG?7&jMmS>pg!*r0Do8{iOtF6VAouZwu zSyB%l&0Q(3WLmfY(f@~2PhiNUilK^n7Slwi@qSPKf*Nn&&p;@X{P~;Piy`T0I4#Yq z4@c=fto{A_&A0Lf4{F@pbYI;wqsfQ{?0JPjpWzEjdB4}}dH3YhJfJS7{ie}j4!Szu zkI{#>b<p15vj-tqUu>dDUi7v_Zx;5eJ-D-Lg8rE2tBhySc4KIqeUnNmLB=K7X!^^m z;173$N^&GSLWfw-o|-EO?Ec3#tY2`#Z)~khndMRFhF%&~tV$5n0*8(5JA`$)C#LGx zJM(OPC(lmL{w1(v)@7F)&SvI@2R|_KR(<{YPpqvy6E7^mfD*s`{E5PlWY|{$P=hHz z1Zd+cVy(WN^?-LM&Iy?xqbvmr3k$0gCfi7uJwarNqQmU-r%$)ggGj*Hrb0f5dV$Cr zincqb6NYu3=z@ed9SXtv=4SXKuYcw0Ka+8W9a67EJE|^-R73h{Q39f>oY|Ls-q)d& zulh-W`+XnpONZ&|KaflOE9WK@ucV|WDo7!DDkII*T$K!GW2E8vav%SDWPh7YyXNs@ zO6jR=k!Q|GI2G)-zE0xJ7dCo!b=7iqlCoG>rIET^TPYV!#+%Ql*to>Q35(cm*-U@F zNctc+F`ej#(2qAjc*y6SX&D$&GRh*zrPg*h@H$X&9QgSz(OB38#T7XI5gv0oI*P8W zMLJ@+wh4r<<tE2m8PLg6aWTEtAJsu&2Zo1+-uU=9NjmQ?@~$i5fDVK0&Yd)qvba2B z;}sA0`Ks|_lLiK?)k~N6COR%0l2Q#N(0=GwL&75ra+9y(dO#yEhS*wYJ$8_g1gHBe zcw2w3MrePr;eEtkutu38izsBKbM$1_<8wpv<I=6EVP;xwYjhJ%;`!&Ce0ryP&N`ED zz0x(*x^oJ)OgM)?oT7CgCNAz6!U*rlt;kek75>!S7~hhkQBv{&cU3*%+$ZD%|Lf;h zcCuh<Y6{saP{CeB!=_S$+|)SwoP!Cl8T>xV_WsPwpcxqj!15@LhX5DRs9zH$ZQjpB zS1%VAxDdBC!TRtT%l~WU)^Cz(_@(edC;iXm<@xPSpP7}E8S%Mo4&}asr8HMbuXznb z#Bg^WKG}4`z4g%&Pt0q@`1gvfOVi~Z6)8=BzdPCS*gdkzn#fh!d+YAG-TxGDdkyaQ zG^f8qQnPF3RDHqXdQ}Ta<3ak;o6QSzv&;iXPV{b+U6bg~q82!JGk1iEu3Rdir~KLN zS;x}uE<KMqrW}(4E52;3v@AzBMeJTV4=KczmC@zqoO+)VIVPy@m=maxq_JX<y^`zh zBgS&1o@~8@E!XpD+kxkt@=*fDTs<wFpMpuGt6Qrm0}VetX)?(4KO1Q&i#4NyIS~PL z0+IGm<4sjmG=WOeVC9-K8EZx;BvjEBW7h-(U6al40xnfr?RhnXageD!oW1wp&0=5O zg}$F>EUIgxip@!E3=H;L*|L<D9`E*&n_qnLBmpM8D**v<@KzS&m>QTfOLMS)1m~Mq zw`9olLZqwdy0Y>?&WPg2?_Rrhch)sGU*L%u`tzqAJ(ESgtNb8e^ZZpE9C+~zS6AO_ zpF&j0!B=*cmVt;vV2x_}bN$RF_s+x>fiaTJoC2Qsr34s$yN-3QG_CgkvKk8c;e1Vh zYGPst*S36o$e1kZZp`DyDxo)<FA%3YDPt+pLuB8*)7*@6jZlt@$L#`E2-MR{{QaRt z1eCY6o%Vg88Zn{LG`Yi+xw@~90b(AQ<e}S6_>1hcIv|l>hSx>1HiCK!r&t}eP6`VT zsZMjBITL#S9_uNdo#NsjCN_n6Ia0<>hzo|~7Vn9E&b!Cd^o_Y$-9hr&^rT(EpU&H& zVmklI<ohc+%S(fOZJ)FAg-&E<E_Qb(<>#2z)dZQ+)AM8*tB#GgojY{sNY9VzB)7l! zgoIv^oT9W~q7?9E^$&^oA$P3`+ztu|3WDuYi{3wdm%t6e)C#JM&0RBSAdBGFSNv7; zam4s-9XHB+AJIO)sG@yOzroX7i`k)kffel;R>AqCWG0bzyz0D<>y?D}*k7rMCfMa0 zA>Yex8b;2XKVNRM>mT<1_n||fp+h2xVkd+tw`?-n1<Wjo-?{4NPb)jyyW5PpdF#37 zuP{FlOsGvMx9_T3a%H*}HqR|5Ijf0lO&xtj-p(k)@e67mFBS@gHYgFs9meh1+KsKh z{Rq@hM@}IQ>$I?55jA29lnsYik1#N(>FUyCm9KFkYN`i9jN87D4nh#NdoEG=wa+^{ zfjf7$TKzNe53tLF9|%Schx-!&Wn;)`P{d308DR{ZjSAS_4;vTw$1fw@XPF7F6bdLG zIwWg`BBGG*1Myu;B}#u!%p|2HTjQ}XH2iXF7YRr#k*Fys=Wzb4$2&nUY|E!i-rU$& z)!+Xd-pn`v(Q!u2XkPEO{}2H}9C#xl<4v)ZNNg^)UgH>p!V?rnywURi!`6F;bJ_pz z<K1^d(UMXjvSpSnt0W;24asU)Wy|(LgKV;s6|yp;>`^Eyl$osT?2wi9J+JQ1=kxpL z_dbsMcpt}|JFnMuJ;&p5KF-ndR)t78mXeA|j&*z?S-f~lx<RypcGuZ550A@&A_+Hh zpH_Ui%)9*O&hrtw>vsgnd#c$71y7#QvJuji)~v5t+3~d8*F=TATYXT@p@&LC3J@i9 zda@<~FH;IUp{d$IRxR=y8>eq}Vd4A<^&G}ql~#P$^r-Q$p0U??`S}YO`?q6ZM-BE* zzqxg+={)MW5$t83_eyg;LIGx<Y;W=e3K=@2l+mYs&jq>`7u)~oL6Llu(ur`cQ1~wJ z3q@S*xJpq?ta3m9QpRS}e}I)Y@NLW=F8Q?vn+@|#pT6=9Cy-bXL3<odDbJrDft3yt zi0@cfTwXp+@R~@!&O*|FZB3Nh17G6K5mOu%R@U35rhYK|+OJVc{a=>o0X?U@w`+(_ zCn5m}yI2^@lQpfsPiI?kOcaO5HPBs<Khd0rgoIe&4mxnyE>XuNhlIH-1h4lBzMSOi z<OO_;6@cl}&YV))shfnP8O|F=qED8Wl$FK&`Qr%BqnfSzB;I45o%x;XJxd=lebIQr z#^VwEX(MM(zbRhDpC7NWgMkU=!#<}+ol;NLF8TN04)ME`(w-T2lG~R;O3GkP5@7tE z-TPZxt17Rx{cLIz5IviB`%lBi+U}G{Kc@NsPyjAW?#;akX47qqmhBBU#SO;ln79bJ z*Fh`y<9#@AMZbx^e8$&kV*a<qVp3dU;@2qa>nn24{pX+G4F}qCTJCo`#s!iY8wa*u z4X9sqW4rmlG|48Rn`CQk`z*EgRnBWQQNlz3r_d>>*{2utw_7}TAP_v$SGp)Ju;L#O zz%C+Ur)b^M(-ZAM@92s6M+lRbF+?GJR4dNyldM7p=bN0I7x~uWqQ5OBZ!n&Y-h1(4 zeOlcjY>o*PF*--$ZTql2!5jwkGiZD4G2Dmv19Oqt*=mMdXar6Kn!}Td2=f^+ah<DW zkCJxn<<5zYjScu}1SV(<JiHibOqr0o03j_5VkELg?*=_+v6-Kn`#e&*W81c8FJ5?K zCxcl9;x6xa)XcElvzgpV4jNk34DE|w1?Tpt>#fFlD?XjLe^ijh{nMjQd>?5?!oJ@9 zZW3j$C95YzoOS!d&sgjIemhpTF|nqg`pR?g)pb!w++T61d3t+R;4@4r@i8&wOyZo| z_Izk{?8862O~?DN4IV+|5EcBy@B$gL9CLzhul<YoE-Ldg>;gRvql#s-CEYeh-^pEa z&@arEf`VC3mc`4`OH}Fkj8lS@&`M0Iz=Gb2%hbD$We}b0C*M?mX3EX&pCtJ&FKYz_ zi+{PFVHny5jso~kh?uB}uV2(d3!6=O>*Nu_UgGyyi<^f>a8M9a&5{-&&ByE<&LK*X za(kb}#5BUbvJ+8E=wd)gaB>n?Otey@Ss}r=#Sq@{aMKHhvneciR5=b3zU^O)>@gfU zb!0buo0S#B%Oi%xlU{p!=J0!;li?tzNcdV!<`Ku3Cn#v)>ad-8&*;zCXVC()HceF~ zM<rWK`7>KPqylN5L^Ovs>54Y#_N{Tz{ww@4gv-!G?L-d0g_YIKX;!ojo?GIr`A(n| zJ5wA%5?Nm9@9S-x4mw~mF>#8<&mh5ut=C?;J2m>En<1;Wot=uvIJb~tUE@yUAixkN z0mn};?t&eIzD|FIfNGiRdZez3f_SVC34xG0E-U&dX|5$~cI64hUlttvam)Sc>G{}Y z&{_#&!D@f{bDXp)%&yZ;O+3Yu?oXe>ky`~;g3>FsDkFlzX(c655H(^f%u%xl(@_HJ zgjQ#>0o*-6T5B!R>r{}cCxhsM{20Ps0-4suKbk(^Nbf1O+xq3}*AHn~WrX7>ShRnC z9BUG2<Hp*kG~Q7Kwu|}w6?$4)n5yr;rlV|qetV*3UUt$O%F$k(x4Oa-k;^nT?{);{ zD&%qWFj3T2Sr2!wX_0%A1EFe-O-tU;l6*wFm8iNF=X9nMy@`jJeoJ;NX2+8cXW$_Y zgBBkv=U|x0WYTjvImvl=Kz(rK^t5tJgT$$3f$*IHW9PCuTH4$5IGXe`;m#3X+io%b z`NZuhc)*zK>++XS_0MftYj!Y~#gKh@xV~I4Yo)P~k#Tl>&h+)l_0+4aZEX#IL|t5{ zbLH~L$jAs<1)j(Sw$Rxpqv}shA_?bD78bXBkdt1Q?%KU$D{&iR3TTjHS^)={(O6d< zBi}{j3Ew?=gdl2xhF{gxWd0_0FFv~jqE=wQOZd+b1h3sYp6oXjvB?uTU&~&<wCd^_ zTk1sZa`)D01dx}<UFF2M>Bg5?ODe3I?%tM*S9BSkDnx(s(@hFf32zhVdO9!^0LTKO z*hc)?GLELRL+vO(!mjFbg77#rG<^BL$mMr7?^@g2a`fk^L#$X)IMkP3#eqs0c*v8Z zhw9|6%n!GIgsST>a&!A)=#0lgJvD2+b?ak26?z*1?UuJIvi5MP5OrA-1tAyKFV7{b z!Nkl8Ky9U{5>7tvh#K-X<L#Q@p>!Rag_SlDT2xWpb~Dc3#J*XsEn5=pBYgEwoVcev zC;5hUf<(;Qs=TNm$37lhXWzea_<D$mF2#-~kCKwu2rvOTE=i%kz4#+zW1C>S5-yv^ zeg_$x|8cBXq@`mQCOVo#<%obs47vjtHh&go9+3WDE<km+-KKMERECE2*hc?8mm1g2 z>2f0b0@F~LL^Yn*Bo!C!$dY~|Z|f%N(inxjYn+D&i@z6#{wy#5s+i~FUVgB@Q0Pr= z?p^h9Ug&Ef+eOUfbDWRxqDsw7Wiv9~PhNQE>ohGY24Fx+Se<8X7#;E0cWlIPb5;OK zU$;NaA46uYHKrk4d&g&Urb~fz&o$n%yZVjwp`9ZF2sYOqoXzXO3f#!;8?CL5)%rDh z@))Q&5NE1tshO~Kp*rITI#@v((e#41jG{_t5Qb7PvD^Ze@qy{$>7=5f7wa=qu~)vY zkjm|#u1&ehi8;HP57)h+H1$3ST6!3v9ofADTuN9?4$lqOUundl$Sx#gbM(61c0_`N zC=UC^=HqKReY54x_%zX-)h_8AXFrzAH(P30R_(gJSZ=@Ws-t^gB}R)Ejzyn!me`U# zRF;Yi36EqHfrJ>lCNC?CZ*widb!4`hKK6>&W6v6rg@whfrc6neN%=Fu330z$mp@sZ zzqUQJEj0hPQ#7%mYp&vvRYlu%*Ww?A?}qo*ekaEA7Lh>T5-5yWzI`WCBnHnZDvA!E zlN{Qfle}Hh_S0mfrLh@ag$Fr=S>l`(2RE;v@gEzmnGM?AJCviv+}Sjl*R-~DYxT&7 zu~U`s9C@g_wsv^!k4X8*I}x48V3MvMHVd9nr$%SR&#cHxd6BFQ2Ajg6s=mJ8zV?{< zcvN3q(ec8NoALnNWB1m7ndLrx`b5oB>cqw-vf(u4*Fk-$jJ>=)LQ1J4##pWq6llPi zNYe1h;mP3!r)n-#QkU_R6y>G%&;zeQat3i=7sW1Su@fs#8#xXTJFd_LU;L4HnH8BG zY1seXuoLJR@MhrlJfmzkDCQtMHAMTRc9R~O_5WOCDbz;C$LlDX%Cq%yBqb!cTMIAI zeX!>0C_L&X*BBCgHad|y=jax#>&4HwRoGZKswNG`;1`tTGRx(%{DeU#oV0Jxo?Q!- zYN=OKI?E#TXkS*mer#8^uy@UVe3YBV<JYev@fnw%zO%u&HRJPM)B<^fxp!Glo)-2F zDQq~-aOB93g-wU(wKbB<S^`5Zvu*X`jC%@0ns<8PS|;F_G@)a5nhcr%_>1`|Cc;Q& z=YD-nJqJr$tC7a6ZiPEC@fx{bt{5s?CarzuX)FJ`UGzBPt##eUhKgUkas#r+<4IB} zD-=w;p=_2Uti7#U&`?xTQd?f#7LK_d(#!opwRzXm4t+{hin>^G!h%Y%@BklQ)_L7Z z#Y!VVH60EAn+YRU9ij3Qudk)aBP(8z#k$?0tAn$zva*u!>W_`(^W7*qs^8_-uITf@ zU{TIECMMw_6{zbqdO7!68pF3@BjlO%Ry@DGJ6gx%>S^iDjW*YHZ`9eKMtffLy}M*u zyfUWZqG+Nt`8dPUs$<<<Nj(4A4JFME$x{yu=h$BT=V}@m>4T9gzWw<e$F}>^h4b{V zmvwvd9EVy^^8w{pu}ff&D9nnCzS{fu=#8LEbn@p8BdPe0C{6Z?&qjGM5J2<DNW5C= zw$41Ls}Vy2JFkj75A98=GI9`W*B+DRlt<!P#@q(Mc$7V%4qk8WPvaY2SFc|SLam#S zdrlNNm2MKM%Jw&w({m(`29s1mV!Y-|jg2XM>lbT-*-vnDA8f9P-Q1WL$uMcE!le)5 z;SCLqODj<)wpJl5VfvHYTiwPTy7!@y*wuZ+(?zx^+x7^BPp5c8BynnEBT?yzv$5>} zrx|88U>V@pv1OUOA-Ll5`|AZu%Ln~P`vDC3t7zCMk7H?Q9$_cg${;PF&)C*!Yh^VM z8Q>Beu0z^oXn4wzBPYkg#&Vd5LqdL^(j_(oH=)&1y>V53ELAO@DPG=J1#p8)VK^s& zwd8E`Y?f4Et6TDsb_yH_8kh(&r=ajTn$XSmkBGAwtj(}gaocR~Bvi&YRrOj%E=84F z&_4tM2)83oZ(pWUX1DuVL3l+11$b-x*i>}7Gv)O9IYB}$#?+H<%vcD=!B)NIb{BoY zNMuVW%qqyb>FRQ3LYY*)F`VUIldn)lMMZV=$dQ+?UJX4Bnu6Cds{WC8|C~CEMuw<z zF>HaO%WW~g8~J&8j}uuztNFR`$9Q_1v@RhJ+MoRo0+tXzsFrH2e5u)2j(P0pSjq4C z@Xva%9gf^5z4i<QJ=}u!kh(ydt!c56nVBk=sOl^>Vo@^N2SYN#sGn@#u@c*ru#*!L zF=GYF$&pN5Y3f-(FrfS2iTH@k`Q%MTUSa=Zr^Kt|^J}~-dm5t2rkx-DU+WrRn0jdF ziq=gfYdyhTmb-B9@hqtkZLlmgrD{>uBiwl1-97fp#`|&|>J9K*L7*EDs?Dz&Q2aAA z)R{}gFf&ve3=mzQQ&>n|ATjlw&VAM^!L^;=a|g}G+2>F2o?ydx#jSuV@T>7{Jw3OI z0U4azZjrhVZHznOl&<HPO%-XB{TWHj%cKSzGLd+_|2Zs}yk@;*&&%={Esc#0t;z*W z0leH#LsJ)b&I5K2I4<E@>oRp%P^Oz<poUpRR1jXo$l(SN@l{gN0cvXDsfI}ewQNC1 zT6|hseY)TsMz~shaE+EeS9$LD;sO**qi;K3LjGm_b3e`rI!RliaTDm2a#~Ecn8sh_ z9{3=5*r{n+vSfL)RMdP$O4ErtRF0Jtdux0KNqP&kE~v@pKQZ(^&nKxU@x?yxx$D>i zi7+a==e3Jff^+_jd#~O<G)mKm-CEPCXO;7dWmbH^%gZ}Lxa%wg=d-_m4aKc8#6$NJ zDhC*d2e8P0EJ|4uYi|4~KCs6BRKMK+##=W%K@C9gavK}qa>(%TQlxNT$n$M-%k{dO z{H#+FLPCes)jN)6-78uV?6H3_vYXaVj<AA4lG}k!myOk?`OkJS5o%N;AVzi2uhH-v z*1Vj04fQrgcCtU&TzJgKK^g$#Auu|U$C_-%ula>@5$P<qoZm-f*$Ak*X42zhUcBgI z@fm%9Tfw$?=7eOw9NvRe!<uZtJtvv(ffn%BEe2{_6n0RhJj76e(1dC8ak6_$moFJc zoiq<xjGiHRz<ux;PD_YH(Tkwog!RSgVH&nnK|i|4f;ekQ!pzsU;pQK*KV#$5FCH}D z{2%_+UrDf;aD5Z$+cI%*&pm>J8_0;;sfWSk@Rmcwj!$v1I6-2CKZN?wYM$iU?~kzu zsE!Ft48oH-5C`P&K$~k8`x5>00Fp|#iJ+gn8&^+_5KTk6P?t-Y%cPSY!(ke}muhJR zU+f<NlxV&-HWdAtnUVL=^OWbTw1sR;{OSl#aTtmtTyYrBMSm!K`e5*`)Po!j4$fN_ zKJP`XSe3qqD6AuQ&-&{T)feiv_}Z^K=O_m6-6b!4Y^s_6&#x)=GReCQOG<O5G{JWj zvqI!q28;WU2&$*|Tu6TP!vpE(*Yns1CkE?9$`<#$coB&=B^YIX(&<X<Ma~g$n?b%o zmAH#`_ZE2haSSVBm@1kz)88Odxv~SR4pRJzQ+PP|G@gF`+RZz={Mspd1$WeAsVkKs zOE7cHaq;fr4Vq*#Gf^?I{?XA35Rz>{3`WVyNaXU$iY55|RQvb8uc`6uEGR=`eyfD# z2ZH0!KI^u;fN*biVV0oH`ZxMJ)Y`&Qkilh{5fVum8V9t69(#|)Lj?iLilE?N$YBgq z($fipy!voHszZm|!HQ37n}hqLnyTufCr`El9W<CbM#~_cKvG$9GKC4#n*VazhK{Ze zNw>h_AAFB~8<pgixUWVdJ$|H~?=~dkzI-FmzB6(LI~sTzFvqu)SQm9*pLeTSQwz|g zqAaAr;F)-r@VZZF<!say4S+{7Q78$A{gM28y6MgCPjsS2=ayWroKV~RrNxQ0Xoyht zE1dn3_wvMGv4L>`HIP<CMehhwEUphoqT)0zBguzdIjVrIGv+f*xsb%4g$rV?{Sut- zygwz$F&+{qKkoWn#0FjJ*qEAN=Lqd?ghO!zhnkRg3uXy*b1Rjc;s>b5(;n3L1hX6h zKt(_EYkr<;s2J=dR3ztJ*TDRP3C*sZJCP3hh}bAEUMM1s?U!9QDE(O8Vf+`d(>@n9 zH9dXzP6)ri8d}iQspb;B)t_Gzh;4^;3oiq3z74RmpP53-K|qYyD9gaAkPai8dX=z) zhXITyqJ{vafLTp!-XD+1F!Vjn!?Op$Z%`|V_pR&&{)k1npO&G%x5vq0mYr{4Z0v-r zH@j50@k(h7cVDiJIN=?Sp&_^ipp!$4*wN-kD&2IXUv0nJ3L|*zrEiXwC9OYv5^%f) zg*=n3TJ+pL!+e~{sx)0YH_Y5+FcSB3jPK{&Sm<Bwztht*c&7WToTc*$aoscd1aS1U z+!CZY!NrGHn3T4vn2-pKV{lZ6l99#FgLo6xbAYCm?%hj`AVsQi3DNA)CC$2j(eM2D z(S5XhQ=-XbsdIv!XP~?>*46$ugJ_4vUR*Q}F6MSdI<EQKqrgacohcKYA$(DH!D8tQ zqk6VYeQRsC=A)4?gE-q(H#~x8|8lhVH5^O$3Uk^$Pzw_lN;tLv<ih%~s-@+M(Pxo2 zkAB>-8f#|l1^uF=q$H_^NP7w|<|PIWI$5!*Wf|$|zbuws=H>>6`S3glGsWN@a5-nI zDW<CwLS0ai$(}z?33WbP`Cu*l3J#B;f&*EGt07hU_>UhCzZxBE1jm88F|<|>>g5A; zbV?W*!GV;>2}48_#oVzYM?7WX-gk5$p*(GSDpz#3jcZX&KKScsZ-;R#%XHSs_-=fM zZ58UrS0g5SIQ_iwTQC}4o}6z27v^jX3p+Q9QiyrrA&<?|t{bzFo1!{JudaW!dUL+! zdrd==c8C<?-xqVyV|iTiA3PH@cK7{WG}fy#nPUmFu(MH7pWcjomsU&sUU-K2Fm(m* zy1{Vf{hx=kBf2z)VBtXQS*F2lM<b5PXtO?yOrs@Vu@~IDK6Gc|JRo%d732h@e)!di zo{UBxzOot!TPuyBFvpAuuRx#RpCqaQ#V4$oC)%}3PxU>w^i8Nscv-agZn7&sU|?Y2 z=x|r-aq}FKriMm8@^RqifYV?;XbQ}Qd7M2jYHjhHiDT>CyTNjEpzm-7DO;a1zoMym z5d&I4(f|$zfBd**dkJhOq{MX=*>GLEb`8ZYl$l6V2C!s>;QQB5hflDvvLZ7|<+8eZ zHO6&+d6r7nyUUTe3%PyCqWK65+Q&$aJ^)Y^6AgDhclMUt6NnTs6{hX)Xz8l#e_N?H zsz)qod5fALlW9m$J@))Viz4w+?mI)G5_L=sMaPR|H{qCfZ?;gK`rAi^(W@4fzj|Fn zj+^;{#|mlKUGZX+LfIwmBoh@ji@V2xqBX>yO`^R8v6swanS#MZakJWE3l~kpQIM!T z$de;*akn?T14?ZZaB=^qP)ix#93(Q~tn!W1ks{^>u(4a4m);b>TSQ@_wQ!pG6!WCx z{llVK3#~{0OCRtg2z8+R5bK`s5`#$oGt)Gx0;a$(-&*AXct`0&@`<GDvo~+PcqW&5 znFAOp6OJ9wMsnvtYIifRKtPjd-%6w1$ZwL;+#ZX`Z>O$u&L0CCnUU!JF=ikxbr_bV zKeLT_C4XmTy7ceOe(aEBa&;s{OYPE^FJIzo7WMK>dp@=EXr9R8zL25%pm2g;yGNVu zG|4kPDqYj@uBx7XE*i+le?=nvrY10@uX)1^!Z))@2o*gwuYoCnOLQOacDyd+<u!1x z0<?%%%PgQaA0~-7%tg)MRjhoakREVqBAI{Hcj8Yny6kXX%tKoIGp@<Y)x8#R{b8@4 zO#b|N1|sci+N^ZJfO6$zgAT?DvKDbzO#yDcbMgp0W>`2lJPGq{I?-Efeen5BX&cvY zT{4+8p`M&+0e(oRbKr~@fFpGaLEnW(<gPt?go4e%G(dz6o@d7O`IXVw$XZ*VK_2@U z*gyaQG@EPCK!Yg_qsgCIJ$?{CAP&auu05=pG@93CR*AnE&Zu!0i$QsU%?IXu%E@;( zH`a0A&w?GShJ}x?hf|iPy30mwb=GQqe3<&A9s4g3#WC5m>n(*k0d#WU0dF&>7_siW z*GeNKSt@C*Gd=V^ZmW@%AnFjb(K$bjVHv@vDQtebeuU@h)oa8I28SLD4V(R65yhom zzn2CrafEP1YF;lgp16+%ZuMp%-r_Upmqs^pzNzX2la>}2F$5_|39u1*{N(Yj@6@vY zDGjvBNS!5n`Bhymr7np48yzmLYTSxnvQywOq&v_jz&J}g_m}5qUqt*=RQ!uX6Wno# zw7^D&wL~Qvh;1v%mo90~?XaOT*Xru(>MVDa#;tW_X!ZW{7fdd&54)n*6*4_FKCXz2 zors7Cm|7F8S9o3#;vofvj?H3rcy|K=#$P)(XVnN(<vVwnU@}BF>ftWM1n?5dDKIPx zwRm4etAxzNmMve2XG+L4=Ak0O)%!#idA==-)PYP0_O6l52=n;&t}cho_pA0!4hhe= z%sLGM@o-*doHgmn@tgDhYY#p?9-j>8tyu~rHHz~=kAJ+prCLVRGS@lsqpVd-*bFLQ z<n?@_sP&jkxMsm65cJNLHHE|iAWAAOb}HFBms^RNv7ykb+wTmF-!N~`AJ%_tqKQNV zY8pAXI(x4acKc$HG6l+mwFItce;@L#WG`H}qNCHevA#+WtL=$w;CC9@BodJZLloo~ z_vSb*jB7M?Oe`RsEHEZUiq)?K<qW|aLtHiC91eF0!e;~40d!(k+Yr#Gs7Q_jmf{bc zQeW4zXZv||%RUqA6=P#AB$i2_eU6fJ3PbyV-A^RnVK#jmLN%H14!`}47N<Mwn{?JX zAJ;9Zo#N-OsI3S_VL{&T=N75^IhaoRhx8G^*@6>uonf*XS7D-7?bC;Q>I?2u2BzYv zfIPHw?;n0+X5*6Cdzhq?NsD>1T@cXWe{+pH0+Mb@jeFhv&61WTVP1ueaiyWp<XPO@ z-6#(ntQZqW{;C%caB*UKdStMYA)w=I<4N8rIU=y~QrOcL{bcvkw$KQ{gtXSHRy~w6 zaH9IwNsO?d5T=apN#Z8QWDMFrcz~54=%C_hjWwS3Ts?ESR_i<5z{Gv-?7SY;=sK1d zjzWl-CbYB!!<^9{DHS+CKTKqm`@<uPmv_3Txn}eUj7j#ZLcu?}&vkh#06uwrJ4;K- z#y#ZZFPQqWHaBcyHWpia${O8o!Nwkqcg}-ccT2sKQt=8A=~d{3x76vep8t3rN1y=A z08vWJOu8D@IbdUM$CbDEWeNuHYK}!A>66^BEFXiH-TMz)jU=jqb`cFu=%-73J?J!0 zVbe5<?5svt;2x+lKpGw+hWaEYQ6#g3L~%00GZuTFc*PeOT;155NEe*D+D+?ATg3>I z6}AiKfbs}*?(L;k%8@v#ez+q|>#SZJoI`=`@t;2Jt&?>jt?kb3+u++1#`S1|bCv%H z1d6|?Uv=u!eSD}X8tut+;VAuq0|!nX*?mQL58<1*Zy!5G84y}STbnz?x|^z{5l?IO z_iw@AsoK%ryb0kL=MjzRg89AJdEwR>9TlK5z#fmF_nbU=oG$jnV+eM?Q5HV|j|8Ks zn%er?K)g}r_mW00wXbGfh)CD->wA&t0#GU!AMdQ5JxkZQ{3~iVWv-i1BM|RSts4Pz zlMf|@P7_i~nnMetnX)O=_xDa^xWSfNl~UEs!~Keuni75<sK2$f?XUh1`v42bGODM4 zJGKD)5iblu5(Wqi5-l^G5I$(N9X77@1x1=vEhdgnKD<XKh*@-m5?jrp$yd|diEl@4 zZ)elQ8V6`iAn<LkuL+9eZ@Dro&SB(m<;<moPX-lG_5nILby~RY=eM8U461@~!!_Bz zxU@u34a0oZy3lQAyQ3B+U`Xs9L%*_p1^w^2w6<o8vPVzn_n7Sbc1F>P98IUs`c-fx z+;Npa<^OA{|1WSL9`lYdL}__BUWxi58&RT!1xG3uY4W{`S4&I!tS;<F0vSZ}Q(I2~ z$~UOAJ$DAY%r1BqRYC`y0>KZrZ4IqeFMp#=L^}{bN6ITtAW;3wU}#;gIb`o>&pS9S zYbFe|>|^^!gKE%vVC4GV=<U#&gGzg*>3Pm$k^SUcWZ?e6C;w#3Mpmq5_~LNYt&<kx zzfTBu(h$!3gBWrWEwlM|iL42r_l&syVGrF~D=|kghe_i9j37}Z0G=8c9((si<-F_= z;RP`1*@@Tu>X($HprCC1$Jrn+;Dz#-qO(#F*IE7hOUykm_tm@4j}Z~IKXD2FMK2GI za`Ej);27lQ_!pnmPT`5nEiG-9O<wW@g9>Xa4o@L4kh0(Y$EPzO9F>%ogzIaIh@%ZC z`J<qF=XGCRcJ>)C2cd?36^;|T`<eC}mwxEv=Cq5w!T2ak5M_Ioxq(s58M`Ic_Vn4v zD}UD128YMo%gd!tm-^qH`W2;L3^VO;*A;$Uy3NO~E2FOck*j5eEPGBMoFcg?N-kQm zSE<eo{iXM-2|j0FPiL{f0cZfMBcKf+cPM|vG@ZgSH1py^xGe1s=jzK|rv`RhHRH+7 z$)sq+1QhVzeY1fEyI$gO!P#Qmk*@t8g4NC6{j0g>Yv<V{w&1$giv7>AZs0`vYWWpw zth004$t#>msk^?SrAD`$zNA~uG6ByjoazK>2CbQB8RM<3!2MB7vT9UkxP3LMs;{R& zl6kNF;2xl<BP_=uDTH~u5*roG5%^T0c?hi4dq8cT(CgXPG@TTolDS%_#V6;JmR!}< zsd3A2^a+B_FpPbhm-ix6g8Og`eGCqYr?;n0J~{W~LD&?gkl^ra))F#qxXj!rw&hWg zT43Q@Ut`@^-&|jfug(8z^eR1mw@uiK%uL??0%Rb>3p&7YM&Gbb`F|#cDfSXhN&nd- zKF-@7C$IKnoO98AzlH|j_CPekV4eMv%7Ae=Fa%ep3G;2~`;N1UohP|MSxTw#ui1^U zvj3x1bk-zem(@@W;echW2=P8jdyMPVopI~aXqxROdh)5AFK8#XL`Y`t+O*jKoug{x zg3m*IM_e`}>mSSqf)6;1rzWQ$5K>aoxjhSB&2mhEzbYvBEH>Ad2<xj4xAwDi!I(^` zB<tyU7m0=$SK4gtmxg&3zZVt&VJ7vsp(ud+23n$ramgOHBYX?5z2W1ACT4kg`J||z z{N|ZWp?ZQUfQlAja-Ikg!<zmOtRh+Ky0#|0oWHqbPQlp+)g(5^SV{K@I?YnYg&<!6 z<jNZ^HTGau2!HX5KdDq<1cPEP?n4|)eXvHUV${RqIXT&2OpBd}`1bQgZo}AvJ)>yj z%_OLlGOM~YKW`)C7aH7VqL_S*$weoQD0Lp4U#a_V9BrlZ?lV`35E$2TjOshh#{v4o za4q+kjegDnY2EVe4iaFKhY1_X(9P#ABS7A2dQwbhW4L~8jL(%xTs#sCHli(T>Frg< z6cXbx1A)MQ2#S<Ilf*gH%Y@Pra1%kqL;sFYX2zP5#KhsKZC{K^Hcq*sv_#Of@rThI znCKvU;IGxMnwnaY-{ZZzcR$3qN=x%~O@48tIF6;?`+m1{b%+~wf;=&p%N#o!TfVGv zHV?Qgtj33+;gUqi{WdbPU|>Sfaz3uJyJmAJ;)T+8@l0zK-Qf~)hxn-MFWIa-3dHG; zE{Uaz^<{1QWk*L6Q^i<L3)0-*NLq`}v4}M)Q>==!0)l}l)U$YbN<}s${Tu&r1iU3x zh@+dDGF2wdp7MQDM*v)8dFQPRlJfIGNUauI>%7gYU9?RrB5Uov^S*3Jlj3iIr0oRP z`2C+POqI<46tvpz0tg0DOJcI(y~1ygBh$KslGg)#eF5w=fp_~VFY~%l(8%aSb&p-| zC2uD8YiU(};U7QM)_Qd<^)^boOfVo0XYl<6G7b)o_ps1GkV){fXT*92cmNQRBDx4} zC1{HDQ5IqkgEK@)PC=nj>L`T7u^XCnU&VL)FBd?Qu!zMlfbiu5MF`F=C=jrgWv+IE zCVDa4Bqe1hnTs+Ews4ri6#*9N@C$~+@m2-~hVk)nHyfl9p}2UAK@e=4U_1u~5pnHc zR)+GQn39o`4**-)wtYLy94^9K5jz0p78o+PpE67eP(H`rCH=i|Y^?>j(IKEc<mBX^ zF0|bf#Ln8KI#WB4+A)EzOGF=FlI37y5xWmk!*uQ9u)wdgD?bl-RZWV0{{6MHvz7=6 z!;1$clNq-5sF=ZiqDQQVB)+@5*f)@k2n$$rQMS|F3gC|7GFlsJavf;M@2&dq_0h8* z&%}IO8aipDPXDH4r%>S+72N5&IX$J+Su1JR`y?R0DPAt$uoC*<OOGOVQtU#?+Sm5p zr#R>q)VM&!16B0L@EEIq;z12dkjX%&+)CNSjH0Vz)p~ST*;~;Y3XAuZJzJf`-yFsS z%ClzSvR$S>s-GV_Jgt`&76L<q&jT7|BxgYb^_@l*1)qp|zP?UejWs4uZ@6p@WA0H) zgwOruTEK-3y1l#eNevuB-ePuJ=#L#s{7dYdRpnqKAt|or5Lc4%pNyyAA7rgh3vCQn zV-zyS0}p(8`R94HFTm06Lr#m4sVPpq=)U!7J30ybX9&)DgS7SY0a`aTG~zCEc>bjT zhJ%uU7lUg)T}N{B_m6DvlP<p&_u2d8fA*IKz6J}0E5NJqS0bs3$o;LVsyY#TP)Q&W zz+U#7H=z69I!lvTSX2P;Nd{{l*k6-|{r_~BvCfM}A&KpFS)IavX8{?BqoX5nt3ZR1 zfC-gJG^iS2#STtRDghw|BtGx|H%Id?eEM~=h!{c2$!4bbk7G_hFfBgAc7o9hSwbKf zAZ8)~^+R(@;vE5%z(YP5pB39pQTHZaRJ@2fIw9wE5K<=|=Wh?@R{7L+ep3B7iWPvb zH^%6X9NDjDdZ%s}n29Rts{$u()K?=!28xsI6y^Bwi^_iGsU1-naU&)T*IZ+;lMLoR zT+*5lJs$Y+w(yF-k5A<61O_78R~l<-ehi1}8URl~b=%OdYUB3Qr7=QaUU%l#uk2@y zQW|Ah+bNRzSYUZnP^jH`q;<?1$TGo#ijj2k^znh<XlKG#4*3Wa{8=6F%D#l>VBDdj zDZMScjaO7$yv3m~7(=yJYGYCH6*vb=HaAv@*gIn7AU_0<H&R;%-gW3Cl$JV|ykh6} z1(ow`%Eb6MBE6a5j)&j|9oKam2qcM?&dn|R!KgBbx16E(<yNHr4;9WPc<l!U4|sX| z%CKp^G1mb3-D0L^$-jOnyg?GXx0bI4tnwRlnkRDZSXx^TE%xLG9|<?Q&aaA~3Yf?u z@{NVvYn_}pL^C}O*^!~S;%KG06qO~>SCdjx2bN`E*HX8#%$ohNq12XS>>uQ;0WcEk z{pUvJe*VLlO0Xs?*3{L4V5L&vkD5%eFbHKAZ^sqN2=}zwC8a><0L+PiotE$4z2N~B ztdiLqD8VG7B3spI95jvMMe5H_=7Z$hzkdA+7H;gUVaH#`=GWdxg+DDWzEZEd!O!|{ zX3H3{1P`#lDW=)+o|#ZzntH}3z+QOFZ%<D}<?bMU7C~yFwv*3~ccCc63GfSYVhiBh zaK5ttGnSm1kwM6kqNJQ(;HD&;7=aN1lD^WI0k<RMQHO+vQo_y=?o`s}%VPg5UMVOl zYzCNoBOoJ#2P5Yy*^k_{J9FGC{&zH;CyZW6$k3RG?}NjCd=S%}gu7mSlzd_5ywXK6 zs334mZ~|nbGe&+#v{V?C<ygJZef0OZ$-eW-$=?2(3H56)Tw3v{-v_61ebcBkI1qGE zIKL>a;H@Hq0>Qd-Inog|2B-!Avp!W;J{btQ<LH?6x!1<V<~*bN{<k)_tN-!h-rG`Z zcl|mw5_8l;XD-k?xLpkA1p=b``A;si(H+-TySuvT!2(8lI?!T@xv7~Mz9?kLkuHsm z%%8{1>UtWsas*SKoUdTMubnvVXe>4z+|-zAegEDy(&o1YS{4a2eyC=(o|#^G@>WH9 zJp_szq}L<AbO)qhCG(Bq@b?)2uLBWpY;1DNVi`K6FK~>-sikt9I6>KHV{OeMCKds1 zISM$pw+~<ki2ro+kNKuIOic0V;T}j#UQDdhPpVDJVPX;N!C?Q~C*!axM!*=-bWFhR zDgI^3L$oNiRg?RT%g$e?`|qHcW;?N=SnGC=c@2;sQ{IJVA;<mo4x!+R*jLZngXp0n zD}t6~b24_t)EXK}=})d2royO^YGg*ua##X87s(}52k4mU7Wa7Km?mtTd&_$1q)5+^ zK>@z*6D{7@Yh?&rum^YKu(Pu(QY_(P2ZryZXEXRhp!9>S2;a+wd%phEJRY&4yEmPt zj2*zBPEAdP_SEp^3XU-xzPG$d;^Ja=_4Nr70j~HF?k)tI6Tb;S5^m`Ry;b6Hz`g!3 zKAtJ}>Ky26IJ$6GM+o<HwY7z=&Xntlc3>^w*TN{vEd=cAOZP^T4lcksOF1;AqO#!$ zh!mOYk%f;5Kf8&2uF;qg{r^q*p#_MGUt!AMkrcGc;c*m5E%59%SSJUVtl)dG>cfZI z|FKze1~i1n+Q+Pi4i5#}@tfC?hCfD4aDxy7>QkDX>op^ptEysV-MBd>l{yt})HM5V zJ)j{9c8cn~t8eoI0vw9g7rQ!3okXsMUZdOi{VS@u@h~ln;mZ&L{QyGX+3DgL1c}N4 z)>ljnGK_T&!vaZbWFX7#HEYmr>a)>q1~Z6Ar-gGJR<H*yL7b0-|2C$%Ep_<`rOXR^ z7UsjIh)HBb#EBYPlgWbL&e#K(gXHf17iAup#n?220cba@MjklQ5ss{-OFCOXv%}O$ zs5tYh(a`4z0m2R2b=kx92ZU-`zf|vX?UL4&UX;uUpzu44`L>o(3E@>b_SzZ@r#DM^ zr4a4%E%Be1P5Lo10&CXZfD&zg#RMWF43K~_HB@VFW&gX&_{qYwivEw!^P*u^doX_o z*gOjx6XA{uOk7)FzBj!&zRod3j_Wdzz3zNx*;(|m1fj!s@yV>g4V*)=7vz|OYcbW2 zP;Xee17Ptn5M(425Ng>h(lFQGJt{@I@odI0#^EV+cp5Da5A#zHTw4(Kt&k~pR!tYS zh49`<mM!y>8;rU#iNcX^>;Wz1u}LJ;7xR+Y9f*G82vw9hcTNoD=%GW0j`+#pB+Yyg zVIhQJd1sy}Ee6a#@VI0K3vdcxqLPYp6rvEgbCOdofO;FLRt7(U>ik7#A6)BF(u-p7 zUBW;uFe3DXA~-(8Y34EQ>WQN&t~o_i(`iw${P6%20k`x~;?SLf1O``=-p4mA%{ZtV zB4<jxz8c9UcSM}eb9N?ycip)^`}T=2rko1P2R7#z)w!4WWiucBd9aYu`dUn=vZ(#3 zF%^;baOI$*uu^kIi(fgf7~JH{`=q7|2KN#ae$w(u&QS71wZe42EG6wG1ci8^#$sjF zZ(L}Ul$4ATwS0`G`kp>9^@gbg#D^CZ6bMj}$d4nQCS-AVj)!G!@c~!9ca+K9zt0I{ zJA7=5>29%&CD+Yx%*lx^47QCc@LswI%NeZj*4EZYWvGWdkbpL<*RK%g>V=-co8{vi zuac~uzrBOQ>^rh@x%!XP{>coZGK1THGdmI>8#gb3br9qYm+b_ULv@2@Y<esyKdWQ% z+xWG#&Ieuegb2)=Aog<~*fUB?5Hf^Bc2xs>aFbKbt?hqTWB1ol^#v|p+ob7Nsj2r~ za5eb>t^^4Os1o3G5U5djppuzKCd&M;%6;?LorDTo*!25bmP>60cQ9_l&w*uy&gNsa z;o?XTAUUv0gTuo`0IGu*hVcRbOBhui=iu0h$vz5y9D^Uwir{81DWP_`384fTPE0`H zC|Az{QODsyI6uLWVQy{?0KiB5Fjf}5<IlKAnKHw1-JD)m$rIiO-?)0!>^YAf7ci(n z*6J_)D>dBjG|C^-7Ba>Ym#Ylc%du>!ho$*b=YunDTNv#>a@aCd4v8-Lo;7>qA)doH z7rXd49l(XMB#!E~Ax+LuVyXnz1gIt5dGo?j-!}j0s?57PVLz4X%QhBsWL7xQTl414 z0c>$dX1$Q-v~YTB<yO*sg1OH8>5<0}yr9El78iF?9^D*QFPGsAeNmg|1p)x^0Es>r z7hNoAZWqdDBHTzoSYFeJ?$|N+r^blL#6X6~S1g+g%~I0Hij3?!xMF5x^kbB7o%FTC zp%gd(76`bd{#h`x$AJM#8V?F!*^vvFtHEj(@b!mVC$|g^3!T+`va|b$yyd-9m?9JJ zh+m*aJi_jr|HfbJ!6+;}NgUA?1Q1GnI4C&05~})eUhO-ZWUCmHo`v?zvhq{nO*BO{ zLi}$ia(7{rcPBoxJjR@D1urNmHPx%jw)d0AjB}0ux7o&aD%O#k1e%SpL6RQIZV)1O ziG<~<8f(^fEtNWJ8*3P$OoTA2W_WO&5=$&OY7n$vLahWBMEFGM9O#Vkg##oE{u%IN zu!Q{Vc$YW4-eJf%z+%REsqvn{iWP)T#Q5aS=7GS-$AHmuta3ScPYADebrtDz0dK=i zvIYJ)V*gtl3xGcqRU>*9Sm}Qi^3AZ0zgp^H0|ng`fNm($RIbW~Xb8N+RCsRMX=Y$_ z!UJ+kjQ$g~!tmwko{O4)a|1pSZ=D&<-M270zH)1m?6C<Si(G>0GjojVl-Mf&4oybd zQcMytFU6L@fD#GVJA9SIs@vLZ#tsX6b*e4pn{|4FU%;He{PTCw(I(AZn5C#8FVxmd z7*|&XXs8-Pa(WgP1iFksp$6e;Ailn8nJ9i9)O8S0+b!oUKs-_eIiaLI3S#Rwue(D- zqt8$$>DdoOvGWpponYntv@Y7tKn8RZlA-*`S5Ndi&EDqZFrAVLe4cV7_iZt1fZmPO zE|6KMfhhrgtA8Vb`N%G<`^B=rJ744qRh%LwKe7kGYW&vK#rOSg<dD;wKzSA*^=M~8 zl!rvVlk7{+s+8$UG3RhuNy5Vm61C%TaUb@nchE;g?Fcgue4vLun2;|qd`)P(r~doW zAE5u|SuwrA#KL0OX<~TTT`luqeTu9Z$5R}D0F_^+oH1G^+h1^Mzq{6>fTc-ER;AG$ zX1o7C+6VCS<+X34P>CE@c}7(xsTFmViHV<VFUk5L%&>j|-LdE^RhP4)@sp!>owMAr zgKT+_*0rj$bESx3;>kW~NJezye(F(fi5OS<x1B88c51=z!A8L5+CFfun#9e^9`qQO zP-?W(F<`k5d0Cw;n+L=W7*SYgZbaOipyV7pPj0-{&OM5Y-b~^2>C>0*VVbMHs~UA5 zWj`g$NA~`oKMQ=*A|r6Gh$YiQlgb#a1tc8WNDNWnBmmUc-TmVp_8z|=IVq<h0q!!% z9>4U!g^9>hM|=f^gg|4vWqYnv4cph#CyfFmYQW*%;Zx055;3#JF-cJ^*)0hu0m<Mt zN7dPx_@xc*FCWg9+M=H`_kw1_wD)a9L!>ZaS&f&8&Ipq_`Be$O$!;PF8<Dh!h7rC* zjlyDOvc?c|%XXzAAq|?|)gO`=VmK`1XYqPkS65a2;*;Ju+~3!<{zI&6X>w_~J)y5C zbE4O|qsL$-IG=_qJ{v=u9qw9Z!Tto7O;p4F0K$7#C`MN%B3<>*z25=d4sb?7w-Xo{ z11eoG=IZgUW#lt38#oRMvqL-`J9{z|V^@*B3svrMxKlyrg)QVpQ`re;gio+*gt-JE zDV@y&VVP<s?e@=iw;G=GC3|h^cqZrmym3SRMy>&ji4uq{*V1yAI$E0-laz<(A~4^M zi;FwN(*-&^`22CT?O(c_^iO--o4gIioW54HXU!Ucs*Utly~%{S5Ost`@yH)0tu0-7 zW_KsTGD6hD653M=yKN$3dg-MUR^6Z-3L36;+veVFK^x7)bn$$*zbI!Kr`Q$Sr-+r^ zvN6-JIk>SpJqq+nP}~kX`K~VApjsCzifAMY9g?!cOb2y7K_0jNV+n*EiCH|P-u6$_ zsQ0!&g7b4~3btr&(BMGv$$W~D^5LgXvrmh*c<Z@qJe_;P=l@31L>xTWn);?e(9hw6 z@nJG%d{9M-?R<m`s2#}C>9(oXt{8m5!Ntcc&K?O^j2H<Hvim=%R-Z0lbUK%watPkb zLGkjpQ9r~zHNu<(g%U<cvFbO2ao(-{9G^zRnUr4gSt$?vNCjmj15D-WODa+^0$b}? znTI^|in{s*6ga3~z|R1E++giARA*>e95C1XmTR~V^Y0Jezu%PSgZJz~sS&0g>d^|L zKflCoJZkP~X{m&@$<94{qOAlF6LQbYOpY`3&Rs!%gWDf!_*=8d()YbbOCQ(Ih~=pM z)&#WR|70Uc$l4U023BPi#Ic7-gc=n6V0ZRf@d%N`eqC=S{SWnP|3~)_UKJl7pC0(a z?om_Mct9jWR@UGQXXxBd5&GfH-Zg2LRo!xZIOsiLU>N%0LDujJ5qn3^zkUpRih;p_ zmEH$^gT*SY;p#5)<Xf`JXHOd%H(@)=fJ8v_sCE9|j?u0CI=<z;AHJfr^N67Hx^qZq zIJ(l#xA&-!eDumW?9;gb30c^~Z&7hwy0=)K8(Tb6MEkHh#@^TS*G}bVsgIeh+AM4= zbN!F@H8j_kJ8r5Mj!ruvGg|_HFlnZ6X12YrcOY$vbm(FEMxU<3Tq=8Ku_2#%={hx3 zj3nD30msu$)GYDkt?3+N!nX;jS*tcN+7joBj2~da4V#*g29kOh&H_+0e$8nuAI*Ui z7!4>eMmd5}yyB+9|3ZJ`rsu%Vo2DJ+;4W|%nZup0b4wN)H3?$B{X&~M$`m#bwSh3< z6yf0G+suhsA*QKoh%08puz`p}`~6cD@NF$rl(@z}H8&IfA_N&ud&{NAwg~(tu-#j? zepG06oOI~{LuzrRPX%$YC<9ySkcM~U?txuu6clSErQzIjrDjv7Cnu*M+jxaA?~nD1 zRXd}-uBBZMjC!twh)<3#CXwCD%$w3qGsoz!MTkuI35>m3Qr@*+o{`bdEkuD$w&={3 zL#b&S*6JPF>gr$ZI&4f=dpd0ToV8o+)U_#I#y9Kp_?#h6eYLdz_<niwR~;wHr7P$J zPV9f7@T0pUbb`sSG0MR}RP4d@=t_u7h8aIiRCIJ;{m^IYNC!<_U6>7l<18`baFdc5 zb=9PJK|s|j*;A6|Wc9YW<V_jM%AWuADYoxc-y>)4-5R3Y2bNV_H>fa!VTqDIgHQ?G z^*MDnIX8s08NlOh3)W`*h}xc{q$I5(Yp<iZhF_YS`Ar@T!+5?w+OF?5Xa_R(g*P)s z)K%8K3Cn>FUFTyD!*yJ|bT|Hlr{5@(x#5nP;K*9Ue1+X=ud@^EM2)$O_fCs*&<&<J z>rxi8g#mDnaoP~u*eG`$_0pC2=Y4Rw%N(_{_h6-4h}j+-;oM#tGB@O(Ur+M}Aw*2u zmL{N(UbZ$qJNF&!45D(CPNTn;S5jtS7rBte6NV^0)f^6!bkoeaNv|jP%L62S@9fGm zxjQ-?eRGZoc|edd0GwUWpLRIL;B}umbqXaulC_nzwCJk+kKL^eVole~--|pWG>2wR zJA>igK$u40&ju^^N$ZWbrUG*A{x$o%__xE<qYnFo(LEVcm^%|uiB;9r4=?~sxXNj1 z`L(gB^`KS@<h>v!C90){b~vQL!T00)_YcA2IjH#2EzI-`*WqhV;JTAzanz;k4kJfk z?Gu@}{p1@q2!`%Dc8o6YLS2O9M7z=-zeBi~H%YFf(Utpcaw+C1qiO59UhX^3%Rc=f z)fL^DYcM}$*Ed(&sIvU=ZuyZs6*a2^wDjK|f+})yf7mqGS87&4$9pb@b04}tkFgx` zS<hH0@^gh{6^tC=<l-v4Z29Qj8)J9VechW|vew6h>YBnST(kcE`O>QM#0=F&=}A4t z%|AbNw?uJCUqC&zlv$u|Pg=<tE?Et*%MvT|s&fl7+r!4j#;sXma;7X;B`8?rGDj+M ztAd(?{!#GsqzNMfRL&oTZ?DW2%fe-7U*1+L;RVA=u9~Gx6}#E*6IrwEn&zj>dnKrO zZdMVm3hBz(qep3Ia*Vz*fhP(U_6XonI!VV6!hZ+ZV6n10q4^{<@Yw$ZKuQAeg}Y#+ zG1{r8+A70xcqJ=ll&`tm$W#}1v0+opFnHZy_vQlR#t&UoQu^#UhrZYk7C=ZVz}Qfe zsgJjj_viR{b9=9xN>f#)+}_Ke?JQT>V}jyliv1w#Cii1zRJy;Kk176a>eZm=;D*|e z;G6EglT(vkLFZ4|H7@8Ho3Wz)+O}icfJmQ88pRpF?@ndkne)1-D34a1lXmj#*zB8# zlC-luE>S%2xP36gG^6r*xwf{}yYYbCe$>MJg3XGj3TZHN+9E2xzD(1o+=%)XtKH4? zZba1si)BkXIXP+nxMHW5p5s44?YPpsXdT3;+1#y-PYMX!{g`ve&EskC^ALG67hd#k zICPQQ0SP!8C)54r&16tB_X3W7*DNI1eQ%5gmc0^dxgMQG4qV03T@7hjrLS5065;|e zZLol93N8XW31TD%hf(XO(U+D9W_~NaUAsD@dlwgNarR=IOwZPrPXppjMju9kFjZy+ zoevry{EmA@Mz@gA`2NgJ4NXm2*o1;d1l-w-!|i*m<qrqAU;X^~Q^{UK^1<S6%UzbO zt?fIzhz4!n9`-NN7HZTMl!f9jU_x2_?0HCvjev>q-HRdI<SP4`Ea`e+-DbUWFFD(L zzK2&LlHGnSVJsoFIv{{(Yhv@9a{gqG0CT<W0@wBRlI3O}lg_u>&z-Bh9ncgb6j`t= z%1B3$>#iJ4wx9E&rDzg9bt*17`NFdEr{72MsrJY2Z`!&fz2*HZ)z+_W`J6)fNnJ{~ z#w}+p(~Im5ZNdNN4}BZ__^RXqBI`$c4=o)4^>rxzb=!S%ataP^PCAaYgOpy0?!*6m z3W%neSb6ksl(%UJ7%~Qg^u2N41+>q>sOua)n0rs`6n);DskyoIz&vIHpjIj?vz<6G z_99Ej(0`jslaB~XPdK0M2#j)J55oWlEL5Mz`+x>?xW1=-SyV)GL{xoarOB1wxSbml zoVP=o0>;w=lQI`4zFCzaT?1YwXcm;oJEhcJ{0pi?GnhzMl9U)tZXY@O&)J`2V}64_ zWo1A4D<;x#Tn!631AS6<58}h+HCTFMdZ~(bJOVib1DS2xw*|%oDl6V3$HvimT~d|V zWP8eVTrfT%-dy1t!u)EVrly_{3coMsycQm?85AoyCqQy01)i?~mwVF<0M_M~la5{* z2P@0gS1n?v{2^PxMIiBZic!a5>JTEU9zG&Xnri0VzUN@vU5{MmSm{3xToxjARna$` zJGa$iFGCS)H9a3&qP21M+ibms(loD~K1WiDv;;5Pi1A4WK%F?U`uPGiZ)C`!X(-Bx zi$<+k&5fEwW0ur6uBVqxa{aTCT=IMFA`!$S)40?&L|DEc?+?q}Y+^h~Efu;rHvqW* z{`>E?6?(dNS9Eoo-rj5ZL{bWswV8^RL-~GNc4bFOI!(<=*$Wb=uPs?Wi7XGbnnibS ziYnGB%h~4hw<B@M5RZ&(JB5QKps-``?mMgc&n~ZBg1Q@)&5ihSHNPIYe52CH^8h9F zg1wO_-o;Ix22S4Vzh*N7W{PG60*k}PT9N~3HY7h9kq73;_ZQzcoxF)X3v6R=@Ap~i ze>VQ9VhA{V{o^R0PLl&-qM|p9-rWcIG~}{XVq?A<`0IeV`MMug-QU73`q&J}6C01F z_)N%l%w^yt+ElS`ta#=QshDx;C*Pw2+Z4z=L(XFjF|C<_gz=Vn>$lnVy#|d@m4!+- z|Cb9;>*~Kjw$wSjHtpW`W+5(vD#vE(#`D(Zj1P!i{nqwI*6qUX--mg5VG;nQ@+F)^ z8}sXUQP1CQD!}He(rEqq%wp)H7vE`KomK;a#t5m7f|626X6Q^8V!g^$0JKA#&&0(= z0qbQ@u;CkXr?<pG&%gjWWY>nl-xEvo3$bN#bECB7Z+cPPg2q56ZmaZc2L2=hHskLL zaTQ+(F~@kwvB=4-+AQz=4Rd|Iyj9cGz>Zr~qzPkNtrF|N0yohNk|+)@>K%M6dS`30 zEl8AsUfwq|2*#XS)i#<)8uux9Le^C1e_o1^PNmp@RCWJRN(GC{CsW5#Uqve>z`S8@ zemEqS@33Z_clWH3%*P9Nh*ANx*6(?QKPUKc0~<|J^OM=8FNAeYX6GEs{aO7ulYkRl zZN<A{dw5MimHffCxqf(KuJ8N8UBSuqJNAil7w8>jCzj&w#>|MvGJE*%EJx2C<1&7a z_~+J3o`~|;%~vl(={_H0?4d#7bAzFnUZcPlmlf2x*zS4;hQQCxJ=EPod7JWPF6fnZ z<S$&(PTV_jvrxp&X|EP2FF15@r<3izTCbgb>z{JcTDX>|>m%v%S;Jn(2_B>rc>4R( zUn?^gfgevOm->ODM{D8LQIC?kwy}}Aq7k6ZO1}p~=80a%OviLbmqS6DWrcjKpwdc6 zNN~V4zb23wZ^hSx!R0xGTEG+kF<r^aeK)w~K97L;NPlvpEK|cj{bTkF^Pkc?e6#d* z`&wt8s$IMG(aVjBc&2$EbP$%KM)E&B#jLQ4LLmVkpc+gyPdS_iQaL3h^`qFVKDPkD zLV5zbzfiYJW50~m{hVjQLIsKGT5JsY69woWGX^UIr1dr*t)pVD^(vqOHgZp4MQ_kQ z$ZU^oo^5yev<oOI5UCGhI)`C)GQSG3aBrPC-cL~pFL-*Q=Ij<sSk$z!lB0K6UCmIw zdjGz$r;2a#q*6roB^8x`mk*CuP(MATUw81<OY)z|vCegAS>=vb<|IX5|BxeeF5rKu zr9#e3NRAj7nmTk{F9FfTAcI?{<i^jl8&{48%KutiWRsTGeO^P1i!E$z+h04nq}}wv zyy6G=Vy|Rneu~72IG4l$px+;Uq&gzk(9IMK2=1L)XTDXO%*f6U#BX9@Wk&{$<pnR_ znxP?lAL4msq#eq`U~@ku&Dn>p?~ghA(|}A(b*!@DhdWC$TX0|~q@eq6);T)bA2>wG z>Q?XV>8T_o++F?;`vrDhog(>H+(Bp%GwzQD`-!U+2?2h~?JwJNQ{*NB@!tLxM6UeP z9+Hoz5?f}wxsW2YO~;~8Mp_oL)TtQoDJq09LHu`p>#lvrq&kxl5-RgDy1qfV6YIPY z5k}&>`F5vxaa#W6iHQkju<DeycVx;z{s>M#v_Z{XT||B%XzrL=K*U$~;R)GF?B)ss zRAWRAQ<n4lE;sZdu-OIah~I8n3udfNEve#dZKdBjBeJcAt<d#}UAH#o%HJ3Bu<d19 zn)t}B8wmGGj&;Q=Dy;)H6d`FW%vZX6V4s=&FMn#<K(E@)2Zml3JrjzOZhixAnET*b zapda>q#Ngo8l1wZelz2w&qeQdH|zE`@L-4=vHbk`^K4S*+${Ykp25rleq1Rzvyc3c zfJqrHy5Hb?U!Mvt&4|tj;!R;O3#p6A%Ch~Nu%P)aH}@QGaDY>J+iZN?n@8BcM9i8g zO33Ba6)H-aN2#e}*J88q&_FKfd}~P+JF^m{uH)oRcnux9R<`=*PfbnDaqyTxbavVJ z+0;4P=ub;uj%y4?-1v7`9&pmUz!dlrGzdLC79h$ah*BGbhYJ%o_ipy&v{7EpYjtT- zE&{T0a!9WGi2V)bR>|$L%+#^LpI>nwZnIpr=uEk$(w1WWa~ZDwRk3s~%DzHvM%gCn zTItZqg?l70urV_~$=GK)+}5EBEN_TCVT~k)69$$F<XyPgcWNH_^!WXDI~yBkNdCik zG~}>i4+K-yLM)f4M%WanT2e~&suz9lj)%n!{?}2jjk67%Zs*z$1Kw*oOuUT#^M@N- zIyx?>DIPegaTIrJ?n(Q&=S}SVj7Ky2USrCEE)ZsWpDe8hFI;&*h07Lmg!t?GY9g+3 zer)R4r%^Cj<bL_W1rMIc{Os8eex$O|2RhE{*LYU)-o0bR>>oZFyK>em77r8F!1u=5 zJ@XAdYF^=%g~$zXI7)(LY|Ko@DF2PUVH-{-B!gnortJh!pu_9OY<UHQb*++=AAGJ3 z56h&|RF^K=op!6RCR-o>`2JgEL*$DWp3-8MuU?smdOqX9J^6jK>Q-kNIxtM%a&3FQ zKPvwaMaTGg6P->xN#za=Ev<ubwWe$xQz83E%q)Fl%2loOAF^v+x7!wkwr^IA|B=39 zVDPC<pKI5?^*4#>iiu2F#{(WSy-D-Kk+*EAu8_Y&{jhqT*>}Z{AIS#}45Sp?IE&iA zOTjCuPU0iBJ|3V?sPTEWZR%6`G?ZTX9SsYbQ|R1F_w^2<)9?SfIiu>bP_KK*JH)4+ zCtN`^;*87LvalN~pXV9*B@TdQ7kPT))=KaENBY~tU4Pr%T0Z*K?M>24C6}*G8i3D% zDeXaW_w4UHP{VxvdN%Iz%d4F3OAbQgzsHxG>NbyuDwQaHM4u8NU<h(x#bI4NU(W6} z9z*$sH3})ifm4~&qsFxZr;csT4Rejk#x08Vi<`exPjz2uYw`-zTaB=3da0Hw>iC<( z-F+*SI9LcE;dswUDqsZ<Wx1}x(q>Sb*i5KDWpRjw>pDiH)TGSP$Grcs{og%6?%lX| z-oE`yW|n@K^Tu<{?EAx<6_piaH|waWcWRr?k<Yp9Dlk5O2KG^iTAx-NYd?v4*ClV* z@Ft@sX0WLC0&O|{0JKtX<K1r<c>a^S>T1T#8wZYB&aYn=%31#uX?|H#{Ich$dtd4M zzTQ8yP3wzdG0PvRsMN|(ohT?NvWQ3@4!!^K@H<(i+c8TLfMwt0&^ZtPmc#S9jbVjE zLI2rB(i@McZaRo9IyKq4p5VD+jsl%9)*E`>tDK?P&N*rcDg8sf!E5b9`P_aQr^j7V zQ@5H<bMN_n<HlO$^MJnZ-xX!l{&iS!sBH8~@k}v(8nQRkR99CwMq_C=ups!{W}`Lk zFL;<e06V>=q)U<CP*}kN0Bh0WX`S$HH$!l5pFMm2P(n_MamdN2di#--OunQFZRzV_ z*Q+wUS(&&Wqi6zu@iJ$qo`HT)a3pi<pZ&$(iDzdveSfU|hj8Vd{G(>*e#3Cky?zZ- zr|A*<ZcDY6EA9g<b`Q!zYE&-b7?|~%%}?wbm(P*Jby~8vexkNM0j7$hF|Ph1o1+c8 zSo@%wic%6&P&V7EIDDoo2R(d!r4QN_;r9Hpfcaa3bCNgv>NOw9GEuq+I%krZN19l3 zim$X!Y0f3gkL6E$EC(*-=5{r8=JJ?yS}`Cqk&gD9v{iwXGD|FrxQOP(yi$o0&miq$ z`{w^g)pv(;*@tg8jf7OB%t}^9MnovG3Mt8!tdyBuh>%ToijXo=p~%jRkV45Oo9tEg zc+dO!y}#pl-{<I`o_ZeN?|py9b)DBaZf8>xR_sV+MOZK4;!4z+T4PTxrC_D)XJUds zx+(1O@EV@*>au6Lsh*dQutI8JWek7X##q{&CyIYO#!fUaONwXCOSV3yI0hncF6D$# z8}8_%AET~wM<<&lM@9=>(Gryq)>{vjlg*UI0d?l0qc<E{{870JSd8#|ZHS^tq*qn3 zqQq6Yes`S|O%2(9jq+^fo4wrg&4OxW*YQ(L3<cLmdiBa$ewdsU7C$na)2KE%7I58$ z-<p(KZF8+xm40RV&mUH<69I^0lFr*MG2*iCL{MeJ;&@ASP2>TN%fVv1)Q^R;MqdKw zjmEA3eq?AjbaqH-uzj7Q=C`>b8s=!w`Z~0$bGoM6jg*!){adV~$uGT$@Ydz}#+aPJ zEvLO_IfevRPIv9nSIUFy;`{gS={a@orD(3gN83Lj09+%#hYz<A&9p6y)rQDclDwB_ zhh5hTpI9cw3i+j;yu+Egwj`AQnymUv?b1Idy?uqY!n~#sI0mQ&kD{IdArHkj3f%pS z2YKWV`1=Q+x4yy0U$!dP>$XN2Cu%)X-CK6AEibv`s;n#HcJwI)jZSHQ9k{Tpz|tZZ zz#i_)p{%{z-JPANmBSOCWDA*MBU4V~zj^kjFg{zqZ|q_Z>&0}p`HOl+#x?q-7=Guj zW|==7l=9=$K1j8AAV<>}-6(1|WKssgTL|#X7vYn7+S&my6TkzLxfGP@vT}2-lrCbC zOF7g%E=Y3Av3X|LDg5cv+7u;nz0!3OO3FZ75ag6{tCbX-zJIrAazhN?+BYnDMdI$` zHAdnYy1or%?*g3~hbRG0BS#YdZyueG{<zm4Gm6Q8Q-`CIK*Suz)Bwj2I&PQ<5&#Ah z6J<FVb-9ZV;71_4!c2-)32d|S2`>YC*OAVU5H9WaeH_s<zF$a=4rzb>=RiDW#!063 zyS*gPVh5lUo-EA4TrbGS5n$ts@Tsg&w-B&Ei0RJR_o09+Zq=vqzH~DnC0wWq?MDQi z8}v}S;3cJ@kO4kay4L87;_?7$^ewloxIO=93tge5C16AxL@h1n7IotVP51OC^^5k{ z{BtqY^}ckh|7B2p==_7eZNuQTMb=?*E?Spf_xvm4YpP7c)^FOi$A`~|-6*-<dN2D{ z%Mm1UC~IpUhW9q1?gKv!oDYQuj|&UM;G{4Jni?V21sIj8n#ia43{U``5rKAG{PpYK zV?BS@{po+5Mc1XQH8+<#=5rV|nawJ^c7vI2p_00HM7el><Y&J*gHQCh`AaufCuo)! zCd6zrqNgA_M)j$cXL%T#glKTUAv_wc_~_Jp#oJN*2+Q{O((Oy-o;!8cE~Ti!Wmfja z4Q31-dGw3ap<;cAz3H}M*Xh0xM`P;BdCteJcO2(}=woEQ#fezH1kw1w90$}a>+dUz zjC}5e7l$Whmq3(^@&nEiH-S_GqVS)85RU@_u5=P}PbUPz%v=Q%K$^iyTplU5QM`1q z=*0cJW6p;Vo<!~J4!M8G`|l7~<EDZT*yfFU`E}E^{IZntdJEYO=0MiovelN*lfC&@ zOTo5MR8c)KrGDgrw}wd1tpeaxg9DRx%~`g^Vg*~QyM1<lTK`(_hB*wJnT~=BF%ZB3 z)D&JN5zwM%gxy9^F0;qFEjV(7(;=bkfNK-DlY(XqjE2Lys;V=2X?etd0me3jE|3`U z=oQR9`IY@N-;B9&@*YW>nV$B?+dp2fP5q9qJ-3<krLr=<#-q&W*9MLasRg(8kA}_H z4V-xlhhp_+@!BDWgVV>&;jhtv=wG~gW#4ke5qlQICPg^8hcOceIJ|=&4c_`6Oa8>f zM9$v)fVXu{6E^M_R`+$ZUgJD9K34HQ|In)h=451PkdXY<TNyijs(^R?LGf8W|L!w@ zhCdf|?&W)Ta#7|`p)UQ!JY2pQoDR)+Y@J0-Tu?;i7Gu*}svk8oaXxBV0P^42#rZGw z%|XDV_Ftw_kFvJ18m<*pP`q@x=mc$w+%y%wjDEbnPFb;v^JnAC8cL7!Q0^|fmGZBP zv>hUUCO*GO+5PJGjsDc;*{_tZb&e&~G~MkZ`PCF=ec^)3-o3A#96nji_n<%OOcz#b zCgs+&cq-y}<j2(?%8v0a7ZPjk2{gJguPsfpTrEY0e2^X=2Or<%u$`2c&42(wF~6}o zku^9qMTFPRE-f9Z{AR;}v&OQwG#)3~V`j-q0D%ObDW4qZb2()$G_dhvsgQqEiYJP$ zDpc*_cY!7x3C~~s`6Uu{$@mHHS*MmkEOuoTdFm3Ti+PDR)`)mIR7e1V$EK!Q-Y8P- zyk3Wi9U;-EFq|BtaB|w|xElmfjF*|{xL}I!GkAoazPn{!|N3<~1Ryu-rRfVX_2~r5 z<>{)Ze6YFA%Em!j{6&5;Hts{I+u`Ph%MO0BI<J$}#Dhcb2%Ju-=!_*%QsRz(UeGrY zG_6v*^qT3=rx6;i;(ttsWUZfv7j-%~JKIlI31nbbS+Rtl4f(V#al`$eDV4_qtuP{$ z2`JRcTJP3n<H1m$2mJa)Rd6o$!pvUj3D05nUR_a}VO%W!U3>Fw-4qT`&%LpYzpbGK zkzw7*+T#LT;Sgx><?D?!g<oJ}=Rh0n*jy4RH|@sUxw>zTV-S3I1@t-UYO=O>=E~nF z$g(}5)3mWq?l;fQC_2`aaqHHZwwC_zC-OJlrCMY7g<5m2od~}&_D3-@jU$GUiR;0- zEu*!k8{{9h+zSVR<KWv+fSUWia5ufe8G#?Q&hFAuS)W$1pK&xn`{JY?&cxk|v-B9w zABojJui7jhoTd->56C1!nlZ$rp{13B$ORlzxuh$7)6?!fHQClVBR{?=C_LzvYGNMj zJ#y_s_KuRKXPnWWDdg|0#)SGLWlteAvssn8Ht&`xEGqWV)7Qc`5Z8M@6g)UVL+Rz+ zONek>q#c`ESP(2tSX|$8bp=uvg5ebIekeg+X}p~&!X4yGGO&M;lZ%%oFC=%i=Zbvv z6z$2|55~FFBqg5y?D;;qFiH*qlj9ZHA1z^T)Su?&8@K*$_$AGCjyE+md2Qut|D^Kg z(g)vo`Q%q>&e@He+bVqHmY<&=`Skhg7TfLR_4Y4{Hm9ZwSnUS)PMaTy*{9&BavIVH z!jU2B<H2Jx$H`_7S*-ahyZe51LbngAbApJED=hVL{8wPVx2>&PV_(DK+!XT+e5;?o zei2|cYp?6ljA>h1G459{&K^;J_N}kZ3H)OB#hxpRU$oFY34osQjNADz8-CTSIp#OD zyQ-1-(sELhV&eiu;2v184GoW8y`oj_mbe0lQO0yANe?yC$amvQs?-T)jr*e#L$52< zQ-)l7qal=Aq*Fki0fu^4eULr1l>cy%W5HC9(uxv)h<54P+FD)hS5~pp&oVPvG}q$e zp92b;DR|G8cwfrPt&BLXSB7IMzvgFU&Ag7Zzc9R3$B}6ACD=k$R{7aWlc`RRxv6~P z11%L05fbtoFv3t1cO$-lFw<dSQLU#;ICtFEX!J54^M?PIW%=>o3Hfe?42>MbrEbn_ zZH5xgaxjb=pOcTY!ufwRUq@3j2Bro-TUx4NVL%|d6m&c{Kl@U?R)3=#n={teR}RBz zoCdHrCaZ48S$I-2b5|eYxQQerz`kI0mY&rpWdH_iWO(8DHsG3^lKR|=uX9^kbU%f# zbpe=t#A|SQ;+kr>lo^%F#>TsiP1jqA=R7_eqdI^6=~L6&%+#`U@}NbhCv5CHnoRE0 zZKf!t!)&3@$LILhrG-YxP+9J0Q8*qx{&2{}kU17ziTQ;2*q=Xr#jkq9pR>0v(meYV z%-&U9UHu6ZaTppWy?S-w{P}GdAH&gs;`9|SFE9VVz?X35`0Pi0O<nlzgG3RlBlzQ& zZlPY6)zyF1p9*Ufv>173%iJ)8ui7{CNA}9ieHfR*o(HJ{3b0N9Q#2~-$xS0muZ-^@ zSqc8#9T08w3$*P-ZbDIU(Vg3t=QA{}UDLfFuR$`!G<Bw3j4UG!PW1PeSZ3_Dyq9ve z%H7f9K1DGV9&~7MeY*Id<SOTAcQ+X~XP>9XR-85n(*OQ;H?_0fxbZyHzr3?)-#E!o z?YmdrV#C8cwT+_@IYM&vF~-GK49%&RQ-n_VfEcy#`2)*xo5Ge1G6s8{rGO*B!UKfO z<?(XOs02P*4HsbUh0ZG_-8p{}&WeBg2@hfTn>=hk{ej@9Z;+C3n=%|eY>27W8#lDN z2M!*rLdd2VxFk@;Lw;#&ZXSrE02>j_Q-4jjUd)~5RYG29ZEX!*Ttq^`<-2!Jq0@u* zrGI!BqR^z-BY5dNTJImiY>5!;1qKD-QCGCK64L*XZ_m83Z~<0BLIclH!XF2a4w?-h zfC9q8$t5NFwN}K^&~2#|G_9O?{=Q4D{%zxd`9=@Bicg`(L$~OSY&Ju`e{7|8BUOoW zdbHHL#XD2F#)oMe3X8t+ac)LuD6?QMav+D(w`6TGTiogNS?3v(@sH`2-38(B;J^U$ z2bMg<e;9Y;<hx^T4o6EbhzU_LLKO#~uv_Fq3!o5Ka05_8K@T!<3RLAFniH+br~3<7 zP?g=?jDX32!2=Q=`I(~hX{o|>a>a-mESqofXP5GVXPkbz6+WBsSWd7hU6a4<`5Fro zcy)aYk3vZ7>Z%K51CSh;n3&!z92P{J9Q|SQd<%1+BEaWNn_E??s%r@22-M0!t(n#9 z@y@kiHw#%?D`&kknb_QDr{3fJi5c|4z?FrI`q_^>mRGKh5Bp>kisi-dzbe`vB9xLw zTK4joj*1G`;#`vJhD*0b)|WTg5hM1a1%R{~7v1DRG{EaZNXDs}2UHWrZ9wvQ^0s1= z+qJs({bBJhiI@Br@(+#m52$|tW!Li8*1&w-wfILC;$RN=;CfEDH&33hIn_+e?JYY5 zVIPH5<$eOX<mIJAS&nc#FVHB!?0~cdF5lW1^<TYuwV<%j7KCsV?G^yhv~$gA(X~J( zcX#|37g+N3FXe(Bac0eIEl6&ywQj*buL4g!^Q5^=wte0@58SC9a`xmCl*pV&Aq?f9 z{-c=h>1erl^&$<7?u^ZixP2o7g1<&_U3>KM0oE_f9}x0O7+N1c>5Vdgib<-<JC5bo zlPT9}8k6GkdWykJzE+PdNzauPQ7L*=RXaNV5f)F+Wb6u2d-eshZ{<ZVy*5wYZ&S-X z(kNtxOHXBNvO`^7w(q?uMYG@6CBH4Ay!IN{aXBWQ&ZO&iLqc@DM)pv`2`ycN2R;** zWsdjGD~f?RPEaI1eUiX3%;M@r?hH5|z;u0*lKTCBW~>y_jDZt!4BROw@F0o+rI}_( z_joFBGi+`Q=aHy!B+?;~OuXWmXyeV5>MmI`)1)+w$T9P8qM;6(XM8=ZD|>Sy%C<K4 zYiPtQgFNmN{p0P$r30!`(n=N-gufJi=;!1w@O2C8fbl)(cLe(k|MHx6?|o3Pp%ns^ zJ1IS#9P1mDeOX1t+V@U&M^>mPD36Qs$1IFC=G<={Ni=z$?}bOXX+L>xeXYxbf_ERB zi7-Yi^yncrpz$s9FN{lK%lFordYV-pe0~U-XG?f^w6v}(1Jxpx!$)VmYk8`Tu|BdH z?DN04j8NU!1gDdEBV^)lW1{NMh!dYiC+hDUIPj}HxKwJSwZ%~Fs;9aFsieJqR8NoM zLmZ4+d3kF61C`a<Ie&seS|VofY3%In$EL<iF?I%{qBNJ~V{O4ruo7N)Af-p-m*_8~ zU#K9U4U6QOmb!m<5)H<DFWrKa&%hJo{(4=_{ndQcYnlc%1QZeyl9HYtfJh4g3@xDJ zxQ&w{FYgKAXqYG!g3|+oW|*mg4*>2qTKYa{TEV9WAV<)$@R(rD|K+)uy;hL}7q%H; zvo<tT^)>n=w)JT7Oj+^7kn4Mgp#I@}dSFI``_nANKAGF-i!cou4k|GquA(TOKyZjc zm#)aMbN=5!7%o7fhkyS%40<iX8RBTN9hUkdc{$1<OIKHlmf9XL@)s(+l@CW9m(=*1 zs+?rA>X5y@zT8>8TV-QbyQGANpR3}iP~`8&R4#Np=R2FdH)+$U8@`+BT&GQhtCP>$ zlQHfa7J6+N#v_{>&t1n(j5Ca5Zb3z`KPV`SJARt-Jk}0Q^Bd(|`NYlua~!tk$}jMN zOzUI%M`sjJt-_mdHxxds;^IeG5`Rz#LLxhw7dltAIZ+1i(QUSZbn<rz1FSPK$%eTg z8%F$4cKr6(+OS|&xbtr4kC_6wK5bw?0QsB;LsH1IBbDd&nAJB<bj&wBz~%eFSfSx* z%^Qukgx&4euX_|o6<`qY@h6=y6aeq<FD!q33)v;u!3E<|06)LQiBhwLMa0^5b>{b& zqXkz4tjjS|^L482%{MD3`X}FLnHXk!TIkyz1z?jr#P)lABF^NN$<H34ySzf8q8x73 zdvp?90#Vavm=BenIKgx2a_I;?R=m83h(lL<lf|8Y`xnVg?Zk#tQ{BvLLPsJOC&rJZ zz9#d#mUiXj!H+yz=Rd_9a`g4(Imv74B2V%lB;*@ESCWBh=!Kv|TUt|Yy;37|wB&}P z>37oeGaB=2m;akK{{2#K{Nla!dfh!33n?!Q-=cDVaF?~@3Y|}kUkqpOvBAseCkSK> z#EbovwHxc}oIE@xH4}y$ga69~c+7+hoNZyS6;Ng${Gq@yT<JprT!02je`R(C0ht<5 z0>IZIuQmk3xBb20PFQIml_&i9bDo1W;J~!(IlE=vt2x<S5((nR+`x>%^S`Ivz69a~ zCdaxZCi6|_!ocxSysQETuDJ17bE&O)d%frS{t<FLwkvNDBWo{YZ*F0}(zikVXjVDI z@+|~<GB!5mq_nJpW8+4{AB;6=tuan?U}U<J|Nceww_rMZ`|fRbR45angz79mA2xLu zi}oZRYF_p?ts0#>b|@~+^&<<%;o%8)ciBX7pO?wI{Cr6&g@nW$8YN#R|D+i%epM0= zUU&oycwZWL2IbW2w}dX*)tl~DWslGd<M59HoIe(kvc8gg?waifuNZ^-&(Ma+{KpyT zB?Qx`a@OZUJqUx!MufGZSL>gg<oQSr<4U*)_P?q5@!^-@+?VR(QmG`BQe=bAmJ$rL z8wBS|zkjZ+y*>1xhBX1hSEc9}WQtX{R6DA#B)rzr(Hek&;ZlZ7lDcxN-ZWa6%c;-V z&W_e-+-uW)hBpxF_+bKmL4D31%S^@2GjyFKv2k$+KG>azL5Rjr-&&Eq$;CXOp=IN9 zQ<9Pw_fVy_|B8}1e!SCD;gXU7C0Sp*_Br|G`~McRCHSfRg7;qGE@V6?i=}tbJM)?l zYOXt$k4_$)lwMgeSy{eY(Q&_TfnKikv{-Kig;&SYu#}!2yE}z!_}f?4wM4fr8TPc& z#m2_Ad)z(85qWt(fM~!VU`!41nY_1z<0K6OgA$5u04>Ch*86nts>K!##?p;NU3h;G zQrG(+0Dk!^eq_bh^Ua7&=}M}Gt={)V_#i&Lzc4Zf|M2}sj<{%k&Btmw3@{?8TGmBg z9L+O0o>#Q5*QL2inZB7&9}2fiRgIJSeS!Ab&DtSB!5l%)xAl1>X`MRH$0rmd6CQhR ze^4K@P*i*tCLvtrr?cF)Bzqq{x^nk~SvUQ?m+9m&pZ&%xtW$e>J<jJ@xhsc|nOhjU z-xu4<t?`jnG$vA7T3Cy++r*-7sWbPR#NC@Whu1Du<PuZd)S^^fopSSIKRa754b)xj z+$|?-<T$*L{r-Jl-=_D@Y87jYiF9<n=*_vZ0r&o&nK+ygDhb<^`}f62shLdx?m%2m zHlIQN(`iiSwI>TB;|nLM8uvL#U+&LWm*NGC4~vU89t;1d-`36%>8ATsx39n7QzrdI zRvC4=x;T4(W>%J2V~nd-nUiFL=A)T3!e=l!icK&_D7V2gF8!O8nT3LaD=B{XQ&28) z9k^5)rIf}eJ3gD}dS6$faCzmhqbdJmvU$Z0r^a}t@c#1qsXM<-k5y#73;yU&)~c>y z)YB0VtrMc6Kw8w(BfN{${%248kaTuQa^bV4b+=R#(<DZ_2Ho6`WIr>cl}eQ^UD;a9 zk78$!aOaMP&C%7O8CDdc?h6~U|K?7d6^)Cm<G5pC@v1Z_A#2gY$Gc=FroJNuy_=jT zXu@IbPf*FIn8i73^HR@u!WBWQ;O@~-iFq<e$Z_zH_lBb8hRFz!OPhPrRZuK*B;1qv zL-(?9R6tY|X@Ljm=@mhJ0+0@OgT1;dn;or*b8EdDn~$Syt`>P51Cs+>rkm1zJ21Dp zcs81d)i}hjZ!(&8_L-EG_`Kpu^29|RyS3XkHl(bul>CESrCi68jv}vmYhxXq9vA4h zHHG<>pTGPqPT|W7iu89Gl)b(rd$-SY>Krq-_@Vjs>W)P*v4gS-*KQeAevr;O-2J=Z zWu?r!%keTlnm=FZ5uEt5FBxDtcZ$)tI^V`>o3cTUZ+Q(1$L87$T37m3j+M&;@?E=E zR+oRjcZ1dehx2(2jaC((6DJSuSzTM(JvWW$O1Q-Iu8)YSYiQX04;?-LIyVMUYeq*O z7tYbY|H73MFAr4*DO%nN=IjQFECh_Rm}T(WGtOV;Onnm!F4PCKOL@QXK9zJ8fzrTX z$$>(yEmQ8n14*0B#yEl;3?HFeYZP7gC%0UK59O83M%Fr`+XbGFuH<%ZNpVYbp|_XU z-H#uuUVMylVPMcvQN9w~#Gox!X_gv3HA7mL$NWC8D7M^d$6gngn_u>>>gbLM3Jrer z-YLmVtNLJpa!V)sQKfX@rczuSIWK29r_g~EnF_^g+JRR$dx7FU;pJ6+`^Kmz&q~52 zWk*qMd;t8in$GQmU>by#GtcboUiiOaFKMbHFI47hRo!36d+;FL?EG7PivJ?r(6AA< z0B^!Ew^!5Bss%f)0CNU13X0=sD{&5?v9rGTHwl#hwZ!Z;0B&q-Y($lI^Cm0&26P5N zfimj+c!$WL^K$bjTvC$i_*chtviGIKRu!CYFnBv=B29+V2opfC8fw5Ebo(@6-2Hzc zcb*2XpuK$)6G7Q;0$TtwuOQ=9(4IZxxE}pkzk@zt@FsI{`XBiHJDIxE!`5ENP*cP5 zTbgPbE4#1vty}8);f17pdguEmzip``@=4T4rwq(>>nTS>{F#|%CT2hi>EA4R+x-=; z(pX$l3g<JpyuQ?H(Cc?9fS4a?Y_mz#50fvoU$8?X0lOgL&PJMTZuDu7je3KX&n#Pa zKhJ;!ZGJJI{g-Bnnt)ZO@C~;)Ike>W!H7q`5sk)#!XV4Jb#ISLn{`2wys|e6&J0MQ z{>cw5`R*sr^3!NcR<6UMP0~77N77Qw=&76N=^rhU?(<gGw;I4_B&5SRZx?(`pnu&@ zLnD3V%04kMvB_13Lo-_w8(rMJAfYBFr`+XUh`KAa4KqFkX0Dow-~CTY6L9x}%&7eK zoe6S3*>ttTg*~K3_4RXyiaWZWvnwgR<2N8FmtcJu-`}5188P+m^y%f%;iRvP3Lwl& z-(>ac>3+@fw{S~@!%xuJ`5*}ikJX)uPbEwfi%uhnXBF&i=lruNUo^F(xGNr2OxFof zQlUH<8>{6$wqG22l&LBaLuU#AGCX8D56cqEG^`T;mz<2E<#Ax?;3F9mxBnR+V9^{! zY8?s*q?J59=OG0YV7Q*YY-oLD!42jN?+nTk@H)B#`GBCbW*JbwI86mVr6>Fbe8I-h zIb*7_pO*H-qxjzRdEQG)XW$s7=%6l4;e9CLdF;3JZ`TL`vwP`ta1_7Aicu6QW60Eu z8`fmUO*1n;rhQS*<WxHjOW7w%Dwn>UoVt_!zI^r4Inyz(-EI>TO226j8~p56ZjYvA z2=Li$y43yInVDJdXY<bTD;c-UJ<d@G3Z+w0jhLA=-0b-M*i@H+Zffevb-A|d^VJKI z623kUJ4Ho~y?r~_?@JN|lqc<S%DZ=ybROadyul}qP>ZOo{o1rAzeJns8Ay&7NU1_N zd(jUK6Br;^aA8vf`xmr6n@dGVmcn#_OlaotFT2aln^rviAEv%KjWES2T)jtQe*Cne zpThj>D{~kAQh)0F%biZ0{Id0$5bwm7OxLqcll%6RstB)$fE~a3am>NV5&V9UTOHG| z#wr|5Y>t=$`4_gdM1}>rs!>EapMY(KQt8&j%2v^dUKWVQb$)0caep(ziReLi2PVLP z|F_$-$R~7cYb)gQJz}PNdgbM_hntRW)5*!!LP8y*hsWx_zq1IRy)T!iTJy!O{d<V- z$;9FewYu1OJ3R&lfx3n-wZ9WOYC@aO{t<6;3z=i0q(1cXfpB)orzFqoxw(J;{eAJ| z($$M8&JOCKwY9+-U1^vL>L*Sab^f}8DX4OsxYZ{=Zo!KyV764TY%cp5W@jAb=H7$V z0rO&MPzwtS3;%#VdHArHx#!2OiYD8k(a~368q3P=3J(vLIYbSYRKxia`=!fLZd(`f ztUFdCga0`p8uE;>iHWSTLojP^EW={XXoKBicZVl~(=$d=Ki%R$RzWfN6MBuXGvBd* z<G#a)vd*_}w}k}yn+B>a&)(gp@8eZkC7U-qqQ-FW(M2;3`Df1*zklZn3h39RrsmVH zOA*<jp<i(RypssY_wNp(rwt!WGkUjKXQr@cq^4H+Jt9j=SPTh~{neVCk@sYC(a9z2 zql?!E+Ui*4+Zx-Ng?{E%TG`}A1+(><=N@rA>&n|vN((ZK^e158aEX%!(e3TqAcP~N zsD)fSrsJr?70ksrCqQfN?!UR+JB>1o|H*>hqW$ZC^5UWg|NIG7(IQMr%qN2Ac#Bfq zR2}2-h6k;pZG=$H>g&Tz^HoZ&>9_2jpFb<XQ7Uj4+YgjQCwl|-8&|Zo$<JTCN(0e6 zhVr+cx^1ohNL&DU%=!=GB*=^yp@OKO6Uir(+Q=%-y~+{#MU6XJSXiXbvGCdKNIedw zh{;if!nY?+<e24H^oUPyEtLsOPRU)>@U4lila!>O;BL({Z45pvOcibw`i^Ino15e} ze^c8JfzEpB3n!xO*w}q7`T3>uVp`gAUcL$ZJ#Af-`LW@^;-QqaOw+qoi4`8#Xb+uS zHd*2@di1K6(tc#}FhHK=nR8pB5Q^y>cy$Es?^<Q<k{F@G&1HRK!!P&EIv2gf<H|}I z{7&HXX(n3(6n+{RI@JqZiDuPbX~E0g3Q%x$Me>8!O-svf15c|T`96w>ijdW~OoxsH zWQwSGF5~Ivg|()3lU4gp)5yon2npSq-9$CMwy|_ZM7XJ~)wgACa2x&QxGzg6tiMOM z*dFiu9k^#bC%f<4VfFHVqDQ=C;J*?S__FTj{<Sail@{jhde`L)bQyXsSWEOb6s}B; zjnQaqBlYY0J<agCVm=<VBKpT3!H!m9l*j_pIGLpLSPW|E)-FF~cQb}O9;qCtmY7#Q z=%RUy*Y{O<@3|Pqi8o|>g;^Hn041iseQUfl-6OF+`x!KI#Cr=(cBWt9EVwr|U=?X| z?Z7oWI5?oCq!*4AnXC~<G~!>kVF*CDJ_5$ZjSt%mXDw?ND1Hz|W<1rITWcaHBO?P# z;Qw@JhNH&eGhl8c{Tc1s^YMV`^~>q%Kihx#o7J1j#Km3wkbSJ9F*JLu`M%AdyvEk- z&gLv-#cdAxA5Wb=mpJU=!d6_cPf{^&EpuL6^A&p7l9L*Df49)a#2$Il+VUa!rB^~G zpLmw?sY`zEtb4iIB*Pj0vtKAsemxZl(T0spmeV8SWJV4Jfy%2UlYhp>;g#j%>AC%y zewv!5f#^#Dqlb0N7sE%NYmlEHHa>`UczJdCSooz!34P9cUOK3rQdU;hD!RvINb&j1 zGq;GzZch=Olr$wSN&UbyKMq2HXXUGzMOU~+&(m9CYPS40&}~MqjQPGfcST`gWobMu zt*pl?7c&Lj75E5!>egcur5Vq7qPQ&2$MLy_G$>D`b!0Rr321q%Mp0(B!(;Wo7TH-2 z@Gy@^2$!<lJ)8C<Vx@Eem&H~dBc_gINPSY@XFT@8-)F+wG}SjJ;RajTI-h`2%>F}% zL|@)jirTLiy!YNv%W)p9Q@fesCn!AZp#_C;2W}a{Q>w9%i04G7xWP7WWo|?mwtbI@ z!@Pw)#}aW<+0HXJs92<U9)-gS#U5r|gdG@IcNjTHY^^WoTsNcKyO$^jB_y6hS4<2f z!2TeHpoOCeuoiSwp3k_#iAxTAtBXqG|1+!Q(7PNDaxU=C#wT<#aj_RaFo(@Fw!S-x zPxAhovU1kJ81)1(@6l&MyR@{LdVbn{&hAOeQZ35jPv6{p>fku1c$rFIc-X<wp-JG6 z%>{3D?v~i{{WPAQe`W3`>%GlW_3$X$*MA0x`_=5%x;HqahZ^LsJzvq8m%J(<B=otf zp5e546!!_WFRgXPf=4ec?W+FuD{5FN<^bK1FLlY0P+MWkz`i0i`Qt7dRU3ki$gEZ_ zH#BX+w(?lFAgo!)OmJfT{*J)FQ-7vX%1W4^wk_PeC3Wtnx%t=hl?5>&t0O(WzVFUF zh+X?yKW1)Cr*U7n`{GZ@&OLpy(fcW5w?dJpZDb!kzH}k+)gAqmv^0))$rEE^<om^L zjcIr`>js5wPH28}sgClGK7Pn5ob$vt)wsskAd6Y&S%sRF)(0KtLu)7x3GifBUrwXc z1->nT^{rdOT~+P7Fj0YM0{~|UUxyUfP%s(9phY2U3XU&Qo6E+0dIb;T;u!Fn2qPl2 z%^*sBhesF}H)x-qy@@()<L@<81Ge_|#y~w~99RDQxqWofjcrAPAT^p1=UmN;+3`BH zJKEU3zq%ipSx`_g#3|<H9joh2%x89|Pb(5n)x1s<72~I^K-!}@uCGU3vbt)rx_m{- zk^4~ma}sv?#)RYJ%7^utm_CLI7M?k1o1$yN311tY2!11QQ8Qdvfgsx#O$syHONP}C zwLfk;rY>tD%pT_!_v{%l7=$yKfk*Gtva=k=u`Ta@`~FS4(Cq}6RBUV~U=A93DTQz$ zs~nJly`z7yf7Q>Qc0{qTou0clv9OW-DBGi|zMFdH7SC+wj(Pg{(CdxvF8KZ{%E7>Z zPyFmPQ=3rS+lJS#zmv50Z2+f8p6s|^|4GT%yYLx+P9U&v?~UyaPEbN{nWc7pgBq`; z@NWMO(Bakx4wdymj0s-fi?cFaDM==#ru{Hn1N912TQ7CgBd}>aJHjt_F^>Flg5PT{ z-N!l^q*c^i3Q1Rp>5Rxh>++s2OiUYZSw#8yL!U5&aWo~&VoZ_r;>9)yOP~*BQ(tH1 z>CNQJgrdz{C3|o6y+8qAieUC#)xRb=(wGWeA7-)0Chi4|5#%E1e4D$wgVniHQd51u ze36H85bSPQ%%>54+|=Ez496iMvj#R+)@?pA()bPj(d=<v1i(?*V60gqSY!P7iLm&Y zGpsRnwuw{j7ZT_0Vb*k~v^&^L_vFzKmE;bs$jKR1Jw>vMo}OpgT8%ndeGP5+<s~Jx zKIR#<{d$DTSS>mbBi!+fj5~SnU(`2+F<-a<5?;EUL$dMLgL>xX1zE|vv@en~Sy_G5 zfA&=EZOic+YrcZo91L>S=OESlaf$zzLn$Z{N#HTwVBTrPUM)u#K4JK>J|BuZ`|eRa z=dN#c!JIvjyO2_%k)@|1tF?=q;{Yco4`#=anqdmio|P^TQoQ%4@(UI#WT)>5&u`4K zuJAn*i^NsC-^*KIY`pT%*Y9bDs*U9#w{7^j10FH&+*y>>?cl^f-(-AS@ofOPzPx<9 zsPOxtzjrjEpZxsYbbjJ`Wvzm7cDEb%!98fI6)&~i*#4YHZNB)Bdkuq4X$5L|xagju zmRe@TV}(vSbal(r+PcAOHw9tI(Cfa&OGNESNa$IlK+0~Q1<vHS2*n%KEao|Z=u2`i zbTBnF#kvt{o*$1qw0rk%qAenBXyj_ewpe7YthQBx<%fyqZ}&AT2#;|7{)m{VXld~K znm>2Y_}jN{uhTOMGg}Sd>$(nl521cIV4{1CbqaFIS0J}??#h3#<^(4Nn75&7q+w!G zxqX`x>$P$Y!$~l|SrJkUO9}APF<Zb$27=_*uV42;6+Sdj9R%adJG6RhOZi*3Ah53- zEnNNGa_`%}g0V(N3D6z&tP6w9Tp21tLXx}M!>~+H?wKh(y({=<;=)UfW{aEUO(!D( zRIR==lA)luV`GuxSo_cVW7&xSS;2I?es>p=v_tId$N-B&E_yN?N@3+Va=-C7%)<3d zXbvMOB7tV2SQ!n@>HlP^E-tR{k1aR}a1P61?@6VTMw->fC?aV*1QVbJ#{C6?$`I{P zKRkta^qiEAbO$NB%SX<byRJ=$KYnmwXONPT_EmLR-3OAq#-HXG*OyJ|tUxh`Lyo=R z3LBncr4xooLxN)Vqu-cneuTsW+bKU#cF&7xX0ngq+@tpga&{NSd1yy#k&O*s(pQBm zHK~d?cR@;`LqZNz_eA_I9NGS3nJ6g0xRg_I>Cf(_%*U{2<l+i|PzBDN9^d)9P>T|$ zGGZ^uW~uvXla9aB`!Mf&!<7@eb_jKN^85E;L>|#%m(3t(NuZVFemSdE+I6<`M_V(| zHbJ|PrIc5;HhmVfwl^o>QrJQO%8=)fuW4v%Qe1C`y0!t=0EqQE*^&o=6yr94%Y=No zx|*gYM{S-j))x*0ZzOfrKj9rjY7F9kqa!&~f&VM1I8yRkdTd9~IK#Ru2NeuRFe;Sj z>LRzk&DPU;>qY0vuXLRUrLI{Hw)DaBd9V1d?~jO4(6yk5$&y{ztKY%Q6>Ij|#3Iw< z*fHY@+{Uy@n)^ymJ%@*b-GV)#fIc)tj1v*c0Y}4dIoUWO+8#oFgkX$}d=3hIobML* z^eM>oA&(m#PngHu=fJ(rMsN@uEn3MD>!lV9Z3qG+kPp7Tu^vDcLZ8c6R@+m3Y9&E3 zC_+2ucHx(yV7z&XlP9&GBsLCr>hKwaPbG;aTu5>Kcs(J&Z6RGPz4m+k39#H+^E3>L z|6iqzs4ph){F~Eq?i)i{es%e9p6cyQ1QQgK_P75epbF<**__O2B(&tP=`{vRQ|9T) zKh|*0m937mGqVM6ET+nYjyQ(6#Iyvp@MxC=r(U%CyxX{3r21%Bcbrm0+>ZVTezu#e zY)kA9LoSe!Kcf2bg`T1N#Qis4Upp&h7rpzvc6)rO<{p*Mctne%d*iFo3f<A?9cJ|L z9Wys9O5SE?Q%OqZ`yc$*fn8e;LG4v_^^ZeFx*j(U!qJTqW7cJ?oU0ldB-{4w@tK{Q zJGvTfQJoK58Dq)OlAD+ZR)jE!!X!GABM)GF)30B<`1$$4V1fEml|RDT$jA%1I3OKV z+&*G>=0GPUoLUbNf1D3KsWWBuw(nmq0ldQ51SgFh*gHgad2L-?g+ij+BahN0)%7-y z%|i(u(<>pzOG!!hNeBkFXId*xPKD9Zo|bdlDQ;9;xLZI@j-K(4LfPZ=KDTQaTx@2v zj561CR%1E|j%T9U4J~y&I4<m$wGQ1CS;6Mb!?sPh_bL*nYQKM%b8ryGz~rW(p}_F7 z+@Ay3Q9Ix`PtSZ<9?_}&hjI=dm0J?8si@da&Ei5IuOHt>v4S)=FLcp2+?fLdPY1Om zKT5tnR;Q4?*mR&b-(s$?jOESxdegZvrLOd1hNOJ!qhkEjPoJKrE;Ue8OHJ=hV4Ql! zlifBya7{P$=sxnl=04!@R2bUrJF>s%Zrb$eFUkXF`S_?TMHo;_Hz%Z>EM0Mff6MHJ z=jS|_VYzWZP3`BW8*wsMjV3e%)YQHj+E8EN%<<^JMLz(kA8=W1jSrHJ2?tC55Dp8O zdWFO*m_+GOu>*$4yAVXyH+Rp)dI%Ief~D}oA^+S*So-x};-d>XO|$Wuv*hDuHS!pC zQTcg;E`&M-$N?(^aXfSsU~~|ElUEJ0#vZ&;F>6bW_gMbncW=pH#`?^h<QZZAzHq}w z!l#oen<Mx2a_`(}dB=t{r<9pI#q`h2gpbJ9g|=#sywQi#Io3s^EYEIS&enpz;oZAi z(x(n9&-(P5of$ba^6Is0PJ=PKV4Wi~IeJ8Jivn@Qz()Q>ULGAPDcnWRv+oyo4|IVE zq}!c$^XA=~(pEyEg2{h=vz`$X@2|a}(DeHURcTmgY}aY1KEsBv#<U*7OO5RWI~*-6 zbJH$mlRUlX#-O6iT2#vX!A<J5omiCkj{8y+s#CT_6yI}Wbuu;HA|`;U)ITf6$jaDi zCtak^tX2QS4NFydO}Dat`T4V70z@$>-goE_DW2Ql%kMDPBEar5j8w~RQk$DgWrMw2 zn@bWmR6|%c{v7o3wq2@s8sYDT)q~r{zcx-@Uj3^dBpDt*ehjJ4m-K6Cv$e-V@t7?e z?BNAeF*wJ1aL>Ogk?2d+2=NQ-%D3^Bf7Oq-xa}dbdIr6zr5+-C1Mx+^P`sWfA<bAG zxqAj*_RND-VQy~j^C@b!%d>{?%W{K<GLg&JKQ<Nsdv`xYMaA<@PK&+=dv)d*v<yNY zcIy0EUNH>2tYBhz^o3fI&Ci@b!3#Po4h(^jHSAkqVcir?dDny(qc5GXTd;!~(H{@; z)PDL?q6S)VauFfkU<zOdl@HEsyImRzqgRq}#a--?g~$GTKk(=vG?s{i;>vSmm0KeD zT-~udl+k?`%sq&$l!36_=Ze|k22Vo^o}OX*!cqC_mjm99psK^Q3o%DBmZh4mgsLa) zYoK%Z>+FPYC7qI^^_;iFE-9!H%%#J(a_rRAH6HR00KW61&&mF{<79x(RDaiKv`kUL z2h2}cZY=L~U+FDltID_TT+tiQWmsuIV(mXiODoF$z86)NM#V6RID~P){rfAiG+jDS zRocQKi3m{25r1kyv&ZL=bgYKug#23;*GU2YY9mxw18B0g3CrJRq$1r*Vk~`UD995p z2byk>guE2lDxq2o5Zs=f+qe3^TmX?cO1dC9H_`W6@3;ommde&7-M5N+`6n22LG~rQ z9LdSa>laHQPe0}7_d{EkB3cKWq_~h*CyR1x_|#1-JRm)>-CSQWEhLTjP8#0d-a(!a z=7*7giQ^3zy3v#GwToAfc|qGNe1sCDuUY`C5C_A#!N0MtB+v!|mowsL_zJ8>Zh0N- zVK^wNDJtRgSKwp!o$adS7cLm@9I_Lu(l$aO$}uSsX1LWZMU^UM3qF^Ghi!DU;>C-e zIXMg2pAgBtU7xS!rgK}A`rWC4YocEzHHBS^5<xn2gApXYzRnZZr_}jxtUd8cfHu;< zY96~Opyl7r{9&w=6>P(~oHP#-76TTy*?!X6h6Z_{v0z(O+{!UK*o*LkGxug$+btJg z_U3@?L;Nq1?5byPq#NU7S&pKl0@ACkIhHMfj4Q$d0@5gfpDMFM+5-J}`OSBe1NZDY z3)Q)IN7g+T5x)h$ce)^-8s-OkJv>HdmZyI@*Yg!EO?G<!4R(NjdSJZeEpD|cl5#tL zn?0qCw|+cGy>ooP-b!#>>Nv+%acU|F;&H(8-EF&>8DHEt)?YZZB%Qqi@?_-?ztEQ@ zB}@`Wsq-ytF7U-17dm_3{_guj;-Mz;7|6o*5?;muFhMPuN%Hyc>7y1-di$0F%Rae1 zVYixt&E4+&f<e;Ijcp+D^pW4Y4d7Ur-TMm9BQ{kpq#sw+d}$mHRLU0rw3W3q=NGfN zt@L3iJoTbtVvY+7J9Jd#Bh(Vio4;S!+m1C1{W{w`a9|tZ+zK!TqT2zTU|AC4-lWyt z`>Q*1yDAPv1yX@qh`CCxVuKa2%~yVZKwM;1J3z2SBjjCegmDWq<v+>-w-rIKxxg?u z`*!(;@<c4oo<TgT0&rDg>AHe^E~kNJLFORN1a6f}q8Kkcso+9%!>8jxsD@jkFN!gV z5(&f}^r5|NJ)4okTy{`m&YNSlFNt(+@vO~Y$N`%dX=!G1RidX__St2cbt!M@>*@v( zcEVut6|`=UPS+@T+#^Ty!xPhKwm6gwha_Bvu6Exk*_rUrZ`IeuC_W}GQR&^nle3Y& zCJzvd@DOR_vny`?)dRbOY#{ankMc#yD<-gMPn|l|KCA7uw1=xmlpKyK%l#i%ASd50 zv7MUNS?831z;@gd5Rl^NImXBS*o`ymXaxPmzLbUXL$kK)(S!TQcGq*4I=*UeZV{Yl zWxJet_4#xe3KiRb<JX5qM)n(>4G4b}vpKt8?b?$(Ye#l)#3~NVH?_9P2g8NoD3<`a zz*PYXr@r50d#Na8*yxg8Co4A2-qEcUdH>8386HNk9aKD<7`mK54a!e}`-V6+IzYz4 z{;E7ZE`>7bbCbWEwh8lA!g3SYFP`J(*9r<9v*!1XhUUkJcK7rgjjYGF_%INshV0Mf zsjYRob6aDLG5T&6iOxm7cXS+-EN(40H%TpwPfXaZ%$pL*`?BNJB6XKOR9jIzmUP*R zh+|>_TADw?)=@2Q)*a=|>p5Qc#Y-ls4})`#qNv-|OPd>OgdBoVRNIZ3imI}zYL~Ol z%uRgwU`zgo-}48$hd@0fFf_-1j(z0!fd?bHt6F7K#Y8E)Lh&Z6i1-uY*`BeaT0Xo^ zOViuTE9IzP&%yFG$f>`hrNw8WE$jHXa~>^KdD9~ibTGM6Dft6SNncK-N0l#SAoDYl zU^}ymk&blHX|d{QbTsXa^^G8x)4e*MbA1A5(1XCmco2OGgPNtq{gWfS4)fxMZANLL zQi6gzMDuAJ9JM_!O?j1UbbjZapa1IxhpprTYQai1qa|V7C;2~jd3Z4Ru}B3+4Mm-Z zYrGU-V@1*kKGT$k>gJD>q@?X_Sq2<<X0b&0h^oZqqu)z?%gbj3?;WmvVq!C{Viu7O zUiSWhwI1hQV$P5Gclqc7ie1qY^HVoR9~P~Ot6B2znCG{S9GDoSFkmt0&McwC0S+2c zaA@f9ja%YJOY8jRJB<pfmmD(6w{37PT2hT*j0=eTf}vsmn*ggG!9Bbn$H$46SUWfz ze91!tKcyE47nyre&U#mi5yyMOy=i6Qf=g{46H4f6YTEW&g&FHn^kaLg;Cs`Xt-WW( zsdk(q!2saZtHF<VM&J6N?t9J{e~OQ(23c)hRg3jmrNIlm&;5X$Z2sFU3ws*oulcwv zJF_Z(I!9Gh-)&wXa<?<)e1HV5=<BNlha1J2WV|?JLNnXc*%}Bh>Tbm{Ph_F0=--eN zq(y@xX+tfQNc<x4PBJTy&%UQ9ms>ZtwBT2kcn&V}#8&C(2!P-Ee9|XhZN524-6&nr zpBX1VaUI+PUOn=iJYT+?X^xhZkSHIvv%T57T~?N7Yv5YjsVhPFaRWvJA{pV|U`lBC z`glxzz+A?5-3mk7zDeP&M*qxZsr%z>za>^uZ*&%BE?b+MdtKp_#oIY{T%@!;0nFZj zJ0*hX`Z16uOho2B2n6#OJ9`!0?H!<k9xM29h>?kd$?wJ$BxEvr44-N6uxCcSM!1io z3BGDzfWV=>$<vqgMdmhw61R3pOH1Dy?Qv$M3lb0)cTpX1onNrd7D#qtT>h<`oszN} z-T!Mu3S=HQbjYu4bH<=T*@&-WBO;7vcPDF5W_}$`)y$p(U)YwS9F~1#BX#_0L?Mcp zN9S1|YVmvt^;kECJS}T6s`Yg8ANK7pwEb-;+uzta)6M^A>5-F&63P)0%_v^bL4~?C zy;OF=>GGmvfQ`ODhW<TsxxWrUjQ|_FKixk7%?6y9Z087=iBtW1Ap$Kq5op_<cZxWZ zwD`O4S%`qDS$@F$Wx5Wg%%YA+vYfLu88$&)#v$a)(ZgeCXUun>w?Pvxv#da(CJsRN ze?bN+G`)yOEwKBy2WjA~A??-{7O?NrdJ>!fKmZXbBq*13=6ZTE(g}lDFF1Gv%9rLB zSb3stmX}vJB`hI4GrEeM#VkG_me5W`PA(0BD5kcaO-)yzC*6x)Nr|sCH__r^!Y;c) zM!Z5e@yP32G5!46+|<^Ve|t{yT9m8Z6IIyp{cLXjSLFoCNxP*8L=UX{C{9U;@4a=* zzLjU+{)iUV@^jnZ66K;V0jt8hE90jAIaN0~KF~1JU5+&j-v`T&W57MrF2`3Q``296 ztmi_Y^?pgO9p3v2PVbA(=dL(3|D(Cf8)4{rrK$HhZJtPdnec&quY-f*&9-U%_9F$f zZc;2EAt6Egdv$(f6!-ngu=phy-=6SX{&!n1si)$@?0G@VXL0|&c=u^9T+6+qtGuG4 zTS|JI6-e*NFq>O@lr5*gIp0G~NGQj(Xw${S$Y@7LgyqoC$RDxb)q86X>qm@&x}KbH z%^0i7*W!^kk!8EAe<pXNTI7YcGG^L?kOlPJJp)2@N!r9=(IcM=za4(xy6)=c#wcpt z&8lYzqPd}oiSTd-{IUFz{|pW<qC5|RjJ_ls+5vAypXd}?Utd4Oubr{^ppO*~27Py- zJt<<3iEZHJ?HwKygT?$W3x_qyw%L0UD36aJ>X`^!Mma)0_g&GXFM2SG^;z+$HYczI z+%g?S!yyd}|90^UT|O@$1Z{`T6^FQxNd3CFxVSXgyxcoOh^N9O^8Ys4LHn3!L(pp9 z(ftq}_KscJQ<`kgUKu2;EFY7?L2(M7--h3V;_4GJOLhhXgXYANMp!b77|$9NvdW3p z9R!IVxvcvb4+duk3X;k009B1}nD5nJxx8@Yve9u%U3#uk&4A2lzF8l)?l(np!7D2( z{XbrX%A~0GH*PJB?oNxp#(5Crq;Kuc#l^+Y?;OqvwBpSZ$-CEAzVoKwQ&bAC3$Aa+ z>5Az>R8%ypk?XFf0m`@+_$Et>i^>m;^@@hbUx3AI#QuosI(^rYW07@Xz%DH>ilAl` zm>wS6%@;>O?Hp?AYNbD?ucc1L=T~f*mHUfP+<^?Oh6FP;z&Mh`M!)#@o^FnYa?wzC z@3Oy}yLnrC<Cacva2yx_en$&%kqJo;2s;oM?nn<I1|y!AQj8$-_+kGnI4FnW+xPDR zXw^48H}40*rjvw#jjLSkk#GiV5-k={ry?x=QC}-QATh~@)*P(Be$sQx+o!t=y^-5} z3?YP{s+Uj&u-%W~O0-a=R=wMyS8}6mNoOI$A~`j#r@6h|A9uRy$vj7kyif^;U65xH z4PT-DP9GUh#*0+Az5GMY+x1_{ZhdMU-`3k3O3{1cA?LMSRFU3cef!khBExuSaLheJ z2j=y@>69f!hi^poelj^3gxDG1ytxg;!bhCfa*h}AIxwtUxp5TeZuz14t5>z9gH<@h zou|5U`(kJ6Xjn4ZA?%PrH2970i*A%ZVMsaGx0BlISrwZIImpJ)A6x}K^tzVw)PZOA zfx|c>XXRFxtWZ?ePKDnT6fxsY)8kWsQyW;H0#Z_!gIx<;vGFSFn=PtGpdiW3+?7v< z2{Dl>EL$H12wX1c74PwDLgWD0_Z>MB2*7XKc`zYMSI18h$1m8HvbuCY@cr*vCF^z# zuHBI8LZ6H(P8ygKyUBvhMhl)EsLzZTDS<*Ed*r^myA%;Eg|Ru<X8i#i2}G1J4!9rf z?PRcWhQ#4G8yg`cT}JZKj&$`sFwr)yd7PA+>v(w%d1XiIB8lw78T+ZyY9>9AL%(nQ z7HV)67%0ZOzBO{IN+?t&=><{eWa{gNF%)8zFpI5|!M7ea^c775QsC0d+~`ScbUer- za)W-0XMNnY<HI&+%OFy&ZaY-!d+Hh)-dx{{zLo@T^133wgFS5aGD%mE-gmZA=JORj zoxMp~#1ZrN-%@{^P1z5B8#;!g(nF8`*!^hhO`~a~HI?lg)O%^4<ZE%_#EH93w(N8X zfSU@OraB`E!q1AI8JP9<`|+cLsMpc<q9Pm`8GiZx^*+?sH`z|5CL1mO`$u%0pI$yM zumP8Ds^7W!7w-(O3d*r7oMD<_elYe39)Efl>>tnify%ZTXIis-_vO)ZTjYE(K@h`9 z&c(;Y6;Ebm(Bi;`sL{r|;^rT@a!g63)0$xzxC2ud2Pdb7wbjQ|k53_@6_ZA<y+1({ zw_W{v2hf0wrJt|wF@An(BHkWT%YC%8yD@Yk^N~5`xCvdUEL19!Q&VY@8a#Bzg@g{^ zHteijddpw72eb<GkNeC5{;5rZ+h1X7iy?&Q%$kA!vh~buKR`V=z<!vmwPwr+-Ju(o zpB@?Utzo&Zm!+BgU)LyW?LLiAkn`D2XuR5)OPLJ2DzB)k?ZPvM+akmhgKrlMD(dRU z_2>@i?##<vRKF-fh7+!DVFl3dLnIF(STks2Z7FN<;}cpnhsbXXc!byhWW98cF&pvE zmZd*(L<S0;(#;VIvTD3HHJI~l^VE9yGh0n&nNQuJLDP+zlDfhwh=FKB|Bbhpj^#{E z4h6rWW|4#R=-!Ty?XfaR=kwSYR(w`uxkqq#>^ipn($`CWmAfnReY~qpcngnqxtvc| zfBEA5wwFBNH^x7JcU!>22V`E;)@dRXvjbu{0o95u^1Y9iI>TLNz#c-`=AefYfi`&3 zcsrF9zqhOJ9Dg^^Rq<Qe*si@R=LPc{G=gVb7m<6EP4)q%pTU@B<9WiX4e2^`ptxWW zqh0aQ<MV^>Cf*RHGi2yGw>_QHLLrF12k=drJ9=EMG}4(3))}P8f&KkERxuA6czi&3 zL(^@PHYm7(Y4r;H1!8sw3*i9!ncRPE4kZy#tK8ecY-eX*{$D3Vhk_%h^xXc46kkjq zxR33@-Tw+J88tn+JV+e_AS~IBIc{I}p*(VVnU_i+T_Xh^^lWkXTl66xOxDry^yPT* z-RMM5J!8n<xr?jlB3&>V`j@X>(tMDVQQh@t+TZRe<1TATy{Ys}T@pW%qx*xdsLwyR zv{Vw<P*?@K`%_RBqtTBkY0P^Ybdve(D*g1w-vk`=;DTg$;4|L3grAul!fXc_*-7Do zq$D2t@1a`yudbn=GV;vR@t`V<2h2dsw!8+5ID|D>_Y@K0SXF@o&mWU4kT?`IoI4`< z42B74a0XE`GzWrRtMYxxVW6v_feI8grg$cb{awz}-4%uQqsZxd#gUi$V;uDql%UEN zPs~hCR{eOTKtm_eV#$R{3^wbp-@YXhQBkk^``^biAv9P}ftA<RD)LW3J4?ypu`U2| z@+>&%%&Ls8Mn7hTO>Q0N#a-<}Vx`n$rkk%huTr6c6kS8qKx3lK;k<Pu$2~otzJ6+I z+r)8Hn+L;9|A5ERRf}Xphej?uPr1|BhJ?z-vULJ#CXW4@E;9l@z6`lf6+9n<(0YR1 zbjZMc<pk_F1A0Y8L<TTt!_9T{85PdQsxMW?1dr`U(Dgnu3+Asl($3gV?}bRG+%%G= zz~_{N#NMl^WC*{+1a;e!8x9R@rS)IG`Wrt{vQ)hl)J4bW`uFJ#?o^H0ow33lYfC){ z?5NH!)XBmVFR`QI#r0q!U$>uzp57nnTXdl26QKSatT*EJ^%C5Eta)S?`<GRBoRY90 zODhvkN=Y$oFis=VKmioO{zMLs6qzoh%%Oe+?cJqjEYJo9mV2qG2l21*iik*5uo$ph zur>x*)WB)ZU8pQA}8=K4=B+B&F&j^kx40qdI2){qsQ#8#K0%uaJGnkYkVZtQkBC zzfv&2KC61HUh6J>Kon2Q{nyS_t!=rpWHEY}UM$&hYkzO~&!DNgKmRV#%{Kk$@I+IH zZc_U1rN@E($GYqy-f`U)J~CiDNJC5GgK-_Y5kpJMy+9%Qn)#)C{EA5<#OhqW__9rq z>YocAepygJk7`LCW<($=`JUStJIg30=!kAB>|v<X>TT`O?9Q;4aYG47KW_Vn1}UH{ zyJ{gWBI3LF*vZXygrcCZ$g`f^LdDGZ|8KU#UhG4&O@yqhSd0hG#27p{?6#c+5d!yC zQetBCF&+@5U6`OSIFS1lHS+RgePh_Zn1=;V3skO>remg{qp=5-|E8zAQ8#u0Bc0#h z%UUw%K}`e?!^Gz9`m!y|8i_&9qvhWpj7i<sx_XZZ3E5xX`Hpv5sX5|1CQ<OCsD`7~ z-Koyg+sYACgaDH>fEkAVJjz?lyHAk|FcvyUa$IwGOY$#v@7NB`p6zU(G)ll1pn#ld z#7{;M(q8)D>^7c13m};EK^k?zkLswTBooF$RWq2%pxyp};XlmJkbJjIRceI|_Z--< zo<mG^H`xW|zRqcu8`_U-#M&pFEbZNBE50e9?H^K@|HO7dE?-j+fFm4=a0lM~w|X7y zAg|~u8QEoZXIFGyRZUG{;5Q#(0&!V5UwH79>NzifSp}ASz(lifHH~;;r~pw9(fADw zfu_R$z+>^}Pc^*~7g`k+mG&}^bHDG8G99Glnyoh=8LSOYuYnRlhA)PHjIs3yww|^i z+SYLTME^gvw_mo@qoLI4(wXZRYaAJtD(;|XU^w1w<;Wu9sk@W7X%PT3Y2Wu=48KsH z+N=JHRPw~<N!S?9fv-F%PDD6Xe5t9ijr53o?HwEt*b(L!h68LkdKg9jpQ(uxU#zSw z>-e_UKT=D7gefnsHdOS4L><GjR{)ZG-4-Yzv3!7hu%nO|ySty%{rr0E@XXAN-+9*a z*nb6jd_*4EL7J9-cb@X(^%4ggB_-;186G<CI+Fp8b1US~%)?7*A2YL*RZx!4OO>-( z>FLtY<)H}!U>JbsgK*ycprpR|aeH4-_03cC_uxN-!7B7S>eJZ)GrbZEafQ@+B*-+m zX?^RlwZj2p+<gTO!}|gKzmIGuqo&~48oAhd5U&jljep2vIo#G_g<?36&tpb#<OoCG z=maTWP%&3dbL#;x^a-{Qq9Gcdi(QBk{+<?P&WG=f>2?r^36s5LEX4PQUu9Tyv`?uN zm-t!F*dwer9b@9&?!bNZgt5mjJI`YlPfKU|V_#(Bxo3He<F|})G9wzR_IqQ?TaLZ6 z)Z6^32@zpn<DJ~y`JmCtBpdxEz_W*b*s9RQ9_2kwiNCLSNm<6h<gahK_q$Km$xFjj zlc{z-geF5vnXWRQcY{he0KnI7)UjkXg?d!EI+UP;e?mU_>#VFA(3fX{bPmF@m%aOo z=1xsb%`;+R{ZJavv#^i`RmUz67X5l<?o4uWaxQm<kUf{CnkbLa08U}Tr5Q~gGE$`~ zVC#W~DFE&``;p+Q<j$fqm!XzUM9Lkcqa*NCSYHu|2MR0?2;K}7Mg!?-36;&N=R$B? zn$q^3B+OCn?NCt?;6;%zJO7s`xmMR4JMC`WaXH}!Ht|55i3)M>Q3ZJ~x8K7lC>_D! zsmy-CN}m^4A59<2Hol;<R<3Fhxt>7x5?sc)kg0xPfT3x*nuiYQJY`63gxf-a?I4NM zWP8%mTB(%Kwug$z{6z{1o|$~ba%IylhQ{x-F1E4(*uN>%;U5%m{Qpq()lpfcYu|{3 zf=D+4l8PWAAq^rWsnU&vba#t@N=rxzs0fHicY`zt2uOE#cYoKOIp;m=TWiigbDSA? z_OtK%x_;>_Zv2oO*ajXe{zzpO<XaIbcpbpV_jUkf!sZ93W%kV40QH6U#n$1j6eK7g zi3#&p@&gVQv}!iU?erl~PF#|eb)_`sPc=Imgee&XEn|UH45rm<(`+AQKywN}1RC6z zXc!nX`-6HdzE?5#+J)0ozviGeB{k(W?66WHT|BU*!Udw$eW=frqgNXSuB@d%tM$b| zD5(W<6yUYT$oDZ>2pa|YZbFB75r&y84zQ@x4evm|6bhd@xFzvlr<Zt5)_A%1IE~*a zSM{WEpTesVKHV?qvb$@xX$r4=!}`c*BXlP|0nZ5R>-yH#!c8q-a&vJP*^}QPTWav0 z9j%53ycx9dQ6caos()4k-3;f4-+%E~R-XatwlnbK`9YBsP+uAEH$A4|WQXJD3G8z{ zfnu>2-VWm8rs9X;-rvaY-Mtb<jgE?1wXs}0cojLsoIzAvXY3Go>$#PqT4GocIa-Ds z6aCi<$nhYX457pgzHMtki&~1YA^}3acXsn9#P186Ru#UjNNyGXS>AK14a}Q>C>{T; z0m;hZHv<4K%B0!rGMS@neLIdKbENRs=@=QxhB?b0l%~nvCuS&dJXX)teussJ=e{3G zhPe&*Vprsn5Q-52_oxGO-Q-LFO642rrD*CWCoU*K4XWmt9Gq5|Md*2(Mx|e+F%B6) z>Auz(Jpi)eamZ@PJS*#cSkwD*GAkFYP4J|cZHJ9oP$P@qfi%YX+nT6>Cmq5&!mI_i zkZM00KraCwrYbMEoMkr^pA^_4ti}0>6S#TaG)%u%$RM22DrH<2LncA+7g&##ab!<n zyuR?}q!Pk9Th&YOsolM~HRe#4>&@sFr9`~5L*gN|dKDI$pJY%|Aw8W=d;9)l8>yn4 znw!8>z?T&>wu$ki+8PZA(3kuV|Ns4dpQ-fb^_y6d&-6d&uJ6wAx8_;Bv`|HAv+;{p zGyz9>q+N05{y1Cp2|`T2z~3L2Nh5&w7HC}e?9~Oa71pHF&&18}!NY9<ZxiyB^zb+> z!ase@{Y-mtmeXMsalM1f2ILK}_#osrx=9Idg+~RTi_hIwPbVfdpLfECX=cVZTmH{% z8uVEF=+KG}meQW#wB?U$Gc&07gV%0|6&yg{LQBrA$`52I-v<NJz80VYNSP1d$dDY5 zr4^6fX?O8k*uS9a1&028K=dW`)zk(*Y3OSDi`@nVU;4M`)!spqx9g)<=;`$jt!W>r zh1Q;>QS0ieEUgs8ZC8b&mj9yHuzNLvU#;Uo3B;$NMV+dx#+b*Cdm2`7TSFu)Z5M%| zrDX^ivxnA%0Q{{{v69<dyvnmXY$QvAk6#51eA-rriv*S-%?-~<g?12QJfUpJmMWst zIy4b__?=8V(TwtEb2f_TY-Ud{D!`L}`!yQ+o$%hiwU}gtfEqe3E}|Gm**nn*mj1=b z=)I$Z*uKwR@3h;`?7}ku?DnQA0rr6Ez-|o*yt~?#RG`w{7w{{x;P?A5$;@Cu4E1cM z&XbsubXUdl@tPQ$;8ERSyC(r<T>tE#+C!69+j_-Pdyocd&x2u;qn!?R05M+`!XtPZ zXEjmbWYJ}jsmubZiz!e^ChnKP`B_$Z)y~d-ZmxCvWR=g>kqRKL{@q6--(kQs>i;v2 zPi%tPs`}x-T7bak&y-QpUIYS)p**Ne&wGaqHY}LqvxNHHQlH%ctqO`=i8{MPOMeqF z42U6etheE#1YCWHqymRAjS=rXdIEpzg|O%D`Xh?%PJ>+YV7Bp#Sxr#uA|ubx(vW-) zs#O{U^1luZ?W_t*dv*te>+lzFp|2w%@L}47Nt&ZZmB*UoSLK>ZkJ8xHEa7|Ab^seG zD&B2wF<V+De;wR0qP_Lv4v|0FyE+is*auJ%76iHlS`}-C=63r4hnrM);dQ#bn{uJe zZeI8aK)ENh1fPq3M&pgbPYVbvTpha?atbYTU9=<4@*}!!-}vsfX*RX@Vx4Y|;=ZCI zM2$dUG-gB|0LxvmryAFx`}uW~erLk*;{s14<|#sox*qf-TOe1S0yQb3){>LE0qs=R zc@jebg#7yLo6*23F!=y8;aM@7e9i5?QC-cb|KP-Ks*Wrq^a?I6JJifg&$UI#x>;Bd zAcp`y(ALmAe}&%n%FA>-i6#m7&wsB{$;?E@!n%^!q}x|43PWiwhGH;8PL{D2VA$}1 zwgBV{zVPb9&-vz#l0N_{dwT~{t2Q-nrGIkV#=^Rxna?-=KXUqaW267lBWnl>H*gr1 zgJd`8n#LIz*d>gD4+h?07|#Ga@(20~wj`MH9;f!ei2Y#m1$rNyz%%U5*W7thcQU%E zn|QcY>i#P4QkO$1V`{3Q{GJp%N`SrJz;tY6PyUUt7d>!&HkVoo1`%L_w`aCVw+A0x z1T7|eS!*;MPW_?vr@I{_8+=^^Wj+1MyEfmX@!tNU?!P%tEfiK}*RS4B3}&;I?c+@L zH_C**n&$J<P0XlzG`&Xf=JCO|1R&aH+AjpNTduV2fdA$Fjjyoj(em+;14`HcwFmE8 z55YwK;nOF<Rg5C%ae?7%T^4jXIpjOGw<isW)(;;1K~+;@fuC)9a}$@4Fv_^Pr5J%K z25!IzFjQ(n6G;$7ON9OW#gAcpHlU!Ivau|&%eAnLDxJ-J;U@@^-Kglii9;|8ugBDb zr=`Om8zBd&C!)vQ=>t-nxw7$VIJf)Pa2q)liHXJ|QD{7`BiwqXr6wB!E9UKgr7Vdn z9mZ+!p@WnJ8CJcw{AfNG7ZU>;2e(?>z95{yAeRN;8w3!#?5nROQ;~iuE()s&r-SxO z!QkyLYFFOHl;i5Y1bh6{5^uGKt*k6IylrqK1YYFa|E_x5D^cu=KAeVtkr{~b_}VQW zeQk7xd<NuF1uF$q*}dsrWKTST-drZ0K&Q?FRk|m#qd9j$abP;g5Zm#5@>w|O8su}0 zct~^Z8|4~B76*WN`sTRLHC7C4xLb)!Ss)%fA~7Wx$OWNCK9TcMqvcO57-Ya40DwQT zR3IS7i~w{XPYkl%yE@@TdbA_U4a5vfT-@K(>T#-rgW0XEEl`bJ64?NY8Rljam#Ze- zBVVwPS5naITaC%JEIqT?w=dHn`&{+;+pRoXSP8ODT9B>vg(|AA^ykvD(!#>4@7f+q zZ>^+p**F9Af=5Z1rG^RZ%t63>c^>!2LRlg@FoRG%5n268$^;YUK;U@;IbhLfY-+sC zA#A5ZCX%hzl`I_mNTJHNw)*@LC=8)=3}57I8n*{jp!`WU`IB;Dy}r(q)*hi-PgDiE zOt@h}O;r<&gkac5VfiTY-rB0sL%5Y`L*7V5O^qH(n4Z$7mT5&^fYYeHvl9op>V^u8 z&50agmjL1OgNNJ!;O-5Qr~z6T@F9Is?$?fDSmk2En+faF5ic!+htio#tYGP#-QGg} z6&)Se;EqLk*P!uYTj=3KG1rKtp!NPOx*l$3Vw1oKwGWu!huD*uxOQ=efszm)LP5u+ z+Yc(^{3~nWiVb7HgeX{8pU~-jAA7sp=d57kWM*QbjqQMU0+f~hfSt{NM-CC!+AaJh zhq!Dy1_n6Gyv~d7Dx_c(6#ABx-L~Zw;`JWGzdWtoC!_k-Fyf8|BUN9rmb&^im&4HU zHUwd}AOTws)tC>S9EMVNTzc6zvNYo~1pfWWK=P9{d!c5C048gAoEQK)fEBO0ydd7v zKOo1m<5uJ{ARp52Wkns0xIj!D5uX$Y9B)x^>GUqUh#mpq*Z)#sCljXrlBxLE7(ha% zl@Uj3<dv4Tr0AV;dhh<W**ZzgT@ADWw&C(P<q}fGeMM>i5Jrw%^aH?9=C;cud^B|x z8MqN?B(PGjxyW7HoPPz#EvQgkXG0(50muOK#bn?9r>3s0=~MmRFAQhC!w;>d_71d? z$U5MQNsR)#Tav<{fFe^AegvZMfim8%O5+hRP(W;LANW$3!{7K-SEoM_VFfrAFi!|Y z<jAk1Xt_8)kFQV(m=&bS1;DpI^8F?py+SXujM*H=p%|>8>u(Z8%Mzle$k>(w@qm6U zhB=M2w4<%P<FAN!VN3h@u^sc`?<gP2TDtX={EqIJhp8Vjedq`BKx_x9n=(kkvxSU3 zH|<U=pR-i-gZ0%qB}J79Zs}AgupKhBkZszs#a>%$P8TZt`V|%IdAZdGBLoxUBYwy; zq!!Q;pyGGE_Ve3jUj%aO24g*caZ-)nGKW6*Lg~52m74eAz)BhX9%-k5=L#YGgO-Uu zI>X=|nkL8@y{BU#Rup$&B~&f+F9rEHjtL6k#U&(f-@P69Q&tNdBDAh;pMzf2cEu(G z*~R_+(SSy}4KiccXO+4VS!*T%oIoBEf*1l5P)YYy0N8qfdjRG{3vX!vvx=J{{${w| z5gGG|!snraI5JrUg}0D;jj&pfjX8_h&A__Q!z4*+HJ1oyD9Eqjh?b>8-Z?=Cm{Dc{ z*0GE>pAGNY7IczAY(4eG#RU>o^U}g17_{bY)u48jfMCcsO@~KEWx80UB*=ED0o!GH z=jMVM3IP0T!{wMEt{6QzPX}oj|G}nB<Ug85d_Z}PP*y@acm79N#mixQQNIQ{0Z=o( z4-eH-^S%RZ%(4m3OQ}q?UYQ4!LgYn=1jt%}1e{jkctp?Z#g7e59q^5U72OXg7vbYZ z)XYqjC^HO!$_cY>&*=ctsrB_xnAOuN%ek*1_ZZHIBZDd_wr2!W1wa82U@!x+1U`D- z__94os(*BlbE#RC!BFE|1mbh?xdZ7Jmbrw``cWriaQi-!Lbw0-@-%W9p92oy#OsY6 zrfZBB_R?!Egn^@mic)-oQD{e8s;(TP6k%{Mgk%Dd^KC`fgTZd|#>3H!4@pV#?>FQB z5KjU*j7Sv_B;&7=VrP~US<(cGY{!8_rv_6L+-IgiN4l&F?V0-@h_EDbNlW0E0_X@J zU5L!d12-qkLGT6<>_=k-p!)gw!GMC?w7_7J^cMt+eL-|j56f==xCD4Ge1TKEPwqm1 zAU+=6>y(SVjJ)FF006QS6mG&Ag@^(Y60q*a%8FMNFV92Jn|lk4J&>)3aFKu-v$eei zks}N-1`4{#x>E(^TegSlTc>$107fy`Os-CFmZ!TtO{Sx&D_LY=z^PU$9_(+#4?QAV zNA%&T^9tD3J2qeQGx1?P08078+|vPxMO?ddvKBqQu#iOZDf=?l{du)|X``P9Md=dR zs)WC^GL<3j43&!_6mPVzxNB`aMVI%g%=dmQ2m$;Bo(y$dt8pwy=-cwSTzo@wdDInM zsOz!Ltqp0)J{P+wk37@wAW!=iqW(FXdRfh{3G@3{l{OIxF&z^NMhIH75T)HeI?K8z zaOojB%PUNNNSOrpBzugJyQBR3qF{4CUm#Q-T<)fH>VS1>*M{rk+_<^Krt4dovpkIt zsH$2~qpy*-X;UfB&N<Y{_7YBV_G1B^_75`Ec$ji|w&=FLcR53fel&wk{yM<sR}w&e z5XA<f_`igceG&_ZW?DgBJ^)d0fejQIXh`8C&MWBk%$c|6TXN(#B7ErT=Kdws!JB&$ z=21jIugxEpvytOgS)bK!j;NdWmiycdM#sl*f$B{Pz9sO-UMML+TxmGi0;eFU^xDmv z&0n6pLs~Il;#s-XF>n5&jvWl7K!{Lkm0CA}Je^m<Q)D;G1YD${Grb0oV``uf-1c6> z>Sy*(M8?Iy5lM@O^-T54FaQK>l4fpq>3-4I$<U2*NBk5*q_Kf5DWZl-^sp)>Xe9ve z9(F?)qkwT3s9rqETLL!Sp&v!nEG?$D-J}heZ*wyex9ADhFf~025WC%&QzE}$Iips3 zYr_aG`}FJ%?`d=hykgqx?Er#qJ1XT24FW<Md@c`ty46>!Bh&>_R0$%{XZ|HC`yE15 z?+}5mkG}Q+O@2?lbcmw1t&SDoYoN&iS=4(DNbzN0WVp@G;w~>V_mm_YK5O6};EZ8j zX@T!QbYdcuxsQlXBN$>U(i2P#F->ctf0YDeSH#n_ox#h}WRY9**2L$W71U`=3d#I| zYd<X+7`pD)tgo$Y{dt1x+c7`0(3$8EB%##TB&CaB&w%#77pHp=FDK>+yFXzID^s;r zXgU2}6gcT12Jz0FJEE{10gimTJtQRbkG+)AF0ikHsYmH>p4r*eFD>1H>6nCQxT~wH zdAQJ|2a=kzwMu6)L?El3jSY}x6qFknR{_9)C>cb@4*93>-^C{)@{f)ts+MCOH*~PK z7X>05hCTQPk*G`*VD0<>y|Cq_x`u{|NaWyP`w$oR9-0MU@A3PWWv}0y*Q|%qY$#HF zovst55U2`{%OKe{XL$w-QV8-DJoaOL4j&lEAqNIj|AXj)%nA97Sst3J3>rr@@xZ+G z%#}C9=TLx)jKW~6v{nM*%6d6_LFnq@<n+?k)^_9S=2zlj&8yGhSor!e-8stfcF$sb zd%m2!uSv2Q$^!`6yn+Da5RQlvD%o%^x9Sa0-)^<d?r)WG8CI#G5D1aPS5LH7NK$EH zE|-V!g3GC%aLYDh|8$QOW)1@>Cq{FDr>fMTreBjD_H8^8|MgKFa4Y9^E6{VwQvs8b z$F^rZ%1>FqWM7S3Ym?^(E>QAPH@aDcldpaQ$TA>s`I-*FAt{(kwCjOLIqCoa2X+@1 zdJ;e}&cMX<3-pYzr$TOmD=6S^N3|_fsb)&u<qr`MCD+ydL7mu%k)(i`(k-Q{I}tsy z38A58$QR!iR@S!|?*Q;GfLj(q_5nssg`RBq#gB%&y)j_0hSBKEGgOH;yakDBhL^hD zARlJlKcl0;U<_7VZCA+X%ZJ-wW(WojM9`9#pMM1eM=;mH9nhKhXnJumBi6ZVaW^6* zC44c(gIXbsvf*3{PH5)2FFz`REC<C4?n4+^0I0yN2PZIqJMoYbKxiPgb&7`$59<x` z@bZNWBslR*2u25TYl7aE@fJ;5QJTg?qCOF(dD1OZ$~vQ!Hh_i(650<jF>euR8TQCG zZh$Ue-hr>z`#Ys2#tV+!wz3tB7#JotZG5+SdXnzkDMMH6ZU7Dy5jEbV7L+zpmiMr6 zQ5t)M1yJhn153NnH-_QVPaI@9;Ya}|JbbLQ?L;7GjJ2)*WZBsBcMJ_Eh4cj`1K8iu z0=EMJ_txqwe!?J&Bmq0G4@vN%kdhD+=xKkc|Ds<wlvi4)H?I-N`nK(rI*79%w*7m~ z4@pgTifL!z#3S7eO-|tEze0Ajo_8SRcjG0Z3b<^DgBlUREZKW*Z9PW$q~{_jW!Lhl zMd2O%ZZCynlag?JMNtC9--y834Zlkxot&CyWkuQ7>}<q(4OcJly9gBv9qv%|t9rI( zBH~wBDF8R|_ClhKLir@PCIFez2WT4_PwJ{R-T`9T0_^<^fGCYHR84SbmhM6rharSD z%TAbEvLWPQ6Z}mbB{6MOUe>O+xw#A)KG3k%FxibDx^TfRt*ta}Z9TZJS9!y(gbXIo zl6O{ms<}z!jm~L)-m$Ma_-_r>(!A2Xf5S~sXuF!;2{WwLl?o`);DlfxV1PE<?uJ%v zu&TRW94|(E{D>YQ&9&+V^Z|7Kxq>}u8%{hVpa&3AfT+M~?h7AB&qIeD4>Ln6P6<Z~ zKTQ}skkY@?B%XqE<X_g%&@fc(@dzMkOj+3u@>*t?n_UH|kr)d2j#$S16a%!!l2>p{ zDE%+0yqugUEx}T`zO%E_8|JAmP{P7HI5gxcX{S)Y_qlJm%x2I_T1Hyzl`|74IR>1} zmtRR*y!{xJn94lyKcyo0n3#LJ7U^qD0IFtnkAjR6F&M1?8$+~?hy~WB_M8Mz1@XDl z7Lf}MP{1zy<k0(Zzz>M9e!e;a&#LKpp`(=9&tsv;1$u^uho?em`h-CxIQS9O9*FCn zh?fA{Uca~tkY7Y(<QtP@H%azhoY(IiJzQD4S^;v#=@#4#(fvk=g1_u+Ym4x|Jy6vQ zu>v@3HBPru+4U+zfENQV_O&K4Xfd;iyC%}sO#d%Y@O4L(5f*ZQmpMQ$xq06Q(=J`T z@0ZhPZ;7qW_o3w9aRE(-Gl|_Te{8({puF%~S_Ye@XNu=8!waPs+r1s^)8~hi?@CJ_ z-LApJz<2-`0bC|`Cy}xj1lk53Qz2RKI<RMBK9}d9I%Ry(=@f9N4P07143nt7C}7z_ z`5Y^mqs)@;u&6NRGU){+NO9X9Vqie&UYrFA?J*Gck>zbia}A0g8smo1oP-_+Sx4do zmyk$5veE_|g?Z}nC&qy+2`*U6wdJS?W(Y`%hnR+4k=e03M<`1OCsKkos%>wi!EAeP z3k|Rc2w>rOWoYQ9rsqxEeYQgW$#oS?p~~rvDR;Bc!^M3;vRk(Tq#49O7>;`NDk-<g zKQ!S@7}j7yMR3S3@2G#lN`%l5V`X-J?>#xmvP_x*sRjGrwLu4-L?Ijc`v8kVOptcD zJvuzUYrv7fx70x$f;#D7T_A(J7}wS8Qal0zv9d_0D+M_vo2KQe7@W2~m)?29AnBch zKtvRPxxkVH=PoY5Q7=JQ4Fi?Og!SU;M;ILGbku@@mX7a#Qg9y%o`IFXL*(Lb=;VD) zKv1B4w1FxfPnV}*>5uVlBI+plsioHWcDQLsXg}d7Q85M6L-G)2CViHVzeLmC{2d~D zVQ3hV7$^EP4K|4yuLrZXG2)(^qm{U)2OAA(9kJ=}H>*7k>0n0$VCl~N`vU^q4GmZS zs{=?*4)Zyir73gWrbGBo7)yZF>eh0kBqO5*ET>!elobR}5MPeidVnB-%ok!f|2`>M zVh4zMZXc7HnvS^|Xko)t%_As0Aq+cw52th=@fa)wyslHU%cAmP1zpf92GjkAk5Or{ z!fXE%E+$(bPcy9cjo#(XATMbAk*8@Zkn+?sJS+^U#s%pEs406a+KQhs1#iG(1erDL z>{H;-<Ap3UNc0VXN%pl&8gNR#-8$!g1UT5)J%;oz@HL30_P|`bmZ$`j4G85CM-B{q z*Yc~4J4j%~LzERz-vSIUNWkE6@w#kK0SyK`<`(E~3;`Jh))xUc%N>~ininVcx!K!4 z1b;Ka0fY7C@%>nkE6`K2tZSFvkVPyE5!WT17il$c<)9Ga_wO4Zy#_%+6I5@4UaRh< z9VnKoK3jA%mOuvG^iZE)T<?pa{lf-leUzJCUU?K0Z{oXNv7_8E<+>4{m^#>uG4AY4 z_N}jHWi3QNz`2e~#3$%zqTG-fIgzh#U*Ap6%{lVkJ_>fdJU^VCo%Ms!j*8D74ORrD zc5{@_Bkz^WjBDFokT>E9F(JIpYh*wYbJ&Qaf;6xJjyknm-2i}hoi`^!zcGYLfqhbo zl?0M6IZZ7s|Gr-j=SdzK5Q7(1-Y+GW=FIb)E4$8L(9zL!<rZZk#rDO!&D`sxas&jC z0r2{OBoosvhRo1#vXsHj$q7BS34sl(a*g5XLK`7@?Ztd<U~6g45eAn5WE#<mh|mCq z=Q@2^{aWwhklpSmqQSJhui(1}+?0sT_g`EFwtDyPP?v*{7K%dqMBv3+s2V8#YSFsX z`WmO{)pLh<Y>H3}a0XUYRk_{r0iFj`>j=yQi3{%OCUB8p-lU@a4K>ug0J#QU+jT@3 zWT-`jGoW7o!TUXDm_@&R@^Ev*Z!u4u)7(Bs4#vW6ktc3Xj|;jT?*8GX>Ib>Cc(e+e ziW%zlHv5M<vTERk$%|A+)Rdr?grgbUU|%aUDD{#qu@u4-U<V$e$a5O7=w>Qeotf>q zT31+1T<I@nnVogjm^v|$D*&~`&oA#5mA{W6J;#KNSzy(cEtkzGhJ^KfQ?c7`y>}_c zq$_<X%^tx^Tnpu|{znJ<N#)84_i8{GgScow0Hp|)R(4x>@ZGCUfXTpv^@T}*u!g!Y za2;B`p_<|*h-+YbKH5uFeDo6@<PYpfd8yYvC~zxs34Egy2K;+Z`$0Uy<%>rOoHH<3 zP{AI2_RABj6YkYdK-&g#8jv95Em?pdnsDZHE;Gt?cP_CNR*n*@(P!G)H(-oDn+_0} zA{Du8irnK<&FV*<9?M4{sRyRvq=DSbt}H!Xlq!-P3XD&f`hEF=Up>CS`UuXKSt*ed z{QQUq<Q5hdf?IW0r|ip-vpX?yG^kri?b+esVRu6N2DlDu&nES@dRl0vPl{LX@pd%z z3`}6ue8?S)s0XJltaPwMwid8NI@LR}=`1^*L_2ALa{_R+=jz(mK#T{&1v2x1w(B~G zKmmY)acEV?Lo>hHOW>!j7cowL{?Y@k#+&(M9104iUwZWCr%;|48j`uV7*=JNOmv%w z77m-PEL|HKzODL2v~`NMgot#u;m@;HEG&J;L0hZ4jfXC=H4VY+7LCxw^9aUp6XHn- zD{-GW%`TltIJD>rC{bzx6LAkj@VvKrMc~k;Ysd!nlSp}4IP}4S^2{y^74-|sxX?J* zE}B2Cs&U<qbJ2Rnnt{!9{d(IkSPAd2+<)^x={=|^4aR!v@xeF;mI>JdO~hk+F=KbO zLR$N)O^JECUW$e_b7(-~o^)~M0yt^_A~8*TIO%9t+(TiRFV=JB18=IWgF^%Cj~E!~ zB}w@uCAv--n*2!$agFlLaAJ)%l={8;t|6Sg@5}?=0K~Tebq~!zF&ca|0Kw~r^?K<6 z^uA(8ZpaXRVL<SeJ~gBB8P|gcqH@YNVCnyt?|kJ@0)|?>PsgbL>MUX8wNlO3S)M|f zOlK0b+h?)F!2Ci%UT=ac5;9SVI!RGSlbFb1cOf`ONa!#TY$b|<^+IWzJSnWF(on?I z(qBu3IQjdJUpOS#d~gmju;WU)XoZ?J9p)reZuQdWCX^mQY89x=oAV7@@Q8@ed`0u_ zY$wIUI4e4Bk0=m>^OvFVz=X!9#H_J|1eqn>#ombFQIUlJ*L=+%b?;!`05rm}Il6Cn zWp9uuMdgSG*?_c70_+oIMe0#Jyu8vOqoc!q4KuV1yhg*iTK8(gYh68ub)S%0)&AX| zD9P;kjNf0<|G=tG{6)VxH{g~)4%jY+;r#ynH?LU7wR`a6KcB8xsjpa?XqxJBv4U1G z2)X^3=cYj?VelI!s^<~U^_d<H>frFVEf`hA<iMDL;3I^@oVo6X6rpd+hIrvkh3;G2 z_~Cd&cB1M`a<R84@})*s$($o;DE%&xG{{(M_8gyWTIXdZBy35m5Zilsey}hPx`HBd zxFtFh?u};c#%Bq=MJdXCI4F`iIp2fBnn%68%N$%L2F$rVjUW0OzY@Fh8dX2`*|qKg zRc#ps$!?e@=54`@K4_!evQIgfZ?Slv%4eH*W_Bi{8s@8jnMeb=CTf%t>v051FaU|A zTCR4I%Sbs0QM_TUVE=wtN@A4}gm{8MuG$Ai8$?j+yYRA-&4^OW@5ysb-G6kH7v48+ z+?*PfoivAY37C!hR@hi@y_6&Ux@?uFE_{C!Lm=DzO{bBeR%;3OvCHtt2>)h+5uluK zg~MN<ID#1u#?#kJQNa9?dWT!kUOQzxmEBW0oW3k{nRsazvpiEnuD|pIHwn*t$v@!_ z25R7PXPLX8JL_u2sl#|-O#gVlis86ZaMp%<$*^I_YQ=zxp<EofjPzC1FX<>>2;H%7 z$Q_?w;e2_G`}Xy~NgPgD&HrivymYkNJ049QK79GA=F}_s&`q%YMqg90CR=i{j%o3q zk&&>%!iG26Lq&Ocv;cRrX-X>77j8WEE{5n^(PXxapI_x@0!RbJ#ib;oBBLK}4ugs` z*6-x)3ASbhEM8G%f)V~@{=w#*(4iqSvm+k;M27mfi5^s)D6>YV<%{0~gE_xTQhT0o zB|>)m8wa-I11*xQ{-1$iOd<~>ZEjKV>Kiur65o@?!lth-B08m)A|s~~U)$))98wp? zz4rMfE1gY7zrCRq+wFjWxT0bXUTb`E{pIC8Qwh3>$)do=78V#zkoEWHv@k{f?xbdR z%*<@l9eW~DBLZ{`w8)r*w_szh^_njAyl7e!+}~3wjM*%&+FTAY@rIBLD7T4XlAo=1 znV{!pbQ)MJqsITHC8|#ac!Ky_DFSK=1-qvl!{x(}u-yky|Ik}5qp)#S^cfEiFOEE0 z)#8Ki*9OqKniWL1zHdc8<o_Fpq$`2#fl9>NQ#HJgSdJ4+H>@P9O6^Y7FBa)MBD>!_ z_rm6N?sQ!<HhFuOlH51A!_?!)a&K2I7Z5$HIGRB+*#^>lMN`IzbH**~(`;G`j*$Qe zyv+)Tw6wkmysP__0nl{3So88q-%0+q%6{kX-}g_(Kt(BdzSc*Y9-&A#it>t{{%2QL z@}71DmwiXWI}Md*qAx62kMZ$6XQxDyLvgt6>;w%A{k~OEHQ_wk>dqfbIghi%Bqe%a zf5Jsy*ZNKE^;8t|c6L^(`OkaJpNqNuRtHnUJrzG}W^0u^{7I2sSlBlu=w0LeO}1~_ z_L26{7}TRD@>nMndMdtC%}V?B%^zm_-amh6TMy9CmPzp9&?2N83%(n}X|Zw`2AxP0 zMV~*U%Us8)@m&6iiaKfBey=^kqysWv`@)xh^xY5Ejw>dCq>STNn~#wCFHjak1O1Op z5usa<LsNCUkO+lf`7awV&V{wIRfEB%S);aMDR6J^{DS?4<K?TD(uZg;HDAZVN>J8! zGF!ZV|9(*lpWg|KaxV{bemtQ402dcV7Y?iI@W#e6lK^ufd~Hs|6p#n+FF`9GVPI4H zAZYpeH908&bapKHm=%)$ga<Ymz&a?coy^OwvTswn>kPV7KbTf;zkDeTttws=$3{c@ zdsBjs^_icfsv3GP;gLg41re!KB{UfZ1wG^8`iwR+>77`2<jVgkX`B82tE0b}cO^XN z6m)cy<;f_E3i#P4hllqjTvBvvTtGZ2Vjb8`(3`dlfV#X#Xy%*%D76Qy9>D91WS)+e zhC`-a?>DnGcb8b&Q9?ZAyGsGZ%N#u%KoKFu?p?k;EOA!rR-Sv?Qbz3UOhVjAX^&+= z0*#KAgUyn~f_&yeqd#a8fAX)3&5f5%%r|F0+WFh3xIJQ#n-A5tNYVt<cJ-TkdU@@i zVz%toUB$J9;1}rqJO*|dI(;A~n;HOPkP-sd`Gl3k(7@nfR%?x_hZ)T}vfq@KLm|mS zn|L(Igq~d_ndS@(Q6L0QT3W)s6oOv`_E|Cw^{MHNF0g4VtyG)^V<Jfd_qUC0O+QT3 zOrW!mLJqXiqOp?W&sNcrCr`wl%06xA>DgxKekQ8_O0&C!t~*9aLnV`@Po-Z`JNbQD z+I*Fs!+3=gt5!)!GyFT(R#O|g!Xlm?ytNRgD+<{tOvXvi$@!#F^j-lIb4*)@!`hsp zQ{CS7^Ke&~rj!&zP7W_O*XIPI?n9&R85-I#H*OLby!1V7|G4J9D}P=FJMz6g)q)|9 zZB`TEcGqL?on>aEy)rB%g$5=}rS?*I1*)p3Knsjm*_H2ZZhAtb_T7J;4+&h8grt-$ z@G_i`NWkszNysC{$9u2a&Fnb??Uv30jI^yp4}p`|H{?{w&@qMEBj0$JgvVy&w@HeR zv#;kQbOS1@sTJBx3ST|u;otymLj<^Bz=aS3q}!KgfNC}aZWSTT0C5!>#5fho*46u} zNOK2Bn*ssNgP$>0`HR3y7t|Hper3(%+Dz3<<$tpMjE(JDZn^vcuViiQOZNS3^g$5n z!w>M%H0IF{hx%W?-ZV`FFVie#WK~+!cQ``;3<TN{5fPIS@nBuQd7F(9XYuY=XH-<| zz>))=xnX;FtM?57hXapFWEI_UfolKZ))uljWi&_~z4W@;QZ2}bNBE>THrChE<tc-* zhsUg%+N1U3--3d?#Dondvj>)&Iz{hI#>f5;k=W~ZQcSo|jEfbr-wpKNvQ-5igX>&t z$j<n~w$<UZ>ZI?4%+j6R%&fGp385*O;&gbubRujsa#$iGLyUPc#p{AxQE2yX^p1{( z##3MtVHf$9o?fszt|P6K7VEganiSweN>7{j8dm$4ZfEueF->I3^_FI4FAv{U+PSze z3vu7_5xI<4WTK_5gTuGAz!=)cR$3M`lbpYBXdNfF8ts4+Qlr|P+hxoS6RJz&XXO^| zcR&O0nAhPr+%?D}gJ<COG&704>H^hg`2<@fW-*E(mQ71iU7ZX_dkXO8Rqb{Ou<BOD z{r)Y7ih9Fi(Y#pGORMZS+6HK$D#7Zd<@GPssb2LR2QZ+OAD2_H@dnAH^@d}jV?-n; zgarq8sC-I#UAG2FgrX7IpNp!LYvW8n74f@(>_udbwu%?f7gR}9J*M17H^cMRI@s^p zJ8^%o`51UzBQWr2pkD`XoyXa(UYqU<3s<z_*_kPo8m*NU+`s7Pd&$(}u{CQ+E?ePY zOpoZ^uu4hYe9Ay2BWL8MPIeEn3;&LH{$VH<x!KtGY;hy!QkQvDOYu`({{;2yXIgQ( zi2AQfX;_D@@KyG_;I#bY$($o?G<o3#`thiQ$o5l#Nm3(^m}|Xkw6^$5KlGa+L}01) z_Dw3mx~VBzcv@>G`mr^avz|3qu&!w<{!PwgluefKdQ$DZ_9CnAKG&<r&CIwvlNCj~ zIFvkKdlH;=($NXdD->vIGJ5Oc=s2~s^gcG0)Mea>6tHgO^n{w^cp5=Wrh^$_hlLw9 zRofU76BEd@ic3sH{KfBDj%P&pkEzMXAizdXnb8`az}WcMGV~|!Tdux|T?f1A&dx5c z=iUQ)`bC#F7)O{N;1R&S_@74rzTk+g&vUMUkH6F!Kkty1m#H>a*@r~^eVl#3i<ah3 z<ASl>^7EBF+@7zmcUF#;7M^#o=TlIjNlp&p=IVBuY-}t|gsvB9TK~+v{Vnf91VreC zR=(9t`?a(6a)5~F1JNycXCnqIcn~rSR1l(hL(t6N&C}-*7aT$UX!f%+f8L9im6Q^? z&7dW+u&5hZ1aGT9=NT^{824c(C7kzI^bmL||J3-<qY`~Mnf{F<_BCx(z(5$7nFwhp zyXzY;+eD(fVW-6j#aZ+8VFp((a^q{PITUBG(B{#8&&qw0{^7Ytx~d3|UcVVB%k2DV zU$=0zXiaq$6T2hl^BUlU;f&+d-Awk-94?maEO&57SzXPo%~8AuuJ4w<z9@msswfDj zga?5OcRGR_106!+wTEwz9|s+|<lj<OUnoLQ2{{$jr~YIlXi8g08#MG8ndN5i62K3K zd6RnTPs9@pY_=L%&!@5Jv&$Tns*b3rYEeKk6*v^~soKl2zoUzI-?}9YICFksapLq1 zwYS?lNgQA4%s+Xi>>Mm?mQJ)+{A7J&ZcY{$I&bLWQuMl3GZgH!rTu^Zl(}pcq4#o` zbE`^)<yHR(+S^}k%P&qFX@092@xI#5&XSeg<XP6d-s-?}YP{DDCd`2?Vfi&bZ%A2K zgk)#;m=|Mo&!$<P$KT^W&iVe6*41o_xN>9PpLQG-br*s+n7H{qLL$=+?!3d+)?-kM zfN;EOcS7KZ_29NnLRe|+VSn<E*L5nuD_n^elXU7lE?POxQK<X_mSKa{m~6}8ssKfi z(`aTF!8VKBYDow@glHfbbUWhF!I}rM#BWtqpCI4@E_2wlIpY#vWOBW)=<+9Fqeu-7 zZie@77YeBr6TBxNUr~;I64pFk0lq%>l8-Rx!}SY$OYQ3{DhpY(Ybm!;2Z`W1hOp{q z%G%#@g+Oj5?yAn)OLP~y|J2;xMsX&2URs>H)7@hk`ut-1??m;`!QN*xYe_y{>Dk{I z1Dt<GgO4}Hf1>_oW#h1SNbQ(NPVh$)J~))JFcO#a7PgR;$tx`qH+uOJCYtiGh>gH& zzr41QL*YSqTzq^)OhWU{(LBcUpb^gEs{IWuv1qX==ml}$EU+YJR!sVfjE_v&(%_Px zVd>gffkb*c2bWo&jUyT?EG$6r9D+RctT(E56+krV2J$f1{eHFUI5>>pmPUAm@$tKN z?jQ!(Paj=L(};S$TGoF*oB8p%1$xyeDB5ehPWP4<;nPLKNM_f}jI}A{INsR!1t<lk z2PW)8nL<h)Z3Wr==Hx>HDAoEtt7oOt6x7rMHYyagCgadZ{?Y7SfaP6Zi#L!)Z+~+R zunB$IQ6T)_3W8`soq6)EFc|Y5@x(xftgV0t$!4=8!N^Enb*shq&``c2qwB;qHGeBB z>3dDzXMU$G%)`@ia0u!Ao&M44mfFJ+He0iQj!$ynf=rA@WU4(^4`x*cm6ddq<N;<g z%QP#iEbsPwc*WP^15n{c!w-Kbd}9CXlm;WWGKhuICD7-nTl+T^0eF^7V3FYdIzy9t z={KnB5jr)c4_}|Hy(<1-2Y8j>&5VePYn`a}I0iDob^fColE%)-83oQGqIkLH2zsek zf`bLOI(Uy_{i2nlwf8)c39@Ms$#w>@SDTWeP=HL@FBo8bw3T+hdwO`dIaHi*!HfQ0 z{HtutdX3G=)@6IjP+$I>)$b?9d4{{aFo<y6Y0m`o%x~|nBY?jP>zc5Q1_SSooWd_` z8$bWi+v?TtebJ{rSG5F>e<uFn&Mm?x3b2!LaFmr6P5tc;2zU`VKSdj+qr>auNV~k* zqMY`%yFJKSOKXJc)^cHyQR~<zVG9ci9c@z=+q$&u(6WMus?<V3#hG{Ml$5RxCudrv z(vA<_{O7Ec1Ytv)c6?iqKQYEf6UAhHfVr8kW8I)*<Hk`V9n2C^x#H^vEk!tPVK48+ zWj#-Fz73+tJN&BR&bmDC7M<9cFq^=Sd+qwoD-eaXu^6Q&GM$-`G6UoeCtwrst=#=O z=V5BP^wp*rw1Dud|0{ryhOTTNA&{Z1>TIV2>^V^p5sx)BDIg=5)G0K$9%MP0%I#pU zy#lZ`j2?P;$J7*5VwuXi1(u+~0olrfabp?V#j|wfAIdC#2T}ZE+T+r(>4Z}>4?0t& zGQqSqJbWyW&;3OI<wKP(wX5qB3#i8zEBC5B)jT{L-1A>5T1H6vHT}VBrofTm<cyAT zoVK;HFm%$T?gilvnHJS2)*soUl|uc49~Ib1%UqEyunZLlE4wEPI1Frx52dSr@IRO6 z5B$;7KNZad6(Brne&}dmz5cM+diNf?*0X-ITqeMnU@<dVH0m4g%cg-#oPmuo^v{Q9 zes|u&-ZffcZ3yQd#*R>Is|!e`H8eE9@uvI7+oA+E7O=XLQ&U5ZFwi4%@OgoZ0jX#O zGF6>@GD|hP;=9FfQm`H&+a!od3cb(WNfgVDlkNeCP*I@^XDdYiV0?ZPbR5U>;AD)1 zggDZHRw`v3WvZYxpy)4G3<g`$HWha<x8UWk-KxUfTU57h9nW|BwBh<}J$YP%o<pWY ze6oAE%dC^&J^pH2o@ufvm?Q#v^@>YNYr0D%84T)r?Ry={N{aE}dTztKsc&ucE!I3# zlG9MxgU&%ncWQ-By7YA&aU;YD7iSHw%vUZAnMOnewPUfc+`EQzlM%jU%o!GjlToil zq1`Kp3Y{_SZMHs%rqjs1K-H{y*JV2*J}hv_?a#u-Ev@toR$DobLN47Jk&8J)XTd^4 z$zy9PE9jnormFfD0<$^@WBU4q98@+l7jj=@!s`ZL`B!BYxWHgo!K0xGS7w<9a;fTI z!~zV;g^-+K)}7H~`pn`lDR*o<h#HM&n?u(|iou=vD>%kFTeaiM6S{-7>#rK#DpcEc zlfu&k^<sfTMz?cZ*meO(NYqQMZ^8a|w$_ufy-MoC)>>L;Z1O|QXR_Fxdv@L<O-6o> zXh(>8u!M(><=#_%Ta<j&V0iEp^z=oV*}7E{bUj6b+!O-dp3z#;?6uCwhBd_kw5fXS zE1|Z)w$yd5AgNKaXqD*ax*7`VrettUL9~XN#}8E0C`dQ)qf>iq_cXtLq7c;Ry)Sz6 zN>eTkl(27QtIBFfkOx_!uiski%YjU&2qxLUkoTXq)6E3|A{Z-Mmn^Xw=gIV}WVJ^e zcM#MERmQ&X5eiIBwE2wh=#9CbW|K0GS5WdLIpX5ta)KWN5*}bX2KN#;)4*W|)JV5$ z&0u(Smq_;oA!S5oNQ*9OO-&7H($g=uDv!OE8C_&#ZOACcUFz+Gn1rZqxcUm)-Rm0T z&e$c5B}#2o`7<tbf3&_H-|R<p-iJK$R24#F5BU6{7ez@^QwEw^p_2#lTprit+S%JX zm|9yecs%mjG*_HQO=sCF9rECSCDz*{Yo%MV#;G7FF7{oUx*Z>P>gJ}TVT5%YzqycZ zQH#$2*7E!y^*@K5ge7B%rFLmVbR!Xbt%AZyS5u8Z4KD64MJpfU&5SOo|MIH^x{~Y9 zKT{Z@v1!vwu4dR0EwbUeW7yr((;M}MwXSOkZ71Kq{}hd3OU=%f7h#H!mVPRO=-d<v zgdzfWvSkIJaU>mtyCNbY)s}kgPL4~~bHH*6k7Q?wvyub@>RK3<w-z=cZ{y9*(-f;% z!H%J$3=I-Npg5-X_-Wfa>+a#fH@8POJ##+xtVcBYvRUKf^FH%pDt5{a=OwDxb^S*% z>v+OmC0FIxMj;0VIX$7300m*rU%gsD-#H&*r=Feg*dU(s@Qq50?Fch*&J(c^L8(1$ z*mPY9%oxh^Zcs@cHvLlDAcgBNHFd>L%m+AS7>hM#3g=k5tfwD*^n6raS$I}=B}C;% z&*9(vL%Af|a39<_^Uad`>z)-}<EVoe$S2B*0>bH`Dm%`*Pg8fis@BSc#q6v0cq8y5 zq@&V?MszJ5u&(&Z8WyNNc%YfY1KX#G$)YU(<#z8Zg7kSpsqsnTd!MRpT<^0>@88|j zC&O<(ZvG%tX)T;DDk@oO`I(*l^r_r!CjM8t9%72oo5&y4bv;10E<cWO+Y}PIc&iBI zae{&&>Z~;jHhV>yY*N3&^)0MBEL^I1=ItPgol4LZ55{zYky={UPrTjY8gAq}mdEJB zH#6HZ#U;c$%N{(8w`^%{?u8ohtlS#&yu7Q=bafS=9TVbaEr$yv*e7vCb{?>wEucTH zA-(e-jM9Dh?elGZP21>DEgk}JH}ubGL7H&U)SdF<w*eO*sgaJ=9aY&^1am&HS4>R1 zxuX2XB!S{bgMX*gbV4OldwfEDCaGxVlS2Y~*4i39TwUWpW$bn-gmxeIpAVLnii&Ee z!tLJOw!3!<h~f2LzDENu4dE?fd6^gOZ|=z;E%5z;ECg!W7u3H{)nYO=>(Tyie`ZYb zc{qHqvjZ9U;Ts#)x@Y6TRR^(yB(N#)dtt?krQ0Z>r=k-^sWRY`61r$uFF7vFoi<xN z(k-zFsg225A87n)Gf2@y(sXBrh>L-1>s)9uWsl5o*1Do1?3vc;Z=6RV>51JXA)1gb z2GF9(XxB;$;4H8m8f*M5ASab%YCm|3Lkap8C~XT-6giKE6cl7+g{TcEHtaP?0Lcdw zYy^gfXA~7hgNXqcKJ;VV&vSDNd9(4ijM@tJ48b0LbUDZTS6nLfq%Y;W`=wX4XN!1C z-fY_~HSroJD;$R%dr%w=hC@7YWO9OnzUUNJxbBd;R;Y6qj0^za1CAsqCictNEti^o zNNK%3`Oa9ML}5z`rexnataT7blIA_yesmCsicR>q0v(Nn7KrAtvVF-HQA+#ku`sSk zVTZp^))oikA(AjE_axC0ZYlQaGlJZ+Wnx(Q)N8GU1d_)dTgt7eB*oUHajM*lJ6_=s ziHELh4??d&9py<+PT;MoYL4HYNYSKKR(sXAx;V*mKMV)~xypGQ*q)!>iv(S4i(@1z zKejI+v%=KE0#BBq(^ocvKt!RjIS&9?JqTnXq#Yld&lN2yQTm>&$X2lGN-BBweG?%J zbl=`Rg%!0jzjRX4$Y}0och-xnqfttq)U>7tqqq4u;=%4H8)>Cugf#d<Ss+q}2s$KC z+=+wKVg`C%JO!b){%rE{oCa<(buBHWXU{}kUCSPi95;ju{+!%pYd!qP3<z^ZikJI~ z;T+BCgxu;XG7j!0u%Tafox>NeJ!ey?bWwVy{yBCtBiS`5l#-|GbS&N6qRh01u2-qg zL`B8tOH@i?cb1R$$5>tOz^*QZ8qjCY*&iE6*(8aFoBZ$^u1Jw*9Im(o01~oLf*~JD zlYLY{K|%0rs^P4b=AzauskZKn9+@Xln}>(v6HCU$A>j*_CKcu%;Nhkcc8~jI7|<x$ z68R}E1VRFdlVTN0^v-v)FlhehdG9mA|I%nD2OogXYL2FTacbHRBU^tVi+^3NpxUL4 zpewXZv_Z#Zy2hDJSI@_*f4=fSjt!m@1e2b}!9pL{LHHEBK&&Ks5pKT&Kz;|?22x1? zGQq0-0j)xJZD`5TEdZ1UX@UjAqPckxn5=YbO#IF-vlquO$Mv=B@7A^(r&d-bj*V%v zvQmSLJW7dr@Z~E>P>uBw;@3BZ5`nY8eY&Kmh=Gs8O?CL@tnp}bGrUSXkfQz$v@nqL z2E4>q)hvw~Pd>;JT10wCpamN2dA0z2+Rlci#@~dw8m@Fqu!_K=1!kcN<POo%(a+S> z;E#;eL*ya*hfV1CB@;Qiz(qT*`3>V~A-r}_Uwp1EEq%@Ra8eOil_g`Xme29zD){*7 z04!Yz7dEGzOf0cZP&*zl<synDib}E=8u$ZMurNvj;mCeWfsGDkE9%Sn*|WJ8k?DSs z+IAYf<5}a6HlSe!&G(H1n^h7n=BVw=n!z?_h^<7zFW``_GhJ;<5!&P2sNM92BY)Aj z3pJJ$c_DMIKq_U~e7Y9g{gP0f0mw24jBZj3OM^bzj>C=t)@1vjnh(28M#wDozG_pL z!n!6tCxN1Z#`D>SO^Xk3EdC2Zc(?VNEz*t7n%O(0Ewi+{K!OuI+=LN|bJ)qrJ7!}G z>0Y7(Y!EwN5i0{xHwb>iUcE;EYDGjy0UsaOg1FabVZT0xLJH7D>qA@*sMJDBN_tH9 zp4%k3cE8Q>5oy%F)Fb)im_o_hf~3;J@efV!Q^_71@q1+l2MR&fmozb6m)5EQ@1kO3 zP4YU$-a#at_mx-amhS=!s$qgRFf;@m=rlx`(gWuMW&;99E`fS<7+aCc3=S61iAc(Y zyv%+*H)jOVA$u*<!k%Oxr3J3|N3Q(^64L>_Q+UVTOD4F>eO>6s$v#BGSTHSLEf>q7 zp=2M`Q~0nR2+-aB;G#|q@E72i2Ex(NDQVMw3aUXgWhh>L;Z*CdRRsk8Y$acByY}#M z6P}_@$%mXLZ(w=_87fA^MjO_TP!sU#ot=3CTF=~i;Pe^+ga+}ToqWuFHyf~Jx{eq- z*ondAM8)g+IyFEl5G(+8ZgfD8?7ELbk>|xxJB{1CVy-sr=(@{9+e;dn=vS}shy#oz zF=ozB(T{81LJN_8cd5q>BZHbBeG2zROUHic(xf~!_Mn@cA9d)arl5A4D`<BCBgDg| zB@4NCfJWWE@7p*Zh^_m~dwYp}$a~f~+2exGd1E9HQVLl<?f?M<pb8K_kpD?(#ECNI zJZgo|5uh{Fb)80s>cZgyV{Ax=1fqjd`f$GHE+kehz~>J;1aNr#?BqhtI?ZFpf0G!# z6AbP6Xr&8otPS(PKTCFb5=-iFI3a6mx)t4$5ZLKDb%FWnw{x6ANsAi2jg3vl|G`+& zii#QO>5`W=56B4u{XsVlP+u2x99+Z2g)8yz=PkH4C?Qy$Rj0yH=D6lC*@JXVthe}$ z_U*-Glaw0KlB?clhCc>=mW!51XtKSMVO)@5oQc4XHsE;j>eZdj-+xg378VxgPa~x8 z&No~zc5YR(CLl+%JmsTK-bdN00-8(gQaP6%emw>`uv0`#M+|0LD$dz=95%-2+tx@- zHySc|XZD-#?Ce08Q0+x>M{jRrf0pWQ<E$cHHS0;Qx0`R)n}41+EqHdv4)jXN#iwCo zZG+aah&S{Mjf{D8FPj*H>wg-1P%SbLbXkqN>(<b?OMlozSJ3iE^tFYlC(pW*AHY!d zlTU>ot@<MHEio|i$S8gp*y3TQ5d?p^E%(<v3tt)izgmE|zkl<ZSa*FW=YwDFMnZhg z+KgCVlFLlZt4`yH&4rj(MnOH61h)YHRbx#w5{4Az#q~#%3u@t)GVGHeXaGO~V%nd| z%QFfHB*NF$ujTmUWCqG=p|}g)=GnvAOCfOFje)X{fgvQlS1-`<#ABoU9URy2IY488 zNmCGUY|;0E>0+F*;=}tfrK~31hlg_RA(=zbe%w0Z5=m+0Zv8_`due}PxeKR9t^=|I z5QdbKQ}N>>d`X+G)s+=6SsEYj%mcM&sal&VPIsH1KLL!V5NeJy@^RVJ)buk{jX|vl zsOxUbpANEb9T|r2`fXlLRm9p9Yjy%YlMnV%<DN8PfB)yh6WhOU!rT4txec1?j}`-4 zA7e>@K0g{5oE;f>+cZTB6*jCZOLZl=xWV}sgPK#H0?>sBuA3x%T8fnBHF^2C@2kXL zbo4J?=T4|JZfL2K7coC@g+J$g|Ij(g(|u=ho_N01VGg5z(~8khWuM+8=Z8<VefgZn zS6fBa=yb|NxsrMNa`=J_48$NO5<NYBaFgeDKPeTPpiBi<63XT4V-GsC`vQ_+82*FG z(8!$ksy`u1h~~-_-{2{^adIOpa+8&=r52EGYf#sIn&0kN^xWmjww!b#?GGl^qa9Ux zIXs#bYh!M41?^Z@AMyZhcgHvsZ7rd%*Zqr>nGP%_JS|Z?Inw753{i97^fu|j1Hs0? z`8ip5+L(OH=W@Pm1qGsa{?9g7WU>l5yVlovL!xZR*bKPUj;)18g9Nn{j8)RS!PhYN zqhG#^>Jz^gd}9#I0bE%I24LX=K)|3qaRb}~2b+`K$cuX8#@t5bCKK?$>!YQ!tE(L& z#TFWKRqr9R0vtLxHQtAn+>Xu{*Kxyb$}cZYj~Zw$MB#D;At_P-IR-o>!joYPo*sAm zgaMRxaSB5P@-^%1G`6+Hd!3Q&9^`d;@LWfy6A6XWb(<%ys;(ZcaJm=#iR8JCRyO-d zdSXYrNH#;wUFz3DlambzgWZ$6uCDI-`NMA}JUsH<c2$4qd1+i0_V!|lwa|@M?Aed= z!JR9A;9VHY*}pjHvEMz4HVkICeo|?O)Pur?BnS#r&Cw2&X6RL8EG;NVC?y(%VGXj^ z;F?lbSBLYjeP_NS^T!VZ7<`IKN(d+@WWWFiMF+5{13+!-Y`>7NC+w`#UYcVXCn%MZ z`)7S|RjPvP7R2`Qr6@AR<|70CqS0y#xFD}rTza<;=A^mx(2Z$nZJU|W)|8QD*`4Ps z%EXHQnr@X|5fU_Yvj26yXC}^GBi)Zlv(y*E-0otm!ni}l2h-}wE^HDXBBR9|mG`Pj zDXRvS*VlmyB=f3SI7!f+DfEXi+pEcb+=qE%a-i)1EO~&SpLpB{zMtBA>!tV3Yzj0R zJ%0T13LoZ;tadn(J|w$amD*NL4DYT}-@GM^_75Db^IS>GPwsYV%@<vf^ic~k8cGpE z#~+oIT6&?LOv5}XnGa}W1376Zeu-s@TNr%{muBhwO~%FfMCicxe(T|{4A{fgsw{)T zh{;=BOr`GtjLplZz?R3^=3HGVperwbl*ISM(d=$|)LL-Ty?twIqJV(stJA(Ct=ATF zYe17yT3mX&n|dAZbHmV3+>&w6H->cW{hL=}{gg5kx7QrHcP36Z$y*OYR7zUfklaeh z)JD!1&E<<VPLGq*$@Gkjh|`V4M8_1ccL6kUZU8}*4D9UTpFUAhd+qhOMQoH5n(#pj z&Y9zR?BAc1#3qyAT15o|MIKUEmQh$3g;eA8$sD>4gIPurTGdHOr64H>vd$q*55nFx z3XHA~52yBjrKh7)FE%Fz3oIpNqFe5_F+i!n1r2u@<ejBJLg||~Z@?bO#LWB-zFA^V zo@l_IhRJI%&C`O50#KQ#BtvyBOF`c&zTYy^XIJ<gV!ERXye7SrK{=jODFF5uqlGzr z?h<uJjyQgPx`I5>;XnEhCfFkKq*&$~BN<&&c)x^uuFeU79Ly{sS|YfMJwa1LBO)?R zOwRGQv6Y3ZkZtD9dSzp5bGjtp;p!3E*{Tj(Q}s`cPXWTNo!XUxZT{QTwQ@{*zDL&E z&7&QOj%NJA!Cnj7<alwo&9bFiL4<f^Ve0VxVicC;)$yVLRtqK&7~a=n*O@P$)zrM( zY7`RzF5slKBuBl)by#?9*021<)4F(0R%^?~>|)|~8`ccx=W!uXh1)lRoAxxd`mAjf z;n&;W*x<_135EeE{q(Sp{#z0|FRa%8fdk>aarik$1~6p7&O^{9T*t+cN}y{37WXnP z-sqH)hGuMJq|D^dnyQkywkHWET~)QHu~A>>!RsdVaD&{1S5*m#SB`l2;?ELonyq8Z z79n92!53m;DfZ-bNXkS0&M7kxv`KV3eVN@{>=v-8ZXm367h|8S5Sq--S1K*jgr^Jz zWVjF(fZ>6YVK`c%D||uLJfXVKIH>2-38^5kS28?&NB}G+oFi>J^A6n;@vU{DG$|7v z>@_JqUCjfk-nNT#!4G3%*aXk_3ZdPnXJn+kIaG->8``vI+HNVX7<-(b>^C+g<r-{2 z>>?;0Z{50uOp^qGQ0CY$GC~2Pl%<swd*U?^E25@GaImwpg9QP$gl3phfHQ?=>aBx= zW{83WHMO7lBChZmE&JICI`!$i;n-p7X-+wp5rDe@L?MH(bCM#cj7yneZVc<XiG&Me z^?%}Zdqc>qD3>@N#n@rc!YR<&*4Yyt8oQobRh_@QY0_6ZNua_pdViDDU}dQ_{>ZgP zw<6ks4nI*biSF}fQT9pa>gutbCepd4W;#V_(fyNEG@+9_l5mL4i(Ebh7|M9w7?ef% z?)&B&)r%8PMJ~~q7GLyrIW5muh(*r^Xn|(IlcF5HQNjg6{RX*U(YQyT3dY`!FZAzt zZMRV1|AE@l?Jkea-&)g3z8!ve2tN_VXSag}kW43A=LyHXd-o#M7zil|Wqo`uzZKl# zU>ar1$#La=H0!Z&gCi~NeapT@4Vim(HXi|b8#yj+!rIz{n2u$9x=HL9$hIhOD7Y)E zYng}12I4&vDHC1y<219rR+Z*v)_d$GyA#!gGBhbS@;?%1+u3<iQpkKM=9a9hDB-bg z?Oq)7ryPkA7WOQ+XJqT@0^&+8!TI96vQ`n=<cdwq5ka6}<lkuJHOuw;JHr*u$d8Qx zZF*kk#4r!<?d_S(Ye`vIWedv)s6hGUP#mxxam~%;QWckb86tMz6{)DK1X!33?%(g< zcRdtq0Z#~{5$XDWOuYqE)cf{6Y@;F|AT1yuAe|CYN=r(2NH+-5rP2%`AYDp`NJ;k~ z-BQvq(k0y>@b0<y{@3q4Yn`*!z2~fRX6F0(e)itaegen$SPTqG>a`?lyeGW*_Wi`( zx?Uttx~4Z2uD_<&o|n8-@Pcxhbh+aMJX+%^=TSUm<>>vWLWt?x1%Zkp>FUKg>axrG z2-V(;s!jZ{{e!_Ca-Sz54Hl+^nCNH#O#Tr>K3g07mG}KS<ocLFQ>fCV31*(|)$V{` z^$(8(q)wObkiyylkUOeA9%fQAP`Yw!$(V>|UD)SVR%)a#W|AD~6A<DBa;t^LWa6Kd z9`5azg16M<@XXA;<fJ(rjdpnh?|}2xeD14s*x0}69&aBEW~WeeE8t(BTw4zja=EAG z&ToW?8Q3n-w>~{}ybwrc;rONzTIY0pdiK*^`)`nlcfM81Yz3sDod?Ohw#aYp-lK`u z3!Xs91EKRhf1S}&I3m^nT@%1w?zE6b%=qb5Lz`N0t7jAxPAFC?_J-S0c30nT-G;mP z#;qF>o2y-M=%qSzwZdn8=7J~tF)%}|A7Q|Ik%=Ih*D>g8u5}skZN@6|^cZA`G6Z## ztv%bslG&%ysdzKUIvg90g{;dmygOI%?&Q+Yy!E}{zwGKU$;!Gh<bAf{e*BthxBe#x zN6q)zdb1v9KkAE8(N>p%%^2wVMRLD=OW-UKvapMQ{b%yw7JXrr+pkfA5b*>}?Lk7K z_DU+Mhve1>qZ|45)-+$T{J(r>Y++^nCMd-5%;jFWw)}HjmZQy?-m_$0C##*gy_=%| z%LS&Nhix9Z=(`^fv>0)~h7D{#qVA`&lh#+dCip0iQo$|_^e7Abjz;rFT5|$PoBzhm z(^qNuhdL`GBl}F#=dpOFetwltJ_bc&BWQ8i0OQnzW3Qy71n2<#wGj#@25=f@W`?9( zBkTntPV|;+!e%<sf=ps4jP>n*F&aBv99ghYQCTkw8UVK`PJ*p@x;GW}>mD9#57_AG z>FsJ(zw)Ph3cqo1=s!A1ivY8KT|GS*19(671}FdsTVj*=Vt_qFJOkA($f3;^B|Y}T z<$5Pmw9*3O6IK#E3uYF!MFd;JpY7RZ)i9lfp-z|Kq^DlxZXC_Vn1qGqeU772l&_y5 zZd$>lp8xRSt7if<q{N>+cZ{?j;~n0-Nz!q+RP)RT5!$b=o^i07VKm7TaeVyI;gq{E z2q%-I`}ib1Qe=tk@*K4<{a968(g?J+H_rbpXGU$|h-9s3;_BE<QFk0kaE^8yz5jRp zG!6kdr!Z6jY{1J_QUILGn4}aLFB`#=pk02q<415BQwoK9fueQ;2uZB+?Y+acGiey_ z5mFz~$MK4+Ut9^d1w#-v<y_)&I>3dp4UEt9D<Y4N4KtLZ-tIq1tga@$nh|(wMp}M2 zy<07Fb|4y0&V*AH@-^jKT7Ey+dur`Q_t?MG*qHiH;`!MdJImRb>Dm*MUeZuryNB`u zeO-8izla_IiQvZZ&Fv8#`<+D%0{|bMH7TSdC{>|BK4+&))UOD;5Pzx=|3CBX44U;x z#*p?kPWVQ@q7|6l%-Z6;HO^kR#L}s`3}l%Zno7za1_m-Uv9U`w){9Oi3n~X`qQWXj zYv-}2?5i4|BY~O)d!P?zkK848O+7aW8EbAEo@o+Z3EO;8w|6K|Tv9T3LX>6>!6{(O z4tRM80#R#qGahJS$E|EWjqqE#gK`OL;S5r37r^PW!z4y_->u0Who1VG(O`Orj-307 z6wc1MB2sb4_bE_XxmVwmTIOU8TUpvzwLs;D2AyHilL{a2;Ri5nXDq+F_+uART}D(> zzlp}Na6KV4gZmf`*bwSRYASg$uMHh7M*z;{IaP!E4sQy-lTU*Ww4N_Ofuy!RLefzY z@hvpeG62+X#wB*-{CIcB@$S&Z#qlx3{%i0)b7K-tt0~?~ytcl+7R<&huBsLgQpuaG zQ?ae}{7R}Z<}KT+SNTH3L0tHhMoet%;1JJc_pv(%$CZ29ny+vP0u~?al2Z`=qP*Oe z;#4>5S>?Yd<kC3_9JqS|v87-)u8}Uk^5@S_F&x2`%bClDJ$0^@si_ob;{fVIFTJqI z`O)7Q2saCWDgtd?M%!wlPIdKvi~eKm{^{vn2z%;*KLssGPjCU5GU7lydp7pNSLFTE zr>E@`l+Rj(e0+Xu>Xf2J;s~RHgEBIt4NCk!&9_H^V(`6JazfG|C7G;(8{b*G8kNG@ z7JW$$#?XgrW$!|?d*wm&?rKbP79G7ZUUIWLmI>A$hIJQ9>r-c$p60ZZSC+)YOcoa9 zJr!!V9S(DH_HqMm*692eP)zyE^XT1ZJAshScXcO&7gxpZ-u#LnR4VlmO2@eIO2Ea* zDtp*y5*2A_&qias=d`l=`lZ<Qc2Uv&<?821N_YRw3ZDP$gHD$<PSy}b(lKB4=D5nY zbMwE81HuZp@o8}<BT2*AVeP39s@7$TT0r0|V?ifxco4FxUnSVHf@}$39uQFR2?#iW zD7)Blhz=dGT<?_w9}~DV3KJC8bV<EEPxcR&!YLb?zMl?sxZukZJv6tp?2e|zF}C?D zvhHMn*sX_m82n<M1jXKC2r^4OWYy@{+23zL*&p`xc{%R>ehCEJq@=#fNuWint|#<7 z^+rKQH!4x+F`M?X;;J|)78SjsK6{}U+5MmIS1c|dzq!9^hmw#;g_0s7UiqcC4q1e^ zcU7(`kU|HHjK!u$3cUU<OD&JB|I#Wj8(JN@K`9ja9htThx;6a!hVfv*{L}+jWA5`A z{9DF+QNtFUxFEpH90m&Gvy!euaWL2IknS^-Xu9i-sRiIV456`VvHrIr2_)+MM-bPD zBL4%2aR8Kc1wS^lr%v$tY~Voh%sahWh*^9IVsCopFmD%^4jbDjTKX6Y3WdR)`7sLN zFx-APCU$U4+Bz%Baxg5lNTQpAI0h~D9kXa=$2e+e@l2T19Tcdq!V2;MFh4EIwSlQI zUgpl#iX+^?d-du)1*M*@iU!I_B=V&%-R|L6X4VKcFYg0fGNSUNE7{S<#_fD0lzoxk zzyHAKc`qR(^foN)Rjs$cnV=AsiRW1&m-s`0HV`)98_T+={LT5@S=n9VoF#H8h;ebM zaSH<jK=A5>oTa4KC8yXRk9%AsomLY42KZQ8$n!#E-%(4)(Oc@wVJij}7I3qN#FgNj zoMnk#oy-AtPR<OXEs!d}2d;)S#CU}*8QK{M4X?xK2tC)_9A~YxLZwVAy|D0&gZ&>D z3oq~HRNX1aEqXnWK{+ttL1b!raeTUT)hVw|L?0<6BnWX9Iu5(!;OC!OK;HG5)=$i@ zlr`>ahx+zH1byeP&Nk>4Coj%;(%k-qFpV^QtNDr^&&1|Wx@G`(hMfTfc>3sv2J#CC z#K4BINHa`2^ZlK4gLx&z!@8Tdlz-Te7=*=av^F<`6HiNRJ-J3foQjy(aarY%t+7~0 z3_e0emVa%r71i9dpYvwWLeliC1NZmALCgigcXQ4A_z3YVne4IOza3Wkzi9nCyvD^5 z>$SYRd|gAbg5Jo|vU9Cx_%W;E<K^er;DHA;pDxBO2p6Mg<_;_S#O;^y?OHtLf0iF& z@XMd{+WT^uzAxJ;DQK>(P7G#XEC4pO<R_V)-Ca%3h1(3p#ZQ`=I!Y>~%&ZXugV{DK z8?C>)LVekEBrnD=WVID>a*az0lo@mC)p~onGx_)ueic&-5p^6@38Ab<^A~pvgcX#H z2D3%9u9bq94F<iGlo879dgl>RN((GQW4tVIl9IWMtgJqoSuQL}Sn58!+}X>tPO-5U zb`H(Hc{AbgkXpYy)JRH70VY^O6aUGM+mR6TKv|&Q%OTr6uy@7v=~G;f<L#^xc)P}S z@NpqCK|@1I*M)~HCWhhi&vif5-|OK!srTN3J%Pe_ry=LH>(>r;&(Wa91;!ScI1=C< zSjWSy&i(XhR57RDSb}CKn~}Xp81e{~LG^E$Vr5`c3mkp8kNzX>INPY)JD!hJfj$1K z{sqg~XKTr8?z<~72}euY@x|97V&0tgSo)~!kO}Xdg+-Ne*3_~JeE>?CrG<^=tKE&Q zt;q0lEU_-CUs!3$&V<cw<N9@O9B9%tjPqVQ>1=NHqn`14NbA1e)G8f7ARdZLOio6x zkD#>ljZrui0{5L*UW2InXfwNO09Q-y9=*30F@-C6xU@L@sCLF@9laYH{65WCf3@p0 z*(QbIpylSbY;C_To1WfpYx&_c&S^4Fn2Yb};gFj*Um%~nt&(?VZM_*;6!|*>+v8{> zna4V-aigieHqOt_e{|HTZ=8qF+2zsU&X?yay+T`I@mnJGhx9XUdsv$_d#paEG3ol{ zcEs@J=IhnRWi7r$b6?%^?}Nt=Ou(PwV%IQ(Cnm>%R{36565U~~f8=sDcU!79e>Z^h zp~ZHR@4N;7;m&^D^9tvliovyxZFVyZ>>ryQxLI%BSOf+YvoacK7MKx_=_@zY5HR(B zSJk8t<jb^KXIIZFhU^*HO6=<=>Q7cqW{!?M`bHrJ=tWJ@HMCRMwSiXJgpst_dRpO6 zw{DSkxTcpsm7<~6RC;ygU2GAXftgu}`QNrd3An9uRc?T~Yq0;Pw8>)(^}+=e4UKbD zC~;M8#x*sti~(D8US4C=Btp-gt&p5NC7CW<#neV_-e0(OZua#xQqro-dcWX8h2MpR zqq^&v)vx{!&;u*77a;tD;0!hy89068C%+WDCr-{N>mc$8j7dvedbPo-p|iIaG)n<t zu_RtqXJXNKF~<YmA{hyY7`t#uKZqd!CJHAfI`+Ik-57SiFtCGo5|~roviYmW-m6=k zCBHI^RWMNTp7I`Y;m%kF+CH7XqEg@HlN7jlbClN{LA(&8`M}<Z=<jud+q)a<>xk?C z^zC*pg)E`mW|_QWzOv!6K)(Xa6zxEo5B@b*0E<JL5P^68?g>%40pUrZ{Wp3L6>KDG z|Nj=7t)?5atau@4i}Lj;ehP|*8Q`aKa^r;c&Ryz*?bj{M&G($0XVa6r4`*L@)zwM! zy}8!V9Q36&d1l4J5nP5MJyCMdNVJCF^Hr9=&R5-CXt)fo$PQ>M&dAo|>M0uf6;bl; z%K6c=@rxHa0<3zeP@%+OM_7<|V~H|EylK9{E2Z7{<ajtOlmh<eX?f<xbLW6-Pf4-b zWg?W6wMAj!3WS_788aVBg8wlsBRF8`29`Z-!^5%Q!3b(eD<L5z`DnuLDPp8)A-N3o z92_P=0j~wP#hbR-+u9?IZHz>HRUh#C_!!#AMN9hiYJT$Mk$Z{(YovckNx?-$Il@n4 zVR`<`qwrdM&}N$5%IeZm8iie6E&#?X4i4j-qD)Lt_wKR3(vx2j*t$<nCL82;{k??5 zH&QZ^kg$c08{-iVADTEz+|(~GzgJoIS;!T8)xYDHobz6Tc6D@HF}Lx~Hv9X7gQ=Mj z1!+$*bo_<p<?r<<U=Wzx9lxoZfw=N3=#v~B%E0@800u3S{GLCVzCPSVm_}f?0QM+w zh=A+K8TSGVm4VT48YjpVMHD9`CEcDSV$Ervbx`bbZR?)6lcZSC<wASoUz2PA?7^1+ zTK}9aF5w;fO{<P0ymZ>&-WISbi13lW%r`}cG=p+6u$OGVWMg&prJWsXt;>ce{~?8l zPo%e!Qj|W@zG1_~=U}XeRT~Kl&nVMw05r8l=m-)2x2z>{o<Y3G8+NSNV4jhb6nty< zu_^Or$Gj1LwHpWQk=)kX$i@%B4a3#N=y(5fO|k1rMjUIfjpX3?iwG6nT=^zqAZpLH zN=wT}F7*8}KgD{rhLnv>xUVN`bb_?I@kP_xTGg@*S%j^*6xXnL#`>X<qTwNA|CU&u z(<$Sryjpnjgn<QIpkIL^5Cp9QN`Qc8>lSk#Z;}3o+1CzKPcYtUhmKxWG38Osm-nKI ziXh_AeT0I=58$i8Il0nyjD$l(_+l<@d|LB^vmPug)wumh2|wtW<r>mG4UDK)zkJCG zljTScB{Vm$p%br$e2ML%g2j;uuB!5iKXdEdlZT?DzeSB0PwbrEE*xB*vW;{t-bjBI zAd@Q|9UpXqos&z<shdS`cB3GE<6Gkkbv5-lmzDd?LPA`j2POdO><&znf5N!6W_s43 z(}(waf|Jq4m^Tf8auDM7M;>YC{7)VsU+yCZl3SX0OZcJFy%-=#De^sI;<c;YDKSZ3 zp>_g64|p1Yx=O@{L8;aw#D5;LPew>8z>FvoJFR+~FC;7WV4Z0k>3u&T^$)N?z{08{ zh|)(I)F9wL0D;|l{Z<<?9Y;o6t;EU1kW%)}QIp?#9QX!H;k+}SzkR!{sHmu3q%RL< zT;MD9Z^PcV*3eqg+?@XM;;4b&efM$Ylp`jXDx&GgeZrSvsaqQhhm&^8U`hDXHDoKl z5H&RzCPxK?jlDz`SjU2~aa0-goo<GTDBU|i(*r@L8yU&YpFjL}Sy+@>BD#)rc&Ek9 z>{tg(O|P69WzLnFYYh%d<kkxzuV2rK{q$pHMM+gm%qjnY1I2hK!9rWhXM&L6qVIEs zON4)QbR^fQ<ftY^v(9S6>+6Mdcx(qMud^_*i2<w+Fg|#g{~s%8IBm^20NtmfuD(6v z0b2p<Pt7e}7yLINoO5@2X{CdRNyBkIO^8TvhL8FK6&cxKKp^P@Y1xfcAg70JMA7U= z-Z_{URE};BsqPse)H0$T?0*&A)%61!ueVJX3I$QPDCz7JGW_eQHmLC_xhk2~{tk9( zdU`4ryQ^HWUYAbi9(WPt#^IvxSvy@cbH)Gdv<p&DD#Fz3gN0QU)_J%uzw-6#OmBFf zdeKt8-}M*e<x>+=AAD8d#-O<;|7PA@NZbd4Mm{o_ptqDFW*}P!<OFDBh0-_JK^GkF zb2(@#&;ZV~7vQ7x8cLD$V@~39rgLf)<mqtH?YeW95$JL?HThQG@bvOzeWhGjvW?&q z(0Oemcvj{GSAbpZ1`jY+_@S+W5SJyi5A)esOk$$D#KL6v5N6ot$|53T<9V%a7gzv6 zF=B0xAm@^%>Fe&E2Vn#iKY!xcRzo@j+`!rpdZwQi=6-Nk3EA|+bXjwN5D3d{v?UU3 z3(Z(i1?D=S;f3+@cVr@PwDHNsWQ@8#L|+94v!|y3B0S8^;m^aHafBxAtvjg-Uhe;o z3y>am4+=tOM|U#}K3C-R$X_@+`@4H&*xENd9=CILG_seuTduF~KQg)}f)y@JO12-h zfpFKm?NtdzTnlY1ywORYLItH1z{nl!&HaLKlwYa-ctluPNRKA^A7eu?7uEAda|v$k zrc&aIh3C)*ynYSLim{7fjo@}=K6yc*llkvz+!2V-oP+(3oOF};M>di7aE#N^`%XVx zQ#LmG7!*WPSqbL72x<=8^x4;&BA$e5dlm$X`qtLM+O=^pNTlXHEZkQ*-Iv@?aRs?s zKqYuCsy+3z)nwOO@JaA992`-_w8w>2#HF*Zq336IbPVq8yjo>3UU;yd^@uqPABl8J z6Y9oMOfh-sO^!Yvzo^6iY3sFE0x2FS%4_1W=$*E>Z%o<8EE8&A3p>deJO~j7Vhf0z zKLGIw+UA6$BqJM}{65`;0>gyVinfi;bVFnOo*EQNc=3&TuewQ`NlCUV<}X+NKI_O` zl^lgP;C+O)i2t*^ECuBRZOd{e9p~iG;Ru|e`p1X)>Bm`FSQh`wOgp|d?gOwC*e#<K zp*SM{UZI%IAw}pbTr$8}Ixntu-I6R&FLm27LR-_F7jt#G>Ufgv{vAm6B?q3-sQ5%4 zh>;<xK3#z(1LK#Hg=vVOaGJ=pJ3TP}-FSJxZZOQ&fRY9ai!0p$Pn(>apA`2+eXRib z;UTlF&BAE4yXNqy-u>~kwWm}aRX@d3Qd6rfC*^OYGr{lmKUNYD`yRb<pEK=DIAx_m zGYnlnt}fIHK6=+M?ZKpTwAor(ojBJbt}QQjTPb&YZNt>kSL6!@cE9^lPZ`txvlC=_ zcEHC3;$NCNL#$D+>|VbxRmQuZ^cJsf5HZNf9<Vo+a5JT?e9C?Q?dC%e6Yk%!d^5@o z;>A%sN^Dl0Kx$!%J_v3EAdC`!yIOgDQR2156D&Ksw-Xa{qy0adZw9yxkANPu=g&il zzuIW4L#>Li(5}7ITR=28z=fdG^*p}X+|`ZsY}nII+SP`ipIwT0Zjn<gx-Xsie$CT( zb(Jc_E|gnT6ze6;o$ZMP=j)}cZxE?MogOh&W=9jHwZ$Pvf46L0RDylY6&+JjOg6@d z{Z<Xh9!ruse_{Rj?Ha*v&s5>%$k+PZjMCSh8VZj-CCYR)n>iveTk=ldazY&)DJ-{y z;Kz9Afjb@8Xy&Sh>aw=m@EG$X!`|dW;)Kb~?Bza#ERpl4g|0<yyQeE*6q7rIyevx^ zwhcz_hps&i-8mA1z)*Sl-l|AN|K5O_!orC8_Q=T4cc_qK?0dIc4A~(;{TXeso|;-K zsJ37kaKFU`2o(S$l$3CyBem4?Okr<mGxp;>VCRq)1%#dUzP`wW1mY_)GBQ9s216Q) zsb$bV0H+R;{X!lg)6etFU&={m6=cfuwIf>RJO}@D8Wlsh-U|y2di#STm8DIErM7Sr z38@$&lFp1c!fO+gZzxEcG8-r_Be3gWLL(=BZc}WChgfxW${gxO5E>Yq>gkcZb@@8b z7fB}~^4N@P-OAd1&x_#KXpxrZcx3TU3#LpG_vCzx4`6cd>+72~d61%aD^|aVo{1jO zl+mQc!CaUACfE){p@w$!NRjbkzm`0W5F3j>@i%W0Cnxoz9!RIE@JTM0Ti-CKm1G|w zINV~^e7+Y-;B_`;{D4KTYcTK@Qbo6C7by&;(krRYnfd83j|d@xT|-F7Yx(POp>B2b z8Ua&BXh>sDEtz@2$mS9cUvR0qY<v)gHa-2V)D+?x_jOn2?A}qLkb#b_QxBvsGW1<{ zJUj8ddl3n4p{+)>HMU?;X?4w`s2_;vfpmU*!^<1uAuQMUG*~R@nrVD@Zc9ay|0kaS z3X$OHN~X<pP3%yPBI?i?O!@)!Kpxd^?Zo?@#M{i&k-(0FnGh3P<EnL8Z*O(>$5h75 zY!>T;K7IQ1%}PHNtop#Byt+V>oRoA9h<IK*twcZr+WDokCAW55Y25hXCQKaYB*2-d z<HMsPDS@o);@mef@G)zWz?V%$OUsgIyn-al9Vln+duFg76rzg#2a%ipfq}dATi%fb zOn-H9A?6XpLJX{|glS|CA2J6Y13TgZ_BwM53y;N-h|o|z*ist&J-e2z{1QCt7`{J< zj)~sct-;?qK6&421gX%7{!Ke-kFzIxKSH<isHk*Fl(avy6FUrAMUmWFS#T`7dovKX zErV5?<@IRM-c)Sf6RSe)bF9tzo01q#?HNBMyq2rC#@qwIgqpLIlYvj?=hrHE=v@>% zt&wNsK`SnQel}Lk3Gg!Bh49!L{(*Ro^S3xmO^@YD%EzSbZrpeUK>NY__ivAnf7DgP z`Sx^DmDNr@3wcO5PQeft=)`u17Ne3_(aQkmZqlI7f`<@}UTquKsP#^*+tpNs_Ws_N z%Wlq-%`}2XXcfPSiRml%!a)Tarsi0XQ!9Q~8`0g{S5e#>t7tzy#-ZFRx<obHo%5Wm zum$ni9*|-kA*o@)?vS@43YMg>=mnYrL?*t0#73a3wi*0uHTVP8W4f$F{zs{y5nsR3 zg@%U08~L-hccTLLA?)M9X$qZOC?+QM?@z<|yN1h76h5D%{X*^>K)WCeZfivly_A*3 zZ#gQ|tM%`5W8PuW=pb34{9IUQCu4L55jb8ThD{Oi)xQs%h(@3m>;ZWtb68tIwz9mu z7|aW(g#MxHQf_Vtt!$fJ^{tT}1Y8f`qzmqREpS)B6Gs!%Z`oHgkUo6)VDML^&3IGo z7Sh_bF*fQ2q{s+O3;72HpoTIg1JO^s7SW$(_erS!lSfqy0eSE6$NOIbaun#uDm{Y` z>fIAH&s_9s!v5~kzOb1@?hztPn>dp^-5UoQr*O;og5&kwLSQ)jWs>rxqL2{2e_|LH z<a}YWJTX;S@!5Mce}5YLA>aKfy#)c!dC9vxHjjQ}-;BKQNh#M(dHYNk#*>Xrvlr&{ zbRqscl$14fb;Qa~@_Fg$YlMU>wX5#ucD8h_kDk1cxGDSW84xEjt?`UHIkc*LiD{8y zVtkcW1O?67D`5e;MdoUH<N`&bbKVyZA^oZGHGW@bXkk=L--(Q?B5x8i7Q{F<8NHW& zOzq{(*ZH#34Q0%F0ZepC<c`?I=|KYpEfQ!J?#rpJK#P7PBs9J0Tv%9WGg$$tasiT= zvnvCcXs<-Uofdq-gWoD2R?--SgwD~As;sOG!UXKB`ErJ>&|?J#4n>Mfu@DeVHA;aQ z0R}kZwXSTy{s2ONAy2ZD1mM3yz^YG-9z%Maa0cN}e*ONvi}jkGjt)YTxvjI)vZv=N z7@P~b2s8>k1gIgJR+gPK9DkE29}|aX$NRYBweZP4zP|ej!NqFBCBCd!yuw<-9tomV z6uxP<hv!)Ts8nuHkeU|;2Iib6--j`z+ns>`tGqF!<wHJQi%929GWRqxAMC`wWg(2c zm_M|Qb*F=Qy0t!7&R>%tp9Ub?mjW@8`Y$L#lJUlgtKST2N#QU?T#|!hVwe$ib9wQp zmu!z2Gd1oK2i=ul+AP+E`lidRvNv3vLCq%?Ps6hLzD>c)pom<<tNXx1ePkp9%9f>= z-$zMduQ~Tx={`+(EX;L410PthfLyNf<R?WswGp4P9(d7frX+01Jx0R1VuM2@W_AwD zc4CT<r=bvYz5_9vdrg>Za;L|vth~X9ZW`*0_ao}9w)7#e;09aXIB>TH1m9fMCh{>K zpJo+mWTfrl{0uEK0K0nA)xqRzZ|@pR1G@*EzzSqlscg?l>VAkE29;Dm!&z-Z=I77v zpv?zh3W8-Yt$~_6e*_7*<7Jlk92^{gP(_2uVqP8-@X}rne^&$IfD>Hpr)OtcRSr}T zR<*QIiTVms2C*QV9fS0Lqv!O<+FGrVq2{C!_3wnNj|J!gnHn2c79DlVv`2oAl&sIu zek&C99s2z?3(*i>O!!SI)TVu|9NHGk73H`<*2S)2rf*NJ!1)<+zWz)Op`w%1We2}L zrsfq_$lF;s_ZNFB;PA&#w~YW56{V|F(xTv%+;(3Go(WTt9t|y9Wb4KTK$Xv=Zf}H$ zSHgq2FsnND*|fqkU^Zy0R?AyC+%{Z1Sbv-<)IFDMrZ$nBe%=wXyzS^8LM=!WaOCx+ zp&>m#g*j9fanq0GUAgs0bcW39*$)9ud^M}))H@sV^IS{ou*P@)TigyT5)g%LgVTHn zP(ELClWP4iY_yFeA<=rS`U%_Ko&>M+c!(12=+&VdexJX5ViSqsHi|d>8h>v290@?G z@;EpTW$8N|tf?U{POVw>>z)MLCijCvlMOCYupP!DAZP_e`!U?o+eb&{V8Ytc-mYl9 z&_#y?KUE;?LZ<HSUixJUbWS5h27N$i;Dh%ONYUux`gf{22AqiFOMxk{-QReo>}6f9 z9XC9RudUO4@bNz5NFi;-kB<Siwkz%Ig2_Fi2X4#H+MoVzd|PaEa#x+%pb^}1L1POx z4MU@&?Va|D(W&v_j7qJy7H>%{C*tynS3+zSoyn(TVVAJzRzxScm{&7Pas7H1f!EqP zFgnX68|@XS1Ji@06duvhBt7iGlAKR<`IJhWeC$*8CGFFcZkg<do%+Nko<UpJ{F$B# zi#`)-!R7`XC%t7Muu%l9I)DH!mkoIu1$1h$p^$O&Fv4!Bnrx@uc9JJLI=bJ28_uJm z8*{9T=j81$g&eeDD_G$>j?hfT%mOCz2d!s^dk9|`3P~)ws(~x2K(Vbc=v5PX&A?dT z2^(7uloc=~07@fTK=49kUpwJ$MIWRV8gV89o(JZ(kX-%}9F<<Yc!Aay2CuZYx8swO zvjlG`3ZMJO>wASn`kW8sm$d;+d=641fQ!<riSjJg?AZ;xrOv~XF}ltXIm<1~SuoWm zKJa(ecm2QvWJtrq!<lW+8mMZOI}+rn7iOG_J|#)I2Z6ru+bte<&YLWo#egV^Q+Kt) zqAujW=YH@W5h`+JUp(SIiZfH`{v;9$3$oz{o%hNsIu_iFEHldZCPVA}sxv{d0K{Yv zmsrJLJWGXyg%lRTER7=ew@yv`BMVOX1pA%0Z6{fPObS1Xyv)y@8*t>%8wO3);90ZN zCqKIgm|m)7|04Uss{_o1i$nX1I7mP6xu6tThVKZ<8o4LP>8U9<cn=_B1r7;npxF5t zd17Ls7kZVWY=Z--0k_ReDl;o8;=ofNe3czLQw0fW8tA~ycCSr2h-Lt#JK;o-nyTt{ z7gJGKVi)Uw)P?j^RPSLpxH!%c*&XsdT@4G}H0_Rq#0GH~Q_O#*Pyq?m-`}4EAH}0_ zv7_yU)exv~D9Ed8158wiR(=7Tt}EcE11S}9XJ-!Ee~OpBJk58vz*^4x74xO@bA4ti z$SWfriioP)5kg_~FTnKtv+RI9u<`S~9|Kp~u|8G&{AB-gDJhJNX7vf%sLl{wb#lu$ zdod6|7XcQJ5$SxtvSs6|-mc<-o<E6W2huHU=*8Q$KNg=0=!=`@TSSiAz^EJyx;@AF zHmq6ABHtrtuz<-q_YMnC&!Yu%{tu-$MKOinnaai&^Sg5)h}hC%-}FE`jc_iBi+utA zX^47S28Zs9n(w5r@nMspi}0$gu9nwgUpw#svJ#*7DfhEfJAK54fGIH9;1NL<5da9} z2UYT3_7i26*plY0bV$h8Yxj=OWi=OTxuvVC2MS9s@T%t$E(GCup>9=EyYF$r<;mV< zC+u|1B)lSN<$BEa63QokezTt6ZaDA|f(;(pJZ*pKuV9H`<Fy&@Gd-W<Hk>z3PRWNm z0&Wgkl`iD4lFZ)qqD@Sa1JVEL-@gmsiUR?@QE+okCpkL__3$@S)sXX5MRFv{EkJ4& zIk^x`VRUorQQZ3%Yi#;i^JZO}+aZmbOKj}r9a*hLvmp0SRaHelJO@t-?eqKX*p!*y zs)DB}H`54qgaiY;s^0f+hXr*i2=<zBwYIjV@V)r}jvhZ5D;h3GQOjGtyGJ)}+>l!z zYX>LtD1!t=sO(_uIz~Z?Cu8Nv*eGj8=VXXfQPY!v8K~k=XQK)DIIn2Gjh*+^auDBB zkr7D0=TV;qTqkhab3%n~=*t#47~~8A<uw$-W8>M#whuOvo1^5hz-tX$XcT@aB=jzk zu)HBbL@nabw7MD@QG<eShz=Q)z8;9OVK||=dD7vOhUM3YPA7suBfOT1q9V4f`n@zU z8-WBR8$F(pB0WWSQ-0{%!2K42r_gj4ZXZ%*wOqln(=XK&Yx)0aET@91YO3aDXJ6Rc zvq?of1Pk&Q5I1Gc>EtxfK9(Hmj(G42U!qj%E|{K@Mo<XJSX$;fgwei;vDTS4JRKu0 zk1`I5RMJ)M*~D>m`g>dq?~t*)U@MKbf4JJDkRzV9u5J%dg5_0I@C^wjMUL%7{%p;h z)oS5R!tViRc42AxZhd6q#0Oe159<HePeR%3wb0ax31bK3b5PqjfnV7h6>252j2lsJ za-O1$U$Ya#HEqH9bY=f2XYAIiv+w+|Z|@$C+e18W%P7&rgcp0_>7CpCk@bG=kUeI6 zUUL9~#vU`STYj&VBRV8AqtF&ZH<6fb|JW$gD|W)@kwZg6onSJlz9Z!L-lJ-DUURv1 zmiXQ+5Mh8k%Qe^*!zomg+04)JdKWt_7zJ23azmEpAh4B@*UxU>zWqoow(EOr9^K5i z_XqT)>Ofgy(urqPG_t#n`j=#IxikuGYftDg1!hdA|FN0pj}YZ~$(aV14bt{VN|1s< zl<Hx7#U5NtxtWBv*dd`|b1Ppmx#*DXR^i47$H;@asG?#`W^`$W-sr9~vXrF)>(+I1 zL|=4Fys?H~Er4e5RGAGbyxQ8?DXYB}IjzFAHE&$aW0(;4*58u!BD;4BqHN(iBJF7= zn=P?z+I}069_<8R3S7+#L50H9D~za?q>Cwr6=w@x@o+2ZXIATBy2vG$$l12JZc%+i zs}Yr>*yCChs@K5ovfGjjC5Nz|EO+E<E<(&pG|AK9LlzF4?7$g)>o`C3K}4RjikwbT z^0!p@@dL3BpMXTdpYsC*9F;hhfLuGLx;nAmVAFIbqcw|8gm_dOJ=OjZZtd<y;P{+g zwLd>D(85LGXSas8y5+usc%^0V+NzMHjSPvHMO|*7lxTCmn$}@&QY0U<GO(bH?f5<Z zu9Ssr71O27OL*DzmBSAf8~f&T-;(MBV@&5*)f*bNhJ8*&p^M*Pn0A>1(n>FJ$E(L7 zneq1I_3PJO$}5;IhQ@Mv{5$CaRT4CeU*af!wzdZNAK%Ex%mDBzW};8ErLxfw)*``m zb%OgI=iY1;?ak^qf_UJ!1TfR~&JGw8_v9YOb(-Ysmy?Qr9$JUIA(c=Y-(xmP$NIx( zv$L~k4^Y4;;1+0}R}}gc7>xDT$M+~q99d~I(-d@hN(G@ipDQbm3R{odls0Ea+oOyG zczNT)!tTAWsjaQuTZ)`nK;K5##T$k*;13c!PAmqN+|bsTENc}-@siqaFW38;z3j&W z@%k3R<=y-&dU~8%?)iF5k>_&e5-~)hGQYOAb__dJu;fqqVGB)oR#w&zkZ6}UmiDie zJ+_l+X>DCBY+pC@2%fs%8RaMSL{O*0)Axu%Yh25f1u3N<XsfhYOqYHI#2i`K*>{X4 zTgL;yFX>Zkp8DM1zjCtHm}r*?&Aon7WmSe_mVNMpvkmGr$;c}6&!1vGJ+&L|IXydx z$&hh>v_5*Ja8zF^HTP>FQekXqVWH)}SO;}{_m)LNB|b_~@Zts-(SnYDip$6ovI<ib zf<(V09C}lN9e=JWAbNK<H#ajWw*Hn$B5A4bVE!W<%l_BL4R~NIle!T%3CTlJamHAM zn#!$<>mahaJWu~UG7JEZyJ!34m8_hcdH8Qat~|@_S%~&F(r!H}UmtyC{yo?Jn>oNM z%m&Dmt}YozCr9vfr4bU+W7kcFSD9k9BK4?^^ZwIBIkdw-Vj@GZEm)ufKoJriF7fqa zlnY(>LY4_AwYE;rpE<DWfr4z#Xg)YJECU2}DRmDa>g1dKx8;~V;p!r9g~y=vrMz;3 z1>2}~cifs_7W#(qR*+PGT6o~Ijq-UX`sH(eUD(WwKD6}G5a$iHD?fk!e5vRrIk&Xb z*5Chex+1E)s(A|sHPYYz6XHMl92bKB{HQ%I-tf9uUH-QcPWie~)Let!tTZu@3@e32 z7@?3u!~V!&5SJ5!D`>zXYukoOt6J*@%N-;5((qRF&&()5(*S9r*@cDJ1_lPu4bV@e zi+&*<%Jo_}!pJxBglI}Az8tVN1ipgE#cbsGWvh?A=fP8>Ok)mWEU@l?Fc%9@yF#Uf zq?Lb!r_%>>;n2ur<@>WWoJKpTE#HvZ4ZtKUIUm@t@iZaBBxJ72GoC_#pyAE&*lWPP zR#(eM;us&?jmC?1TUs^Otav+~MV*LG1zjCn1VO%MVqgHp_h#;fRHWAQ>Lq{>W|u@~ z;|D#39IZ=lRaA9bMp0h95D=D|pWkA^T>?hCu+0KY2uMWZv7~?zUxlv*!zTk98$B;C zQA}q`h6Dnj0*D#8Pe1^zRrdGqXy<KZH8pgf1=&0F0r>Ua^&ei9PXEG4k#dogv{zz- z(RdM1L^uhz8=@o-gjDg}QfE|#ui>;(Qc^BBR;SLQ-Wuaif+G5!Wstwczirf!CNHA3 zX|_2ix3F;O?Sv&v3+@n`s9E!t0cdtW9Q9vXGJ^!97od*^13}x#3dn`5etUvPd0rIB z=eU0xh=!mVS!0N-Eks6$N#T6y9Jy_z0j{YjpL!-me3D&fJTL%O28X2;m?A)w2%pZ7 zomjKXV!(ftiJm@3N&iW6pC?^R2q<8M&;D|uV@OutLd5EB-{o=NzfIrEh|ixNJ$okb zLz5Yvr9;IrGsqKxi4Eu-_W@4Vdp{CU>Ztp5j}unDSwNbbe6KulxMYoI4VYemLXH9= zDWM5k^7!W38k@u<8W>MAxbY{g$$}fkAb(#d8KA@kBNz<iCCX%Hch~6Xtk!)`%6=E; zav#SFoM?xPs(93~HZ^ULfrt$<UOTjnhniaK_A$CxHY$o38vmAjJ?WZuhK<Ebihg0M z)%_X`AJMY~mA0CPgh!aFOwqOb8(~A_ipx`N9+1epoweI@@$q%^T`ZbE<o7U<iQ0-{ zm^V(`fO%m|szOiKZ63pZJI2-bLprM9Nd-8}PEt-Q%zYK-9w+VU>Sj;wO(}Y&sOC)Y zdc8?nK_;z)tOCHlx{Q>bzj9x;Sl&UDSLb&V=({eTr^N(bD%f@`?vh-lVn=#yojFqC z*n7L_OH~BnQ&K9rx$yxi3NQ)S4+DkPwXPxFcZc(C`3GJ%u`xno;tue7KsV&@o<~Gr z$APV?oLtX0r+Sv%4S-Hn8OzUXQ7rH`v%koa3}O#V4+*VuJHp}RMR_&Tr+bNljUW^o zz}gAm{6Rt*TGb4&Xr_J)q>(im{#ngQU&@Zx&nPaA+TVYhHnsB@x9he`Lqjq>g|AW5 zeB@Dm1R{h+m}h3wQ%Jw}$b=e&7h=+*KgHw64MqXM-tcezVm4Xv?EyUftd_@|+$8YJ zurc3_(}*jjGP?f##&ACKbAAVQEjSl1@4RfW38N}{6bbnk@L8UYT79clZ~pH%IK#EP zH;FD$OF|Gd0{Uk-Z~d0ek4W`In4_e@iK}&Zn1IMUo`b%Y5OFheAXvYs9ZnE82?t4m z85ec&ZAcviIscbeQ*XNF>)*lS*wv*?)JkO5t_!Z5@jyVOzKe;uCF3<I95ieBbAC8u zyu}4%*xO^8MxJ~x5Poi}0r6<}&(z!{j}2$*^yw64P=28)FRXNSl7n32W3ap0n3A?- z)~)&o@Y+bB7L$#@+dua~xb^qK;pkIKrR^Ml-FXV!YZ)0IU@t2Fq(W+Lb+&UpQpk<~ zrA6As)Lk%lu6r|fnMo;->7{~PTX*+*#n!Y@v8LxoGt;|sH-3V$5Q+ulYEViSPea_G zcIMJ<Y<Ck+qMT$;8!_G-zFAiKjwXy``aY|RTKpq#=hoJ`&^aNwszAerK6TU0AWuMJ z$f!aQHy&KBRT*IqhWT7k5l1SLf)=7$VY=pMt?ac0Q*L)v!XZ^~J-ESkr^4*#+cL$M zHtEltLm`ML3`Cjew*;=C`-oO_H|Mnc3l|^18Bq3>zkeUIu!O_dtu;wF{a^{MBv@N1 zg8?xB{E%0a1tQq{s4fRubc-0HD9FEd94;UJjcZu9+CyTDCvodw<KC!EK^q>PWW$UJ z=bcd{L@RY!rL3Z2L%|ruuWP8Af_wX1-|$qS^J3Mldk4(|R1Hu!W>9BJPki#v%Uk!q zyu^OkLkNKL1GT%5O#+jHvZktTol55a;{w3pScczC7wMP?76qUs32jKf)Wtc7K(EpE z2usK1;1>a@BQcg_-WXxz>yd!l%<O#Z9sPgqLp&Ee;8zL9Npf@$?&#r1QQ8^SX;V^B z%88ZSL)NR=LkO5Ihfa@l3m#NLm{x1;>H6Ww!osWbx5?nl0ILnoHqIZ7%N-`s4`O3` z0~Ci|Wy=v(NU4#GaM~I&Qqr%?6;gQczG&!s1+15k^2fXh1f&>V2*7A|G55A=)PFY~ z1Bg_MOy&WL$(Ju-*qv}TzR;)sg!}NBL-1~>ql<4<a<ddRO5F=|ils0;f5}FlJMd1j zN1jMJ&_KW=LCaxN04Du8MO}TJ`|b|?OBrcu8YVxd<vuN}v94|~Eqf$N@}5yCAg6tW z`*=@nxwGG7?A!;wlM?Os;M<W^^MhfYiEt8rlRhP4n-1j!&r}{s+s7Qj102QaH=s5F z2?T91D6o^7n8-iB$OT0K_&*Pz2?obkAc_F|9#U1sH#^4DI1T7=P5HWot##`DMYb{n zf{5j7Wl?<GNE`zRG>+M@zcc6`83|O*T@XN>U|#`4Z<uoCHa6tpQ~^x^z&Ly&qIUH8 z+uW4=@(N5~{g*x5-QiG*X=#z%ym_;wt!-l1OQd{{;nS>)@bM~!;7LmiRI86)I*AYJ zBO*fSsDxh+qSkj>T(z~646Ar_y(ZUA!zF0|hDdqlY&B@)`Pj$DNARqtl=~^~mtSS9 z!6f05ckf~X(F}J6(M;Le=+y)^LoB&EV9!LvNeY7(5u4t^Ts9(KuQU!$A|{dCMU9Ao z1Nw;J!CaxIms&2o%VXrpTxpZ4F9jq9q%aa5t2JZI_>Jb$6sfc5F-nw47I5~!_ypRQ z&6D4YYna1u@IkxkZws6*cnxfV#~uX-OmA&16;L*`79IWz6{6foR9^6O6PnpxdHftQ z*kI_dVS*(IxJc@IE<P2|KucNCt0RI1P_8|Pi$kjSh}#fx+uY1_aCn&3=I9VfGOZ_4 zy;8`j+u3-I!BF&M+5B>s3*_zGUynyt-!{3Hz;F{ouQ*daMggW=IACh^p7DjLd}}^3 zF;q)i6i6~)>IQM6vzwa=2LV=a@4FZ^PfzO|pUX+v?$%3!SqX_2iK-fk5erOXL?86d zCJDO3*OHc%rD13P2>vFRb7#fv6xZ*2v6}e-$PC+#&Ym6sI0Mi}CZ)k)Ruu3``b8H2 z?(W>Xoduh<wy$jr5*09`kHbz7Y(byI%IJITNPv_MY@yydI}ePG294W*7ZeE`L8vzX zJMJGHWe%-sf=Jo0ese5s9cpHBG8x<)pjbRTJ?&q8TUAwcJ8BE;lD7A`6!F0`4=j@M zG>Qm0t9T^s9=}nUBlm?xJQB_<oJlnPD4K2yMQ_G^o!sYNGbKvN%FXckBR0XaYrJ+- z&kK~C%9p;EhwJ;WO3+F~;IY6_fN6kYW|w`Zcn9tHud5seO*Z6y!jsN7s7*6b<Ah`3 zB=q|w8iZLQ2QcLH)Z?CHb5;uv^?gK(i{<jI`uD(%zM~@1Xhp$AaVzsZSvc?Z(Ov^R zeH5HP@dBmE>H*k@$5b&yeZx{RR`>wJ#>qH_$UJzRq(vW(tRH+B2xl3zb)rfCW_D($ ziL?QyC>HbuX=1@?VPj=tVG&%$W%=PaA|k0Cxp0I}h-f99?(O=VnJG55xwsm@_%eV~ z&RuFi&$KGK2>CA*{5s(R^89qHASagv@HfyhF!4R%NB<9&do<&|RoHSUO~|bIlS?4& z#jsU+s5|tGw5GIt3@OCKb;GCKy}j})4CjwRH=wEEEXhB}sE~LH$Og0W)cRLmr&e&3 zxC3??5Rgvu=+QeCor)hm_4RD%aprHzj=j|IAY+w_xiRcSu0kDJ1VDhW#T6(^4%p?f zYGJhKhvkELZUK(kg-F-~3qak28Z|gD@E-1$#dw1@8y>XK1Gcx&IRW$xwx1GU<OWw- zim*3nwsI%T2~w#<am-pxX!mJ7J#zS4=x6UA5U>Mq^6k}CQ&Use1;HQaG|url_tN{X zao`h|Zz0=sw(6cTT<_>)k2;R)UUZ4tsKuS6(E`Z;oA6~urg(Rw5ae%>MGF6W0vrYa zGnJIpKR}fOm~;92FI);jJLlD-q)XQG2(52^weV5l0QXy!0|fvo1YPN!T=7s<tNNE& zc(eA<G{2!=gMD3K;4L|`nAF)3O{I-ut6CN_Ofv)t{DYk)fKqDF-^CZNun&TkD7QKU z+*dr?-kDTgDW6?ilQHt5Cd=eeka?$|<~92JH+uF5pt#@M(`~(Il@LC5wGl0oMn3wM zL!T8pOEW{mcPf@S9ld=7grpDWJRMclG@_znIbOT8Oy8#<WDVX*Kkx42b6ffR2x$vZ z;k(VeJ{_K0b-bCZe=1aaV3dJ!63=ST1f~Cj4qXiTf)e#=x_&|qPy{s>Q%tB6fs2t2 zNuhY`x2A5Vxtj_Y^YcLDZMZyZ009T+`;Mj1Gs^!=nSeS1ypO2F#Fs#2?T%xq-9RQG zCtL2e-aWoZ4R3|}I#s|mIw>hsyI^UdGX~tVcEJ~Xe#<v64MN*ol=)tBCPGnKoH(#n z!JC9m9JZcAu#*uNzfn}Tdl#C4hr(V7(EZ#&@dCo?;!^QZ<^oQ@=h1cgeN1qzSSlaY zHwJeWSjh}zN-;1o;s28Yh!Hrpu;9caC-0SIs~3kR9Gpx4Mf#poq6xC-%RHApJ*mR6 zbf*Q9HBw>2ji(bbvRz?bfmeWr??d8fWP70AOi!n_Q+S8@%inSN`VDM%RMYYvQwv^G z8yw4iy%&ICzx2mY8>X5v*D~0n1vMI0sp;6_H-Tf{3YNzUb{wM4Le@es6&TlJhC&Ap z{hG{iIv+fvjV4_L5v?D@t(-5#O~R28NskmI-$i;wv})I`z(`lbCJwDR3{sX=1CMMV z=Mguf-j(xkcJ3^`;exi|<kFYx>v5d)V=!TMg558Sivgp3Wn&bbYifB~^;YG2G7i4J zBB+$pK!7)3U=I!p_Ii~0Ddu(l-`l*ryzu|D^+r_bK$pw^W9v%nGUNF9tQ|JRvtUSi z$PeC#0)Tz{pMj7fEXLXuC^D;ClSb^EdU#30Z9*rxt=kNp<Xsgj4F!4YVwH|h9i(vn zSW4y$fqu0~<X^Lh!_J%p^53qk@Z~?J7hd2ODe~pVkB@NIPj1pXNc<_=pE%svc@1Ia zu<zVUM*Rx}cL-obLD&;1!HLV8H(#<%cb`teFbq6;un$mxdjS*}b*F22n#_dXzkd%7 z4W))95^TVLHDzi9toS=%6VAf}Zl0Xks4oRB?n7VY0X7+{PDO}QkAOu96cp%;bn880 z$pu{cVX5!o@l3#F<B^RwG3CGg>uEk~t0cH6-{W~o3row{=}J^;Y*-Y`b6TV|pYon+ z@W;3Zwn<vYY1TYTt@|K|$4mRHq~&3cKwxr)nVG4wlGdBPs(k^Um)KwZp##j!^aB%> z9>ToND9y(eM9pEosKYw=u)wj#%N4)>hdgy;U#(bEkhU27B>f4Elyg<9R^Ws75SFG! zjk@J7n3a-bHU>8uKF=BbGP)XYL?0y$RS3L%0NAvfT(c;w()T0>ZUgXCUMGVr7|Pm^ z8RHUUJp|Q?ETmS>kf?ZJ+_*6&@x)xmCeox=%o>gUQ3=)5PuEDl-A#@GLxhi?5?XF8 z?u*-OVXzuhhiPY4$P%Pl!3}~}Aslx74EvS7Qbc5B<f~+UB4+Kf;4R;+v){UTR06!o z*1(ygv8^5#&8vwj_^?S2-njpxJ>XBSj}+3-GTbykdFDiH>i@Li(ZLcqK)2NhLY6sn zys)#gGrY}X3SJ^-e@jcBRm{eW!Y>m+E<l%+8oB7<BLMlNfL^1iDIdlzHeDMK0Ct0& z#IB>Y#{04|?zy=+x6SHh0J7+Xgvfb$D>;Tba%3Qz00oX};4e-THjj>HQ)QGWP*+h_ z{xEK{w7)upZcIbAQhm!~4%SEh16Q;U34B%aYS{7PrSqA)cOUPe=-34NGXa5{?WbVe zLM6*=se-2z#Z~%e?Pp`^+{R+BN~DN{vM3&G!G5Wwk}VFV6Z<X;-{X1@JBEY@0OY|F z&l}@OE^z+M+q$Efaq2P|glT~or%p)PKRBX_@1$ob3plm)yXrUa=(ZiYe$bVN+9D39 zMP>p9jEW)7xqtm2A&f4Jjz%&Qx3ra+FEzP`ZrwZPjzr}(Hnt*nl}b(2tH@_6z2)nb zp+^tywuX(Eh0`N#oh_VLDx^y6HlD#S++Dr5+|kkX85pN&GZYc&f(kBnJe?sUJc>Bq zk15y$j8vw+@^fXV1ftv{=T^<e2ThrEYQiRJw0|dBS*=?E;$%_s)W!MZ5kkiYt`9AK ztq1Xh#()rQz!H#_mcdkeeU*HwX#_D&R|DH%cthX4yD|gjRgmm`yp~sV42%|d74cK* zmSK;f?l9MK2k1g4$qgsTchc?G6K%O}BZ7nfz<u33IvNjTbacGXxDB|e?}9jR52zM* z!X?FCyts;fn(nZe%sCetvqD})|4Vke*<it#uT>fd>C%Dd2^n}{04KPgEXKP-QUH+F zfaa8Hp5|>P*>Yq9xYiR^7CHgm$zM!AySp(%G)1M%G0xA=y}Z|~9e3?bLxjGK%3$o_ z12X0!ST44rXrQJ?TeS~{zL*>5OMbEq=qGzWvs2pJ`@Dc+d~SzkEK|9Y{-mxjf)(&$ z2Upk1uLyZjn@QagEXnJ5#cDQ_8B=&6ElE~(QMZ@$-|0<M71&p@gc?uMO;OS?3ImT8 zn)IfTpx#v+w<^qB^m0*GZYo~_Wixk%cElTPIC%=Lk9#t(TYrp)3$Gy@Ruv`pp@7<2 z#Q$4qEBtq*jZ;fcujtyOIgW0-BjT**;RHA3vDJ40T+RoxEWpaJ*np>6tM0s4{cphq zZo`kM@$yP<a3wR9#*iMvR<NXUDX+u+N;!GZVZjY725?3Z?K6v#7KgX#@;LIcBTdNj zTW)Uk1`>*?`LEQ(fgRzC<9SeYD)JHjICQu~o2S7H4_=yvdrQ48iFiOMIzBmxg0>FC zp+u~@KMmRM1F6@_YAv66A0`DDqyysOL@rPI2G$Qmi|oPl>L)2JB?EG_Kqu(5>@-d5 zBWH3iXdg2=2W}%44V`loVeZ~YDi=iz+zTHTFRiSM$2UlSM9;fiD926Cm%u>Cs@YLU zUhD7TOT?=G(}Mdh>p2IR@lqXk53Ho82){VTzhDdA5WpR-^h|?BEN_T9F0>$5p4wV_ zUA&-C+z1!u6X}*p{|a$N+>GgWf3k!iz%K8cg7rs^D0DNh!TIsTVIcqLGx?1DP$1k* z>bpyGCTQkkpYZW`KIM_Z{Sfgd&9VLkIGOnw_v9<kr3}{O{BQT~Cq3-7J(EY_+;c4~ zhoEKun`A*w8yo0~GHT$R%A`^BdF0#H$+Hf)ZyfiW7?>G>O?`V(qfqnZcg9#)DDXd= z_Va5s!qwI#y>|<)&|7|2t92t(83|;*(b2rUC|E>w_&o6>loaBJcmp)7oa#E$h(h`H zSle4zJVBk!992OI^m1Q1Ju9o-h%7N!e4%4WEWyk$KVMGs9`RPSeZv6{3~~RCeE)5| zee2TWIbh3^%uvKE6_fp?Hb-Y{bA4T4t%e>iM6<y~XniEV)S75~dZ>3`UJ4}LbXu`; zV>KA&UnUys!KD83+r>T%PJgFtWV&VDw+fDyY;2C&@_#m_3;>AMXi??Ocw*9e#CIg` zkvCMW$t?L8S4*WjoDTekt00aUZ)g-npCzvK<7;%c3Fp-G^v?G7{fzqNo3Q2k@iiGC zQK@fU&m~NF)(&7bTs+Xlii(PwnK}x2E&d9G_~d7dNiFgrd(^f|`b{HqPpAbyM3>;9 z_nR9V*-(*-uzhKRw}A2W>)=&R_)ZDULm}<0FoJH4A3%p<)k6Zz_Z7OdLTpE5B>`Bw zqX8|4iYxW{Y&HfktmS@J1+9!=P^Kq4M{;jM?}##;U*kLVJOaXS+erDqi=RHsEUp73 z#^`%NikYw!ns_h^g$p$^4IkY2AZz0<jvX;@jL`11XXvmufP^1?*jw)Fo9oyFF`VdP zwG4X4@^|e)1rP~iqCYuK-UHJZe@?lVV>KLv-y<JVGYKFb#H#%ea9~freebqOdyK&G z(mpRVq%Af)0Hs66kWd=N4a-}0R$v*xa-;3Rlq+*Zd$6v~k4LdDaS<&awkrx&aEdl6 zgbGL3SJ$^P3+l0Osj1GfpXUt?iuBt%KO}r#R9W;x**5Q-5Mf8j@MHJ`3Om`@Q%7eq zO!5Ob6#0`9kU`fH9!2(Yio4++^`-<^^pMf;mb|Eb|9=bRf`agKj3clsQw(Jc2vQf} z9u=!MhVJE+b=$9qu?Ll%#fDDt`P$W?YD^kh)4Qdd7PjTC-Ie8<$!x%N_#dewEp_D% z)*Unz;ScRz-;>=J&2b^7-CZ@KxiK@0ub~(~^9wP*D=XVSht+~&hAei3D0dDI&EUdF zVBzhaSn9O*5VT>KgPJ`dFcGi;hWaWBxRorbOwFG}tvulU-XPz2$oKY&d_<tC+M1Ae z!CQw*_8DgdlCLR4c<lfE9jB+&-+N%>F2M4Wy13)lfv*4U+~1_Dgou`4TBFBC*76ma z)PyY+H!(p}wQ}IG?;(U2bt9%z+|{7+X|Gp;H9xhrm6wwW*8%U^oo$>SU-OL{k_77P zJo8C6qb6;9ljTQ(#q15(z~OXAfAaUhI8_zL1f3oL{Q8xmRq=q^py7H>>S%Pt#a;=p zCO>DF2Y6!~;u7DNhTj%`zutpa^u2E5xG+RU6Q}d7XX73T%vUd_A1~b)uO9z~rzZY{ zW+@+AxoA|yq2k@tKi$SJ#Q8#=DlsbX>!!xMneHRL7swD|Hc4G7PW^&07R{{JB@4K@ z;u$vozI}js^k@6wBvgAO5~g4N@NhyxR&J`8-aZEK%;L?{C~Pw<ap6t0(J4DTbh((1 zzkILCxClLHV|%+fp`^8`Teln;z-Ud>e^S$e9^>7CkBRps>~mFC0=O^2vJY5I1ckAn zG|ty8cC48Ry^ayn1{dLIHS~qAJ-4F`d2(#%AdDDWY8k+pwikIrMx05TH4&4W96Rh^ zgqY=Z9~0i8voP9W8DIejxXkHC%~~j}5lD()*KA_w@H2^!p`@a{#1OZIo$$Fy{qy~U z!-1*aav-DZj$_4F?!HOKK~MVs@$}VUS*2Uw76M|>CEe29AxKDz(%mTCAT5H@NJxi- z(%mf$(jfT|0!la10^fShdC&Kk&NVa6HSE3bd#ztSY3{_{Ot9YB9HaGbsBZ{peqY_2 z1hK{c2hV<7tt9Dgo%;X0@sjnvmg9jVAqhz~?DPNAPUODSEc5EredMCs)fW*og9!s; zG_{cN2cjXC>#1H7^?h%yHg26;KMdKCo>^NTR>+HMI|luHOun4iS^1v|&Ir^8K!Gwc zGERZ4GvUooYOG*Mq&4533HRRORgZcCj`6J$yU9_-@s6QXqq`!gt=w13_X5+TLL~{q zF-b@i<mLOauUgD+L-?LLt3j}OiP;MwezUU6k?Zs4>|S$#gwOvQN#<g0X49{K{(-JN zY1<74*~P#|i(O@OKI0<`*{UYS!LyhG8`@`Q%|l4cBsqq!!g{^@jX>IM)SC9!+>QVw z!JCy;>~y&9xrTfwk~w4H__H`cyZakW-MBODSFR4OSfjnP*yx;j_wy7i@#e7$7$zUS ziDLTQ6Ey|_Wa<T-o#QAPd>W;iW4Q|ER&&Xn)=g|2S{GK2i0@*_cT`qaEp04WDx%g5 z=t$QlD&q%hIv)OUv+dzcfeRMN05bmA@>pVQkIju%b@zO`aKu5PKn4v_pjWUCn`J<Y zgSW?)d;V7io2bcu^%rpQIv0OrL|S8{)$f8>5WzAvRZhJkpWJ}@ZqfD(^z^2H&Cbm! zYPb=|M8K)^D*7dq30#H++hvWsj;}I8f~KmUsj+!p0kw)$UxC^I(&njwih-zAbOQ}N zJ(fl#)_CBkP|BdQ5vfzbpBueC^Y(Bw`~J6Px?Ts~_io)&sBDH(I+zKN;6>MXLBa~d zgP%}ZXO_`N`19c?->_S^u@LlcLj4Gg8~~30JD6-q;n?^7vw;UQ9dR;opbd!m{cAcD z-VWVwQGYm;UFWcTH{Itdk2<ESHO$z`(}L+iB^D;;_m$rRhdYA*`Eojp%Vy<RTH2r2 zP!!9c*+{Yvi@}uPM-g}7ae?Ia=Eg|jQ5Dr;zEh>@wC13W>HDN*ifjz8PH;FWg{XJU z?_OhP<Hpq?h81dP@*UXsrEg2WAJL|^s2-l04FVZR5>tNXRkJ1yB$3X`@uX+h4QPTk zEBbSc)SI_?hNpDc!Du=J(vB|=3cqCu5Qc;4WHuLL5dV|LCuF^Eb4Hr7=taP%Uznhl zS>-m%E7&x5?GU)wLPPk6$LCC@gl~%@2V*QUaey3t{IE;HJUSkpp6+d>MlJf_osT<F zlqiamx$m(HKV{?>b(B9o=E{tE+<4j+3Lx~M-Sw3nvKJMC*j=}#kP<ui{&Z{Y-$7u5 zN(rLbTL{1>Wzn+$5I&cBU${oc#5lORN`nb16HqcmIp@cy@5?l`cTT;LiZdv=fBN)0 z>8^<|sC^-P4C$pZ>ywsAhfxi-+#tMr{_p)?+t^eweN2!AMh9IBTVmlUxrnz&3_jvU z%jr1Vsn_nRtMSG8(WVy|j^S*9%~j6Wc&RdUH_3_z=sND%*O=9HwY8rBpo1*k!ts(H ze;kou4(N<P^LQ3`HZfG*9C3Yq=v&6^`~=QWW^`>%rsYIMAjnVul=${iKN4$m8WQE( zwYuCzg)ts@Qd4t_nX0Bkoi!P_K6oA#CAN=*M*`;m=eFOMPVqxQv(eTq*anJh8m(8% z`2s6gNWD(I7wz^-5v8~ehy^N1(9eMwP~zIKMU7CN26#|YPAg}GahV}Iaj78|9Wi+4 z%Q|M1`mH%Imdk>j5LRZKi9C49be+?kTJA+aM9{@kM#&bguTt&(-K(r`OHxeer(-s^ zYQWb);3r3gD;8p8&KtM(cA~rSxl#VuUfJONqpk;=Ted~E)9IQKeAbv9qrhZMRhbY# zm%P)A{O~&wK#}3iX$`Nh`$`1YFYF~|cxIqoSzKP`Dp<b;i%N=|SZ5hdcYvw{>^LCn zY;fJ7k|0{Nr%9&=0rjohw}a;i!vPhBm`=FJfndzb2i3MQ&yMX5vu5e9h)5%tji0bA z_PsZ7Y~E=6^}HGQk!rE}RGUa^lXttRy9=!yJ%1c|JMES}+Wo_Xl#vKBp&yA{7Qo*^ zopBm)DnJSVifsf~KeR{uf-Dh<3`0<SLAerA2?0I=2swrKK)p~CY03ae26*s*P)4F1 z|6lBKJgHxnaJYK=wJq6=h*FnLbpXU5M1+El?gQ}a_^i6mH8kSqOnD$A3zqZjmrpc` zb;XOS1rILH&Oi#&`{Rdk`-ca>fx#{FTvj#%g3W>Y0$k-&uPJPaVZ`!P8a$L260i9e zC>oJ0`qC0a4OxOifuMM~9S8z={uKD3$WSmt_Sx}UC)@BCP2u(eY_3wU=+lPSND)LU zi(RfO|NQy$g?C00n4QynuinCU1cn<5t}#Y5U`jw^l>yT6+*}68I#z*W?&8sw#gL3A zT&Xk?L>ynOd~EbsK1PyB#}sAM44n%I3J7G#sg@n)r3QQm7z{?9q41k>4o7OB?rYUu z-P~Sj>;DMvdd$41Wp8jg8v8kZ|B|nHs6p&)JTSYW*Go>vK4k>t<mp5M#vY&G|3g(( zz4W@^GFBrF<0}JHWC<UynFt^Em>d?nEPzI4w$|acy<|OU*!!56F$SC}L{e6GjG*lW z!jRoQYyU1_bitbbF>UCHy5=?*boi7SJsia0>SaEM5*d7J$a8}#3R!tPZH>?Bii8E! zZR5#pNefsW41r{VH`xJn57mYo#O#b=@Cn_&+y46;D>6!8XJbon=}C+-8#z4E|Eg!; zk8L}K50z5tv;RU{nWw*C0y)2cKoq1i>MEoRBQ#4Uowm<;iuGD}nYQDsr?G(Kas7(+ zUntIO!V@8wAPf^b=z<D#t_bNQ!5);I|1!sPitqD$!$Wga;Kt@XS4HMeTOa>hwYwf; zJxB$sps6XG3A9=L_hGJm3&#_58`A-Y!`AXI8mOiUr&T5B9DY(ck|K+Y6o$IhXRz}F z!VY0|AMu!Wgejh0K5G1*7T~apZT>scP$=mZW;M#)yX9c;0GEKwn>P?n#^U}T|L2Md zhBB;=0HeW-2=n6ohYx4;gm&*fa(e`yCagu-P)|G>wGG!lGVEOga#)|!7z5ovLq`Wi zQK8RimOxitSs6CS4LEWpyw#sRVM6ZxF2jM||A4c}02`nkPp90MjF;&6N)l00Qc|W; z$`fl7_+gl1fDIgm8@OYOb(`7%N0(Lkiup_IavGOQ5wd}IcYV@Lx+Aeb4}`(i_#IB| zUcg23|9R<q9MK}R04H$Kr}^%j32+THrk4urTfF96TU*0~ZSHMMO00sr=BbE7suM8N zCLpJb`jMTWxPqSAW2aF8V=F9*+`K$g5&;ly#2Qbn(PLLcxDb{An{Yoq7nP($GUxjd zKe(0+OONl>pl>d2cikCaDvv;@pU`1zbvCNfb((UcUsl;<>M>)zH|ltt{!|Q%(<(== zV;tU*5ffvx3g2xndOzPskcLWRVPR37ZA&T2tFI{ua(LaMI;6-JrtfH2f-0+HHg|XF znfOA%3DGcr_<y+He9?{|A$c;o3WNd$N(K6(s{o(k*)rP)0=?&IU*~x*wp^RsVq&7v z4SeksBz7$5uosrknBmdxb>Jv}ijMXN@&|OCe;~J_@$aa-YeeI+2@S=UB-z;L$Ts+b z`#|gRg7Gu>0zRdsi5`*8nZ7f+`Hdsxr+Se#ZKE%!MIhD!2tPoPkmm*5r|?-wu#^L7 z2g$wcx{y3qyKK!4HwKXSNY=5c=x9RX>JA)MU=a~V;*2oOKY0=ihmoa~)!F5)uQJf~ zNa_-T52U}oMDkbvRrkTvg^h#r#@hNfvU&nSwUKonqi<Frza3-&@NQ69$MpSy^b{;e zoVTk;f;t>`_rCUy?yi{BWJORi13D2J&+528Dm5Wo`Jc_w;gVR{TBBI6Z<m^?mJB!G z^lTOVY$TH1>u=OEFJ+u%fqi;<x}i5RpM+Wgw+ai*`A827JWg`f9PT7_U=4sJu%6G( z!v8|`y&WTC9jZ8>KQ#;e)vfFB^x}VHgNCN^*@OpclxDz`brZjw0yeW|0KTDd6k(zQ zU08edBRHxgt$8deG?@Wow%Rx!aF~iPGU=~2!Y^Q|pEm6p>%%FN4C}PUy8yb4;rDV0 zGnmOTntS7R(2@8E3}jlkwXf?%Sy7$*Y$VE_*v7DDfG`s&?&;HDt@tmT2wIedeGXWC z5+b~X5_I6|NnYYbPrJ$6-VC7;4i7H6boNgU{z`n#l^_y5L!Lb!8?Y8&;L4_G_647~ zF*k8{VIbKcb!03AvXB~haU7MUK{h^sAkgVLFz^5@-k{aP!@~nUZDf3$=O|SP8{P~! zMlv!o0ON<0aV2mEfo~CCGSQ}01#lSqR*CcT3p%~S?VXhf5K+L!57H9!TRv3CN<Xht zc8E!-z(GKOBXn(D_~sQA(Lx>{kVG$Dy!d{7CU*VtPhb3D4|U|1mw9lHgEw{$<a&<V zGduvNL7*!tR4^c?H%RsmgESv^h5gGV47QirDnGzp7qAbUjWKT*%y0HXu^B)}?yngL z%Sm|MN+Nmi)l8i{83YKrweCjx7M7niVh^u&PCz)%00*>5h|So*Zj>xDG$!!$9B-9{ z?235a*}nv(<*z!6bf=Vb`rbcG@hZR%TH0b)!=D@#`-!_q>0brXNk#}qI>Cp^XX+|~ z?*wM-7j1CHp<EYk`E1TSo?9%RXDu;Y59uhnh&!9t6X2yu?GC4-ex_~p$Tmufrt&6^ ze4&b+j$l2-IT8L%0xkNgYL7P<_%tsIZp8N?Z~1KeC!BRWZ4rt?nwT3kiqbfcEzzVB zIr6%reM#I+gU>jaFi`hh%j%TB%>RdS^e$q+428V2hL^q&o&O~1M}ZAS_+XFPAIz^T zWK~IG;|K2mmNTac*)g<5u1=g=kKqoaW@;Y{>w|LM>;M`nYAVv0y0?R=A$E|3l;*MV z1R{4~WO5B<F<D&B`gMLJ^f*huBnM2dAfttm1}vNqRfhNVB|3XnrY8+AmcG7z#LK)& z94MaguRi7lfr`9;-0;LaZ}F+ClS?}o9^xkOVZX|usg49ridk~1<G9LdGPk6J9+p3N z6~<uf2VIRuiT+oJ{D2>G9Gk%)XuMEVwsv=iKr`{i(z4vM7)Uv|n%Wl@(m@sgYGRcA z%TR+$|LfB~zL?O}3UnmM<RxXKVj$Hz?|#Es(ErI>K?{&LofxYT3p=EM+Z73{sW@c# zO0Y6Du1&qvR~bZY5c}0rMtyATIY8{wV)Q;0v_ax@6(PHkqEx>J_&A^kIkcpaL9&^2 z$<xcSc-)@uFzf~Dg9)dcZDN5}@P4#52|1!x_yYh57dzOR&;yU3A4Y)`r{BEdQ$DL? z?N{v9o1~bT<JFZe!IH*2YFs*?d{94esF1>(!p^&s*lC$WhyOt6O|b3PG{j8MbVnVF zKk%6Lj*jKu1_2snF}FGgy4a(5Y%?IJQp&Ur@2uJ{GX4>ES(W;1E*B?QKc7DJdtvo( z0=;h!{}r#qGYRl}(7Ma+_4^n;T)_o2qFSUp9IPG<^;QVWs~H|ExQJ&bhUE&zk#6DE z>01q3Xx;t;m&hc*&$;DJH$YtjE`oy`<!jTESx@iIYw<3+<{Gi;RHzv6gZjP~nwrRJ zV`zE73E5p-4NNqIt{<e$!fjXo;P4Q{RZuPgQVd4IG;jEpWAe$#upg)tGolWFeqnM_ zBk1q-#&y}r{JzSp+tsy`d3CNEG*M#Sy3-@=ckh<V$W}*JS-7WHUh}MX%&gu_r`v+T z5`W#PPcNQOZ>N%OOf5}(M_@vQ_mrRDE!C%)p%LPGxrIOCrW1F`E4XH)GT&pdE0YOh zW{q!Id>!9u6x}_!IPzFYbXY=cyB_ZMMwU%mE2Q(L7VmJ>975qbkoM42-_7B?IAZYd z<NK3&&q!D&2#p)yy$4U?!BQxj<3aWcZW@@xhRL9PT@p@6kmoHo^Fe=OAq0*1``>~~ z5U#jv@OHyrfUUCC&i6tGe!cnn?VqbvXmR=4+?-b8d$jr6^p9?hKO!AUXm;wCSwjv& zb90LgA@MplU(QLM3(|;<RaU4%LPNw<oL;6ng=|ZO^7Gov@RzaNaE-@M!?XuEn1k<r zs%6NoljFY*2T<S&_$<{rFvB_f@9Wv`KP%qGO8+!)UO6YH;HcmRhlFs3_0uIyr{%Ui z7@l0nsSDO&e&_VlgLYbZn95MKSW32oDYDaI{g&=NV-i*}jZqZy&BI^kHb&O-x+-{C zQ0Y#%y~ewMk=cCHa9{fc4T@H@N>lzm|K%#>GYJW(@{)-&Gns<`l>1Pi3wctSnuHe* zx46u?T<A>FDtgE1si^#gL|sq=&jN3rZF(N>80|JU;Yhco774Y@me!r|kCoc#T=Hfi zC~0T{GXGIImY3)s7x#|;>FB11$k^4XeG^ktQ+A6%5*UzWZERQ&HFg%g(X^nYOdDUE zUU5_L<w3i5Z>i7ViW3a^i_jy4vkNtxey3L(8ZFSd@fZ+M5xeg23oBbkY9}@==g`dO zwzkDaqB)_vY(D#;;DU~8-E?gb*xyHg<`o$cflOs?57?IIMD}~0LR~^Q?*Tm28~WZy zY7ry?*!CC5uz^u|HV(HPUF7rxDRSQP7XUt)|M~G5-UsX&!~hhn{(vT)TeeO>+9G?6 z%!kqjRz*()o_Sp#)EOKUtopjBIX0Kzjf{-UI!%h;;^C@jsrBwOHB^DBUXgp(lFmv6 zzfV5imx^l>R_K3wGGeB44V!fMh$l}VLZ)BPC#9!V+&@*xUyn8O?%jk@g#6E66!{dx z1X$u4*36etQDJvcI4o<%$gx`U61k%2F<~^=r+Fm0_e+tf8CuX~!9OVz5pn6GDDCu} z>D^g`jibJ#3Jn$2tsMCR!E_?5m1|$Ak$|$XKay&yMQtqM!44u3Ooq<dH^lM65;#h> z0B9A*t;DwvMJdq;J(3t^oU)C4ERGL92i}e{AKR?aaD3TsjQI|asSObHe^JDTXXf#2 zq-QN_h|A2*iCNS!$~eljy%Kf}q4Jqygrio(Hc2OGdcJh7=M@UvG~Wtq!?fO1h~|;U z^wL1xN;HpKVMghf7k#7iU(MdsY}p!3rs*;3mVPpO+lMR*(W$mYe;t_;#~J?TYoBat zl*cxiUoTJRLTO2TbyCJ6C46ngkBz&p&3_{u*&3gnASh!wVa_(EvNm@2`tW4mqe&WZ z78tZ!5RBOFvaNA~NUsXZaYkfR04llHQ;^JoRZIBq@U#CSHjaabl3kK_3B~joqiLd& zll$P>db<=%kBn&?&Ugl0E)fM@ZqBa52!v;=G1S8cMT(vWDJJt$hGeR|6NTgfFfG%A zrCf&WZ2-8iknVG9zv*q)c8cwnKJ+%ck0D8n9a>8P+aw~r&zn3j_3O2jRTi8h&`4Ym zeJG+86dG=_En@YAk=fX()BIs2+4s$(mkXN8z*o{r(Q0fr>$q0!{eF~ALSOARl-wPv zrRCh!88tf68Zx6DS6PY4E9^CR7#I=uX~~Hr?76JCtg?*HiC#T3el?43&wecKO#0go zL<^^P(=5^!E7C8Rm9N%%la;(`+$vw`YYnzOLk%}kFZkRzD|`^YV!-EvLh$}cy&@}N zsA=oABNwNzKjP0sN+%1xwYttz-Wt=9`QMTSK@{j8l4~Ovf^z*Wy$WT#p5${*+}pXB zTyU7RSCnC&X(WA!3R=wsJ_6e9PPwNA&P*Zxh;3<X+IC?@HPvkcgFiayD)BV3I0K?( zES_eC>P!%n$q<r>?m*E)CaGY3AHEgqqJ<w|8;e>`g}%WJyn;k7&xdq$g76Q{Hm%r( zV1(qsiF=YZmz)1%FfJ87HC`{&@3W;GM9L7gRZ~>It<Bc{8~Y8i%8+qy>A-q$>?YU3 zwd<Ru3+R@BD5taN$%1@FvPje#M0npHiD;UMLap|EwF0CMliX|XCZvC4z}*4kjlsdC z?!7Dj-@0521Z~5^m@rBM1Z12dK7+g-K&B%N12`-~;MA*d`~v{ETyB0o>~F{$_WAQ3 zGm$j7pG1%HlvQ+f71TaYJbVGa!bt85O>6wlYoE$KzyyuqD%3)@?=D<PW{o^F!%Tn{ z)hO!QR4BWI!wadTcZG*9A4)I=aj#1980mU75yKdA4+xbPM!$O5O)&4sE9dNezd2z& z7gF)<L+hS>ejKyW>X>rO27U8U_2FYJFVNnr=&KEa$1vOkNTJy+-Ft^@*KU@aCLy*l zPE>uIfCt_eynCDT-BF8D4$f*W*Z0DH%L?L$OO&mY(w}vtNV%Tja8u*VIp|)e_>f7d zylAp~+8}7?r5|UuT#|2T`&)Xmfq`&orog?b+F1=}p<Jem%(UCM?2a%Q95j|ycU2dQ z@;`$OU-6V_MyZKL*4fqVVCQ0&lb`=}ArSHr@Dh%if8$^=n;E}uP0)?+=;*NDwb<e5 zI7w^r3|sv~f!3eKlPo0WvZ`evsHmV&Ob+U#Cnb!lPd9HaPX+QTM{?;lJl*&HyQTs_ z9zSd{fGmOlThYA%qt(E<L6_C!@S?b3XK7Gq_jgvLsPSCA3kkoyA2JoD;rB%ycA<V# zQhmK3Jkze_NHL#z1OS%Ecy7S1{iYt?yO#;M%3#{Ti0|wCcXoIN1wRAn*Z(Yl)kcN_ zMG7CFK^a+2$*IY3Cm&K3e7Xzpy0nZ;qKGFi<dX0KGqMcF3R1N<>wA3(|GD!ISPSLM zui$$hh)eR@Z-m0W@=WJWJn|u-<f-{(97Olam(MqLR-Eiw6y-cG&XnEpsaE?JSM&06 zzo%1Ezjf-xCQA^C_n%PrhiF=-F}f8}(f)HhrZvxFt(PrlinGdMHbJ}e>F&{}JHEf* zKL(ONRaLc8&t2Q)1R7aWw!v??Uta5y?1l%yXHO>?X9hdq`X;#(;}HSkifhh~Qe8?G zXOyg@+x|*jRVs9%d?q~3xnxpkB91j!`m3f&<!jdMhqvdt#jQvW-Gy(K8HZ>P6=-hy zdQ016G8k7N_S}WxwLmO)QE63b*{7#XBD!2Es)KUTB;HF9k&^OgBO(D2hAZ=ShbzpZ z@{V!rOg3?4SFoAAe5p{u6jOmTSa_ez$~YKt;HlwlAzB`(sR_8RQM9=45SUt+y^8g9 zYD7;=n0@UGc&Cb9>%6yTxQPets&Pur5Ph>tOdj0y$Z|r^!D>Y}1X%d)GsDK~wclsZ zn0-``KVe4K$7x%m!^M4MW)5QooV$-i{$jGmht}8EJEd8<yC+QQ=(l9M=rRE76c!PY zRx?go*|=$Nbr8SYQLO~&2Ea@5-tWIU6uXXrPu;fV(iJA?l5=5^@8G#S%ke#@hshGs zpccihmc?Ms;S8JlJCOA0(<k)KljHjB{&c?U{E|aQxV*Tzd0td}{QyMWvO6Ryn01<E z56QM<o=lb(1d?B^eQZ38ck2q?j`ud!L9rEZ|8%k7OI~1L*(2HUEoXUa!??D^w{56q zb)|g4u2CH2ijb%`-O=eSg-9yAAhtyXCL53K_PT|3vt8ze3x`BxHfov!FV=J3{w^Wo zm>Ddw*q@u6%n6^|w&f^Jl~OU?Z|lS*z+X_6x(kD77_tv~%sVIi>~;H>e&wHOXTCQT z{d8=!3u@KMs65Ri#c|5?O9%>QisLdFq?zg&f~C0=SR2*EQKW=gAiuUec#gHkJbT4S zY*MO0v~QdIcIMKmaKr>LTLEW~_UE}ju0~awD!5V&rS^4EctluOI-eetY?%#n1odra zf|$SQ;&_SBk#KxJA%XC~@c^2nBg_w0LJ4mZk`eK;zEDsYlmZapQK7eA#Nb25e8w<= z>g^-Mo0$<wCD(_6efR9pYP4};9;ZS~iUTQgG>zUd-OO}{n~#qugdD5_Y{A^C*H+?l z#$>Bg6i)f?czi*B!em6MhP83dmQTGPj+m;iyqajchSG;OZC|wgm=?ii#i9{CGNJ;U z-NM<R8yxoR^JAC$1Qq|6MwA{jb=+-RQ{i>y2obVVO`d#U)mYsMJKeZGV~i9zCPW?> z5VM)Srp<<5GT9fADwLaF)V63(*p0J<!@$DYwDkBc>=H}8<f6SozHdK1dG$?!q1r5+ zU%%3g?NO0|@8F@-Kx*H9XXx3V$~UHA5srw(_Nk4HTODqy=8)+qzu$ScQd05@WFSXo zf5SF-)lRVB6%$YH?)RR{!qNE(QV2vWRGUjQ_C?tFzYz8E?%rQxPE{zgPv`!|$j<RX z?K8+1?vlR0skX&cfVkQ1g=c=Jbf)mbdg6S(jcNx9R%D@CG7CNiey?%A$L13MuLrs} zWPj@4!INtJ<C>8ffm80!U|2C#nP0Q8`VY~8az|C1$GGor$VsjfF3cANuhmWrtx6Y* zSt;xxsuc!DB+>&{Ps5y&g7ba(cxE%(bKR`+ZMGd3pf7_%g*=&KgM-C_UtzypyZZRr z$}TH2-~au`hj4f4)Yw3h;z;hNxt<CoI=V?Fi-O;#EI%@HzpRC*Inw<&Q%X+kDoMYr zqO2~tbCqfVZ)#+>iKL-NlfFsTg@j}ccE<NV7rA;4e{VfCHqPXbcB6y65Q6y(-j9bH z)gXrI;FjioX_37YB_bU=Z7QXL>sq~)o&Sx|(1Zf6uF=eww!O7~Lgp7bgKYdtqp)@u z*u<`v?fHY81!WK1PuaO+A8~Qj*-S9o3V9J)>5)?3zU^#g5yRLwE6OR+F^sv`-afMs zg|+qmeGinro}csoVq&~mn4h=k?#OAI{Gew1$4J<H>y~r1r!YL7rS&f%7VTd&eNFmC zs`w!|lLBov+5zLM)K@_K^q2AUg%n0?jEBd^15J9c*k!y$%ZkY3nUmfnWioVe6bytc zsfFFEWC-dhFC5Uhn3?=r%XaH;wenL8!dqHm-;&eUbMw{Bs)Izux4BHl0;}`$Kln}V zP6h$tgONpH^~u$90R<TWY_o0S?BYhL1sD`{lw>fNh2vIOX=!Lo`vWhT@85rzkcs%6 znV7`=S%%CjASOrYrHWeXBK1d@a;&H813y4svE!j;T+P-8=Ob>8y7@KowH)vtt>_I% z)5_pV;hVDp8WGUbQxL;Z7`j_>nO>4uf<o}FdozQUxfG?TeU(#$pRjH1HQK9hVFU{? zQHgn6kd@lH?Xc`Dz}EBiQX6X3SQ@l*3ybd)YJ~*{XJqFFpwuv<?d{ZIH&*PBPKcJe zHclP?vF^k1Y5~d_?ZnDS?D2aWn^Id+134vg8(UVpZ{Nx(xnmzd!jt6$v#8TQ{zXMa zVUOR>pVAtj+#Pb5U$?Q5d~|<!-Quo0#Fn;xcyv0))Y6b(*Q;g$_XdcFHy&?>KUDKO zJ6w6CtqUk;8;|bX@9(&CbT`7n!r0mQ?I$*>uQ4*m);rdnms}ej?7w+bjzdBcmdQA^ z?MkBpV<d%^mx^wt8cu(vUttfLzCm#fBXQ!)`Q-+lm73aqtw<M#Z)?#K&d-qJGAx3X zRqY*eO7o6n$}e)3em&LNMQCV$kB&wrM!NR)*h4Z23AheNSFs*H4((gdg!6nY;dPtD z&>Y>`wZDn6V_7y$&fZ#k<lWzA^>eoQRt3mK&R(QB>VQd6p_t%5^ly=I_aNyzo0yvO z8M-X7#OmHqtXYU$x=E+D+O|+36-@)vJj54Bj|Me!_<ju>9XD_P``{;Y(L3MA*L6Wb zSX5NfYwHfiW&8kYoc|_pznMMwoc75R^qjulTqozz(Cs--*H>D4vb*d0%kHYGxU_+^ z%>BCV<7v-szrPK`{wrmXK)<IK>-sa_6pYw~y(C&67}oV{R=<0d^XummGI^zyW?K1E zCrd{1fDZ@a(s$F-INp!<_6FEaJ5D6-27elS+3%oJ)br|_{p2H`?^ny+^y6r)YikU! zc^UzPL9O(N!dpoYE?(f!^xMZ3S>a2%^&M#FA?-zV+(621OpwRc&a!S}cuAXQQecx{ zht1hec9fZNG%Km84d5zvLN>K_p{9-cfEme6Db@Qo3o%RxLz%^gjXVFEbhYHWUgzhk z)i>!6R1PFyoZuj&t7cE8B*i7m!_=Bl@1pXLyM_SrxV*XLD#T^cPXin`AQ5Xl47Txc z8PiZvJ7+Gonml*p%3;hYkSJ;+nC|=ckVMEQ?BIu^l9$)5_&zB!7h1$dO&PNt5gehH z9jgx%6>OzR9-{K-SiYVeao4L-gmjk}$lN;|OTTh%BU%X_MycsEZZ#iU;sxG~vT-Qv zmdIm?7Ri5)(=(GFv7Q*|@`hagixgpHMMD#`K%7+>o>#8ZD99Q*JI5|YEy}V~-#p$z zJd;wB`hLO&y1b<}V|*6fzrj_~09@Yw6#MCW*2S??esRRXSNUlXHQf6d2IQj2BU z^xQ8hw2K0yWK3k`jA?{PWL`5o1MAd>57-tJSO*sihnmjZR!&Z5hy96-<itNNF!1eH z3$+SG9q(jRA2%*tIIH4%<Ah}@Y;Kzk46{E<5e!zuJZ+_^Yj&>F{b^HRvUyxotIN9V zKGV+~7tc&DAaF)pZ0l$oVvD0#TCcavh|r&g&QY-l%I+zzYW@lB;+7`}YhGsc?L5;m zO>Xg`bQ#<*d`EH2Jw|=inh9-NSQf+V#P4}wjRcloV^sM1)Y$5;e6Av~!^4w}y1!Ul zljPZ?pXH)Quv|`+Ra=Qx21&wJhf6-0V&Kg=t#zl7?Yl+rr!4eQB;tL3zO$<fC(oM= zt(Ke^mx-?5=QJ+Tj0XQ^2?QWL1Eg0e!Y<f3V@QZcr^b%f_l+pjc4`()ST(7_91{Uu zRhAo;uU}iEtr`DFNEd(O@MPbCAnn1WtWnJyJ$AO{Qz|C)!e9H{<a{J`LxGSn1{;a+ zVL#Wb_sJYoD-bOkdi3Y8HnP2TI*VWU;^~R0aBIYy4%xdPBcojVCa)%yo{rA(e9vfh zvZvos`v<qNi3t%IkvW(O;4{5MJ$|LHMuw?D0R3Pp;#gXt<;BzIM@KaDG<$1Tw^L^7 zT~ba(Nr`$<zkZ!P8j+zHO6pw8l&aJ&x*zyqlnA>m?U!K$`Yqd*L%HumHFlHr&!wd? zl~b3PdV5ojgLgwdVVZY$SJ)q0e|SthSl9JPPLA-%X*7KT(MS6J{jBFdeqQn6X1ADM ztGliZ)9NkZEIKv6oCU*|xxNh<zFj{kh%4}+HiYLaOg2=@djLk>^YhB-$08@%CH#+z z%rgDPZ9C1Yj4EchpK*$_lk^@Tg8k|IXjKrTlc{|w;>SO<xf9l`o}8dtUDlFaqBKXU z8Kj_Vhs9Ie)4UT}hEd`ho^RQvi|a-7tGWAYzNm(il+{gg;)xYEIR0M6e8a{eHPKZ- zL+e_`q%9IG&Z?PAAIO+>X636R&K^*pwlOFExD{?>{y#0iL-NeV{FLfyUf30<RhxtB zZCr4fnJD;#CUF<&=rsJIqOeS)M_OzgVIKMs(wD$#_5<#by0@np9|5Re4W>{36-c0O z2oMG`4G26Wu*5}~C4x~p;*buxrYgcR0URNcN={E7(sP@Wl92GnZ+%l?R54wuT|`h> zSIC&58xb?}{riohqa#x@y|=B^R+Fq?euOx3K`RnXh}sGG;Is63_xEp8$eVJwFF@#g zU&*6v&ZG2mNdCPUp)SXw_O><#UG?X#>c`o2bfcYaa&57&;Y8@zwywB3>6p=S_&=3Y z$M+46Sox*Zd~Lw*O?*Q1SnGC<5@o7j=K>AAiK4>qzY(O)X<6-(SW;KzmUtHyLw60K z94wuT@OLrw$FjC;EJQhTMU#<Gl}pvlEXF6jPhvmEM)7iO6BqBC8#?~OPtbk!H>BLp zkGT)T`@dWpsu-)3xlvV%FC$Q<-&ZEEhu-0o4vW`cjFXfV`WEsbk0?ya1O4^5U1w2U z(x%ONe&${NtoO<aS(f|8r;KB-SI1HK7^NT9GK6$-kgBOcRjLXm`lCnm{aD}XqGdV_ zYY<Up)BNd1*sIA#W2BQuwXsl04D(R9tH^avd9CJ{<iPI@4$lc|^Pwcg%~tgv1wYo; z)(lNe10s37JK~CT82Z_0=$R}=b=MLSbd~v2mEb{dlNDGEB#L}2U*d$!&*H@m))YvJ zDtGLZ<F%dX!BG}%4P|S79kk11HSq~BOMu6xD=Z@SdHw@o%DcMq0vZL6y40)>9~M!q z23HnXJ_%^+**?<B$FYN|3IS*WNK-&N0M1kWgR^YbU{rl~Ke2uK<%F?yQ^*R12H^_x z0pf2;sdCUFT+7(3e-;rI_EUP$%XUX2DNptl{17aLIi6oXz0M{;e2gUd)>xkM$|fhw z1jgnVpWC$+1vm+sUK%TZM&dqwf4|!#vzGD9%i`Etu)N&e=G^(=*`=`myIB#>HMa)( z#z)>O7rH4CAxlGUv#lesxZjTc+UppQyH!>jqjbnpRfFRI!a7v#@*eiQQkIj;1XNj| zVpX?&T+bju!<23&Ifnv<r#G9gxg0Bx7}+o>s*iZBd#NCSMLl#yl{LiJZ)!rSHYC3) zZj)=WnXyV`KpG(xL-XXj>Ojj(QFnZhf3Dfv&D@zl|CU?=$(w+UN4mT#$!GM>6i8;u zmymM|!3xh@XxaMgP@ghoUG2BgqA`;B3g)5x9_@e-GJ%yNk8q-vy*+#Xf7$_nOX06O zjmoCSAhEW*-25*U1u<}1^LkabVlGUFR?uGtCI|PL{*q2r5sp9g`8y&5uLL1Ir<4kJ zha1EY{`vFA3#k8Z+1UY*=6VRYqQQ|%cURW|bXJzbG6_sl2Ry+6$i8Jg^YXp;*g{(- z$nn%!MpANbyu{}-fxi1Yq^}$ViEy{UB|t$<4Q=95e5GIwd!`bL!J8vQ4q=U;6$5`m z<Sd)=`Q%nscf?D;gS+X)cq33yQDa)T(`g0d={^rVx3XdaVH%FKZ3NDOi%Tq<PS*~g z8b=mleH$B=wsS4y7sw|&!8`*`)}-tHLwRi9vFTuFT$k65p+e&}HGi3wuAI=_9{;G) z5z*YFsp>KsWFw^#CVbS|%CT?+(h}s6#^*K<N7_*^pipoi^^_~<$UM%^C*Ifouyzz| z)3mL9oib-Wxl+f151KjKNFAI%&2lx1_&X=v3*ISQ-C#=APA8v4sj*!Fx}pr7f{M6k z&7XUMxFj>NW?k)V(~oVtu5UsqSvRngrjvuBCW}_zZw{`X)4j{jr!fBQ=t;+p7@k9j ziJoyR8ZE*WmGsS$P9ycL(<+DEj_~mgLS9M@1@tHUBo9TW_HM%IgG+#0;XYzKX7#<p z^wuD6R)Qe)=kn<C$L7)wRQsuMab4i{OMovlz<@f03hbMvW@cdefr}T#;CwV*v&vHK z`^kp&^Os`l>z=P|nof@(O930y>cE2o{`85mnQgpoI$ufG<pCTw!ostszQD1UG#wK| zf{)quOcf11J*<~#7#LjhLq{R$;GzeENkD*n=(D6~b`)5l4SdO!R)0ra-QovQj90^Y z<urJ?i=$!AHo-%wOA_SS=JW2$50KGKkk^)h)4zHVx;wP9psb@uiq{vn-$G04rK;KU z7kbj)*qF^H+Z}8tatS1U?hI@HxPGXAx)z{;J1t^Ic40BF)bTTKO7(Mta#fkJ1_r*G zR055$j+$DM8xL}lZ%IGX(X}S|+NmL`d}-bWyU&d6_8Qu)wkhF?wbj4gAEqV{xkau_ zfFe}tZ5r#vdfn0(k<1tUSkw?vkS{nG(0OelrE=>&0#{93r8|OX+**yjyt+z=q;K_Z zy5R|z16N1G7h*O0<>pw99H-Fi#MUR7=0E8?%}j8_-E77Y!<WDnLo%*mnf85+zkt`k zncB~55ThIrc18r)Tl$=*HwQ~o6R7JB#K`|Wf-#wamD${AMdB4y<9@M8+29Jf+HM=m zQOqgK4*N-zH)-pjfu-l=Te+WgW4{SLNb`#oxuFgNuidG#_Xh`#9v&VEf=62)GH;}x z^*?z?wpC9vqNk<R+Z#i#1%=yi7Sqts>>*)&_;>vZ$dZ3T3Jsu>ASe6=c~^09aSnL) zT5+<^pHsl}A8MMBbJAws43H4yoc&GP;VEXK<AOfmY&dbLWg-coy(AgSKw!Gz0=^6& zR&zi?`jN~7O$Aq0S(*IA`vmfnw-%K1l)ZN4lylZ6bb@!+jkIM@RY*y<u<l@+_fvc; zi40maqDj9I&w_vV*|T-nl_A7D>Jz4tjMTn^F;&yZNcP`jM+=?Dw2F!`O4hsc4aq<9 zzX#QTYFsWvuBVY_jG0Q0?i)6HMnl8ng7J_6^RbR1gU5CAWIMa}Sc7iikN6K{4!CF) z;<r-_ye2(SOFfdS@TJwp<)*F*=KLN`Wb0DMqN`R_LS#`$7vWvRS{+{P(ls-2n`Dv} zOKl`Y^XOu<;Frf|Jr%rd{-izp#%5~=6?WbJRMs3yT^bcCs3a}jV=toG;gj5PY&bpr z-3{6R@6ndLq*+2V|L^`f`1V#^MU`8&8RhlSkl}TXdj9sL$t`dGrJ}46dLl+Y-;0=J z9Id!KyTY96;y5_0m))T_1Gd0^x#Zdn&#W@bKaA={x@JMU@%kRYKYyx%!1JxrJ`BqP zkXkkknkUbb9g$UUP3HKk=A3-Sj}J+g0O;>e6G31u)W1t*t*74*Y#@e^+rt^FlBn3& z4mcfZ|HSFs>bJNF6^($BTi`7?I5?pBKXp?+aiOe6%pj1=`S9X1Ky1e4^liz`<PX^x znXa^9_`?+izvy91`o941z!E=x{Ptwd4Kg06g*^YEO(ZTg3@Cf?F>7Ml>l85K{C39v z?U-@zmQn+$#f#xu;k`FdO<V8zDDc5i(iDEDEF~;&+Y2&p)#|Xy?luS2WE$g}`8Z<P z@d<ugYwmTZ(*;flODYObSCWSxRW6T89Oa|$+<NYBil$tk#`R(hQ6{C*!Q`p(0`q6t zu`M+@f?)Y;I@68T>voRYJmUp-r4!GBZL`c$%6?QchE<hbTw4WUTr1wVLt|vkQXiF) z$&kd6k~#O0Ay`utLw`hGQ!@eU89pwFr18tliQ*lctt)?>?&W>(G`yV;@eA(#EQxss z>2QT-I^0;0n7_ezj#{be@3J|mqNk%M>wsQkK5H3b7nAH?L41prPDS1EkoXphW~ra= z=|^9~K~yKGe)t8+a>iX@M1|T_8;wiQ?sSn~Y;*p1-D~;r!Y?S|Se<OSa`8KT_~1dO zc?IwUSJ6S}2jN56hzZ5btfIa1uSK-n+_7w4ix}3kwNVfr>@Bfh)Zj)>OSkCS5FTP= zt-u_T38oq&=K;Nk#kK@#C&C?Gv@7L<PP~vFmz$ga3rScdfQz3`D8B7q8~SP%y^w2z z$ghieh@D4X?GW^WjN6CgiDf{h6_R-eYUk=Y+%!_m6E@2<_W}YJ(J+$td~#geUX4yD z%})r@0Ly<&v+iRpG9?EKBV>qmmBBm$%9I{$uWhP%TUEMl<+<NU9NgTvFKl3xGyN%G z*)Js@jjOqSOjLNb>YV>t+Ejl!bZnhFZ1@H>nF8jWM*R}X(Qw{lF2=bp15y}hzetnm zPtw`=X1a!kYdjj<p8lE5$;DGcf9*7>IQe%@NKMV5PR|{W4ZoL@?$?lJmd3F$Y!|4A z;PBvag}I;m5*Pg@5tOKap9G}-k(%!KZAlqI6-vNr4rK#dujj?p!p%cQJ?rCZCYu!1 z6hHGqm~zS(XB`LdBFMk(V&mdRIUF1CBo;q@zVgFUy*WK3lVx`;dc%AmNea>{sHirt z$|I0pC^!s|lhR6mo$F)lw{PDfv+-bB(f8c0y0L$WEZtR8lhV_h3#h2SlJuobdi!cc zuYBz;X#W>63{G#+E2nXHoInAKm1I)tlja;c#m+^0`=w<Z>DDDjdsm@gE%Il_AE*DK zoQzz3K0fpvk+NTLy2YI}lTt`>?-0YT$0`9fPM8maLqoG5pA%qo(8Q5pzT(R`)vu4$ zb6O={x={EAPtW-PSD=aqa^dKz>4Sq(dtAU1AKPXY_}etOmtF(ou)!n7>DwCqop+_f z?80P^^rx-1dN%HwMAHyqX@z9|B6c7;9AL~Jab*diY9F`&0|JhlP6jWN&3KwEYYm19 zN$7brP4JZ-YS3WHN9I01-bZ9F@L)<(4zP-vGr_Y}?c%I=$#GmTzY!J;Gg(*vjO4qF zrjNmcDcx(iIMd4`RK2Dw(f#&pCu%=vW!v%utF&AwgsD<OGfGN!KX|os)`?<DMQwFX zGyl+)9E+gKuTh1eWNm$YaiC@)n=vB<aPgI)WZ$BAOJhf=7r23`EJAttdG`{o!y`kH zq7Ar$C+%G(BOscAv4C;9$*smgA({rCO<Tc1oCEB@{}z1DTf9z3J__%*)4M~g0h_!R z(`pYxGba2rfTIJ@`Rd5v`ZGuhA#-8i#=aiJc>{kt_%@B{361mqC6p!sU--t#YPqOp z-Waq!vmTq8CodrP0GOBfxik<B@t90lpv3uR4^*C@oah}d53jFpX8^Mx;(2>{`CmE? zABIv+jNAO%kB|-)X(jdua{(&Vs$Dku_eF{tlKmsa%vGcU>8e@q6KJ-lyCcZ6;9|xh zPiK!<FFpjwCWd!uTe=l@j*lZhztcTcYXA?kRLcg9x78kdQn9O1pXJ!f*%>z;0T4|q zndzito^tGF=Fc)GF>238SiYVk2}H>yoLl?upUkE)=N`w+_uYQhz|*?LB`oALfiSR- z><oe(1DhhhYK^s(kGPolaM8mwA+6#8V{!<Y=~1txux+Gzr%dwM1Rr*x`ewrWhFrBX zGc7t{W)j(0)(uFCG9?5mq&YWH_Z5vS6(4<kXDI&I)X(RNdJo`J1^RqHr{+p>DOOT0 zR6a3T^hBF&yyJH?kVA2LqGIo_IE=6#<9NP`R883tQiQ7chT|>H`Z7rsQ=|e8BQzM2 zp=&R}IRFVfN3@}KC6n@?F(>yqU8F71YSFiEm;-=r)|L-k->ax%r#C&1w-zBp{2}JT zWHcBbkRvK6&mZi2*Zn<y$mQvJPfJS+B640`9&Rv|j&iUb3pjAGJFO_})Gj}SNDQqS z+f>SCCr8J@C(Tx&AwjrOoTBH?t*Fx_jW2%Z#aI_l^^cgygqy_7xm-ziARkKomtz9N z)9+<mZWgIZ^l)%KkCp@uSRIkTAmvBliD^4+!=JRNHS4&0!@DY6k~Km8q9HkGK<j(# zXO!IB6c0D*8=k&b_c9rxkH22DnwzbCSDCraA!)qFwR4TDLge(+FCx6^4n6JgWO@3S z&~fzsT+7PxQF4%0`KM)HugD;jb((qgu-7BJH*h=q@@n`vOP$EYp9Is0?mbae$@ada zd!hDF^g{3p=g}h1RGUP2zg>J^piCSV)~6;;vYKj@FYb8$?^*kWJ6Z;G)zngya*#Ye z3J5$JY2PC0@&8B*h@nevZEfpU%k{qn1;r#eEm@)p3q|3vH^!XP`~?@bu|wV`bUcr? zfP#SuDNc{2OS+5#&6Kq#8%UG2+%+ekOUWf69-hyTU;-@|u#bbg4={qUg$3oSaxY6u zE7rG{WRcyN^FZHeO*j^Uim<1**JvnB<lhQk%VMPOKk7)at5e#Aq0hfsQOUERG|y#o zLN9Jj)O)7=BYD@zFvajpl8mbAPdweP6EF3&oYseeAE!bH+D^l+C{j=iIzD%3Zi1k` zXSh;Ogw++iTN(SNXSb=u#axN%J<@5-t6}?)y{%%}`UBRysatBx2)opYVi;vTx;2~F zp~0m|4MGt-aM27{P>KM79>)|y>Y?Vj=BA#JX-4{Y`4J8Lf3qxtbyLKl<{|=q=C>a- zBwSyXm_$yvzT8GHYreo)&&$tQC%+2RGN>mneBrQa5?kn*HYG(wa@p?T@z|B)D?@xj z3JSlF$MpVOI(CgU2Rai5|G!PKVZFKUZR!8085tFQ4@G9Z-_sOoDJh?+D_xpVhx%S~ zPvoLu-syN<WFvQTmW<Dz*|18xDx_hn)3}0?Va5a)GZ5Alsj2u4e{vf7lnUCm=D*|# z!M$qVjmt^_=NHftkXGLZ76T}`#{C7mPthq7@QB}VjTIlgR8$xY@s(~;0{2p9AYaMF z4p4V$JZf;IVo?;@4%B{*Ucv@{Guwt&{ptMP;@xLnLkS%3;Xxx)*BbTNAUxF+gxlbQ zv%mH}Iefo+?FVL1-SRbcH5MBXjAYGh@4JWX2*8x8u8t2XSqQCOOj#8idFy{|d08T_ z-5m%UmxQ$RT^^qJV|RFWczD#|uzq#_5j{4(y4d1&(sG{w|51F$z8itd71L!(?FgU~ zNc9!$s5g+dR475|i)VZETF6a6uSfswXupJ;s|%7&{GXT!pb7>}b$dPH#W^&E2#b%s zJmSDa;cses;lHCoTpL7oKa-L97`4bEmuVDYUZ#1!#z`C(4gF#3x?@CL_ytM-pH|A1 zs|&ZXE=lYfQ_6;`MFZrM$9eUoE?ud~qRKTrx+5(oje0r#I_~F?&)pkpaRR5C3pgkL zUctovm&K{ab4P|DL}Fn_UHJVo)60M8)~}3%nflE)+ZUdmP1<qQUQp;I*OZr^`PySJ z23u*os`%?e(x4rzUrp%Oqo&=dhlL{fGzw2zBujepBGG9MI*Y^ZM<TOd_lDUa=nGIM zjPtZju1z|+m<RBaHu9kasZ6QMh5API_#$KwyxpKFxxA`+EZQ*j``q;U-6hOMgn0DB zvu>dnAzF>E_s!~dJ%q`8E;j5S5^6PgS43P+?#E}%1GVn|Pb4?1Fowg04D%H>If1X% zYKzU0&205K?=!EKgC9)U-@buR9k4YQ-ynDaQdYxOr3vQBnU@{w?CW%=thG(^CO3J! zv<JI|_IF>TI+!6UN^r}Wxm-3><5=~6e0b16NT!ss=StsU&O3CCo+!hI<IEU#jDb66 z;i)vsd5td@BF}mO$2kWel=Uu~P*h|wki=tZsz7EJgq#l;nWie(?0Ln6n36$bJf^Wm zY!b4QoB|o(0Gq#a(x~(F@VH-NH>ax@i3=@a_yFW#mvYcaxQq}BbD`*1<K|*U^QK0% z)4#wqE4;PH_3TySz4xAv9QW$@`2YPQuhg~42~ChX44>W(XiMQBaHMdS=4^e1v**zi zFqqW3Hxk1@#&+BDQ3m5Zot-NkT&-iNPr<bp=ji*MF~=TwjnV$utIh>8f?KW)M%eUd zw;%%$4Q;0Q+b-3YoEp^RacNW4Y%CL3x^uySQ<RwAhynAg+R_BjyulMJg9iyR5_(b5 z)?NK;(mbx0Pne#V0LwP%kw?eJQG}`kcRagp=FK*M*#CnVua@gunQ5)Km0U*TTpc|z zxqC1^Y4E3vO{7aq>}m+WA%o-dlDqBg?LV#aGBWZg4d1)X&%T96%SmhW1FuQUcmMKt zi?Hl`v~b$#JdVcfmmP&6{G72jG?}Lcs3|AHOM!DcG1&$?Il`4G7V#pRlM&5Uv)drw z?gcJX*15Uwz?=N$u;<NN8!<jgv-hF8>tM<x5}86-3X%NElFpt@^G?m*fJ{&UO;+*T zyNa`VtocC6jYM5<g%R%<NPr0$TfZ}?|A&l-2uORADovhuTR02;41{+6{#3v48b3@Y z+9s@|>%up?$Y@KVR@LH9li_YA+3Ft>BEtGXr}=~@+LnzhlnJMMsZO$i<<|oZ%x>*z zsg`P29bMeGQp|$|Uv#bG|45U#0-fqo&@$2T@8yRq9c40%P6=SyM+lZ_vS>d}9tfd% z4nv5IlQ?D=B0^Bc!IdB8b}ro+dL&piiQ(FiI=b{Sj#cXi;Pq4LEf0W@EnDtB9Vlp_ z1SZFf)-0RGfP7pm=JEUBOj}6cK|Ucqp_B3%A$n{Ch-<;n3+~>x#~MQiqfBgyg8L$% zu?H*fQTUO&Fxm2H%Cr*$(-Z0^9P9b>Ev(IA=zk+Bf|sOA=t)A}&uCRyGfjQ4>X54R zULx8kEmg0!+ocu~N`@4FmCL_l1kP6#BJ`uH*`P1*7>8k15RQ)Ypk7^oeg_5yKtfq+ z+8gbV4&K=><=>)L;#T||-a)0o%a^K-olQ3sSRcJ|Uib|OJWw`e+E1LW^#_&>0LcpR z3n;l!#Gk5k&(!^0_DHL~@-0y0x{veS{x;uiv$sJ3#$m41;ktW?f5O+$(oQL^<&quq z>z1Y<5!R$BxB?%heivbX?ln)<vc{&!T##>RYQH(|c*)VRYC(N>THth-E#{!Efs#96 ze#S$hVkJwHR$?WG<3)4o7aa@gF6r>?gaSgPWl$DKN=q77X#)-cS%VBAH*K`_JLO?| zN8d-cz?=W}Cb0KN8t!rs*;l|t2)L}Z-Bd*P@?y^jH6-W<Ojnq{Qh(X?Gdu4;UlKc% zy?%x9JW|=mnxx^S3ZDfIqVL{4w9APae)r8H1sm(^WkB8!JA!4Yn^To6zJEv<EUeUu z#fw)=Qhdkdz)z9_We)%N{w^*US(IslmaomSia6DEa=FoG?yumF$++7Tq(m)5<fMAC zUjLNW*QW=gX+N^c3G;CCzR*__y%JD)DShy>_bi1S{Wpa0A)UcM`+;O13a)=0mNOq- zT{kO_4VF3FbmH|r0A(%?m_Yfx&nx$ReOp=3ZjntB<opTk$G&qj^fkx)4O$iA0>2CN z-O@L&R8m-JWF_ul&<Q)S>Pr<U>8O6r{hH*bj`ul?+&ku#uSdE`Nu%sBlbF#CUvm&G ze-P=y+4cT?ezfE$g)T846xE=FWa$?#{ju=q?jnMF^}e8+-;|W4YGy|jzeCw0eT5h* z+wC4Izicj{4!Wfh$`#bF<7XK4{NnoRk>0L#_TkB9;#qoR*4=3=%ooFqrx1qUFc*PX z<~1HOEm<-2Sz#9T%VY$_Z!|xx!)zb~;ZyRTw&@NjD$qR!y-1;M^C;#5d=Ne5{Tb~a z`JGQOfkS!1#7fQKu%so46C=L}@HP0-oxm=$toh=_CoC7I3?E_~%0AAL<|{@qpN(#u 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 literal 0 HcmV?d00001 diff --git a/doc/source/images/Novadiagram.png b/doc/source/images/Novadiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..731adab95d7a36302dc901fac50cbc5b284eb5d9 GIT binary patch literal 52609 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 I(SGoM0ANH-p#T5? literal 0 HcmV?d00001 diff --git a/doc/source/images/base_scheduler.png b/doc/source/images/base_scheduler.png new file mode 100644 index 0000000000000000000000000000000000000000..75d029338b5e3d81f7e251677777bbab34580e6f GIT binary patch literal 17068 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 WTuAdi8afWSg_0Im5UUh14ER6D7q0aH literal 0 HcmV?d00001 diff --git a/doc/source/images/cloudpipe.png b/doc/source/images/cloudpipe.png new file mode 100644 index 0000000000000000000000000000000000000000..ffdd181f26a426dd36d19395936376de424a1237 GIT binary patch literal 89812 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	@Y#byeY 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 b{`zK=FfDxq(IfpEz#m9nO|C@NH0b{Uvb0fS literal 0 HcmV?d00001 diff --git a/doc/source/images/fabric.png b/doc/source/images/fabric.png new file mode 100644 index 0000000000000000000000000000000000000000..a5137e377f854714a63698338e8a8b4d5a786e25 GIT binary patch literal 125915 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	&f{<{Hs?}2PQo8lsox-n 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×(d?}|f`0WbLu%s7fV0HHu+OrvINvhu0A8}>q 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 LsebLgjH3Snm;m4j literal 0 HcmV?d00001 diff --git a/doc/source/images/filteringWorkflow1.png b/doc/source/images/filteringWorkflow1.png new file mode 100644 index 0000000000000000000000000000000000000000..58da979d793e03662743078b5690cc7160173702 GIT binary patch literal 66997 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⪙~!@ZIAQKonR6l&P$Z+#dT}?cklbTJE>f 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 literal 0 HcmV?d00001 diff --git a/doc/source/images/filteringWorkflow2.png b/doc/source/images/filteringWorkflow2.png new file mode 100644 index 0000000000000000000000000000000000000000..e0fe66acfe2f082da0f8e5140d6e54c89a180b35 GIT binary patch literal 75288 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 literal 0 HcmV?d00001 diff --git a/doc/source/images/multinic_dhcp.png b/doc/source/images/multinic_dhcp.png new file mode 100644 index 0000000000000000000000000000000000000000..bce05b59515b8616ec0543eae56e7609df3f0343 GIT binary patch literal 54531 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 Q@_P<YRn$}{m9q@_FN5y+z5oCK literal 0 HcmV?d00001 diff --git a/doc/source/images/multinic_flat.png b/doc/source/images/multinic_flat.png new file mode 100644 index 0000000000000000000000000000000000000000..e055e60e870d3be286dfd52c19fbc5de31a65c97 GIT binary patch literal 40871 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 literal 0 HcmV?d00001 diff --git a/doc/source/images/multinic_vlan.png b/doc/source/images/multinic_vlan.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0e4fd6391ccac8db65df712f90e9485e3d19b8 GIT binary patch literal 58552 zcmV*0KzYB3P)<h;3K|Lk000e1NJLTq00LS700G(v0ssI3AZ9>r00009a7bBm000in z000ip0a4I~7ytm|YDq*vRCt{1od;YLM;E~ND#yXmdzU7H3MeRG??#LTyD|0_yRk-% ziak+d`E1x?qER%qC?@uXU<12i0g>K&JB};gEDOtVT-&?7+dI7fZ-2+IJ3D3HzMa|G znfIsyfdG<4_{s2J=l@!fR{_E#5=ov@6o5h^@oG~xq*50wS+ZgCX1r3SN;=Rrzbg`W zKjXbugjf57_MOu^lNsbLd0oJv7~2?L4Nuw30|Jo0KI!Ri9UOS=+ar6*{rsRCH{dNU zPT4GKX{e+_h=c1TS0wy2;Avo7AQA>OL;|3OXyi^=oyJWXcjEUGm@}-em@uG*V&l@u zWDcK?Ig2JVR1&Qr0Ii`EQn#jBSXkue=VQoCTn(kbY1i&!>(-uc-e5YbDRq@ZZ%#~j zzxS3u@&F&7fA#gTX5q<TU_GTNa3#Z5gnj(-(Q~&a)|1PADuWKm8~G50f;D}-fGe5* zW4<SZxrPANW|q8B0|M;nbOo}&1uB_B?wr#Z{XcVBrrjaCB;O>~V3yT7D`aQ!@nVzj zO;nNn(vp$|hK6=RLQduJoEpnq`9_P%=kbLV64Vg<y1jH0jwDjUq!meSn;Jz>m|u;J zMfM;yw0!w8&({~(qkOY0v7M9xTEiIY7)ZXxvVB5Ae5+RSX8~&1>h0SEA0GvZ*Azu6 z33%%Iw5qg9&Kd$R)er&H@Je`iXlN+b6Pp58l3U898eyv~Tth5ae)^Q>;eqKCQhdAs zj~YTqC1YJ<!LQqTH~Sy#<vFKtL?LtsTQ+$mCE#~RXz0b994XPr@$r1nxvK@o9&&>K zlYUMz?`!UJQlc8%x42&y!dOF;i&w5N7z}pn*2ur~XU{;NMmPdrHC_KkcWJ@(0^xtH zM_aet(-H|c)KEFtY&II^fO^tsocgCIUfuDgNK?g}Nch%@`WQ9PbD)Z{=hW1I->3Wb z1<snKqAVbJo~~#O*<7~%M!56Y#i`4(&dWkQ@Odf#kQ$y23wwXz!t}T}+j_Oc3k(lc z29+ULqpZ%n&wn2g9|5+i8u<C#vqjI@fwRL}g@N#>^XKJB;oR7<Z%&=EZP#vke7u~Q zD%egcjF*Mij($79COukdb*b?d<Ap&Bf9v;~$f02;Pl8QkXE=$pM)E^Tb|p#SB;^H& z6(c<(kxbopyC=>|loTJWA)m`7Q$;H!yOOG|p>!djAT@N^>GEa47b(#|4YT6oMYLM3 z+x2$xZJ<2z#8d#8H8e6YEh{NT|0OLXVM?E6Y$8`Bks2~LGAmbBV#)v)Kn=U(brE|g z+A=yK4!%Y+0!RW0&t%X&#PHw&H6*Pg30A9HKZVJjpKY_tMrJhotgH-MTl8OSPghXG z6E9DU^Bsq|bWM1E^r-*j$#O;p5<|nEPJTkeOjg~CF4NGM)VM_<WoDvb@s&I%tpyq< z^{Bj*-gx=cSK`s>jc+~Vo<sn5rtrTAJMI=siU9sqcRPt<w0M^SXYKoOusqSyK0J49 z>5u+PSS1x>)^GpFjMG%k+EK}>@{(W2dat>Z@#@amm$%P;zdo{Q91gpZO4lQk;US^} z^LqRB8W}WrI&w&MCDWL)U$Pu4WsFU?cy?Q6BFXI}HpTje#-N5E(6+~Lu!)UBXE4EU z_#k@_bLQ@w!iQv6@}A`?G@Rs{Br=ePFfK*Lh3FHp6b*9(0y;@dgMKgqhxbY3T8Mz{ zb`@Jgtcb0lOg4}7{OQa`4!eTRFpv~S_$VS$BrLm<O{F9d@JS@H*vOJlUP_>b5PVNc ztf9zJVUa5G;K5qMrWDNTZNBfO?06EWEGxQt@aM2adxUrXvuokt`8#$^4Vr)W(Zh=e zgNIB<4`Ht4j3`pXK!I=oTlvl(WQI+LYslk56a}B{OqQug4FRBr;1|>o{0i3)!dgk; zilKoE?|-_QxMgj(ceX6?Bgi=e9DwkxuB5`{3#-qbLaq7qissQ4QvnnMTP4McZm8F0 zuyK<UvU-pVCoX5rsr%MnT$Qoxmcu~L)!+V`E;co^h9w)P8?QVlDN_>@6VNroR8Eo8 zmF)~<1(0lOdl=Lft!x{2HB9vFg)hpLPwPWHeioYus9{bYE9)D%VviOT6)9Or*_DjT zJQH9yvgv+)X(8Fj%(h7%N)kv7C26vx8sdWNN{X!^0Mt-{{1kXrDUY;Do^WpHteviD z_>gG(Z5A5F)Bxh1pq$8-B<RYSOfrFHH<amORn_d`V&v63D=Hi=<-j%aXW2AC1mtxd zNf2s}Awii)t7P59j%z2fzvE3;aJB0$zQl(jh6J-N!`CYgvdzMnpq$8-WWRo|uU%`C zo68w6;EldM`LDlPIXUSmlO^s6%0xyb0|K5Q0eyW6lS$UoBclbXsS(g<n42#J5{%Dk zx(@?>HnJ)iSAT1<Sd{zs{e%xGP(#HM46qY3s3Sk%bnO@!P?E2{l9w|t*FDg20`~;v z<g1q?BzG$xKFEH^f?d`wUKPdpZtc3G`zuQF^V1WZeS)wih%fj^Qta>%z`)o7Y`A2h z47%I3xgfrh%Djo=!gO3`Es3wBiWWr>h1TD$n?`!9IP+;kn9Hj3U!cZg$|zc2Nl-)Z zi_{Rp<uienq8*iNZ>QAhRC%5;WICD8fmhme8sF*lwb!LNrAp-~4tFD?AC@m)v|<Is z;efYH9Os0J7bDA;<$nwQ79Hyv8}d1%b7p5`CO+jiiXY?$!pctz?POyUBeZlW(bE$; ze}3wY9fzHr`N)bb+*fG{uO>jM2LRO*dm7V?S($`+HqQ)8%Lr#@B)rqqv}uIH^+#cF zs-%LemjWIKV3njFllj8CVYO4BfwXUL_1WN1N%cK!gsUe%WHOnr++sVphAzupoEAGN zlZs5pBobetxw%SK4?qPsn_|^_-ut;piAiyCvCNolnM}p1ccZMVkJ2})#JjZQREhDJ zM&sEc6CnI=`ZqaAJg*wxpXeO7|CN`A>Fe7|UU=7sCHLAk$x!1u#(~F1(*q*agT&2# z;6?DDm9q0VzhXt$rcLO-=oG%WhK88Rsu<L=q_Q6QJrp}RW@U^#(Za&QAfXy!L-}VZ zjY1P%JSZoR?H^ZHS1Xyfbo5`puEHY=(UpU8qU!1aaH$@IJZX@ITmE_~(q%(#Hn|sN z-`Kpl59U0?)9@?><(5*(9{=kR9<KC&FQ}*FO0KD?34i$#3FB2gNTjt85e{16#I}j| zGx1r0CHmy3uW(R7!K374e6nbav|byiFljAGuvP$NN{OW$ad84ZpF}1<QdthN`lUjn za0{<3-1%rH2rLL%u(Hca3no6Jz=>C{dJGr<)h_r5m^m|a|9)JOMZwVXmS-)IOb)~y zIQ{nY-7j~Mf5F9S`@c6x4dq$S^7hP`v!h0VK>wXPJI<dkPmVHbi2FjFnLtbdGllnr z_ZKr-JL>GHGjGo{&E03@NU(|QEJ{i`)}zP5)KsxK5<gV4ymmpa2&adi1{?Y>bv>2) zGgndyrfzOX^?o%oTUuBsa+LT*WqL+NGUFiCE3Gay(vudsY4spESCn-+(kW(&TwPGC z$g`Y`Bs^6alvkoG#Us~U3aZ!Zc&}UE-@=x*EaY4*2avSV3Y`-@eTMjs1cqf+xL5Dw zz=3jB4@JNed~Wxdq)&2v<SHpn>ztf7*4Dy%2z%0ujf#>prasG9c#Rbx!?JD+e_VYB zNqB)3DZOD@ER!W}k}59ir<6o^fz{4C5*JUQNLhiU_^ffFczOSlZ`VPRj&7eJ`ZkZb zhGY^B_KYeo9%c@is=$ddXHqSS5VbymxrSX`W?(&~DOLX-$5g}cLH2{@Zu9Rm29of# z5aHp)i0en!kx1m#|D>TiWz_IJ>#PCKN_bD_z)@+C=$n-EMOB`$muniYE-6TS-E^6i zltop-RgzRa2wu`K18gEYWli%l+byyu$v25&L2<d|BD_=jimL8^G<tQe5eT}ux1bBH zu|iPA%wkA^yHxoVRW$6&slc5Hepj4LqR|<@jP>q2>1X7QZOZ16o<IKaOi$ks+_8u} zWz?{#a9-wI^0k)uC=*Ll;h+m4<V5(+Tz2xEl$gkpE2#F4MFN;*xbNv;BR%V_eX_Bh zC=90Rp`gzgc10;oPoF}i2|sn7T=~62=%l7+VXh(480J?dTQFNFP|EBOeVbTpMxjv9 z$}kL!MD_s0Ru95dL%x7ZuAiGLTs_bS=;gX#q__Cj|EjAei&uSTb?!aI88#~<T)pC- zMwx6rE%q!Nk*kJ3UNir#UjbRd)Z;p-j`gqk_`>>T9@(UB{3iTv>&)`E;HZB8v0_g| zs+T{;*W%PmDY+{-WlMGqKNj8t)f0QD=G8-5+h8PYaq_vy(KX#0nb(xm-IHEDNY;EU znFa%8*U;0fo7nxF7Z2!u7(RGN@68skooKT5nEa{9kBk~77d>ua+Og^Wl66yzS07Oz zzsNUpN4Nf8)BV+VFDj6lJV>nJw|3u-qLo0-P)w}}jLghBi&b`ZQFV4pW&~tiw!NHr zS<al$1W!O+LFfIX$eO8^?y$ne$75ZkKy6~`M>K+zV`Uf1SVJU!g|*Mhf>-}Uh08zf zIelch!x=H=e<Ld^M>Cm77*m1(E?365jkFs68|nbn)P^z}jH&@)B5Phi_2e%HLd;)2 zbqO}6+buUF%}i+ELA+N>$$rv|9Qn@7jCSBaogv11_lh@dN;5a7o;-=!1f_}+l#c9m zQgLzZdiQ>X{M)(niw6(<K!NCV1y{f;kf6+UQqm*HwMgpb&AO${pfuq3+O;+^^29a4 zc&T5$z>`UO1mZ{aRn1piL!_a@aVZn-3ChV=EJFl28{hbAC$8*YvHD_aQFcoFwZD2# zSOIq4Iq_?caZ5iuxt^8~hwPC*K^(zHhVA=}i`u&k1Waw5(aM18f!~%L`hpFYToePh zyHv^`AF+IudPw*(C<xb;P-1GRTLYy*H2sFLak%Tsv!8|cXm<^pKHfyC2Wfi^<v|N- zsE&0{!rXd&t9RSp`mXv_pR3Swz5npG2yK|=7Ht{b>YG*;e>R%<7GoE~<0$R%2|r93 z41GR7pUWNf?YGDOfo)pS$mAL!ll&PRj{U1w1B{LTZS02O`JqGp{_@V^R}T{JQ@R<w z#kv;Oqv5$558WPqdH1EwcWqjqZ4KEr%x^)bpbCo+k}v_LQ)VYz7KLHr?_IlQE?!(v z>qcNzM#jO4igo?_&-@HOkBaL3DL@$+P(Z+@?ChGxUKL>HJplp#Hu0q4KW!T9RYH?m zRZ%I@3~9k%;KBN!j}4|0f|G*BKx1GLDh(p|2i6bxJRIDINuzcK@(8fidxF?tZ@&Tj z`7GL`Agr*FZSxt0U+?uzb>1Z~(MXC^BWlPO@yibJrE^Ya)#@cie{ITS^vB$}6DCYh zQ+5()Bt=OpN3{z#OUoqTHK{6Q)~s0?Aw>}nYU-i#LnVZ}@t0Z^RHq1AynbCR>m!jG zpi&uBi6Ru#t-at^@yYsRWVL1G!%Ai_{8dcA7LXY5;hNMMniCCc#>|#XoFA%^pQ2AW zoFN4Tf0>!Jpi-TM7I)sSu3lPFLLrf2EG?%M6>Ty$wj`62xLh}(?~}<~ZVSnuE0f#6 z-zKcBt#hRM*itprrw^abha@c2s2{xnB82K^e<31-4>IZwD<DEu@OM$s2yrX^0fBV7 zuqO(Xu6lZptm<Yd9;!drt+C9ch!CZqK>WN8wLt~1KKG&fBoax|{CK?hI8W4j>BLJD zA$h%P$Yw-RQgLzdzSgZV^)|6GEGg-nTcf#*3u!c&U*1&>e50vBga9DItYcZW6Jec* zwTXpmj-Ln-OnUcLsR#i;gy)Nk!%Se$EK9lEUthdXcJ&(`z*4kvRc*~ty1nmq*y1o8 zBECbQIIsw7UlV^Nx+EyD6tj}xDGp{G%v%48!+X6XVyt8C^He-=6BlP^ZJp`psOnr) zn?80Ln(o3U4U76DEobKza;auATKk&ln#aQ)ch0Tr_wx7iO&*&>MMcT)CRZ6Uh5Cx{ zgiR&fJf2##=--74kJp=k(trE5s!G9G&#FeeNRStRl#~>YmL5KreOUhR%)ZKVmBwd` zuUxs(w_M`)><3m4U~4+UgKOe_5vT)nu-@F<yf=+@x?UcpA3qkAmYUP)1#KlexQL4z z13_cPG^~cuPyyB=O|hJvojGhy!~ZjCHy~q1-Gh-#ChO_zu`AgN7A)AYqqdn>@!+Up zh`b3P-YN<>bye%uty^?-G=)s2(dm_y1h^_x9;Lp$0kuQcfp3l73IYLk0awOeu`;ld zeWoUH@7_IjaWTWhB%DNwKX|bH^y#wC(J=7&g1RJR3D^`nm(6A8R^*<1eKMyar<h%w zRi1S%@tTzQ?QGk%Flpgv40mDdSaw6bhFUN!Oc*AL<&N-p*RF1B*2r9$U7npC^UE(l z<S&jL6FJm+%osy!>o()YnYp<!Oq42&0w^oRg~1DzOo2gVI2k)F@4Q^ebd=%l+O<H6 zNH{t*`cV9#zh3{v7r@N}nM7U?v|xMR?I3JuW7Ds;;TZh;@5*PIeEW9fph2993WuPe zDGwhila#Vj{H^bAt@gG`n4O?xI>chqqG2&x7pE>@`*Y}@@|*}BBm+(kxRZP*VqnDd z_Shc9EqeC+sk~h5A@FP;e)@D%OD~eZ;feZm+Ee8dArSC{oG;<iu}r{&<o0;ch24nb zb7joN2zv>?zGzYZT{8T~;vhvsI&3Df*Pp#^jmO!Fh?XMk+1+NFP4;5NS00n8R3O4* zUAs=aFKxgCxA|d+2vu#m2wxCWI?8uONF)-~n93~?KdwkxB7SDCKFe6x{0U%L5Up6k z!1`<wN$fk2A=9wDvK;4Gey9jFT%3sfu$l{!0uW)-FABxSiwpM@x;_?fTS&w}4;-J% zZ93RgDG)G8q+CAViY#Us8DhjoRdY2F5o)F^-<>^+qx_^`^1TVzluU$KYm!5(2vJl! z;}(ce(*!BMK{8Ch%bioi?O!%x#xH-1J!M>zL3NOb*cG=I_pKZ<YoqvlYu94PD@BD3 zYDEkbc>J&Hk`T2{LzRLpxKfJNWjgku^=G%vO0xGQKmQ%w1U4y&sAKkfVxedQKp0B6 zvQ`Ww<tJw%>Zp<h(?t!r$V16*KN>F)wU?y^q*yh>1$9Vqd5BWOOE^;f;0i>96ji;b zQ&}krJBJn_$uG$$%*b-JWyXXI_A9p0a3jl=mQs?EZZ1wHl8m1M(s(=?cmbzS%B@WT zhdB1o)7vNY9Z_MMbGxPm7w4oRGW&DY$kD5g(HTsvi6Dx*Zm^?~g>6Y*29jEJRk@zN zL?;v~)J1syW9|Dc`vn`B1)2U`y2D>$EWfCl3W319wx@1LA|+T`+h=9{Q&lB)ZljXS zKLkH@womY1^vCn@8_p<}2qHFNvylKGLMe}BWu+)hfg)>vQy}g|4mE`ihc`iDyW_YZ zj{+f<0+EjwD)2d8r$#`8Do9(}V_6;T;>PIqnPqQ?wS0?Ubx9@e8&HHV^rn#>a}PXV znOWCVSJCwJ@16S1$kHzQ%<ggFC(UeKMB;GRmFTng^NahgesDXL^7awCqO@g)zBm8a zgxY}+i&}a&ogV5@;b%HgR*X5%qiYi44aP2@*tuXe+^H~#7fS#TA^7b!=11`B-+Q#! zIKs^*B0>P_r&+oPAyrFp(}Tbjou48igc_Uf+wveNx%lzo;CmkCn0*1sq-gO__T7ut zw+qNdX5e4Ce;2SJhkyuk2D@ATlZbn!1cJX5x5mQPYe@+FrVm6YDcbVRGTgVsq#b>h zb?!~>zYzS<fE+~X@y(@bN;S9UHGHDM*oFH2$I!e3#hz=r?Shn)Q4!X>d7M8n$og6q z*<4NYs#OF&Qe<;W^D2`Zjo{Vpi2N{79<iqE&^p7(D_BCKg`FHHgRN1#0TNTF;j<T9 zHRkd;Tl-`g>B%b+TI-I&PgjK>wo2Muk!k2uI@1LL9HfY}c8Cb&NBEK%&IkvaGG(BV z8G8pb@`sjQ`f|_HZ@2Uk@5V+fpge-gauQP=z5($C2PtChu#_L!U^r!!s=F8tM!tv$ z|Mz6T+z$WBc@_|%+PXhDqKFh5nWgFuL3c5nyS8?N_SelA$7Qg%DI$imW<VJ1Xbps* zD529;R6=}FM2eZ214q$HxOv=^-YIT>yCG|g3;$R6cHP@dA?vp&s3~LntgJP*wg<D| z#XT9ewzX!Bl`Oxs5<>OfX3-K_&NUOZhb)Zkw^=znUc21f%eJ<tZ&_h?IGT*&PgJTU z6&Y7Ue$D2ZLF;6kf?OKmp)b_9riv^yik46+))b2RONa{!O7XPVJ6fC~LP92~)rt5L zN(MX_n(kDEy=zr~L+=JL8Vv%ICx6(v)7{9Z&ip~op094-u3MB867oDY)*p#Xr;}r2 z{gltQIh9aJaF8N$fdEI3wiMovULXK+frKNg6IGWGyznX035rl+5($K9-i;1TMkmGQ zfKH0d0Y#*U`mRyG5q>$*{1W1eQo5+guTTh@UqW2apeJhhAp3<!<0w?>w()-QOd3mh z^U%39Y|3@l)S&r?Wqjvq-e`~%QOU_U?++0n;42p)q)}4Tp)firHV5RDq5=y|bf^uT zE~<mWiw92Ha)CmvGbFotq$lF(8kxWP=c<w8H=H@L<l8A*>t2v*IP71?`m8*g6fwW= zj9u4drmvHtIso$HaXA~pT%g*%n*g=~4ej}%tDz}u;fX@i1HXJ8Y$y-$>0aBv6Vx7} z^SCvr_$8r}qB;PI2nqGQk!h%N_Sa3T|8C83@H_3de}&^9PKc&%i;^dOofMk`m^~Cp z!raHa@O|N;)r+>R*@o=l2sj4D2HZ04-1&2N?<8QonF1W0GiUm~eHKh+wvaucae;w< z#l<<8n4}dI5m+`!U{*v!Yr`6-hFi?-JEZS_r~d<cDEgF6X`OuT`GD{f=m}z$-#F0N z_dnm@&+uFM3+M&dx#8W0u3hn;1FjfPBO^PE8RMa+msnkmIvTpsvgKqJYck@bC;;|M z-qYFnmW9O$2s(k-y$A@PK6}RHYnIhX3?lRz=w)@xs@>bV&!-ho1rSVfw`3qck(g#Z z&4BzwcCPYXbsy4*b^U#ejBa>(HdrGG2w*&Ww$I6FvPC1;9##JSj3zcMxb51J$z;AJ zNm0BAPhLAYVdRA1Bv^-1x25JC$eX%<Dv)2(m{rbVjJ~!$Bi>*&)0A0Rq*lA5EGl)6 zqvHf~a}YLs{=A&WTWDhg<R=pCmAAJigCVlBsr(T5?Fg8qAO$fZH1BQh6X}D<58$-e z32e`y=LP>2n15p~650DtZ}~F|_!L0VqwuQLVQ;#vsp%^>w=%zmDKq8%{y^al=jH8i z5MBM+RDROwZe%oR$Bqe8rr=Oer4bcj;Nw6bKe17p%1;40WvIhppFV|BCBY|R86Lh8 z?*cvEzn?sHswOz>Ya~LtB|Ru1NK#ZBQLPjU3nj@9U-<3YckkZ)?%lg;$V&>1M5rG5 zAuL?Du+FMD-Z<OZrqp_RQUhBF^(2MRAj08`hC@H8FXNp%cdAH)YLg!z(7-@#c}b!{ zgo$y9MvxJKMbV)cbs{8@NnLVP?o3J;yheqDnbWgpyU(BVx!k2H_9unXqoCl9dUBEs zEJDz^P_z7AhQ6e}qH?S7^d?0nkzjAY7Px!fl*S!%9D3<WLe;a;>-eUlI<w@Ka(%Ce zj@>8=hr?IG(GUW<m`zRwCMHI?yPN3i7Zd80h$=;X>=*2e2^kb~3dNY>c%i|!R^`LW zymfgb3dt$TDf`E4%axWOPWtF{hse5DW^Oi@U&*Jt(#2<KRQL2YG&C%iV4WT-WIa7e zB1Am3KIU+E5EMeEBXYW5UENg={#;ij5a`$1hfS`v;e5Bcx_j+@NDhet`GMbJAMvlz zYD3x>DZ>vQvvB&yiOgykYAQNX#LeK^AGJqT-P-&Hw>q2;9Q$MTXq=ROu-zzREua)? zxHXCwyfISRRZz^41qEq5-b1T~0m2JaRY_d#Bm)CPeo(z9(>>+os0g(MYTC{;#|09- z*EJP`=@c=JVCgLzDV$8<A#kcWvLngIk^lV<YT`l$<&02^g(%hzaR&NCbWRnv-&6th zV7G(oq4g@wBR(X)eXN+L+}pQr@ycTIoH+r@mc_Mdg;#=N*_@sIQ<J{#=&GtnmF6l7 zYM(xR0*eFNu50VE!bL@S0QsfwO?Q~xXmDBoioW**3`68HiL0on>y)YtAiq<Eg=5Sb zEfb%zbEoQZl!sd1w5@GAyy&3PY=Hb8dOQsN6pZe<HbI(mFGVOTQ>pwAMC3<#{+!pR zkE%134lF`d%MZctYTb7q!DT`8B>WA6lZ=d%abPMx@7Qeb+K*F=H*a`6wK!^(iuz_i z>AUGaaeDH<UH_XlZJH|5H<0Qz0!R9!r<d}0Wo2b-_2efDwN7GVSE{hq41ImoB`(a7 z$jJWv`>Q7}d4NTj9F*MRQ45(-l_b_CR;BLQ^UKSj0EvdbaYUo!2O%O%OH6Cy-^TQY zm=``A;Yx5}g(q=weay^mxQchlgbU<n&opS}Q!RB5($~*lBY`>d=Db?{N|_WNx;;ea z-Jtw%;|FMr*yuQOqp;4;{CRixFuXm&w#v=bsJUwhqHW=x-FwJna_8L63a7Yy-tt4E z4tbugn<e(V#dFZ|t4Dsqge4|Qdafo_SG&m?Mcc&Vt$O(qovap4Cg*kNkg#VD&ZWcy zG2Iz(quDvwxxa94dg!71!{9_w4HJg<FK<0Sc(|ub=`t!zT-<1L^T-yW&Ad$c0a`3w z${*8k-)ZuCe(^oh%yihap{=bgIe_f;d)<KNyVmb&ifgF))R43gNy){Gk5NS_6(+Kv zASo%St+)3pPftX0N6F+U2ZtRyb~q0kCh06ve7s<c+MgSWBJHIjE32`=yjmx!+$t`E z$>@+OIvS8OJm<sR4>*?&58T|`Dykby4o|M#VB+Ey+SoLmQ|iy-sbWTf>QLmp5P7{D zI&|p8ix<fhvL0Qpva%ABQCbaQM>c#{g0|n7$t<p@Sh;fLh7B83;(A1tDE?}H;R3vJ z&T)rh+QKxMku@36_OBz6R%?~!38U=j3?e^LIQ-#sb+^^w-L=vj6V1RNcI(y~OP8w0 z87;oxGr%U|Q}(~a|F*?$yPaI;Xr4x)4e}h+-mZOb*WQ74;yqLli*5V%AxoBk4TO`f zUq8{W9|%}_d$*r4qvO1JM3+tmDj6gF#{C<x$r-trT?~XBof-`S;NMFhE)`Z4N{Vbi zH|SvB!Pgp|J!Qf$32_W*WzouzZV1B46xdGa4brV|U$MH#WwTT6-Fp)mnSA?pNophS z3l2d+U}M?YwVO6gd8h7JQC5UM-~D-gccni1gR39bDhzB&mZT|cF8j)-D-Tj1fScof z%KgtppM{Sa>lu%2GuF+_ZM4s5D>){BQyC1me*N5P6;w_t^Yf!OZcMmvp(Lfw30=^F z1%4AJTKnQTflpZx?tHjYNfD|J29+_a)iAKhjA=h{A`$>n-~Mp>={Kie=hlrlwzY1% zx!2|a9+KVNNQP-)(Qn6&eiGIlT$(!d`H>?a5cbz!ZN`pOAbkX7MOe<kXBMG`0HnUM z%Sy0`J$m@r;iWg1wlr@UpB0}tH_^%1NtwI`9X<>;^xw$AgFjrlG&eEP%uTMzV<^gs zkV@8ivl;mxK3KGDDLWnnO>H+7Y{Gj^y*V}Z+*o^-efp2-N)}`EKmQ<smw*0wal!=o z`^L%&pyp@X=7JK%fwpZ|RaeW7Cyp_#$AAq9Z;al!>h`LV<t0XXO06#P9X}pyobvK5 z#>T7VnAm}X4uO|Kk(UbXg2%yUIxG4F?sKA#w}tnv{=1Y(jc#ZN<QGmN$y7%iMEGcm zcAE*s{dNAvxEl~ocQz=SOex|Z!j29dwO0}4xy=;=T#!MLgD#D}q+~jvcu)51=`d%G zqzJf;&S;|)D{^yjkspa9(W@Kj1F6={oKk=UI?kOd=_qdfNgzM{P5K*qZu~LmN4(Nh zDSR$B=jBURJSOr+#0f-P^~rgb$R0_FNbySt62bG8plSuY%uXxRu{=AQOr_!?KZGuM zlGoVImasoXbcd9w%n=gyA5_H{DUjdu?B}D;j{Y!56TbjMwer(9Go#SOFMq^~qKG2X z8K%5^Uiz4HhypoZbygq|`>d?t`ubPc>_o{+&sFkb?r-A{<fpOf_-MzD-oN~!>Rbf8 zTH~-56#EnQkfIaK=_Jw|L&LMRtB55nSykcK3XtFJ<l8-4^i*9I3UI7jw~6=esUah? zS#=9&sMd;K<m6iAYwAu@7}XAs^*Y{5uv)Vek%QCHa1o*{F)#EP7bm($0f)5_sum%T zUpc4Tkgh?F%BQQwudgI$hoF-wzaK=!5|K-U%J^fP5yislbX|2+UOdbkGF5gwaTwB} zu^7!tl@;bHmX|P<WyR7XsQfzv35zpxRa3HIn!+MffW>{S!SA-|-4-8Iy!Bn!177R0 zb5@@P`)-JhpmGr&7^rcJ5Y)`4XE@k=On7or(jl$?+J_BwEh9xhMs1Yw2`o<{>JZ_j zk81{bYQ*G3<`9)EFqVRn@{=bKb%-$fON54qkm}??bP<#SaTX-9Qyn5K<KWOS!v(6V zs*G)M*p+k!6A3>!`@hb^;SUQnU~h50v6aIgD~C_mcvjA&s;kPuD*&BgaPyB%G3WMz zJ$4>`)3#qpe=q)ZNF5>+kTm6`g6b~bbieYT@&h391JLLUAU_b0Uw!~R{kqra-V;`U z4c+hH)n2UAPNgU0Gv(-R31mm3@eOU*iaQUm`Se`BOtvc*9=no~{!x0I<aWxA2#S5& zsSagDc+YZ`q(fP=vuyXm!+I@qTO!f&f62F4Cf;5slWP^0f#FsaVepuCQohu*$;o+b z4ZouK=H$Gzww7+<kQ5)UKpzAV8+dT;odtWuIkkSmn4kZsDlgGDG{%|~;LxH_@Z<!6 z@}gWmkH;`H7S?hRRQMnT^7|b4+4ZTbRd}5V!it*}l0>Ld5cvUK)(3D0Q9E#<7anaG z`czDQ07QNO#7&-bR4BsCDVaci=)dV>)17Z9^36<1*aAWO+}yV+6Q1fo+*Hbpra}?g z9kCPs*Wsk-dRq0sAdy7mrv@vPukM^}+haKBTcUjvNT{bO6XXe;{3<5p?W1Eq4O@09 zfnfm8P5os|D;|&AA#{>(H%D0!j!Ti<otY6uQuRnTXuS@~5shDvO*WTdd0o;J2TTC@ zK|*~?1Ucmg)jxrehqG|c2*|Q&<gaUhjeYAJbEKrHEZT}XL>S&ZfiK{aNd(_6Spg)n zk*V55`1ZkNLsQF(I~I^Bl(`XghCtXArLXUv4-B0s9Ov&}X6my{X79a=p8NR){A|-> z8rggL?VcVod*3|@m3DAp|LHrfHqA&Km(|A5YtNH`b2`Z7oK{8T4)d~&6J%kZDyT3% zoxcTd8Vim*5uRmQSz7pS#7b0zNF21OLjX-?QFdC=i+c+WKL-C6Wv2l7<s`pD+yXa6 z<sw8HLLk4`v||E@-^p>Zs&i}#keqGptDf~8wR&=G`hss}>mstVX&jLz6NzBmLZSs_ zm5cCy-&7!h5XXt&cgb~|Z(FYI>O51``62+}S^W9Lw*FO}%rZg6*=$g)2v^<q*wFKn z@Sd%GVN);F-12!>S*<L3F9;I<C0ZFc&+ZpY??!WPV-fkPskFeJ{IUKPC$-MJj6_r= z!d;L04fozAB0m&8sv-KCQNw5deA}~#oo2$Y@9Z??Ta2Hjc)977XZDsK+XBL%t75!# z54~Mi>3Rm_2kYYF8i>*yI^;Olp{zQ0@eS*B-QUj-lGl1Vjm+56J5^+7aaG3k<ZZV; z!^Y=5%(_%_%lag^IQ?}~Pzg^V)ax{W(P;qEx1?A(u;y$A8>Vt1G6sDdijk@L?+-DZ zt7+gS!oS}w$}WFDx5E`B-{Q-E-(0pA9(w5M(RRp^dqAb?4uHQi;J-j?uP1H2^kEJZ zHOI{~<h!;9>{$vrEVMfJ9{dV8?A)Ff)(;e)U#h^G7#zVzgvyM+fG1(@07nvoX?gx5 z#me4r(obNM5+7)7sK?J>6W)2@{ZCgDxAbydFwz^dTT2q10p!QNdr>c>KL}&4fNC81 z$qx=9R9JqXL1N8ZXE^m|<-3SOy*7glEzkNMpR5eT*i)4Pqx%r{wNs3KT4Tc!1qTrx z2*vEHA@5rk)BU$p)VW9QCk1XSAU|z<<xp0H>+k#i-1Q}<Q`B>rfcz5jZ?-h=j%i>I zYqv-fP*#NLrPyq-=TGRUw%Z)McOHx%IlaB?Pi`oN6PK&5JSsw25xSdUGsLdnYq*j* zVgktTe8RG@Rv1<j^71k%mUgn^X$+V}*phXsdrKjMVcnn^^DuU)cP~Z$8n9Tu-6_Rd z0GWuEa4mH0`(Nchy#oY2sSm5Dg!qD4gnWo1X<hm08u3#_Y`@KFy0fxB(_kb1&bOf2 z5<()2-|N3GVJab{(1Jhpqtt^m$v4UEr5pG)on~q_$4pAh93HP-Zf=IHt$kLO8JYZA z^)p#=SLAXMIn^Jk<t!lrGPw=>E@!dk8fwt8NGT{N!t(#h4Zo?YA-G0`yCoWdMYvO4 zjm}sRmS0v>-H52|K%8AcSZ#vmegWahS;C7|RYU3>cL`6fK}+ZnrlHO%6ciyMKh$Th z**qCH_-JO`G)Of&$d$i@i2St0f3Gl#h)`0CB8jZa60XZe1u~b5%*=rh77L9MOQ;P! z)8_EC<tqmV5zd>JxO=yISs8Em@ORg)wFwA#26lGsY8(_~G<dLipFXee-}jw3@x!4* zo-`V1=FCqA4yb#DnC6#I8E_CGxH{mX#K!tpR@M!c#>KUZh{)QyHErZbOK^3-o@2*g zv%4W7FE|_m)@^Hk36()95hAxUxE$a&JDX!{45xPCg3tHgzjt@nzkR#G4*b-qAHj8u zjrAKe=#6p(*2EIVi+`(B6H18?xin}XDhgh`=jf<+{J57$%)^K4+!<cFq^cEuVo^^C z<E5A?R6V-xjMk$Qq1K}lq1K}lq1K}lq1K}lq1J<0grCYrf(;TH!dIBJYsEV)R}#%H zA-?FeQ0vi&Q0q}#gt&jC#U0HrAued57Jhyi&8=oL42<}Eo=ck$WTo<hzyD`sY3JX2 zG!iE_<^9#eYdQ~`EwY-K*pd^1CW_G2x6Aek{!}_+{vmkH5wcP_aNr~|nS#c#a`vK7 zXqWaZ5njzqScwTmvqbpx-#-EeOaOsJe>5!NL{=&@S*9Y9zgv4kB+l1~W{D7ypAJlD zmI!qyfKG&3k4}VIk4}VIk6a=&F)<-_Ik|=~me2*+l8{S;MMY{gnxq30x(BJ&qZ6Sz z*gnA@9jr)*y~1HvUEDbz8IHKJe|g-0$LacpR!*K%wq8bTeCH&;E67at?iBjR$`KPb z{w+Omod{LVhG8vMol8dl^$3I=2m=u!|Azjs1&EMSRSx6_)eke7JGfgodTbo-%H>qc zOkXELl>_95Xd%!r@bAdw2O$y(i0b(2G2gE{b!qn^DxJaQu#YSqH09SzNSsNV&sUZe ztvvgA*R)`n>FY$O4v?p)$UrWTANU<KZ#&q~og#6Nfqv=eM5y)XM5y)XM5y)XM2G|J z30(|KCDw|cFf9kR{B-S;Z<H^qJqz8*PGi3r{>H`J<=vBa$e#D<@4cP9O}d%1J|nsW zDK03Elgi<8xauo(^QDiYV{B&T^H!}q84cDU-?7;PK7Dd)-TGF&IhT)*9(e@^k2Euj zY|%m_1;^K~%k}h%N;TbZk0zkPN9q3C`)Bo@<v7>T<!6_sM_-1%tbSX~E@y)<jYSJi z4z@mKZ4HT9q+vKR0v^LNa=Yetjkbz*4R^Kw!M<~jc)MW%kLqH+==S2q(Hk8*cEq<v zTFupU>jtb@v&G(isf`$qIl=GWe-H=?D`0E*3<`zq?|%c9hNw8a8H_J&YEAeC1d!w7 zuX%d*VX^oUyw;`F$25EW`uWF?&dvn*?9vt#)I*Mdb1Lf8;WLLxWYV~A$4wtTUHGVp zkBQwPJBvXUU2?^n`vUl0ffq`{+GQCn$tsvIF-|d3QWL@Np5GE^Nw#P9$B#0cPBs%b zoWBnqjJ|lWg3azfefo&;<Ao2p85kUJaOf{tVE_-kYL`9-1W@ARd6J`{fM`-u6QQt8 zo8rNPI~f?n#Kg#X%GZXxdKmL2rgNLlZd=^!rquVNgCSBd{5ALlbmByQ-K@aRt3GEO z%#dGUAQ7u~lIfJ%N&Yku1TzI2Hf>n7LZY`*?d9I-)7?jpKIi5ZW@3Wu8Bx2z?A{G; zwTw<qK37y!(+-25U3rvH{%9yBRH}bU%GIc-{sRYMI`Jz(wjR<=>2ANcS%z84qcE-; zT)_s_DkKsh5Zm##n>uW|KK(i;i}S?y37@ZJhGoP8I*sRCT|<qHrT8#Lf#2C`U)z32 zP2KP0r25iHV~>qZkFjI>dwM>vtPJ}2v6`!Ujc-7j9(J44E!8A7=u?ma=@PDl2mw#v zH%7WGy>o77qz|k)<5E}|;^sC=AOLS}3Y<&05+dC3gw6c;Gnv(XexMIbijUV`ao~$Y zJ+$((^1A8e2sx^=G^z$P>H4PnRYg@q7X&lT1_mjuS`l3eoB>TbgGOW5V6j2kOcAe# zrGipsf2Nv?q8<W21+rMIva&Lw3xa`n|Ngr}3yl}c1KZcv!NDOtJ)P)+5R7;|4D250 zbWS6BGOD1wTyej5gwT7`sLYlvi7thz$jJD5m;0iK(L)}@<CS4{kETWVftM34g2U0T z_s7sI8Q=IT%hySR9+GKfuftvzp%x%)cim3T&w5%1sMoo3=ZG$aY$zns9Z%1$EO=^B zl9Lnl*)uMd&kx!HIX?c*_U*FcHFsb=bPshmU2WPqtI;Ht=BI=i5gCR56@q&0gm%tz zn5VJtBt9l4F)l75ALyE&688T1(Vk9+Cj%^6)Q-=8_UswaB_a~)H*>$S`vdb7*VG}Y zP8Z=9NW`g{$k8vozPQ|S!KHj6WK7PmKWeYox%M;c!G?sL?mLBthp$<qamL$5`})3h z$L3%f&@C_To~0#J?-5SqsDDn*bL=kc#3m(j^b?mmv#97+ZPr-1>FJ4v_g7W@^Uptn z2M<;to#p}c>Yl4z)?jY>fD#t&E<_!badWs-YbrO7OSOa>SYCd^>t*iBT&oRMkO0bA zkz>8Znw!g|T2YbsNCeJj4&9ZGgasTy&e9y4onj_H0@8-3Ii7Vy9|6ihHKMLvyH*4B z@bs%!kr=0{0Duy1DJxrE+llR%oBP-bb_p1gn;Tmj$Q7EvFu%BXr-_LGg60+%?=>;W z=J9MOlq??4mQrW=?jx7$Nv#vj!s6o1#>NbicpDl(6~XUOQ&E#^3eeHOfHY*t*ZeJ! zYUiWidJmw4yh0wCMF!!Fi5WmQN=}xT&o>AE8uT#`R10cSYv>+y(`lxa4=PCvlKDdT zP{#NSr+=J4eCPk_X8oc{2q4i(KnY7ul^BH?k@OmgAM6B52-Q9UKt{%6u{r0{7A%<x zel7w^n9t`Mk;w;4O{1%;-Ko@$^tuZh%3!bsf-gLt7nM5C(C|)mHBhZpwMsj<paAIb z(1L<TwHgaRl@PF_cGBFK!opK#Vmw2F_OO)C|GucGpU{E~9g0ECc#}aQkraCyq?l1! zJb<T7AxecPA;4xE+@Jv^1iv&F8raZNoUb~g@g-qAMvRUL?`*1sG4?T?GO$fRZG)@^ z&@gf<Du6iTnX}du3o<!DsQ<a6e(LGL+9u1ZR>9n;R5u|_Lt0K$357vBrIM5o`~tQA z$J|`xP%)S5@cMN*#(6)ZMvcN0znKAx1oQ{CZQHi~#CqSGzA{hHOb{i^iOk74k<&J+ zt<3nEJi!eVY~GwX&;R%%T06fPnoy~T68@BtQNic$c9cCOi~Q^vKQ2!7MbljB9*v6^ zFWz@+U*YvaeK-9V-@M=!b16)U%{UtknI<YH)}yV#7ULY#DMeb__|W#D#wsDg?mc^Y z{r&g7vN9tIrPGHG)qFmSLfPuzFwMe(=%Qg@vpqa2CgY0>jb@UN&^)H#D?^<gI)^wr zU#jaX27i=ol}M8TO8BDh3%~1PKGxSYgBm}dv8Ac$2e-OW=t_kqc54nm2`yf}%=Z=3 z)k5ZZ7puQann#@;raew`hMLcEX`qC0L2=0Pe98k#^zi6iyLQc<JsZ;KR<MEe=4DF) zDB-}w#HiZuF(=66@o{ly&z=nn3)2#5sDnB^6!4qdHR<Ts@s7nEI5Y%2lZh@3Mk<?K zKh0y(BxuJD5Exgx=@6k#4~vS59J@OD-`4If5K7gWsv8$>5M2tzdGh4R_;0@X)5V48 zg5X21;^JGiN~l8;b$V!GVp8_1j7%YSc+r7wOP79*hEw&Sit&nJQa@_1jRXb;{+XXo zCX@NvKb`G{K+vLlccM$7=`>nz!ROU=huq!WKY#x0+S!%gn{V97ICXPs(VZemR?^hK z^Ip&WZ^_kGXLQRru=7Bl=sv10k{Uoq5p8X4b8~aQad+>>W(OM>EK5(nTULhELJW?$ zy?K+=TGVKzSPT;qo;`nlSZE5H4zY+|f0&q<DEu#D5Q9J^1XR4KkRE}YO^)`Bj*E-) zf7?vD*1}}f&LBg%N1+g?gn(RGE9jq6C>@_ZO-oBFw^wj7@YjZ1_S)DLu$58JO==h2 zj@eS)iC5fG?%OeM5&MYB5Ni{QHq;9jE<AhoY(@q=2gumi*vH2wGBVO02-^Z)H~E#o z<-t|OI_>6ZMaA~q+@{uku>yZ{uWzX5%$alY<jJC<B5-d2ae(gh>C>md8$lpw%$3aM zD+7c5QsnACfBw8(yLJ|XELt6rVJ^j#Y+ClTOv!bO4{aZEg$#S`s72w_niI%Wg!}jJ zck9+|yt(-wvIceZ%*_7&`0)%DyQ89z$@;Hf3x9LpQ;UMB=@0_59btcef04;3DJdyY zQBmpX=?n(L$jHdS!C}ORT2q=9bx*~doE%#_TTDG$28nUQ;)Ygyb0?OrUAu~i<K4S= zckbND&(DWyADtaKbO;R%1>v^!JqGY34Q$^Y(}KpQ0zuG=7d#$M`wVPp2{_o*cXoD$ zKaoqu+S(fFSl+vLuY33IrXi-S{}KO|pFKD``APEIw{Jbcn|*WpqNyglYmpKGJW09y z266Ocv2IBiNAb_kPsq+rN=gc}xBqH-{luVFS3#f$CGzklg_8tpg!bsnuB(xz;s_^^ z)(Gu+uJ$5*wGi*JtDIBb^;p;ES<gc~LbvtZ=4IhUbcw!FIOXMZ1B1;524<d~GoI^o zP^}QJhlX^+XVXP(lUz%@7Wp>v*o$MrJBPIz=3(y9(Y|AMm+mGEE&fcenUtobF-%Mr z)|>6gfB*jWs#OWKHnqG45B3;1u=VKCbVEZz%h+roUJu36&%Gbmejoh1{HGMNi}Ne< zuY9`lrT9xmX$F-{z4`fOUS*!l6G<eJje(6Z!`RuxxrIp!1{Gdi&ZIG2Ok4u&0&ER! z5uHc&H)BfE)9r&Ad?;9Wd5t`KR#N1`#KicBi2Q_vFZb_r#2IBac6PQ42rzbZWSE+^ z8aB+x-k!<;m#~>%Lxs^$JyZaoEnu79aX!%nX+(B;c0px9c13nhc}{6{X+c#1m(OK$ z*<h>YR(~q|lva{fTwPqkE&+QmrA#J~4QK|I29}_Y(8>b-h7{}&+|r^Yc$Cm7bOoLo zU+&(um3xhqnY(+Rty{5XAq8+r(qdzal9DR(^Q%is*(D{}&!1<%cmejKaqK&E$awMu z{TKA2S@!lG0|qz*2fO$0PodMbSI-I7LlZrdHv8MW{^2#T#ZVnKhBjdHfqaNANF%`0 z;c4d6*Ez32e*ruWJ`{XNE=vAFOBQe;D7=xII(?cxP;wtjA8SKvH&eIXuD#vOFq@N; z2cSYNdiDexj%lXG#3Wt4T9%cS{_tVmyLae*pwEsWAwYHA`t`#xJ7pkP50e)poBo1> z!7m+{0FQ=mJ--E;@J^AzQaJ(5__M5MN1q?Po^(B}G!5O)(qr{^>)+9#BhW2>8)7CK zI(6y<Hkr}*T<*uHDDX0z_x3ILSKrjM)3Rk?Q+)v&Ai6!&4Yz1HpaUEN8W+b9c_IU) zU4MT)XooL<yo~Ib888#v^59img+-JFnM(B<G6ZZ*52ZhTe7sjLPDO=BXefAFR$afB z`1iv{Qy!7lkp!!CpY4g{_R5t#)~!=@E<kBF_S`7xDCjDKcJ)Bq0T7<#H|e*2zY+eJ zcIepgCn2vyWto}3cj;2}`SbK=&*XoXmIvbX5OiIrBx>iQogYkoKy+EYUZOW`QlL|c zFM)P}VA~(MUwG%S7ssYup2p>Kf9?J2l1@vADjNdJ&Td{(5)%G+`SPhjgNB|s(e}IV zluwy>Jp|PJTtf;cjlVel&mn&jU6!wrlcAx#w`?K06yllaHxX>;za0;Ee3J1bc1mop z1HsnJ!231w<XT6ebeJ=z|E^uiq^1#i2oS6h(ALxbdi57?wQeS(T1ktEDgN?h?3F7- z7ep=|PkoF8y8PbdMb3+|<;44wUCrZh%F7iS<wDUEJ%nmo#mbsW&@e6vUbL<6HlmC3 zRS<vh;M2W(XVs1qY8TOyqM_RP$=AQX-p7?-^9yuCL!gbysG<hxAyhky1)26uT1TRg zDBPd5&Cr_mz~^$;(`XCR(%Mg-PIOsdNF-839Oj!iVxVBwm99%dG{FoC?C9lSydr1L z2q0;e9-<(_r#F*s_BjDx;?xDHj>fXhv+IzD%KZGTmX@>Ly(4^JrYYc##JXzS))_hh zb;Wc_v}LqRod+es>}3SRpAmrR3{reNQW6c-LxkRLz0p-sdK>jPT+X{$?^;>Pumhk& z5_t&;`@Fq>uBp*L4O9|t7B_Whs?$GCs6RjTAl6Id-tzL<7$?MQv>pmmy|Nk!fG#T; zBI|~8umav*<|ZaK4-Mp3@*x34HXx&Ja5E-kxIS`C>7Rl)6jL)nxw((5tWcfAs)Udh z=^+ZzWd+*kZ0!7H{uiQ)qXlr;?2Y>R%|inb$V@U4Kz&g=U$6D&r*<Vo6c2G+C&hiT zOteoA5r8(%`frwQB91&XGbL=6XsaFq_I<O@)x=fQvWAYvtf$fDHnv8q$-sjaDH!6H z73OaIK48n0R7|;ylf%^_D9J%giGuEEu-@K>)tF9+s1Ind9s(8zFW&KJ2Wu0nYz6V( zb2Sh?mn-1&&FWpaH9r>jh5a92|8r~K@dQtKn-KuJkw3G2!N^5B6*wJFJyh%ykdmzF znlU4aq}X?xW>3MSE~Y!LsQ=;^(xI`c_j(?&Yy=WGw|i+||1qXk4l2)50!M$Y^I>)C z)UH0?FIJ!=+T9)^xSMsJd4+NyR5yYu3g`7By^#JymqH~J<)%No)nK+``2a`tw*d(G z8J{2j_m`3-X%2e0BqSO%iA0w|hgt!*`+|KpT6O3RI)vc9e{%KYg6<|e?-Jl#c-2sk z?KkrbO)QX-+&Qyn?MR=sXRu8bYz}&;LoA%QI~3=ZM3+KUpl#0Z1@Khl4*kc1jgXQY zc+#jN)??%xuwhN4ndl*dYP9B_cX+pVvZH=AR6oAS>^q9+QmC9h<8+;4bYx%9?kBb; znu$BkKb$0;Ol;fM#7-u*ZQJI=wr$%^IyT;Z@BMh!{oL#H>Qkrs>|OQz>e)CLI)R*t zr$5*+dG49cUm3peW{YO%T5`6}oPLTs(lFf}jDdg`W3v4wA!v1a-mm>%CXU4{sr65r zTy0h(4VP-XgPVJcb{+oR5WiUXI&1E(rM|8!JDA`uAZ|Q7n;Xul-%%b#Y*LN(&*qH} z-iK3A`F=OMoa)(vulsyk{<$5J!`<$r+N^-oqAlCQzTYf&4IbRfY&pHC%?Ylhl{C5P zLI`g-QXJxI$3e|z?B`HqneBIO>eoFM0hi^I`IIk&mQyDAQhsRz&+GJS&Z5Yl=co9p zSjQ+jZ_7t<L_$9A#4Gz4Ge}`LwYhr3wk7Yi7FgpGnmxyWbcDp~mGE7D%xn7i44>xm z+dqg&INu+kR(i5M;=1W$JiEO*^o-4S4?CrLvr+RBMCthwZ%#!dY&b&=jda<YDXCs` zy32N%>&+<Le_Swq#-t>GEAe0jRpe9i9G>agiWoA8nfTo9iYXtAFg8P~jgOmi;P=gd zfdL%^2){f`kw@uGSibv|Ofw_U{AdZ;3V%<_XFH4{xf^)Rk^60^RqO9Nb%k9#e!+0^ znsOg^y5o2D+)OG}l&W1(gZyqxLlsWf92Z!DiNy=~F-=2Dt1^oadvZ$vtT7LK>j<a~ zF20VG@$>Drm6g+4W`i>Qf=m~-)ADg6%=mbbnb|otds0CWfwZ=@x51m?Y&cF!d4*u@ z$o*xt?zJ*Q>>@S+;xb%zDtue>y7&WAH*@vK<RDtC18zr>zfiUE{F|Tnzg0hkUm`Ef z6gzyXmmGWvcmV2G+VaYU_e0Z%YD#i73$q}Z+4%Be`q_WN2=m{wv$weEjZUQ1wi&?e zw1Syq&3u<JmlnHg__sALia6!ZQA9J|xw<@_X^%KA90E5;qMxN;8g)}`ux`eNhkW+T znB)L<?K-1Pg(^5tFHQ*y=cleeNu^bvWT{B57ss%wU&NQEUtkJ>PY|@3Bdl-;F)R2c zvqS_vvinnr_@Brm;ls|m#$r^@0Bbajn})P?aQd|?kO--aOll6j@J9UBEWi2d^0bUq z577m|d}z*;Cuf)YeWD&C04iq0+b9*QLEJG|;5rtzfXJtckllR|M70!2GdeCjtakGs z!bsNizQ6P~Zwt5SmzNRM^8<+IRpy?rz?<`8srn7fi7IVzLmTtU(M`Pm)%VUZU(XMB zV2Qm^xwgZ|fa!Jr&2Y%8EAinv`QGde<60z&g(!WOB7BvLgVW7NnxRFTqa1ia-Qu^g zz0*Y%H=;G%nAY&q`5m^+$HV&s5$oGe%8!o{gRDO9Z|poXLad)X8d}~z&v|Sv^>#Wj z2=xYG4lwwO<sVWjdm#4XvK+noUqXmJyF5?)3*?%kEZbjmSb1~KH`?NW!<J%844-$0 zWe@w7<*Osl<s&nw;i^p`GBlNvRi!kfZCL3rjCV+kJQ%n<%2a0Ua9382rt4SzJ+Kl) zltC6^G-{bIfq@y(|MnnVHAMRPvOd3g3-m|eG%Bso#XTFU5<+!jvMr&!Nhk`IuAc06 zCVtS<w}IR^?PPPWXi23<U(4JHJ=C;cHwV<33a|+S=cVtjE%uT_{rn5_Q-3Ouqm#7# zhE7-?4sX=Y@IHC2{1!ht9TLWXI+Y6w7tgIE$uPE2O3yJig6RGh5WQDOkNf%Vw($H= zl95eHK}a4{*GG_?W`?%c7yTlHa}h|=`*P_JLci5+__wF8;97BSo3ioi=E*hgz7?2R z-#tapc}ra^354VEOmb+g0&@F}Pc~r6_wD~H<`L(4cd{^a4&^Oa*RQ~D9qE4k7*f{d z93x;&TTv`aBpZhfm;%Umzl0F``S^V&dcVmy?f!u4Gj0B4(jOXf`K9(Fc!+r(f@WgP z<w;^;R(Ib=@R7Uo??m&mIA_4B(?Q3;GZ!n5Xiiv-!$=;IO9{mQ0`xnR{l8pgJVG$` zS)#KIDs|-Hu*`dKPu2PK2F(lfX+C+a3+eA8weW5Jr7<z3gKwK1%V+naPzC})*+(%T zem3UDwq$EeEeg*OqkV}P@;PnI*|qN%D3D?^$#4jCzmc`p#1hdV6a;&&DQd>keQmqo zGA0~jvE(TN1G|J$*W3NTIKrIh!l?HAP*Xp@)im$rQojruq&13WnDy%j`59y9d>qrv zXuu6wj;UU*!oAqr#nlC?O6TA}TKU)Kf1BW<JGEf>L94#%*nG>cDW0m`SEy+HD8(wx z7(DpNiBtxKsaY06aZy>se#t%2UVZYeoc+vCWeS^#yZST5?Z~rl&i}s^I*cS~&>rjN zv`J|SOtyDkQr?j<GS|`em{j-OU42hC7Lrx~!Z`9!PXxk!_Y11kEtPQtco<fhsS)XT z5Guoif*h*qy=%K;77zSfF`cegNAPqPg}V)VQ85#JK9Fkg5!fWeET65e<6l@=Zl!K8 ziMnAoZH;$khd2`@fc8wc54C4<WQM8YD4elC+wAMV^M1U(RlDEPDwp%vS5ga(<4>Fr z<~+IlqJUEQ%d(ZJ#L=RVhhl8WmwF=1%)spr;wmRF7qpy*oL&*KoY0glr9PHhX9Dv% zKi46qb?)cURi><U#oz1RG69jXQqYlzmSh@})U`6@hK+P{ezag;CT}2>aZo)KH1v-4 zIy&g@xvO-cUZth+c*U&W22&4%6!Ewhy_=Y%FZ5N_;o4%<&x+2Zi_wcb51+%L2S_gp z*%7%4p=HGv`geVW;I*0T3nnFYil|g{c~#vkaJ#=Z4T}G2EOf!s@9-oJ>lNOY&(sRn zSv!Uo=u*EeucYC9v$>g{P$JOXBrC4Cn~;@F(1{$J_Ev<M04Vhae`av4MCBxyU@9Rf zEV$dk!#6rglg7c*^*H+RE8WYJ>`ZqEYHaTpXm+z-w-mJ}D`##<I6dUSIkKmBB6M&m z5NxRPRl;T9-I~rx54{n=YRwB-*_;MF(e5$Jr8wNSb9^ziJ=oM~W;$qmK)q!hQBoa5 zT_-cY7eMK;3ZfC0<hW+N{c~rnq2vJg1hTL8E!|Gw*TtpH#&Go%2Yc4`<>Ez|cfwhn zWRp6-Hmy{@B#oYXc-Ar7shMAaZ8X6BWqMSW%&zpK(~`LkNB;EOkR3NPqIWHKLzbv$ zY>0N|_IkhFrwEO^W{Xq9t;F4$+GA64&-=lro!v$keqfTcnnCpXlquMk<4?uREE(Z{ z{;oXQj+=^$^njMMN(Ktcvez)<x^4R!<D^b4k7=<YH8gEjyNC4oqIqffCGhCA<@l|t z&Z|G3>{d<k<O3UI3M%#PS-b9eTeq4HgR-gIB1JWnpFYn!qkVmf8{=Y84%f`+t7g;L z+%j|@*wYDb-B?1rA$*PsUu&TwGVgTBy7ar#NgmvJB<^`jR#pqP#3rB=whfbvQ*UV{ zH92-h?vqZlRhQntA>&F<3lu6A2$rUExrN<?<-Z-^wKcbCYLFJE=Vr&3htc5HGM_;S zU@LJBv#p{TDJv=#h%Cz|DCl{tQ2dJ+AzHau+rGYEjaQ-w@<7t!HuED2ZyI=Xgp;KH zbA;>^f1$2W+t|U~+h*`f%Gk#QVQJ11mLEZcfy|<<dO-RfPm$#LXGmCa@m`N{hpxxZ z7`E2PLf5PW`VD!PZdOwXRQ3!@pAB7C)6Znj1C#I9(CB(2ub84HSlGt5t||0%VDlDj z&2Vb+^0YNn#vHNQTsyEta1ML3>x2T(NKpv+PrjK*)7IKGH-9K==3AIxxmP5ucwiX~ zo~UhlF+^e|wSv%i6Vx(wc4yl+NqBDzih&P2!8(QlcujW{Aj)31Rw=RKq1ugP0X?jg z6aU#l|2(j6S(x3|-WR~)ppVnEXGU?|f;6PYD{Z7RG;=o*2pdl9G4Ds%x7P3LYijnJ zp*rh+gzx>@{L32+J4O6$MyKBd%D|o4bKCa~;f0;<;_~H=*XymT%eynq<Do=uTv&E` zbXQ%gU#ZPz^S`UbadNOuZz!bKKyCi^2>S+ecSLcug)-g${;=FoB!zwBl(&0QZBQ>z zzlElxRME@m4)t(yb2~-o3c$$PVtQ3m9|5uyct6V<8;elIk=Q}`W$nO1c6)jkEZpCZ zi0@Ri`8h7j<IlqL2<M!WX3-wNLV{U>0<K;ZXzzAs?7OB`LoqTcd9CKQJuO)o(e;0T zFkw<V$!}JoSuOwaSRldH95NxOgmbf}d8mW~1@l6LoS|YRA)JorF|ue*CnQARiLn_0 z?z5TxhHzaTt!PCd(NukL=d21p@UOlTC3GJ-%82m9v*47_3vqN@u5l|kPx;>q22KEJ zLp#eg2&0;axyr)05KwKFE14vsXjO0YWaN4r80WmI^E20$rC{yd+Z>AjBk*ezNbmZY z7xHHEl-l@&TAsE(^hW=AH#k*Bi1C!tUJ^3F^#cj0s#9B?hw=Go94vLd<NVQ8AaA~- zcS@A)<jHe#Ujv~GfgS`_RTf~W0npQelqFprg7fplh;I@hqI5jhFUAc)o$d88Ke~<k zs`Es^WSq@BPi0#^tHsxC+&G%V({<(kxj;$CAAYRch2Svownymkn~MGIm9J>cQ>9ir zlj|qyu9Ez~e}He+0Ke~ow{EUWH^AI^p|D&@_|pZUknsO+7`Y!})p3tG9nBcq9_2$& z!FEpIcry)58O@#MMIZ4W42>435hXd^Ti;XUFa&H33cI=Bg`VMmZ}D+AT~<JvNj;h6 zQ$@|Gxv3QAWVHRdTz3%u^KSk0$n%8=)-Qp>y;DA9s;H^83Zu8@_wr&6{5>g0sv*<+ zOGAFv<QeKf=1?$aC#sI7FoLBypXDx%^L)5u*Ta}p9CD$oivR#WWiz74mlre|v2{l@ zsP0?|=<Yi-K0#;F%dNmDAEd8{+mALSnfV*UvzX6lO?&m1KLscE@*&Z%q3$9J|4;6q zsT5H5CL)ck2RF!krRpjv3mM2;ZCVlQcp2H+ZnGXWiY*UC<7p*oknbRlDAx(mhSZCJ zbz9i-?up5?xw#!S>+j6WlCIoPh((?4Z+tOCX{o8KQLYaoab<j;sXD4dxbUS$b=@Ju z+55vzd$Gha=4eW8Wemu;2@I4~jLpuz1T!C5O-_<86h)<_@Yp^XHEam%nA|SzuLE!J zB}}_>fq~HoaHOacscb@3BDT>7eBM@sSXd?&uQQ9-bq&H#jMj@5md;HzzhQrK4VxIf zUmhi2&5o>I`|b8~6&8z%hy(=(mp7iQg^fMbY-f5eKj~7P$C<0LdczR2I!YTJ?S}Rn zibf0UTYY$(*MX9qrp`9*9ZLpf_3v~K2(|G#`2KbSC)YsfdLsg}#uwlI4{6X&@M>ok zH=2LD_ZM4L!ejTQ3k{X`=AI@&+Btvzu4My~VL5U%lG~?CuG`zJlJ96ztHX!ypVwP4 z!n=hnT9YnV;m4%B(CtXQ*t;!rvSbH{h@_dDBQ((>;ry1%NRCe{>yrc`DVK&6^A;bT z9$peRfa;neM)IouHF=A@*<4@u;>zl@WI1|F%2{%nhARkSJ?U+1XZe^4HAAFR@+g@| znXH>ym$ClW91QN+q~lIWo2bahRR06rP$D|pZgHQL$YF}c@cz9$=!Am%<aVZ;URIM- zZ06>1(d`glZ%<*ARSQA@vU!{9_sq;2g6)2^{7j-G@0nt9OhsxT@!%T-t)Tmxf^#1{ za9^UO0RgzmX=^agzd?q_1m<nwg24QyaI3{GueWE{J?#z)EE*beTwFh+tka=C_Unyr zho4?}Nn?jMg#*GGnQ;)Zaa0bN|2?>Pyv31;Wpg;d3Z->3V=eSY=10nSu=9An&rC1d zZjHEkTYt<5opv}<@su#Q)v1iTHvoeq@-)KJ_!qDWP(^QXryDX(3&LU!V*Xtkb$EF^ zFYAGLy*C=Qnn5@W_xHCJzmrqNpY9XI8k1L7u&!P22A!BiTvb$n%VUzCdr`kw@O`c_ z-*37FYfcT${i?Qg-7I;A)@;JFcBO@CC<Mb2^kihO(zOY6xDAd14c}ro<_HeWx6!wz zJsCU2!sm`W@ufvjBvCb6>~^CGxtOwwbR7Tw4VRJ9`eVqlxZ#NsP&+h(9v;)p;(FaM zG4XbI*bRnb94|HFLqfPELu=@{-qh?1=1ChCm$!F!NLbRDjJvwPT1^&@2U~G{7tz6@ zP>GGK24fxA_@bRZpA(idEi~Sf?n8XGL_MZ1na=|}#QDqlYGYOVp{6lR!ob+rWW7l~ z!MO}BVzIzj3SFGTN7we_)ydiUmWuYyOU~ej(d|a7gOfWo!m7JEpp>cb2P`jwqrH7x zTrx(Zl4eQYc@SD9@yH89iQ);HV@00oOUf-065^ou!<;BT?n158xuBlj^%ezBF-w*% z80TT-%Xz%ei1Gye{ZAxD_{`MGv%RAun9ACEU^xs~<Ep#O=dro|5M&BD@tO`n@y>KC zG|oexM4M69Qt1fsFLwqoV(crGYrYdj%N|M}bDN2VModT)UACBRWdPCSW^Ue2NN7B) zN})6{`ShE^kDm()YWnko%*i%VP<*~0OLuGo!(q^SDFI;@EY(Lt0sNX$){cgb+#7G) zzg~H2MHGWeOs5$(8o~<X$3<JdL!whab6YN+fp8gN@6R4URayf$5)QG&Aq>j6Zoxc_ zko)NS8yc+@s#R+>22iuc3bCkUq9c5J`MZ%!z$ov#qlGdh!=cDH!Z%v}d?L*kEg(LH za1EY8<Dzv%@>yO`wr;(GAoPsz{BYF#DZpQthwfdubn0(uNVEi@R)bkwW~Q{G0F$CZ zUWvr~&5i#)XuCixhRfv&T?c&+Ou+b&K?!w*ruDBPi%UoV+Tc@94-S)No9JhY<PpFV zh!kz`cz&)tk$kw@Zp1glM9O~4(u}KdtdT4Cjw5*eY8v$U&6P0*dI)<Dv4vua4jc=x zhCd2gTGZQlsnQjxg>eN`?o%GH?`Z|zRhTS7446xt4Nfdm)6&Xx+*gK6SHt@w7OZlf zQ^C^QM!ZS8S?T-qUl4I;7y}I3SULzgQOdE+CXI<)6^+bRG`ZWl>D;Uy%}9vvyAC{^ zHpkxsUAKDd;j)7R`26u)1lALSsNA8R1>Xts=GK{DVe_WWpv*#o{0I_aY;4h?AvWbR zFk3UGDYP*8omr+@#db2AlP9tT|CjAVNA3X0fnJIV12*VC<PMZj+EmGBrsIHbbN*=d zYHI&<8=Nf5^ft?<6iiG8lEp-zJAL%Zv`X}lDnoYF`dmOOn>S8kj{o|ttSZJEf;t@B zavN<o+a5C5Z9^F%grj9suXo0hnt4%FYe=;kNNTvt_jxi1PxqLOMq<I7!gn1Uf4>L2 z%}}Q-MJ^1T?@5@}KcglVJTf0sPwK>jhqZ8jz7(M}iA=A-bMO*r{APZ=HO?Ow<W@!^ zMnX~O1ACY@r`Y@_`R=y~<=AF5To}EzwFTPhR8r6#)9*Dp@_~^QFH;jNb#~SQPY&8_ z%)F|YkMXPM6Pf=Nue$@9GDlQ~LrUbmi*j_Q+Oi79#h8;KeQkFy&%nqNT;xz|nwau6 z)-jV-Xc1_`w+)%#-o9+J3~E6o_=hSCf$wlnjiD;gg8gT}CN#7+44<V<@<%PF5aorb z6>o-Ieq1S=a=Kx`?!OI{R#p5nWOi_^3w$4n6{d=N7}@Zw7I1Mzrv|bv=Kk|rwPN|+ zXcO4P+!SvjR?r&yQ<Sz{Ui42q*1Qk~_mSI3v@rDB8Sd$*Tq{3QUg?Q{E643WJz3ex zq($HN_jVaN-bqG=EfqdL0|WaTc`q-{umO^|ziu5}$gnFv<1@JA^?bte09BuN?qBck z6*xG5?qL40<{^uwba2Dm%Li`#{V{01C9iR*j+hCXSaYHucj~BwKBW=2@45IBS`n_8 zQv}!+C2iV+F&A9Sp=-zb)=Ot77<}jS+r&A?N*K*@&T`^7qu|D`TC=(Vi?2fVn}%(3 zFkk6)Z+j4=h)v)r*8KDH^CMnUJT(<fSx8<UBo!pZ2Dnb|e%$z?qe~^9Gq)G2<g3%y zcp4dRH#Bce9mLa?M_04lD)v&q$Pc06-a=H}{OG}eH^IS`QWSivq`S5h${R5JwLuwX zulKQxWbtzTcbsXp_%=O%xp<2BzcB3*Hd0A=-wZKcBe3(RJbmt(BL2NtU!h=ylWLk0 z^JR3XdA@`97|j>jXQuVcc+U|#J`5rq@@BHP^P7guJXmRM#ymXS$9k3ARr8_6Utlv{ z+AA*PRHDvZ_E=bG&?KoTVI4rPfDY5PLC?|!&)`O6xF;J}MnJC}9`Pz^VpFAN@VVbp zQ&WqNIyT^1%wFc>SYrLeF@<GO>Xvb8yD)l)P+2VaPZLRVcS|r=9PCzTgkZ@OQHfTe z^ZM)<f{A*%zoR!JX56hGkUVM8DLe{6F_D>O?!vE(El`5{bC705H<#Z$V@?)InhJRM z^zJ!$Uz4%*wF;i6p^RsXE@6kKzmL8r6{+=wXRA36>&(mPq{ZR(Sgz0cxL;7J&HMwx z#>Owr%?)KOk^qsD7kWeOlFnhqTS49#=6IQ`Ut~~xb+FX4fY3W{Z*|X3o>h{>pXN?! zKkuwcencu@Ar?u>3f<k=T3Vu&Yl0SMT&GO}_6D<G-PbvHZuB`u^&?B<Lmwm*d<8oV z>e(d<K$brOcCAW0_w@_mqi=!$SHOH#84|%7%0?;#_8?N|(ijEYEaU?!&4kTS6k`<@ z9ksx3Yx!q;wAKh!R|@vK+((fFEOm!3;#o6w%=U~Jt;H!S*nQXkfyloD^y|i^KYuh= zjHUH8Qu)outCAL%vaX~+>FA-x+vCSPsg`FyDZ;rNY{YeUzgI2jm~N?enK##FZMpsu zJ)vNf6OD??5{a+3-Q--F%ph-N_m;%)R9>K$8uvaslgW7{hTGeB8JQw6{>E;(QQ7+3 zx><*{hn;WaO71aZc=88EW>RWAp-kd?z5a*$#ZVM?5FHCUrfdi*cy9py5WC@JRxSyJ zk{cB*N;JThMOH=w&RA7eJ7NDp@vBJ9d0uf~vmeazN~5Yuz{X4u=gv-sVO7?+DwXjE zo{Wqf4KyJN<`MCFQo~hXrJa2>@ROXJY~JWhaK(_L8KGDp@CW8kSw>xh&8JIAlzAy7 zVD(7MY;9zx$6l)^yexg;Gsp(B;^MeEIu8xw`)==Wp9~L%ZOS(Hjt7o|5B~7O1o=V` zeHR!fhYDrtqsbpXW<be`J&F54RDG=^fQ?I4Qj*f%iXti5rlcq+T+qu`xU$%Iii926 z?CgAHZx6b>#OL%&j*X3r1IQ&{C0G!ar<X!v_y=AZXw{HdC`w^CO_oKxdN{doJu&Fu zDVO=@Ru@1C!+&qCs*G(a5^+>i2s5n3<81pDL5Pp8zi`AgpDWB+so#)opr6I({CU4# z^0;i7ax#{ZY^YQ#i9xSaf(;Y=r=`_;Y)n(>I4YDeqG+@0BPak4qgHaZbiu&NrgC0{ zs*pa8a`0b-<z-l1q$aD+?2(cr`o!Dj%iXlKRcw=BdgbIqWs%VB@ie>b=Iz6S$QZdu zfno@iY*wypTwzLCpP<cCeLw$W?nPv3<n8TW=u3=<eJVMkq`5bH7=g}U50JWgs%!}h zK0{@b%zsWJBbe<{QT_#svb3!pe~*@>#l(gKrxC<6$cWsk7?g!QtgXlI?`>OKvpAi? z-yc!T9kAjg38!+{d^E3E{cX-)P)r7EZ|Cpgngj)lr_zHgbmo7EVdJvoLRlqB5^}C` zdNDoAv+zdMDa9-KHz35b*uA?Bo6lPel_)stGnG=7*)SerH<XJvLUw(JHnt4>S9Kmy zF=uCL9~x^x_;*zsTPi6UBOFL1$82ZZG8mEcpRyexA|jGUdOEK)c2zNk@E+gSdq4wr z_|)_#>(gf|d&`r43KavqCK-00Ri7XS;-+<#1S>162?5WV!{bGX<R=mF&dm|Z*CK6U zmAs?(+06Pn*MnO*j?DN?d_i#xr9WFEbf2kUch?6v*ocvYTuoq#2-^BmEIFB1+1RVX zQB}nF<@QiqD-Zg8u7LO*`OfXVN~^gVuQohi;unE+C@ApXNV)iShE3Dl1WB%Q3ViF$ z>{G#cL9vJ0o_q^aHxpY1JzT=Uw`Z4{){VsqwWpOj5iJp8|LABc*aT&TS{AOixG0%n z95K`QRDgs8d&X{QH#+=XenCVIUrK<)m@E&OrK&1mO}JoICR#rhh{u!hOPvcJ`v`C7 zu&F7noJ|d|Hjq2(S=fITX(4(LjrK$ODfNf@c@{vdjg_abs<d>ZA*1ZvVSw|^)MkuT z&v0u%Vq9VLDM2d-{#;RA`M}0#VFVslgM}6N5S*s5e|&Gkd{?7R-FGzKfGTimHvCQ~ z;1!@v97;7<H^K}So0P5MpQtjt*gS4tgDy4J+pw4OcSZDcy~83R>N#fdG;uSa-?`ep zKt5fjQ{3O{fk3~(IzXJJO;44-e|2)QUO_>Qrh3bVCY!8rJy^UXR#fWt`9c*_2o<Rp z^_)%zo`1YO9dl*7#5me|FU<xNSc=Rhe-r#=uv%x#<*Xdc_;S75U+GuhgZIn>>6cqk z!R7IIfjzC(aE&85ycGZkS5){rDA?N>-B3`aePtyX*Nm^cv=YqheY`%9e4NaZ4U0tV z?e7cV#SEXHo=)cQ@%<T%$Jxrap4%8f8jc}GlZ3BhuK_(bk&PB=@Kx{!{-f9R@P4xL zb1S7<k|RPY52$W$Z50uwzQ+3X_u%nzedh@tbTw6mSG+<nx8B_R`pz+0CIV%-(bot4 z)!6?0`Z_c;)I`o63jd2V7tA7F|L#B~<m`}h17*)N7*70*EeKbd<V-SV(&!6b%C8l< z=G#QyQ48zePfJUyMMA7g$9S)olaS!`vukWw(VK%0VoOT{gM#roNah5!WEdhMB7RQ% z{5`Anrj2Xn3d8a;IB5&qe$#s_YD|3DUnBZVU{^Ak6j4@ki<dA$eB5Rz(-MPY64}`b zl=$>?#3eGZ=nl`9y2j!oY3w8l_wIq1iQ~V=h|no~J~*FT;=+4SbgKTi@t@jPdySTp z=@xl@;=zF!y;I5n>5#xcVKK1)JV6bOw5qC0UkIp3|0wz1MN^yu9CdXKJ46n5!+}u7 zbl~rb4C`hkKnXd^zbc4N7~p)LkC?8mZi#Hx>;0)it!M&5MZTb(7~H#q=U`mElJ3^^ zXoBfvI)zLD02nK1)D@?~`nT_?5Cq=d6Xvn!bKHoyA#||o+Rn|-8w6w+vA%#trpCG4 zZpppZ8jc2Vy{OO~Kb~vrINDSkomJEiumJPh+d0$wTHvz_W*pWoE!Av)VLw4W{aJ`0 z;&H!z@qAHVG)Yqos;*{8m*unkqxjF3JFHjQ<BLd{-!(4owz;MXuq@uV-R%Q+4yHO| z8h%KW%-8;=i}p2SSp}z{*V`i;D#7*c^T>QQo2-ougSuXeogb$m?6V8H-S6v|o!b}v z%d<20n|C+fd%s&qztCB5F49({%fNI(Y%Z6BvTj@sY@vh)R{rDv1BJ))bgpKtbr_vq zR!Bn7`e8GtlM%p%aF<9IC~bKdo3+X5_ZKZsRWWt}fEUF3`&!>!g3~Ti-@$M?%Ccjb z#0;%)yUVMGHoC)cG;cPUD0D$UG2{pGk-%O6zM-wvc_)2J+}rRtU!Xs<G>FM7^`quf z^#g<TAIh9@uYWX)2|+_6%1>aqmVE4RJjH)=sm}Ow<l<+sffR?oDvtT)Rc1HmUC`9| zIqT`}M&8IWvTgC~Y<y3QXz43tgR`{nb%NJW8|Q829frrS2*Mgl%WZq+ftJoHP6+&l zOgcCWjyb>x*bHkU*mzE5Kq(e8()ks8A)d`yD*_$Rg%X=G$P;0ddNS3;Wh((Bccv>s zHt(MLG@~#J*cFfFjE-)L)-<Bm!n1OUjV=G;KkW9EDS?s!+Z<5eZ1K!0yzTY_>FMY` z-Wv!B7IreWZ~_WZqZT6h4{Oq>pnO{TDr)nv2P^kn(m+I%d`9*fDf<ioiZ-GeqA<;; zJ*MeKGAbSAVQpb)ZE4vSP9?-rGEzGpRgIN?<-L%P@XOZd{^b_idi!N{;St>-!IYcb z#BTQ|DYR;5y8eUv58B$&o&U94`v$6Xdy}J}WU`9tG^)lf<aIWElw``yjmZQQ?ygVa z(*4na5soOIvlDO=u+p_MQYFt&`>6^=-lM3hfRjS}L;;EzP(77*q-&(>O&86BKoTkT zZwv~Cxn37MtoW`h;;-iETYB;F(K|PTz+Vam69;rVMi^+Nygs>iA1_;84>U0+oiELn zmey4EGXy@{F4wj0&nTp&mR$#-B?uW#I(FVm?%?r!U#G`UE6xI7u#CkxqT~O7o7lM| zSt8S~3a?NjT%D|0<NqRmd^3tEcQ>tP{G&%i7Bgsw{VO6c#A4Tc?}hWjsWT1JUKk}G z)^5MY9O{>4JgXPIS8oZEJdhu7+3Dx{Ut@#4;T<E5wCvQ!Jq;sU^7J9(&tYh|ZM}w4 z*3R0!?`fj*mfKsoLU1X*-_on96yLPSomK{09)!{V;gZ10XTnA-IN-G19G6Y|MJh=t z-i_ZysEf4gfub2h!NyMqNyk8MH@E;)6Fie#0@S%nr}Y405?r3ZePas^|Gxo6o3`D+ zJ5Pp)q@O<#3boLQeH_+UN%T<@H143~*_wW`if>L#<hy{Jy<VwXB$J$AAK9X3HXj-< zXnPy^`)!%G29AfJAOh|$2i8Nj2w!#IJI#13K7!YjTKxO!tD35^nh2>mT-eT#!#@xe zU18gpFPBj0P_n)SzTPa*<j#e9y;Vp4>^D)CD;6$Ptb#>my1BpjZ5X^4ig{Ku2@$w3 z-$A8radl9;x()=YF<VT(!w_6lG^m9Ig@IVMp<4ZK9jY+zmG5EI(XN>v&dgRY>`OE; zbALU(!dfI9AN%~a-<xlBc*14Cx&oAzw@IfTVEiaGH>c6V_wnyQ?X|5BsfC+UZE#Y| z;bV9FM>XV6U+M~czk+L-udJ)wCyvf}bF_J_I`!<G_G6xMpW@HSLgso|XJ5$-fXA}F zv>8uvsleF$;X2iRcSKlIi=m8iZ=b=r=+*~)N5perj@`!zU6kc(2@!UO83%;Ay}U6r zcq>%@wrr7SUR$)B+!jJwPx{ZNv+HB=aW^G6!Wq)O`dafQW78H<u>~8F`#5%gxR-Rp z(_^RSP@w?2$KmMkVWVZ%BZ~V~leDt`FnfHNJHSgaj_PQm)!wC$<GQFoK&)orA`&9g zR9kl=EtSRaUnKUG{hSlt;cttyW9FcE<KvgRUjOpjgqURdb>HermZ#13=JR}!x^|jA zPVLKjyfb+W>bD!AZIPx%E)q6&DE69*ORY^>l9agi%R{!Ls{i^Rt>v3@f5{qd+-KnX z$u524Tm9;RsQD(4P0X|-pr3mg3n-}8?%gT;hj(xu;`>*Y114t03I)AzMr9Tz9c%2n z>$r?ThUfG%4ii$%kBewtE*uZ)u>&{$SctqNme9_vMoUa0TQ1k@)C~3_Poz^5Dv08< z;@9>EDIZ3WHFWs+Z?*_$X?^8KDIJUvSB#psHO%BU*<Bux?XaZQI>2nH6#v7?tIgb+ zwc{ARHVNDRXb+rH+o-X1jvKLsvpd$hbc&OR?d@mmU4P#I#O+=-?A3<oy=&CPM5x?N z8X&N1e-2yh)fyqFqjGWjALA&iPxHed@au*MLRQ0NzFZ=M(?ua0JW<e5`WPV~@-3uS z2hR<G+=gO<dBYI?yW99}1I?QFy2@zg%8DA7^S9xa@KGx_pKn1k2D7)Mlb7l8A>zG; z^*1Av;B64>Ix<cr=D^X=*~P-muRAxkm!ESuDs%MIBR!MWNNF3l`lN_?LMZXDI8jbq zM~?<WaD~?94jnwMH7}i<af1rW7^U_~E0pqaqZ;W275<);zRq1;{fye*6ty2LL8|r& z@Pv?EjPEwDB{W$wY80iU)>7+xTkkKHzX=Mf&;x*5mf)x<HY?=Fy07(jz|9@yW)4NV zVPRo4xz#_NEq*u6r{-i;V83B~ghs=C-vL-l;qT4A+*wdk*0};Gm3m@;4%i7DLE7lb zxgt0oXIN#JsmZYag;xoL_^K)C?XvF*#6d|a*k}{->9%I(!GDj&V&MvI3MeMo#tDy> zH5Uy|udOvop^Zg_$OID1nS6IA)2vYi5ZRm`)g&mTz#w4_{LG*I-r24hEjT|zecHig zhC!%M%1B9BLf)oIf=)f~l}lN<SSjn{0;zj5<16IAIVrG~sXD&d>d;E3+U@lg%T}0P z0HSy~jC!`e5^ATd=hRJV<M|$Y7@d5fl#4Y<jOfPxL6{{2=QQ~8bac0L8_QOLeQUMZ z7W4I9U)MokF68YOJ+8TDLA?cp#<F0rIFi2cG<R5Fp4YMZ>X3Y|5KgAfM^#Y4wwJ$J z-mXF;Fl4;bm7`q5q{blqS>o|9_VubVD@<MJq3a^Spha`^QYMo_da|MbDa01x_F4P& z9kE;puqsv8>d9b$34x<jG$^2@72oz6KOtR+;`i<^c#f{JSRd9M?ZbWhe7`=AyP?&i zqa`QLBF?f}R%N|+O7l<)`ImB)VwJhg`CG(9SyDG$Fx3Fv(wOfb-tAvh$02^MItJJ} zA%ewDnXou}CZu+e5=ilMK#T~o{0;)p+~C5x$Gu9B*_;``lakNJq3a4~Gt-!(EyHn^ zykQHK2ZGp-?XlCb4H1t=NCc+P6dU_;ab~7RpL|4&!;!l1kJI2u?5yfrRrEa{a|KIg zg$^?5BdFx~Ksq9ne+~WA7hssGkn}O)`!3&?j3KZ{>f#G2(#(@zMsw2wFrEYK?2SZp z5qp+wXWGcrUs<o>n>!>z@uvLmu}Z2ewSaVA*&B&p?<M8%uiLnMT-5kc0{BEJmaSL| zanUoUwc1yF>FK0ek#%)}mbKx<lEp$jtj*?DMD5e7yohsgf;X#{RvRwUM1@tcc$Zs^ z747pU<d6=V-)`uN6fG~YnoX$3BwteZc})lRu~Sigd~$lvn>M@ghc#H{<|CVjEJP@t zq08TTAh<)lYEQJ@Ozp=tiR86%IF&Dhy2-3z3K0@jLVTg1P^DYgAkJ#+c{91o=zv1l z)munexPMz_1D|Aa0-_@mI{~EyUlfVzA$OdU89pwbZxc^f!4J^+!MWv{X0dDn$TQTD zEgvknPfJ^#JYj-KpBq+tnswHSDP<W`XX%<!&Ri5r0Fn{f()k-%J3CRKj;&UuJV<^C zLQ#p{u*LmjPy+ajfKl-<ueYbMUlmi5Cn8B&A?qHt+c$r~iyJkAoNBeUf@*LBcHQ1b z!5F$?j@~BtMY^!uob-`1-z6%M8L;3ua+D|Qm8fd+$5*uA<Ljd!2WS;unxk|BKkzf{ zG#Y25OVRx^=InEbAJ#c5&NI!^qW>!p;ksaF!P*y^gSwdy`uFL5H%>R?Sq%y#Vo~3~ zjf$ZQ&zQ(ee17JcTZCLS%E}$No<BjNE;tC=X>RzzfND5hT}sLPu4u{L^*26KM@CwU zKc9xJ8l<o0=(t78fI@)!baeupjNlrg2H?L$#MV07)$1TGj9PNnyZiJEwCRg`By~y~ z$|~WII6ej!Ry;p&vjc|ek-m2k$(+^*CP7!x;m+Wiq0n)}<byf?b?h^jtz5_{|8uiY zMn0rbUyN5N;|m<0k-+CCIhjjNI__tF6(Ntj=C$hK*7o8ztYc$~lM#>i-HHq<LY_DJ z6(6+1pk%r$kpz;QrCcG0sHvR4aXtZsX4iF!zgWG%Ifmd~%$CpYM8Jk5M^g2hu=f}+ zW8ORHA>Is7ve5jyLjmO~4k^*$hNu~UO4Xi?>X{qXfQ|l=m-pu2IM`#pc(?MW2HrEx zPY9>TZR1S5W-lClk<(GUSE^eJQ&<E26y2U2H9gdVkTZ}!k+4)Kw6E46bha&nFScn9 z*U0+&0zlZWrOo3rw{<<}bhxDH$GTI)`5Ge`Z@6x%;qfeSD8$8Z0yQlo1tRo&|DF5I z?~B%uoE+`X_4~~v6emVT;%mHLdTo@4MT0q-8mm}e!#}u?an?=e%2B=dWvhNn{Yjiy z@%VbK>*bamynxDMe`0)j2m3c;55IVNk3^?ovS+f_f}pFzTb%kjeZJv@*uFE!hoHld z0w1GF;|it^RQjM*l%7sk3Hd|%WKb(Sw;f|v;j#}(s33_Sc4uKcV!ZXg&MU;UJz|pE zB#zmnwVfX^pAkx_8KIh?5ORe``UD)B3~O4-xNH!glLP?T?lF;GZs!-TH{ME1&P30A zdGN#pdfP5*uSXj&XXyF-kvd-P$HJy`+42si*KPKYpN#Xg&x~8$KEWlRuO)IZo^}VL z!J0w19$C4sRlR<YmeWZX8G4afe62N{tjHyYsE5oup;&2Vgx0}{4Y6j|weUbS!W4g$ zlJmw2M;?znBl_-WZk~SqXgfclAQt?GbM&~sp~YpU3%PV^sfLi2d$GIY^jQT>epW6z zty6+1^oPpbQeU7<32&n;)SzLFu17&zKRbFJ(<}i-el98iUF4etVR0$<5F)%x&NBBL zje+9maN&m5e=p*}^YanNPK0GfNkM`d!a<T06(B-)2@2xVx%70ExP@Id4?TqAr!t|Z z*3F!Pa#InLV3vBQ`iHLtDi?rM>>~JWMDGSz7v%m*Dy;w8sbJ~F<t$8y^1Zl#g8<hP zQ^q;U?!t_PlvW~aoXZ47rv+E8@_pNw(wnux*~{aY7`38f{kqk*n)u<_`lzBJ#Gz|A zEM4W0|KMW>j*6Yr4F#hqRMYw726Xi0N9qVZo1=FY3^JD|XP0WIFelb&k4+w!L{2iH z{u(+}U7t3+o`)?$_zfA6f`c7~jblp}E{7{sEMyEFB`8Bj$J+D9rL+R+>0MP`Kde6} zF{R|^kKYFe8_P>J+;D>i&vj&dt$v2tx=kQ9cye&6;5h$;B9)Fp0Uhy~g0Nf=UZW+X zxzs>ODc^gmg6Q*m_Fouz$kCPA5`wLAG}3c8oQ~-g>dTFq<s}K3x0xq%GFY;ig~5M) zb+gX}?Nn9#eAuN0KqC}=^B><g)TKGduwOwzU#b+Os~6|2Yghkic+buYt?=5T%glTn z4Q+e!er?qPO`@~tGdtT*vmj7|-hVlm+c|blme&a>Z6m7`h+q{K<Y@nyi|7<%tb00{ zHmH|JVXa^zE?USt^Bqg2#rl`i9oo>N2b)3OPM*QXl2We{&JUeIFWun(`<Ug+)3@9) zxWM8Hnp7A#Q~95zMN_CV-fxYT`O!CagM8Kc@)qhM)N#GUihETWv<hvcr(6U+A;Uyn zn#RZ`I!@I>j)F;)zH8EvQ4#*ah}%<nc|cFbZnuXId#8ye2!UK}&Se?|>m$Lu84{oG zFB(%?j*ci*(uh9APcB@iA&(W6J{kYl3}`(?uW1&4dx|b2j9CefV}OH_#ec?M=eoHw zt198|eR<Obd??ml!}JQv(OVHx&T}TbmAc0@XjW8KVGSS4X7zg$4(STs#=UlX%!U&A zP$)8vVXAdfHm<yq$PkLO(hlNU)|Ol68I>6xFu7eC*LP6!JujTZb&|FgS^li=%NaJ1 zTX)i0A$D5&97fp`d2xg{Cv!#4ps-570-ULam*ZJx;Jl4DlpkI4Nc^WF<JkQuW)0}$ zEh;Vdt|CEMXt`C)AK5fNNe`V+cR$+CQQ~6cyis+m0=t{?S&+GayFN+(P8Ew17CYJx z0-(rktI8!DC;@SVik?a-^IBSR`ReKLr0+vWI;1m-e~e0Nl-8qfWCf0SBifRJvo}#6 zrC;_nC+`@oGlr-~bG%3zY<!f>d&~6Cw0<Mbi>#KVznXZJRDQ%g*OIdfxi0jzYE9m? z$7u7jlxJ2cED$#WG{g7~;MK9UIWa=`FD!zB7|rQqpvyF>&bTg*^<ltj8XMRE<3ja} z!%B7Y4vJ0hJEbr<hBnyQ;@Nc{ZA|o@X$EI2Fm(A2!3-N(ckjBGDM*-3Zv{*FNhjzO z{9a?7`!>`c28@!DA_pvmGG^92_C1rN2jkyMg)ofUccFXWa}z(Lillx?)waEpB2htv zN%&}Dv{SXxb9@NcG+Xj;5?Iw6IHayy*uL;^1r@nk`<@LH-S6m#<CA(pLw;^Y!1<Q% zbQ)R)!(6>R{z8tR+PNlox39J~?M_KSbB{`ell5?Vs2QI5Y5xzj=62uhMJ=vwZAqTf zumUd&gK1P$ZAf1EJR4C?Ro(h|+_#OR(oNV}%ZP5&Xsfx*5t9Acm^=Mm@GtNU9N{g~ zIZ4u@HaAj^v$WuBgvpV*mz)aV2~*K?7GTjlc5+P%;d~D%du`60)EXn+E`g5)1dHE+ zYxmu7#Wn{WJu6oFEO$0lLQ60dtNeO$H|iq-N=~(j3G|{T_P;Ak$2~M@+S+9I-$$h3 zE1@3u5&un@BL^ptzsNA{_OFYa-PWCz^K{eKNDbtrkmE<_HB8i+)VdE&@RMjbtUJlf z#!NQ<soGr!t4YY@f!{T|G~3nyO9=VmmNEG)tRMiI#kPR`L3%-@R&b5lXb1QBILhYV zS3JaAB1XN`6T?y$dQ^jgB5bHwqNrg_A2f~@Px<*-wVOJ(_geK>je<)|^%)0mD1W}b z{lkREgB0({8Ky-TxISPQJH8vL<Qz3t1DD2+*A;r<?*s%ThJVN;p+el;7emwkvqlA% zWH}C?Nsu-V%|(|t1rn&@%cQxndlAv7DxPmbEG1kma;ftPN(V?8y0G7zU(_GVCfW4f z1h)I#@Q@!NXtRs4lWWFsux~k&ZNdW5qgK4HWxI7!RnOGhnUUvUjHCKQc;{IgJ=|}g z8UU8^*7;F0R1%Z&ElpgQ%}yG0nqwFVp_fX_b(tN|_`Z%^zJiAP&nHnrnOrYd!tfbc zzXGT`QIXQjT_>iQzaf;scI@@NSv(~)U0!O13ebMQSy8t3U%H-#!FEUM!}=c>ml!;p zgF@F4nQTECmN80CdHIepwNgFq8*4k1cfacFF)4+CqjBRgen519I?^GPHdG+Rin|E4 z1s%3jV5w?uKepV&lIyY!{>JjZd*ij6RhMg>NGfT2>(}kvg~X4}IB&<SwK=c<3~?4X z3mt&GF1}$9e|KR>CWTv_eq`H=CK&yxJW_m$O*v()*^t<PwuppP4pG@8vuvAG_4S?n zFLf#F?y&PLkOGAUrNT0jrO_aeK=mg_$rdIFqW|~v*m2XZJNxg{L2Q4g_|Jj*VN<QY zKsLsakqn~yaO*ZRd7-npm1fts%%@af<8WTcIXwJ;Q7B4QZ(h4FjVrS;Uxbr#-Wl{k zVGXBLDLL)C36m0AX9rp5S^WPJ&-)LuDuie=6zzZXkz_pZOdk8c7FwYs!9t4C+<m&e zo)UIUfT)p!IX&vtMPxduU{-n0)=and2suZm#Kon+D`T*y#_jWZwoVs^a(=Zs?yCj^ z6q5MN>dP_Tw1#UpXSpKRWHl<Mw{Gz~P-19~UCr~^c(AfWP2*`wrK1AXQ~d1kU+V+p zR#^metHDC!y&%$G_gQhTVGA1$MinW*oWQ8#j|7MFnRb9|+Xp^lG+Wqz0v@6vQl+Si z85+iV3_}bZSv3ld{w1SdBd$&k53*TNLyZTblMta%cc&<fPa!o88VImL7b`-CKC}(d z+;L;{Oct6wK}T?okjBbYJnUgx0Y&lj!kW|}s2rY4jsIw~J>Qfv=B{?W6)$LMBbTB^ zwDFd=9(yPZ%qK#r?R)dx7<f*8*ueHTjF_<2wbECKbzTag^fFGF4tE@RM)TjiL^^mt z6EvNmi%th_n3AvBHmvROnEiS)2n~8nbAe=|b;+garjB9uOnwa~lhK2ULkh1Jk}rsu zYE4sq{u_EZg!9T@TQhS3nXJjxJ1w9ou~4$X1v8Pzr|S%p0gSPTkBSOwD&{zNR3O+( zadmW;oGkbOl*#vC%q$|Cni4r4Vy~<Y^kdM1pK0AH7|Tv5@__WS9pG}NeE3<$X-`8s z#4k);irTB@xtQQgfvvGAQv&Dg<=;;&{DXNXgdWJVUgoGT7W5K?t1QgBe_R+5ovg%s z+tC<L5Q^K5<NYLF<_4hNTbp<1I7K-zV-gh53|_zi!9?U{>eg98pp%O(i-S}V5yNPX z0MsxGfUK<U_po0nYQNS$(knh~#WMo_1nE|}zNI=n(RFu7x4;#Y3E4f6q9My?)j*rx zNzE>N4?5G-quep20DP^U6PE~f(V6^}6n+z+U(j$tpP^C&vCU$sL^V?N_I3F1Rv;0{ zke_Qy2@j}EJBqP;DbgAT^XIB_b|kc%n!K-VclOb<lAHfXMBKsGxM4_i+Yhu$*tsZU z=B)_=vXiigZF=jMwPJ>{)RG{39(0q2AU&;EzCnhpc9u`KWdfe?;c!$>k~ScQ&Mf8R zgQer@As`{*v%D7;79^#lFj)Eh99urqpi-ujO)2D|?c9q(RBsjc6;%3^zCLP(()a7S zXwXXnqKVaoJrKu~WIccQJkCqU!ouuS4`FsrnvAYRrpLOYu)8vjoaQND-2CX;jin0D z@2_IyQV464;?5quE5<fx4p)tVaw5+R>Rjt1BnJU*J3MsEu<mkg7KNk=9Bj6p+g>+H zR<Zn#)Q1E9x_Xfcf;8-Vk#qJQ5`arN@#`|{zY+8L@8i+R20@3X2uQfdrLJCRExecY z3cr;sTQ{3uT24?Pki@ZSnSB$WBkH$yTC;4%j;|UFr|UOn7c}s-Zq!kN1ObjMFCrmi zP#m|dYO|n%6<Z>C(dqd$A2nVVD?mE=ei2a;OJ?TlZ?_}sh7IshX{yPWGC_vG1E^ch z$dTWc{7$j``~r{bR4@*&v9HmK9=db)tKq{&%S!q$EE~9`_68|%K-%QGZ!!vl7H2hl z9V9Ihrq$}=WF-Ik6NsrKX|Y_$60Ndzy+2w$EsLeODo6Z8bckzPiok2rQ$s5I(2cJ& zNQ4VFiG4_euR*@p#V;32Af&WBSt#vDk7+R?C40dlT)i(9YMkg4H?d@_Au@ash?9sj z%HR_UAL#VV0m=qWY85x<=B)NgNzHgA($2S!<YaZNg1^60n(NA#Q^wh)x77UB+p}L) zW^N|jpjKTbhg=GMY4>h{Y*VI~-79<Gy2bb{r5R67J;LilQb0$cm{a*DPmZ@ujQfnh z>L#SWpms>n#D%P=p;3y@?!^`!zLtY$`fT*uC-PGjP+d42-AgRx(hu-zjM~R3P2)y2 zpF9^{%2Z`IZJfflcVDM&_sco&;&!;%p%mVSy8Rs>h?SouDr%?HwP!u>gS52JEH+Y- z_U}TdyEuOSfZgxE?p~Ydw=)Lvwt^B8P&p2r$Xshr(2Bx&x~#EZ3Pt6tY>&tv^5Zt= z1-fHrOXv7R$a&h+@^Nt?sJ*zMmC=UDb{RerCPyT-HU?&{?N_o&Smj%;<7a2jEiGNm z%!6%EeZHpf*%F<^n1lRz%4e(e@2QjBL0;`|6m&PAVq*`;*grXvr2OF9kAXAvhBlXk zs?>Cn6My`34Tq0%BBLX*7+r$$dQH`d869;)lQ_@~gktP<vUmvaJK|+tHmRW@`=BPV z^Sx8&Xa~6$v_;d}j}AN+EI*v6(s+fGEqx+|Nij5_4$AvCl3LreoLEGSf9NsGI!iP~ zR!1HqeeWya7<X`7Iz6zRYF@J-5ja8$k9e{)dp<noTUcTn8+$d7PeTxgk0HvPKdva3 zJar&JV~>fL?*-l>_c|og9S;#3zGY?#^6Ir<l8PLZ3$6XZQ$Hu3fwSDjEj97K2^8p- z6T_S-t%^75(yU^>8aJ1bsloA55Dr@+?*sQlH>|1^Y81$(<^K?}eg5DB`@pdx#F748 z1gPTEItD)wsXQnx>Q-fag#<pJ>L80g({4@N)!W#Xwo3fEEWM)B-A7j}y;sCgUf7mj z?K2Jie)sD?5Q{SFfexRQc;L5Pxt1$Y1fLOzN!&ceg0*ge?X6qWP>Zu)eS&3l^5C)$ zzA&mFl#@<?)e*OlLqGgQJY%LjHUX7(dwjg^SbmBA7vldg_D<22bX}l!jE-&F-EqgZ zZFFpOY;<hfR>!t&+crAJsrMWI_^-~zx!a@0PVK5S*P5AprgR#$NmakjL1~0TQ>r&f z&lgNn4{;Fbt1yhnRKvg95M&sLpj^bw&4NE+PuJY6K9q$dJ1o|0#Kpoli=g^sHGfNY zjt}f9WuDtC64GK~pf~{><71ifDsiWK{m-*yJ8dDb-&-Bz+}wB31eX%zGTU7_);6Q7 zs~6HK_&u;FC`ABD3-70rS#Q7?4ls*=POqKa`O8OIeR=5~wVUz=rwKQfDFrnwbwI>a zBNgtM7Un4uJCE17yzAsoI{za(`#}iOdf-6n4~MT$D}9BY)$VS``ECBkGgWb@z^}ca ziWB1+*t$;d_S{9^5a7W{cnFa+!DE+6a$T>-a_qf7&iJmMt}w1P-;8by*3K3i110NM z14a|Necp!l9DUuJ<C4`tm$tULS*iYNr+@*oC0Ro$S=KQipW(H^a$;_*uz?&6!%*Zb zq_kwzZ8%RhNJJHWIF~_B$#6`TBHK4DHdq9P$NPD7o2ykL&2#NV7r$wRR)Ll*F^$eL zXY<kc1NCaDkB`Q{0GU6YP1cg&+c9R-I-j5GL(@z{<I>(IGaf$Ki;J~eTeHH!Gs%oq z7rfB4{99W@R5CLeKMI^(1}$Z$zoVYIroiCN%!16iqz5BjZrNyBO|LbY8i2yW!OiuD zOgXclP_{WKf+yk3&Q4{O85;gAU6Qu)2#yOyyySn?^UDR5I70?1C;WggVJtN8QIN1y z7zV=qzX;QT|NrwvKxL?wTK<#Y2%$b-ZYQ$|!0s_yX#=i4@i3INj#lR$^Q<w1yfsk* zg4pbFq=5+F0it~{cR(zRcm&)T#-A7ojB5ZH;|Hp#yH+9UWFBmeAssl5ulaX#0@5eZ za0KDVrOkJeO`i3&|J}fXtu8hkX7v!>f<S;^Nq*!pjVy%-GK`M<_?d~<?bm9o-(*TO z69Mb70rg5NU5|5b?XoWu&iAJomfe?>CfREi3yQe>*WFvuYLxq)Y;|=c*ZUkY9$M6w z&2F_<S>3P4M@b;~(sR^hp?i$)@wyzqcOTPLo)i-v9Nods0`W5!(HCriR0d=+5{64j zEjEfu@jZo5s9=^X@RKx_`fJ@q)vYg*_o>IUr#K?t%2Q6G*u)$ZRp5{NDXa*yDtTYJ z{VGOU7*P-@gv_cBfjqhVnq#XiUo1Q1!mhk!GU2TGM7MTvspV<3uJ<?VJs1&{LwcA+ z!!uZ8jGAK0)3B-KAGIh&)mP~ugZm|yZOTuW006+WeysYd^`=?$t(+NM&hGAac3Aq0 zz#5`L2*MtlBcZ)o-$T%30yuj}rq)j(4P@T78M~=nGsCZ|OM;sGtDsG>iNRf%e@8ez z`x+@E^QBsgEI&T#`+To<kH6lpx^LWCWca{EB>lK5i*1#|^O7Rk<eVi{Pc}pv1@o-W zFi3jJ-e!WCueqGWCgHFMVvrA^EXD!ZOq=@Ni&AZo0{M?B5N8ekit1uw8?ZtI(Eka2 zf#m<P6aH@(V-}nwdh$)%3W}2OM9OAoW(3wCD1_5L6^M~py-^{+%E0MU{{OA?|J@*V zDXanPW|TEH2c}e5!fI!IxW>0x?vlsAF=w>mj1X7=d7y!N?W^UA#6$6F*S)j&-9dJJ zAidud<MY|YYjwxa|BavxL1Ynz0BVJOO>Mb>*<)rQtGVaZ>iNUU6DwLD%ld4l_3%-c zKu8N5<In_%mM?jp05N8kCtip!7Avu3_*yD*78=TvjpG&$SAWD?2&KoT71fl41XAH3 zaepdw$+*cvI1D$y>z34JR8O2&*NKclMELLAmDiqLEYIX6%2x-4H8A~y;Hq`H2eq<# z;_H(gE?*JCWZcASRR_H7ny$}dp&GwG($#UOxVqr~y(kE0L)&iaAB{E-b*ggmVd_zJ z#br6Sr<G#mqQ|b`j)t=tmd8Payi7l;|04dkA80kUCwiuGga*8(|M;5_BJ_2D(_aPp zO%-ind*e0oio=`itlJ~2Cd}j_eO~<NNzCYb{Ua|JH`;c{7I&M+(3WTJP^g%ZldO%a zoH@Ud{6ESOv++<D091l$s?9<a`|NoO0*}byJS-baiA=LDwhBb!R*f#=lh=`)VJr|D ze*c4NWScdu!khvk{GoGyJH`D)8_J4pS}rcAW{b;=QdCpA*%GH8cwI#;;IOJOQcw#G zJt+YFAyFTDx(@gMsIT&oomfTIz(jg`bD96$QGAR)Ak1&;d5xRchXsoSF#4N|kf$XG zfRzLr6*H%8r&iik-VHc{YUf&2dcF>vc6q<D#~Yd(pS<p$_cQ(ZEyZap?P!wy3X%UK z&RUET8+k?ZBE0h3D-{=6vf^z4*r0fsRRxn?joV~7o8#LEvIL7H48mrEo5M(nJU*X3 zQ49wavP`ImC+cXtMB%;L_R0l0CSA~Ev<b62wF);{LIeqkZ5AG0QvA))WH}DY)!^U{ zHy&|jO{5SOGUSO+5j@hkfL?U_)@@qa?BpbWp88fDc-+mY5%b=7ir-j_iR<FQ4Uk&$ zwXD_D*K_;QPr}z!-jZM$Zm8KZ6zyDXF266>bC*GEY%Y(C@0QQI1Hb}KXq@(2hl1e{ zct3B<k2bL~wPX3nvXc66xx7vqW3BqKtU*2JCuOz8?L_xy8$emtg`0FaoNYd-+Ax1# zB8Bje?T>A?x8`uWPYn$fzbp$8v%TDYyamEx>G63y@Y2CqTPjgos+0#+RlWIvcE0^1 zi<6ifJ(zv{x8H0-w`Z?*b`Fh)3)SArc7G)u0)MKlpfGZLz0t;I|8jTMIXLKfJOTUq zq)&>=E3VElFamRUw)QTM?($rtsh~iavR<Lx9Km7NCy^DKTu^z1?3QlC5o5E~Lc>If zWL?f#jy=gbcQZ%)Kz@?zBvLY%x7Snm^s&{zKQFbN=qTNa?mV_Is{HiT+N~D+mUE%M zV24r)wwBYN?yQEfOxStrVE`I-(__yHWpi$>{Z}vhlUCO^z^6IVHr`vzKy0`snpp9% ztFqI~Qx6u%kxPGme#QgpPq=2)jKg-r`9wiS5*9b;PFXplvWiz!*ytN);p?_*My~)+ zV|qAxcc@)oM~V#(l_OuEWHy=A?!Mln^^%pv&9QT{%ScO0WNi}#1K}{aYGMtK8GEx? zXL5Vp?dsrQSX4BKj&b>e{mAKrcvbwNSV?)k89EFO2j`U)7dNEc{jI6Gy4tu^keIsY zcL+VG)kFBKE8>Qrp+a&7gALKjTE2BgNBEhXGtW8onpeWRSVf51?f9>BLWUpgD4Y`Y zgr+~4e&aL!w0t#hnh`qhTtdf_dT(=6z`F41tX=sw3B9s?Xoa;iF3ugJmQzOf!Z$ZD zAw&C9SPLU4Xy41*&gZ=}u%F-u+lRTuYG#Coa+v{&4PTqb;(m{R^WotXJG*>;Kbr(O z9xg-R;OoW7$xMfoF&R%?ZCX~c3oF-ac9QD0%cWLoMr^H?mO+>y^XA)QV@*?ZOpM(t zVBPWogZPdTk6Rw?C&Q*@FaDmUovp@KjwBnGjLY>k^n-;|?$9eB-H+YI2d9<Vop+fK zj$b4%Aqe+LPza-NvSo^g4?iJnPfh}b%Dz{ZmkfY)F$Q<O&H*Pr%*^gd8YO1uf@j+K ztW?(J;zF!AaTv|Q(XFmDmn9`@u9;2x3XJzlPPylHNtCi>bD&IECEx<O2YY|jIygAo zOoEAk8DAl;f<0#YK4o&dGv4a{5|s?Hr@{?{avdt$dA9EIquQx|HlTuvQJh!1Cpf|5 zWSA+45TC@?5pN#~8qmCKsOz#~(7ngLh0o-gx(st#h~CTBD65=O%qqHq6V<4!&s|aS z^76_rD9FmnGI7ER%`~X})T=*QNTQp?!GT8<Z$XL>Lz^*YhU(wDZv_J_DR0Ju4PnWf zeSd#1hJtEabdqy-CqzWFyT2EvXZR?3{geR@dFwOgiXSypa%3p8Zo<XPxZWd8+BiG> z+xo&tyEru!J!!gcFQvQ`LJh<GGKBBpV7@uw45<%iuaarXBpWCRm5#;AU677(!-<!~ z`|oI>l0p;czxbgMSyXV?JYctToadSCgiC1EXLd7d-f%B_`V#|xY&S7*!O;q&^M^-} z*|*M)4j`&x;>{Gg;Ql#Gl+bJ~2~acbTk_7%?wy@WtSs_+=J30`UOZQ79De@1rN;z~ zaISCg%1JdBCBHLP*aq<Y1QLbqOG<Qp=_oKHN|wYne~MVwy57CCwbu_0j5W96=Eh>v zxs744{fEKjCwM`1uxyYgNn{+Wb9qJZ==)fk6Em=4)ln7ihVG&+6}7AQCf^p#39&IE z?`?`I4OX`see(eDy<@<)-inmvG%~Zu$jJ0A_yF|5LFtc=FRw=#$Ux1)inq<CQ>-n7 zAG+F}ufCgw-8CBXG>P_rDCSEll9O%G!xJZ}M36!f@|hB;m>B3M_`Si-6sY2gWz$)W zZhx(~e6v7QvJZLsbrprpn$J_P;Z@|`ECcJQ$POWgu>9%aX~@;)>vYkgp=zeuJgj87 zu3~EbVP0e>-R^bSC+Of6{o=KKLog^@wb|mbIp!>p0rfI^Z!{b{k)=JgpY?;|SZXbz zjzr+{QgzX@i^#f3{}<^^H2C78owlar6QdM#X)ssZsI@=w)@&^&k5^a8aZsNSJk)P4 zPPdDdS_y4vMIEgJL}4=Fx7P<qcg`SA#m!P#{TXJRtI?aPz`0%fBeRcn`(P3cfxT^D ztZR?W_a8sPys%a$@{*BpP%!Z~T<?snNN=;Ms$?VHjM<}6{E^R3Rvz4Kg5?nx&t`gd z112YX!RF4B>3buIu8+=eaWH}k9gsyug<MBa?BR9c;eNs42M{#87q0rjTEKFBav6+v zC)gR7&a5`xSEyIVHkHcunQB{F6eXqbH#I%xjdi5LSWx1@BlO;x$srO(TrQSO11$E~ zCYXE;i9N)E-vyiS8w*@zl2-O$B5meK3rli~(N{!KgTJn~yOD+|#}jG-p*<&Z__M{N z|5^_Hp~j7Pc<A|czXwSe19TAhGi{QP4!DGHUthuFVjFjjZ5YRe(ZdHwz@>OHYMRvn zM=l^RkV+=iui>XnfN%okB=>L1mA+p>ES}*)$fN*`*hMQnEKE{FL<FeZk7b9>M-Dwk z1ekQ_tke>|0elZZQvQN|pin`uFfb>})kI!N)K<3E+lbzIs15@Q4fqlNZf<rQTP4=P z6k!H_hky!$HF#KPUaO8>E!&`Vf^=5$YU;K*`S;ftOFP{DQLVr{Jr&e170G00ZqrfN z+26l^fB9W#<4+ueeRVU^Plf@B@i=~IVum1sdBU(Htrh>L0i!C@=Kd(@-p#WDOjS5B zl!S|GnUplP2@H7BT|^{nZUJVpQ9}Vpkv41yY!Fv$LPDT=3VU8!aA0pD5c;nY0VGl! z63fEE=j4RQ+P6?4;$Uv{8%T1aRm7Ztk$`v(3IiKxZmzL-M@Ds`2vOi0D}U}^up=u; z;e`|7er)6ghl|b8tsE75A@{*>;v-JQ&?=XzoHb_xRf&F~lPrAO*z69%<>nIvb&wZ8 z04|HytLa2L&W}!Df5t%fp`-LL0ZiyX%-zd<;i}a6+~9!SqTkdmm6_sssmiXXD4^Ve zI+h)nOYRC05F#o0bhRnGh8!xS5X0Sp?rgEO;O;)_uI1ezlak8S^@{UOQ*O4fT&B+( z&vT{+sVLJ0|C(P_g|L~|0JGlx<y)avG;{i~u=s?FS6zW}utrT;e7;=0TcfBYX>j}U znZpk-rCas8ef}pcABPaZFQ`l0?ucLV4qd0#C2BF{+&q`Du52;Wd*ilz{GkohZwi>3 z{92pJo%BVKB9x+{Vm~=Yyza`>CY1EId1HuN)m3F}4fw(}phM6gAsw5(k>a>YNkLIj ze8_9Ry}vy{y}oL$u1aV_2xeQlKJT4JWD|IxPKL@3>CWFS$91a4Cdc2~$@K+5+$Sye z2F^W|aC33#wK@)NZxdO}C&q+EV08{fU&`dM@<p{nAvTN1%iF36lAD@Zo^8LpxK>pP zV0`^a)7%~qp~u9-#XZ~K4{WeNCNFae;jX@hzeB29GciFn@N3|WO(u2vqrzeNw2^~G znL+=(x7;8EiKxqAe~8U$iP$`Qu9kz?K+^sO91l+)J5u{4EjitTl;1ZpS#2_Y65Q&% zCo(dd*HcVPtgW?obbpPp<$QNJFc`9NeMN4m>-#E&rd@lsCI6xpH$wqK#&7qd2bunE z1QR1IUe@iJU}Sp;i@-S<#tef}M;i^wv^YyHA(UWcgw>xH&gV;@B{15u8KYU3>sZjx z-F5Z%DvEKZQ9zX-qLn#3MS|7kyWtGIYBVi%i%7xfP{SJQcDYA22IUNOA|;ejR6m27 z>OWG{A~RjIiKW?}wx(*XUwTIS*Z9%u&9;$uj;%Q0imdkarjts}N^I#2_cd4Mr0Md< z$2Md0n##Vv>BtflAJkE(0)?H3EhiUATR-skVKNiU8AMJhl-`PPb6AGvd~mJ@>5fc* zqL_B|mm)JBQ*;8ly~5x2L!40{2xmKMkncnZKG^u|BinKMgldS41EmJ^dRhyOQ3-vc zx(OAH5)m75I#1@E#!ORCpWL2`O}nr!?hbx!As)gZ6YA+$derzlZr|ZomSl=;R=z9f z>H?`{0ignE$bdr%iuJ|wm#0m$+Q*sGGM&FHgx!%+momf)JhTr#Naewi+bS4aTbmmj zoqY&Y)JKkyMy8RL7a>o%>6iGpc!S2-26s)%N+XGvKW)F%6ztWct#mC;jW8=hr`3B6 z_RbohsD8Ibgh!~Cl{tSbmIs#}N|CKtH)m!d-B}u6t=O0TImg62NKM`9^yGKH6X6>Y zKu6G-D#5?UIC5-B$Q8<E7mCUnn8HpnblQT6dMh&WSlXahaA56H;RPwZFva=c)AbZ} zUa;7CKdbs{F*!%ut_=0AGnr+wJl1feG88qDo+bJbMLU-88Jqo+Z2o42X(|k(pO#0X zv|X^7q&^}r!e4%IyTT5gUMvjs+2F?Err7PD!x^L}oVmXvZ7WCEEN#J`7g(T)kvuWQ zj3ur9kQo$NnmAP=&+E|f<L>@?#{3z#pPdpDGeB#<|BJLH<a-*2lvLBgO?pr7g0>Ny zifZSW@zncb%9plYS3~)ttC!*K3GV8aX{{I*rrtZ-jwN|UXF;VkM~k|*+$(k<DE=9& z?4<UdcnB6q)XfXgPyC%2SGtMN6%c}~1Vcj!ZBRjY{O}khhgkPrb%@?@koRvlp|8GY z;C3Wy(_Z8BzM9$XT<Q(bvH}qshQc6rDQrw|E&bsu;raWb=`5^ak0Pez^E(EI^5FNp z%Dy>WC&o#Hw5=76R%X58YzGy79D_J}E8DA3zBmRWzgXRv$x<^_5Wg4S6?dv)8^SC6 zD|Dk1fnWlxxgLUSK5vh?LP?4B{FB1ZXV9f3N9(cr{$1NSbMO0m|CrhyRoCC1gQg*B zD)jV>m|0>X1<eb`IhH?yg<z@aA+Els_pi#AFe$0p#0+;E)(2L2ZCSCu5l!ZRhkk?( zys+7l{D~2&`g<KkV_!6+VU3#NDJUI5I_oDbsOm|R3xtApZplXkG3jR)c#_jz_J@%; zVSlYdh^vqlUrVPPM?RX9t{s$1PKD!#Lqp1zFQE=b2oXp@5?1t9z?g%|`wcBE5w`rn zn56a9L!`AIGz))$@3Q<lTTVFmYy3*a<!sQHjU$h<6aDW<=b8W^S_P|FdMX(t#niqB zL}TlqWIyHZp8Y6oiy7l`R<k03{rlv~Dt1L4vS7z|Y#B=UxfS?{%BoxJiMV$!cc>%E zyxBZ1uKVx^?@$rPq>@un@@Ue84~eKjaq`^RjaMj?zzP9`YeiAWn`&_!_%?x?bzg@3 zEeNnul-I9j_ng7Ivg*bJg`8&YCw+=LJE(mJ(Lo>?5uYlDqWtd)*^5;g-&V)a(C^nD z&&D#35lBeL8G<HRdxAFSP`7Xa0oP6&k0NzxNP2&JG)@+Uva!_IUdbZ^w%YPQRkjj~ z{9ArDQ^!Gw7MvkrC<W9~HC+AD&mbkdyyPEz{hTe1XewxeCW;zt5FpS)ZW9tjaZ{r^ zJF+)g^$ibC=LG}e-T_=1QjE!o{B+PsYeQMTjvgk)+80V?z_1Wy#?s>`ESp4;T`)7I zkCBM@fCBnNa3tuEh}+w{oRYoV;Gvg0$KqTif?+l`V0In+*tGnPqXqT^470m`Iqj$V z)4hter@Q1R10|Z*wLs(DmTy%G8g-)o%S+#ojDjpg(jd#1d)>U2ma9hPmb<$JPxenl ztkQB1srRz7;)+tgLnn6toqAqaOj(N~r}z-9j1cHBu&Y*H);Xt`SgT!v1J8<kd2tch zK!R-C)7kZ=H7-H7LDF%KwJPVT@HCl|-i@mvl5xOjyw8a6c?E){@e*t&%o`Fp{m~(H z02fsHpa>eFp~lvr@7=(qfje5hmKyQT3nBm`Pf~wG#`G7BMu1@bE15*(tBo^hoVk$^ z*?fBgZnp2M2t^!zw^vw_gZ@UF-RF=Z_5NoCi#tkKGoDR7<fnCW+w0Y<mcsRdTdnJn zdI(3X2=0n`QT-NSp|h)8z5*p%wFi|$$^r~jLBs_&YZm07EgEO7`+8BGchQY_UR*26 zP3Y8eCQZ|~S<6|d-5+j}<MC2@Nq*@?ACjJ0zNb%JyUC73)jl17`(1Xt5l)jozo?>0 z@XM&1lZ)M(U4*^n*=w0e|5vIEGt}?RF<|1c0MV^mOt(*`(`o#|?_g@U#cDjC!gqkq z)aQ16d$zf-u5S}lDQklUI4rXXUtITA8wZ?q46B!U8R+}F7}4}VWBH$3=|QlN{-k;h zU!tD@X)I=>Q7&s6_!bdsq<ku8!(X%~U9hm;Xs7}vw^1tn{c;l0_xJaBKOGCv@BdI^ z@o#s<RP9}Nf9V;t<p${Hu?P)68hq5^kkk!bl@gqpn;18$7gzgbIC;_sN#KNKp+d?C zvPVu*qs*I4LyZ^9X29Ta<UhY_uC2WpR^STplv|$VB*q6sN8;!H^%)*3FZ%iGdwC8& zcaz=MPA@pk3bdk@rK?y5pLbhIb&3`Aa)35u+-%&02xVzjDQ9^qBirHy?6Gq^9VMJh z4=OjwW6`Yi@O?DubOpr-W+9?1+cJmm{ZW(?gS8a^rYg=UDT&G1ZVd>SsjK6pRK|$7 z{9E3(I5N^Yh3yh51G?x`(=t40;r;$RH#L<vo01!aT#&c>awPlZ4=yYuRA@yaa$0(c zsII5eYIDI3#O2z^d~wnM5Sc0Abmg;RFWs?2L~BDAEB3fHA7{2ReHe8Z4!#k9pY#k} z+0Vj>z*aoYkH-JWY_&wMnYvuO!e_k_e!kpqZPTgZ8^)H}^XqbIH1Gb!9bXPMhe)8H z7o_BFx3lvj=jTtk+FDIUMi0&(lq^_tRV|$F{UHDk2N9oB0rN;OF+#sf0LzHU7O#2o zRG(^6uaS<_SejYmz#RL4>P&Y*5R}5!G7|tM1ddK#W(@00zT3YGPiON&g89o#T9IXD z@%#RZ!n3=$ICF7mAc;$s(Bk%Qh!yqlc+vSQ==8uqSK&VyDo1RLo#D;Gz65k4rzDaq z-xEs>FkRVurQB+DX*qk7KsX4PbRIZM-d&H%wh5!AC$dl;&nL(SLLqnzds7kJYw-^b zCLj@LRhCeNTzw)ttXdmC)HFC<JY5(4{Tr2&<~IzDjv-1(6@$kSjfF-=bWc3iC-3TZ zvPVJ~c<hGxNU5$+`J{!#LoK0|Y1~+n-37izv*vKW-xciJSYN;1?c04#rvIY76297G zPoi<{*DHmd)cp9kGBQ#zIQaQbR3Pg6_f%Xow2b7V(^Ge1&KBhoxw~d$U@tm_$Y=BR zmQ#zM|Bw(a<toGM{)<RIDu495+7V5T0{s|c-n;=8jS|1b3j``99>wmL5yH)L@pK?@ zNJ;sb|AtN;_q(4^77C0U1$p9k?AO;<<=202Ugwx|P(tWgIaf2)A={1Je@V>06-qk2 zw83tpGPj$0xVZttdCcY>B}*?Q))(0AT^w4`aDcvp*r8`JVq+{U?)p^#t<(k3(n1h7 zBN`-;5BEyAGub?rGH-v!CsS$K*xhmxhFXt2rvg3vBLLZn)J7u1=yRz`TP}MeDWP6P zkL6x)fTF$hWZL`fXgVhb(5xnhDSuhdo2s;l8n&FmXav=p;#f%HW21g0eiw_x_HQ7t zLE+`?Eb9+p>UK22jVdPb3GoT7lvGgOhl4<)k`n=(HPrhGZk;AZCZ_AyeUjnd(RZ15 zuygpRA80^)&k&iWkkjYI(FI^wnN9cE*l_oL7JU;tZnpb)e`iHEr8Ep>R%*}mv>)!x z>k@wZcP-9J(bnxOK0qm<yOOaQR2BsEeG9L}vQJ*l%v`QFyK2_vgQvZ3Z4p}hCSHUu zD;3za|2}|Q7_=~dv44I(zJDi|!^bP?`%N;#7}?x_b5Y?lSx_WVj`qXpOWDnh^MW&+ zbG%}u&6&<+64!|IwkA&TKEy}ZSaA6Ly)ZvNJ{}cl<)Y?A=z>gBfs~j?V>uRFh6ca{ zYgcOv+of#<P7ango08u4ie8NR;b;mf@lmfk|3JxlZrpe*OyMkW=qf<M!qBLu+}=4k zn5t8n9?elL!kbnUAJ$;#`Evfmm9r|8!l0LXIyD3q7)eTnJN*W5l<6+kfIEg+q^ztA zXcQq~;cl;&_=JRhQ+2s2MxH+<yQ=sqrM4>jK|?n4`eH3&u`&{jPdbH3hF3cqe?tF^ zr!c*}y-Cx_hdRL`B4QT#Q#Wn4H~^kB5I{LTJalN)$>W-#Mn?$wO_}gkQPI2_U6wvO z+t126rL7@B#m%!t$@`)0^4RJ5<mGKR02}IrJZ%SH8W^hbmwdFT)(4(NDzemU*#FY- z22V{Hu76Mj!LGQ)xD%Oq9n^4^$mbApyI7C2{274`p;fEYP_*i9%_E`a*0WgtJLw|H zo0g*w3`k29Q~rYVH&Bv+50mM#-vx_oM~Gvbn>BkscDq^s;Gh1Avl$`KcS@AX9uu7# z858JnK--g9PL+BrPwEUOAVQUADqzxSxlui(v%rH9j7*%E0Ej8dEZ=9ORsRLqXlDvL z3EKVz338N_;54-6QF))r(buSSc6-09)`tY^oh=YwRb_G@MlK_3+$+D)HIk4RG2fg` z_ep1t@=kByp?Q;O8rQ`t&k&L+NZ_W&8We=3ik6U*L(D{dzF4gXrZV!t$}g78ZCGqP z>ab$UvJ&5oxeW;A6U+LI4yvH57<)|_e8<+((qb{4z-F^bTvw!#xrb8}z*MchdfJ{{ zZ~ppQ-7TA}o8LA(EY6Z93ss+tr^fGNettGrp?5tvFz|o~508Yz#Kc6ke;ce~iG+aQ z$*zqS0jYXSk4TjxG&=BW9x_0PkDr+)Y<U0l>`X58`|fm45AsS3JgHIPh6hVsI4~Sc zhBX!D&ZXm^^or!e$5m~;YUJqP#Aj9)t)28Uo7v1<&eE7ROAgBxc+jm5cQnle;_%U6 z{!fr`ecz9u3~sFV*KLbsIm~+_zi%h0*V~ecimOvop&Zjq)6-0cw~k-uXL}bH?+2r3 zA`AfnxFVF6INFdB5Rj0UI8D$&qG?rZEa^0peOa^CWCipEDN9U~J{&BttZ~1lCPV&E zb~d@ms^-;c(2KzPQIpk|3#k5+`p4s&9omckgFRcMK=KyzYi;!(6T@P3*vt5W6RuE} zF4~P-3KG$prq)rPZ4NSpU{laAfvVp?3=w}Zv<$#k;lqqsbevQAr=GOJedayee(IVa zK^(wkzOwt>j{iEvgGraDwVbPh-MjXII!*8HZfLwe1gT&1h$J3G2eQ1pze!%82T+sL z5CM2exVibvx=KVY+cWkzo9)43V#LRuTU(EpYm?#OQqGRdq$6w>zn0(MpKx$e7<B`( z@=2urWUeUzG3cwUPP#Q235jR3r~d*>qa!20%(Jqqm}sCf9J?mBmk26QEbrFM%fg}T zgqAe!<mhP0*W(LWE!5m>rN0J%97f@@-5Cvu12#%JuL+;)5BonqmW>4daikM5oO=qc zfti|`PUrAr+4wx)7@oHN226DsU~U`(14dWEkP2;q;|`$)xI0LrUlu&2vK#CSVvrDU z_BLyi=zg-To$Ysdga2$t#8cDKc^?=Wl2#oO6@xcLPH;cIKmK>V98wJ&aZf?wIjA&s zICggS_3~ILTL6<J^^y&Sy2ZD}B-TxQhE|27Vf8Ap%5;}=$3OWzKy7rf(aLh8mFvV3 zA|TSDN>a4}<U{Vh!9_$wcs@Uih>K~Vh52Try(koIKwpCSf4}U9&K9sg97|fae+L)& zX`u?9*OwjQ&!+GRs90gK;8=uFE;J{Zlys?VBX%i!otvu@?nIDAgWiA?QKlkOItWs6 zz)Iy4Q)f2?afW|-Lh^oHNR!H1sjC5j#h$pPUjob@(zq7KL#d(j<+*w+FhM`HL&PAE zL;Xsy!tG8^SFgoeKuuy{Vxm$*fZKs*BFWX4n0D@h*&{hr4p%mCSU}Q1(qqCMusG}u zMB#B*zQgt(2y4OaXn&Bis-*gS0`uzkhwV066xGy<g@_}+f4>pSdo3?pe9OOOO?qvq zy!Z!f%5QLVE7suPfi%j+I-4DuT}Q&i%!L?j{pn8SdndC6Y_4FU-9E1#7b&$~=)Rm* zEert9Vogh4etL6S*AqYTC#(hCvx=e>6}2GW=N*N~kqjZOE}tu7k`x;U2lN^C$rT^0 zm~l{prB*9<B^DW30f3Q>UgP`*^o=lo8k<{imJvn%2K84Vr5ChK<-rLNd)l>s?IrvX z%Py?#6e2VO)&N3b&*9{oa0}H5YEx}AeN<=GI-R~`m<|Qo6fLyIxKZxV0ESNc>+2J! z?waiAgvRIkBj_Q*4?$|RcBPIVB?bopri?IO-#--~%b4TIesnR4M3us;1;xIJu(55{ zxtw?MP=B`Eo7<0F@?#C%2EX`{k5OV>P=W0xOdzi^cb;XdqxFZ$7$whEsg=5iS~5^9 z6<r{PV$5p*4kj4T^!6s#gRH@$rsNZEkJi#Q`ZuAMlnaz|WTH-Hhs?<F*Al<JejlyF zqU%TMhoTc$lEgpue@(@jfop{flS|_Z5q=aW<tJk=fda&HL7EycOAu^qHSCW!sd!i+ z<>kyndTkFL$5R=~CFL1uNrlA$Sxv$rXDjRNvRUQ%71EVlL|}?~Yk#@PcO`lVhA;-$ zoWSg30h$3_yZY3fhvUhpmiQ`<%g+*gx8YDCl+}lebN%XTuTB<5{^(J|rO9xyVvO%_ ze=K%5FP$#nRT08CNpA{z0=dqA;weTwsQ&Avtda5{LII0|aM8rkSS|<KlOP8uAvK|o z-yMJN+igvRNAjE=4vvhXTrM{?PR7IxD^o9lLtCb%l>wybr;|KeODR-eMmQLe>;_%e zQZY5UztoH-N$lR1-XI)M$%FzYN4)9ouo2_5rWoM--#ScH)Kn})X;vWKn0#9^g{Q-q zLci1=szzmaWO?*UzL<O9p0%9gx$KK9McA0LE35O7*sXMnq!iecIndH*%Lj$7;mV{1 zf01gOb8)iz;FhAeq_QKh*{t=DiCYqYsY=$6Z+3r?k&^N=G6IMeBD-z1#KZ-z$%S#c zOOrzlJ?5xlQ)7{(xw)De;xct#PXsO}5NG9F7KLkwDQx<=7dK=HaNs@6bAQFEWkS)q zIJT1^vzCGdK$JQ?0>F|g>t3W7Y6LHvUxL3>T+nYS*`DTCA67b6Y8Gmwd?(COYNYn= z_W^hcFy=>Z#=L=2Qu!pzAG{c~Y{+sbs>2uZ7`qe~TLHnZ0`t)nESvCxT=fHUi3iQY zAx$Ye2WiQiUTqKm&(^rb1a=MUvDcNa;7zw)d-BIES<EEVX=Q2YfajA&P!NvYc3n96 z%ir>|^T4yR<VLo`WfIcdy$ZxfZ7n4y=P(u8n{(27iWa!S#Tl1PLxbg>AL>K)FFJ(? z7Bp<$;1aH^7ciIryiREz2X5XVOJDDWTf2uIWQwzzNB-eP5RB7$XB^<b^n#s@5hKWf zTh$QZLrSC6hYlL~i*!!T)`7b@>=gQkEESuBKf$wG5iaJP*gxaL<B~b9tAJrt3X*_S z3YzG)=wnn%70e_KMx+#%1UCLnNZ7cdz7v)+8s<`!4W1V&?_$=;OEJN~ny;@LtE>Bl zh8DD__V~5l4%bq=#DTbDwIb%~N>gS)?6TX4*Uo*TSG~EpN$pag-WeW#sVX=iK#z<J zaXN)k@f9)rmHAz%sot$C=RVEMj4Hc!|K)OXD@$1=kr2fnx7wTwmuYI^AUQdimD=G4 z`8UYJis(*W%OmD4{Y(hR?>WQ5ms%#WvL*-*S90Koj8gg!)PMdiC~a`!&lrRFOYGdb zpFBsTGr6UZ+0h2EvInq5#~~gi`F=12&G@4QIT*T=V2%cv1Qo5!KD;UP(Fo3mLHsfm zq-6KSDS?+ArI|GRy}D9&g2^^8n>Z9@Pn$ND`#o|oQW41FE~?LBeOkn($EUZ&b3HaT zFe+nB?iU`bRFgAG$cZ&Gf2b0TQL!5I24;r_2L(Mh1-U@0xwuHGsaf~{P1#OZjV9v} z5wq>z5_<<NEX=tq?XikV;C%bF=qQ|>*^G=3q@``Nwfml2;bpuZl+N)Q&GSr*$ePRw zX3#khXM4d2)K>5xk9H=ZJqUZ+@rj*lmIy7;_jE^?YQAG`$kIx9V1M0c_i|L0WlfGn zkA(|WopsE0gg>&DuvXJoZy8$45dS5|Kfbzwfnitua{r-NiDF%D8ooBxwAQ3i&>EMW z3@_XcJI27uy2n+kAxbvu@1I7*?>IJAm!B`?=tz6V#!K+_U6Z`6xL9^NTSixxHF~XB ztEtH&IvOg<Rm|<BxWyq9`#VC{p)Xt{;vY_ky8JngvQmstT;HhnFj-5>L5iRVII{XN zM*xD802j}1<|~F0@r#X*iI4s#eHAr=i48#@CYyZcL`S4*R1&q+pKCkeSxzY=Pn$Qf zY8_jc^dpR{q%-g!bDv*(%fm7Cq-6DczR?KZ#v)>X4O7Wg;{0^gCYup&!76KIH9nP< zHz=ua!>O}n`;yp0bCSij6$C=eaM$I-Ku5n&-)KTzk(wv?!NCY~|FyM1t-SwxKLIY` zx0K_z@oz-NyaN8=#m03a_{BeDaM2En!qQ=r3!rGB*tOUhBDHcKODnw~Bj6rPCD*4A z5!j}Kl~|6BCLdg{6_k89eLp_~Ad9*m-xe+AM79S-hqtyGWby713D6JT<btC6N3Rk} zHZzCz?@hPTTf2{aI>tdkd==HJl>l0={Ir-R-cklGLKZ#OqE#=wnwn^Lc?ZOUErtmd zF0AagEI038J{E`iRtBu6=}lTq1Pom16&W0hHfQ<Q`J&5~k!Hj>3LR`XtS|_qL=00S z5}t4D3_SRq9Bu4AUW%6GJ0z$<0bq5j17W6mdZn5)WgZkFdHcu?9FD$e?|0_UilM?F zu>(5>E|Os;DU8p_dHpkjf$fG_uM!0pkyFvplVPI0I0<OKpT;+}YnxYeT#8l|-sbv8 zz=KS<>s_j3wS)oWiVQFB`PJsE-w@qLDeKE%gdGV9tb8`a%j-AX#1n*=;RXxF0&y!X z&0PiCeZ>b(_zZM09a;MQ#467wTg`P7w-j)YY&U$l1OBgEl;J$#+rLGGH5b-KYsJCt zHH;F+TRFn+txVS2JrUq^A6HEosvP3H!++IuJ7qd|$Uhf<*e-rUFfXj`=4Xfe(CvnV z?&kJfnx3q>czcOFSzCMberw9)T~}CYyP@{LCuNAz4yFjPdA0)|AW^U<0tcJ1Ne~P? zxNaw{gqw@RWD(&D|DeVUGEuOe8KEP)m%guJt*WUPIjuNBvfwHVbcbHhQBn@LuTu;D z{F|)XmYcU-OJr6z0e~?F|LU4`cCuAfB?t-2t~Xe)*k$YH@Xh%uqFYqUgXzh52x<w_ z?j}C#JhpN^lWrY?_+_NL(RDE+^Zh6b5RkOUH?8Zj0>#~a8`kS}LQnWf@e^8~K<Czc zFjiU^VqW(_SAiRqEissDOo>H{xuLS^YbD|{9K%;^!6mZ8k>aGfn-LK|^hyiJk9xnk zc$=AZSfL~A)%2bEmx$})VBF9cc)UMECllN<LWAHJcKLiTkc({g^>x|l15=GLsVSpW zqLy5=BA|Lj6630s_4K1Vc+MZ`9|&<XIJa!P_(Oa?F5Y%k$`XZa#E((PX8eZW;^PVF z^}I#~gKj=D#S5-B6xo>j+I#c`@YS$SSsmq1vTF`%7)#pi)$RZHn><=w_?wSw%}Ccm zg#=>~Oe{>S7Y|!uvM=dR&R^pna90c`zInc$_m9&F*)a|{_0`9GCskxJlLN**r}O3` z(P6E;o{ykZRLntpTrSorQFuiMzg5bpg>XAkANm}dDb}je&eH~^BmVobuy9Ui+M`Ds zD?7V&z0RAzqK_Kp8rGLh7zityrIn?sG3v9+^Rt{;Qu<pyFYoO4yL-D}YfViBKtNYw zq0#Cq8V{?^CS$$D!8?YKB3|Md6RLVf{`U9Yzvgo@bQ9_-)iJ%)DxpAWAMl_a(^}if z(i0=n6Gj-Hkih8vpk6Fsb*=|DGkonn2a&MI=E#mbrZzX6Sq}33gugx!f${`@|LJBs zePPO{mCp90YNqIaJ#hCC58d;f(H=qML8Z1z2>666<Ct4C;4jU~Q-3>JuseCxS$_1k zW4g~zmangu+0Bl$Ke+Oxc)Rdy8<v}T_}sWNDKm9QCt$jCdKT=?&EyIGKI(Y9&%i|S zUp6a24oQNPhu=c4v$*XX?416`zWn`*>zHl}1C&^dirbl1M()b_#-JV+4Opt|){}OT zsmOyHPO|FA%-^1JzXbPGb1IO-!GyuU^6fTYwmM#N>+ctC>~(z3z#XXj^4TM1a_dE@ zNSORvf;meTGj+GxZy3M%i4E=B&*X(@>s@skg#b#xEu{dNntW`q7fX@4iE}RhvbM>0 z<<r4xfT1HI9uol2B_18>60jWk6%<^jFvT;0?A2&#!qtV3MLaZ}T_SFFQaMeFJcWsS z5cRfGgW!tW>TG0RA7^Hw<A!IMK@gV({n;C%az%q4D<au7+a_2+Ybw8f0T{~DQU(dk z{<BsMn*%e|DbpYA###G3qghy@5qdua@Rvk_iu<(2#%M-sS4?)lhPJ;NyK!YNR|m|d zJd|Eplt3(lw*2&Qxf(cmH(N}`VS9U(=7x2pu**<B^lmBY8H5*cWS#r%MBbD~8Ml_; zDC!kYhY4zG-cS5PJJ;u+B^eP*Jdj_!_}=A9voLil3>-jlHUF6}o>5ikBDNuiVq^{L z$$7wb%KO9bCMIt^{`3BQ024KekB@AyUQe}!A<4v8%M*iHGN6ieuExbF<CA>i%j6T1 z(&;u0F>r8#1{-z50#$XO(Zsy}w5*IqOA#Tpk8#MN+!dR6vbQc*Tg(?Df|(8Gpn+7u zRV4(Dd&_l%amOIyTtJIkqG)bM+3m3Kd!UsQq&y_xX0646h)GXHO+DxCC<>@O)4Y=! zS(VPrXc)Jqx<Y8IuUZ*k3y9HZzEgR!C}{8qd8j{ZUp{3f>mEFO8@8($eB&VL^3grD z19MnG?nMizjWY|I=E^+TaheGO(5ugX`n{3lE!Da!)WM0>S{)p)py6|wu_;<xS@^u? zY~~=Y!$D$|kVCqQsx-AP3T?OVx?71Ha=g5mabX6+=_&>%!h74fa%YtK`<W1M;@=J< zG}oH|wIdi7>M9z39&wI!4&&agadi#Ax@Fl}2in7Ph!OEZ%GxZ3I^bFRb{)8~Pq5z^ zQd`nP9UThqM_9n8c6138=y9&MbFP-EsChe2V@Z_tI+d3EDxP+kuATI@Zh1`1Oc?YT z(%BGXCGRAa@bZ&8xihAZw1d=iI61rxxfT=4e+ZIYn-fwc6*LPXU6&7D**o0&=jWTU zu92#$zI{EN-A#?*4jNd~(;MHv{D6X*Iz3fRosbO*+MALK?H3axQOuTg3l?*fa?C{f znd9w>iC~QSa(Iw33BLn}N36$#NM$gS8*pIEhL%9HyIVf@u%z8v_D_8tyQ-J&$Q$or zl4k^8mL`I>pgCWguMvGh`8{{#F33dZp0h$-?bc=wg9I^T_LTZ8{P}$<EzQt_Kl>V* zy}dJj?&Qli`&Lh%Xw&x9$HuT0n6r$<(57~$KWct3a!xjHD`$1JoGC+IGATW8c(S95 z8!HbfDd}lr&1qs{M8wx{vH*MS*u(UV5vvqQovB4h!0x5KncNcY+jPO4E`_V_-^1VI znIAuCeW^vN|FO_7xl!KZM;wY4z{+z_B~)mOco8EG+Sa`pv*LTWo4;P30_}ilDyFmX zq#Y4pcSj#D_g__7MYg8wH1zO%1WD`xOo)o$wPzxrg1;5s<ZVXLgPD3ma!UQF9X+bh z@URB*03_@W1cWP}E4#TZ<Yi=W&KOQ^5IIp$T=C~xqh%^NR_iUVyYZA3eF|t097qRh z#p;qSIVLHN6+`>0%~tW-7^S1)9bJ^z|8z4oT#||^6`wDnCX7I!Aih+3S2&+9WKOGp znpSFgttOeBAt9hSan$rwoJ<B_Sefa#(%;XUnLzwJ{5c22Z{vRf`T4ZLw8$v<rC*r9 zKYC5)-$RjgeSL)OE@jx*JGv1%io4iqnRVoX9oo0roFc;`zh*M4_BP@Dzn`h@S3-Zt zB63Wnmpi{b56S1bem#1UA6+89m&*Wmmj(9nkcXJ0d)SrQ=EO@HU^^Mh_xXNxa(inH z&eSYs{&ZUgJG)%$^y5HcEI^?%n>NjY-qVd%3H5w>U;Cu^bDj4*{5*)d#Wg^Zt@J53 zyH=S53?{et?yKz@zF~wONgbwB&tDfb%ac#OpqUuuY_@=6_pu&4Ib@&mFl~BHCP#>_ z#*K)|RcLU%Hb2~>8Lg5w!mo3Ou#uhY0~>r+Lg?Js`m=8rO+@6B+0)yOP0Sq$^M~f7 zREk)`<toyZ0X07_FD@e^!WAQGf8!`^@MU$y&7J0aCP0vmv7^74d_#BTEF<puej`~t zB}&JaS1uk>!U+HF1tKvBwfzkH>S%kOiF$lS%dV+5BDK2=#F5;$g6VuuZ@-oMUF<!` zl_5S?h%C~HWKUOg9|n#q#9M|o7XR&Y;+3W#Is7f+=PAbL%~(N%XHbc8(EyP)pJkuc zXx4!e?!Ln8gw?&%AlX}H{6OghG-8|Xf6EaZFAY7z&^av80SEez?EObsO^JHUN=u{7 zrgR4uU!vTJoukJ`V)?xO2H*L?V!cTWN<0nt9<uMN47amM!TTKg*Uj#Fo7s*oVl3$4 zuKWuR<Kj|KA;nioV<Jn*vMeLbSoIYNnzlL`w>oUfpLVp0VK_dnzYrg?^yy8p6Id0< zAxegc_jw;oZy0rXzBHu?bHmG_PQ^;?TW(ljXH@hjIs*yki@aloDQ^t8b&paF<kEe* zH~)-?0_;?u%z=eHxl@dg?}`<m0PfT)+Km(@a&*i2X%{SS=|gz!=-06C_0q#cqh<@| zKrQX2GZj?TW&THk^fY7jXVa-*5zRJty>42b<?hPfeT6tRA`7a~lx-@z<0wf-L=tkM zOF&GtthFw_mP-*W%{Ff%#)m9CJ$_dQoZx)754^B)TTB|$)h}Yiq9DG0#>SKRW9!<l zXY>*OyJie5lmhCl5=-XGy+{6#sZGVx_1;{x3@Oc^F3&&+<*S_aFs<0Xmv2%X0{A*x zY}ePqF|;4KdylmUI*6XVwFVcA72mIc{d`NLr@_^TYV`v-WG=tEKRB@Z73dY;*M*67 z*@z_fp@}FgmQ)Fb+Zd1Eg?kLkj7I$Eb8V*;Q#YIl6@?a&GfPSNHiT1-yEwVj^50`- z2=ar)3GAT#s>@liY#s)@?#>o{{sQfEPjO%aL<u<fD5|;6H@z#X1@x=l0Dl1!R5-Ak zycx3%=>TKd6YUXbI|^kAh{jK2$9aq^RG21TYJQSIQi@UKAwk(M{q~#V41=U9+O-h+ z_*vHwT{YGCeDMEdBO<+uK1fo*1AQ&zr?T(;wTLSzegTv>riJAYWv)FioT)}+^G_9x z9@aERJKFL)P1XB8qQDINHA-Q<<|92??BDTyEb($LF)`S(dKH_eWB`PDHJUAhK!9|u z$OIPC_Jn<TJDl3%4ae8rG0bR!v)a~($1~pMK3op>&F*6`s=&g5$YXj#s953F?Gb@w z-VPUdz0kHgls1N4^c`S9EjO-@oykvecXdPGx!XM+B0pj*#v<$D^S>A`M3fbnlWM>5 zdPG~W*mK1U>#lFZ4;rc|$yhk}jO*<aXt`%_wiK*N7)uGNg<tQ+I)gJL>qTqxuYBV@ zTQiaH5K>ucP8|T;dM~%==p$9EfsI@JqQ6!PZ8@Q6jS_iu>t-38tgh#K_jgAQ*5Afx ztNmHlUM9j~+%Vk?W;>MaW(Rnc*WlkhbMhL0PmI6GGhJtNd{Cy_41_BmFGb#JUig}n zT*v$6P|+XWyO-5o|Gj$see^l3iiJM$c(7-SnzrC_b0OwV3LKKcpxYXbvag$G9YEqr zQPVWy&Bn629dL2Jl#i2Sgb*#x|J)rm_1(B+)52^e$(dcA_UrMo0Q#51b>c1Cw?=~F z9QPR6VJ&C$bW|4(`>#GemgbYx)ja1d?k+}tva&YFPO2)Ym@g-5!EO{fc{-Lw@_S=E z`rZBeEf$Uf4ur{0@lF0#VDhf>hLY3yOxy4v0$MH2$t0-9*fpW<=gq-3Wj1e3SQ8;e zNs-gddtm47u!+86McaI6Hvy05Svq%aGvXpc=pUV**k4ztx$aR*r|5eM;n)>zD(_@e zB{WcbeX>=Yi`<H`aMwZy+dGi_K8V{}$MUQO`+YgHhWiOkkiT3JD)AxXf_cfkxbJ&> zSA?@aO7ioLApbFB$gSK}uViZ);dWgd95N^;7?G|arb`yjJ$uc1n{;=$d%cZ>cRYwV z>l(>|N1QFO+h1jC`;1=^>MuKA#M|zt*gez|0bQI20j2)Y!KE{~Gv}WLYFQW^m*(I9 zJ1nAKTk6QKx`DX2ni$?Qk}|4*406H7?ojCDjP^Aq)V+uOG&rs~&v(#vAuGC!1Y|NA zQrpg>4YJw6i}Ti{0P7<LH`m-ekqXR#TC|khq(d5{P9RNiWcny2X^D?2wuQ^(*6*r7 zNy1^@UJVPEJ4g4;D{25pzEMyVJ-#I8H-G#oBb@u^Pa~{qbWHZM^}@1q;wc|X;=A)% zOM(*#vJA{0S#O3STBJi~s@u2u^@8Ejw-R>8pBEIMKX?e6Eum-22^8WgxV@k!Hib)D zJQQDB7Yj<Ry67C)2g$SSaDl*{B4!g{PS;L)JA5d`Oul?NR`dMjG5Hm~1;uNEby)Xg zaw<I^6@#ZdNxtxu-aFfF^c-W{L}8<VdAGS~l~WyuT~fT{{hP|CGh=ukGAWtRq?WIC zbu^gs9V+nowef(178E$hl^bhJ7e8>@rAgx|T#&2QKrv3)eO8Mml|$$s;8r*-p6?PM z6hBlBhk{AiT^QOPQ#-`M@}yMrjnINTLr_JW1-yMGr)Sny`&wmBx<guZqL+JcNX-(k z2cv`~$xsvuEo9~tTvSbcP0ap|Eo7I-+DT$%Q`D-HPG*a-m6RhW6ksd5z3|kzh%Prq zQs9UUN17+IvdY=Xa@?^<>1WzHE<xl_fek=)t_0TCn^ly$&6w+RX1c$;&@C=>n6vJ> zuNfP2DwQRpkJ)o={*js5zju}-XVnc9!5uQl1vR0SI~-?_1^>O<uF4%6e&JW1U$#7O zkJSBhQ~NP3_whqKfAODk68J@3yx=_&Y8XG?Qu!KpB5^r*x!G6Q@p3fa(a$nn$7o_H zY+9oN9xM${z!n#8xZxm?PFY#}u3$fT4*C6C_dACXRV~6J?o6c*{$~xn$e7W1Z4<HO zFD-EmWrotjoN)?m-dG4m{~Bpw@F09#*F2?ZOAB{1lg`<<L$GdGohw)d2JW$#uhuq^ z(^nncPnD0Fzn0L7aRdq|C66Do#4XyJ)_4BY4RmUk1Z~fI$H3N^B@M)Sz06**Y}#h& ztpiqkLfMZq5ua4_MD$R#0jmPlc$W#y#^M5k-2=viq-{LfXdYi=0_wo;<~$q`BL5L3 zfEW%m7By*$HS~f&s}Y=5sEB5on}DRF^8Zx!RZ($lLAyf|AOs0cf(Lhky9JklV8Jp- zf@`qBf`kMJ&V=9)+y-}NLU0H!gS+eC4!6%aYu*1o-1~6nVP;LQ?&`gISJkfi>g(D) z(+rRAO_Vz>P^vd#V4u?3A78b+-g|8%tKD&4yT2zNND^l<aBBHgS>&>vG8#ehl4)}} zR?DmX=H6^Or@46@4p-N)#R;jRm3oK?##nIw(g@uWuCXszB0@BlVS*XH+kSo2`&Ibo zQ^GdUIm1sHz=P~XC-4duxQAyYYjIK=n65@ZaoU7qm<wJdvW%m51*zbUjueU-mCT!e z+E%15D=#MOT6Gb`by}Hr>O1j&USvaocWD=0k(OerE>j!27obwGCGH}8*@s5dWC`iw z7!|1Mwk)lVOC2wJI7mvlUT^u8<SVtfZ(W<L;lO588|`p@(TgItEI1eldE%Y)hVl_8 zz<TOPPq<Xc{FzGq<XxT{xd@`U+H>}W(4Ja~J{&6wNhg+(wLQ>?d$K2$Tb#4CR6OWU zjZ4%pLht&(!dWWp?Cj!p3G-?hxh@i`DbykGyS8p#MIj_G)qGqp_PVWvm>e6p5=&Tw zvPT2sL^J3fAXD4Z{yV!Fd^Sfkn71`XYa4^5<m(F`f0igFY?U{e2}MUk{2PL`Qzl_6 zU73~e9qsviPrX+ZFW}FvVN|h&Ol1ffYqw`LvELTO7PB_>-Rw-aSrV19i`McOS$K3_ zE)J#Z0h643c|G{@r>)aLYL(j&+;QD9s^oMarJ9OYjCXBg7LyEXBArM#Ig=xYl`q+y z;(qJz<jw}cG+NDv>3i+g3l1u0YbbIj9vtS!XMK;x8#I#x=H|zTOV!xSvpP~9_%TG1 zMJ1B!kIZ+K38fZ*+4e5EX$}eHlpK_qP@dj(KYG05r1~DOyglO+Ep}2Wl8hauO{~9M zv0C<mL#0WIF{uvh^dC?b%;f~gLD^yHf{pRKQQ2W{($DYI7=BQvO&_yuRX3I%O`Rb= zr;C~%{Nkif8x{*Tz)aWK4`@WqDe}gVx~!W{4G>v^4I|!r8LnNA>;q-M$AaoAVR*=K zp?v}0Sc9>6cX4K0T)@HRzI~ZruyQ;9`A=P7U7oEYkRs&}aEswum~|={lXkq~%9vGU z)P11+EIH&e%EqsgHl4dl3#@*?<a6CHQ_n*wdCG#%=y$xC;zYT0C75k}ffNvi^9~1k zfAD*2VoaiR1&HPq<gGkD`}fN&S>)pHz5fSuBrrdvdfbso9NLd7U#FHlIa_VVGp*rJ z!{~u0LQ5oUk{zbuz{sofw3zNZ<aMr~Kag#{6|TAel|#@bqDq2HNHukvowZyan5vom zRhK@!(irYX10=(vfkYQPt_4KO5TgkX*ZUde^>pJE2tff=Q?uKU`H(ZkJ=U>F(j}`J z1X<s|6?9(GjLs()Jonkf*+YFt5B!*K=zi?I*mF{Gw@=W`Hf+4@<QX%Me*K_)J)D&4 zlB{-f!?|w7%~~c!1SdDApohJ~=16BrQS_2|CPG_7$9mX*(_<}%@x^pKU@nWrHmb{= zLH-(nGR`%2T1CCHkCMm{@1v7-V_eN0heYl(Yb3#cD}wG6OGRBbd-}E#E)0SiRNOZH zoWSBXde!e;9FXadZccfPhDoa#5D>Emc5gN-NvbmZm@!hbv*G=qXI%&6I_IwX$T3US zg<Q1Tic-qK#n*8;R>iKjA_j}qrehJ6RzhAuUJUX(L#*Ki{OehB5vOG^{W5$8DL${o zYG@UnuA7}ym92Rdm!!7GVkh-AF{P(%!%$)kSw$25yHv?K%hS`A=M_z4Lh9s=Tiw0t z|3o_yjxmA7#1CFA`G>x!l(STb#7rSXN=Aa<Ik&IpwbM}HE_%4$wFFjPdpTl3qE%}f zhj;mc`)TV#(Ur}IA6dpyqE)$NhftV>6axAJ9X>RgO;oo~a3&)7q9e1~^VD6cao>Jh z_0@=uwP^oL$YRvIC#P+1N#YrxPNF;B$VLp>gnF#>DyxS!aHthdVsY!~Ye5)~sfzP& z$;pN^Hf_CCBkF?iJmZ!ps|7OgX@nt>{=PK4_S-|df>Skneiq&K%OXanl+iP`RKY{I ztuDVCeEs)ymY#+{?)OH26_9zn#gDHD^AzXG>=W2xuUX!Cr}1fTHv|bCAP`r{WX0;v zR2pc+6RWet32Xm3^*tZWXXfVC#(F;$1vJHcZzmuH#z`OA6?HV2h|6Y~80PD}CKa<C z@Ji;*-ca!)>d4e#StouUZ5XBCt<O!YcH3@QQFnHmmN|dkyk%Cpyf6!m3-@!nwSDrV zE9xc@VJm(!rdk<V({{p3ceaTI*3B!kfQV^%n&Y-x2`bBW^x6fel|$`lUQ%w&InzQf zT&-i=tMLBtdEW9|-!?iQ9R|i`w})_v(j~UKHs1i5$diGxAu|u|VhWROdnE4V<UpR6 zRb8p<z7e#{jG8wNSXq?TOe))3bv?$LZz!QdR=p#e$lE^Eux~>U<K3~2w*_?So#M6= z2KEf6*DyeDL%5|v$?MO2joqI(vyhy(>}mIL?j4rPfP1AqMMIUYW={xG^vF?1Wp~`{ zt%`0Fhe8G0mcDrs>T!=MR!KHUuF5zin;u7w-9#bJ{ofQHKcwftGX<SA?t=@H=;uzI z7?(Afte<QxQNMIKS=!@j*bX%eCZ!6#W4t9`u>`{Uo4mRU2}(L~=i4s!3ytDvud^79 zrP;czN#B(|%lTj@O53J2t-ZtX)v69D$(5vs=7prt5gd01<lxs?+#^P9zlQ3a2;b;O z7u>g(dl)deQQpeb%2mPStpkZZe`D^wShaCAxyVi+u%6hpnS{G9_F8*-?K1S;o2f=+ zTJ9c-Yr|;qjy%ris}uK_Atf7G8yP(>3mDd6gP0>Rnv_1k&SNCel*4jj`%&$b7cYuL zRBQEVxtdcW0y(Qx4ou#xR&VUPKbF)gPM&-%^>K+<eeY%^z*ofod~$|_rI1&qMb{x0 zOM@U)Cs$O5@!F)D%_C)$r)FPhGXeYQMOq6kF2W=_*KSt1RA677W$60avFw_WX0jWT zJ~b%OFg>rQ)_x+C(>qFD7I*iG3O_`6_N>_sgMG5!Z6ziz3n5FI*Ij+&K=MuDt<RC> zZL7ORN{U^5_h##BUDsW+s;P+#?q}*p2{`0ngQ>ffDzW}RCrt;4FxE&!+t}%$)#P2f zMh&{pRgl--kW-~X!*1%A*j_Z05iOo`tl^6Wk&dcwX;Sm6@D!Pc88ZC94`oef;{5pc zG?9AQq%>ZuUnORGKg37A6H`(wY+o;z3Q3r2czb-PX{_0~y{NP^qn19MoWe~&F{3E$ zyT1(}Ixd^IN_H}%4XCIO`{M;9k29o!JH6HURdW+0)Hv~RX7J=TTH(IrK<m%QcXLvI zELD*UhGqQtC`<B##pCu!9m*1ZBaiY#$Ko9|x<BDue(&*^?~JDXk*bI2<@6>n&OH$x zlKkWx0jILL*0RA~GV>FKn{&N}kN$Ux4b!U<t`7$qI+{pH()VXg3Lxo{r5+Z|blyX1 zf3ds_j`{cPA7xUklHJA>7Qb<gH74x4@ITGV*!cL)d9J0NN^vnljr01d|J~1Quv=5+ zm9C993r7jRM5cg&$=q7~u|^r-)-<ci_O7V>SXEK@2Hi0`D}}r^BAt^##dZvnyh?EL z#sqp1Ws~EL=W2GciVonCeWZ0sW2k#JsORN(*^1Q@uZxvhsmn&OGKM5225%#7%B6D6 zALtn|d^!%IT@#2=pjv7Z1RILg@coP9{i3cZL%d}aX9fq`RloxrTu9xn5MovcuH)Bn zpeuwQb@%r!b@;C^bRTIE)f*J1ej8eMVoRq@1c0In>o?BUU6dO|759{_1H56OHG@}A z$6s?!2{QXwdK8Pt^|B|mZ;m%|fIus6IgVAdjdP7Z!`zs79wG}Hjb7$kE5+`YV%+7x zuY$sObe)1RV9{CS9A=yHmJ&)m{&8(#z9~>nL7~I}&O*_AUik^bqR1~QMD}R~%SGMg z6M7Zx2VrNd<79~DpDD+2RA<2{unz7Xd2Qhlf_0j9&#P&=4JMeidWo{3H-p4Spi$+= zOUj=@yeJWdq^#OcQsl$2oDJ@ITc@?7vsQ13;%CNX8^)y9sp(mQH#`%b2Ji<8+f%Zl z(-`NZMk*nG8D3(gtP~^d>c=FpBT0F$Ayg{7@E<blt1#;VFLmNn^jw=lc^Hp~#;~XT zVAbZLx`O3ASyI{~0NLbo_Ykn~-Qx;UszPoT_m^kEUXY&}mKt?%b1jjqxga_#Khk+N zBu&W~Yf9eCyFyQAlj9k*e<s)EPc;%E9;`!Ws?lA?7v+M(aK632%Vh4{lET6z@u*L& zEXV95yC6L<36xN&fNI&!LoEJ&{!uFfwnLLP>sf=5dr%r*-JD9hbv$q{(+bK*<{jD& zdnB$>i|ym_Ci~+C2WqF7eZgREX*4!P%VkP2N{+v1%@Af~KY>^($O*E)3ikZf!Q44Y zWNRF6p!Qms&YC49roT_wEl<+65|#olG8~qefvX$Qmrb8H4c~w?ocM3+``3SpH*1|= z8s<e~bC<2$J%PQ+y-4|P`Sw5`p*{%e!R-|N^bj@o!|C~ohlKJe`zmpE6BmXrrMveY zYS2=v2E_$#)cH)C^sB><rce3uFF0buGT%9izI>5H=Z&Hhy*-4Zm{NHLPcE4qR;Vy3 z#7L2>ZJ!#d(l?Py9-fvk5T?N$)yu9r$g2F89^d#=zoa>3-=GSuI1z*}4PFWsDzlDY z+pgoGDw7wYS6akuAe7G=Zo-xSYWhfs6Xt%VwA|X+aDtK1B*)m;ciDL=xjM`qXcBi> z9{e!;EV%!M2dE8(mtAoWwWPyhE}li!2~xMf?-V(MSNzWYu>W0^Ls(>c_A9aZ+$9p7 zL=AD3@jo}vPB1rD=BdmO<<CD$`JQY?%-5tKUdHql-d1qWJ_LWON<6=jkk_h;IARo9 z)4$w0T^VBB>pKF%{kQ!Kas#^B(;fN~(>eoSUFEV0+ju|o$9xmpb|V4v7K$xgqLsC% z;b;8nHLhcG?q7?o0`0yK{wZ^zv+tB)Ak@{>#eVh-#q|VpY8TI$#Zbmz1}4;=T}6|9 zlnM6WI`%GoOY<d*)Ofp{J$340-6=g&=JJ)T_H)MQK{)}=0dRtnD8}eRFT>=saWj2r z?Ww%1dsXH*2S@)?uw<GhB}K9uTj5d~Dx1lc>s&MqH}U*e-YRjXfwKE2<eVRFB+5Yk zD#gn3wAh-S&EsN3f5XK2$PBawdqlOe`@NlA>eBXiNQBW0&PgPMu>ASt+RFrOLbuY> zHmT;@;^Xf$`B+RNNjg><x$hvl`Ndg{UdsL(cap>|TQ#I!?#e%ZDx(t=SX>F-Ee1sU zn+<?F-ZiBW8svtmBk@T2)&%G^FKvn?LouLxH>s>tqccULO?a9n2O8$^We7Pa5@!WP zCR348s=%oLMiaq%W2}y`8%DF+h2?l09iGbSLG{LNI%vTT=e_DX24eSk@{-}<iDT~N zZTWSBSBp{E5zVLDPWEA3?TtZ4D6V){9qVK02qQeQ>b{*4D);Gp&X195e1i1A3NPu4 zhbD-h>3chk=jXxm81;&VAqA0}8ou;E50S`X@mrf-0e^toI`%g^&$!d#E8ZMEh0!u3 z!Cp2AIqxk=UfyI)*2fanLQ-{b*wi@n^L#^lHU(UAgG?Qb-r2E0(Xu;D_XG~`O)qN* z2&Q&7(SgWuJIv7CXpPRMcv^(L;oa*S7++Cb`Oc_kCt=Y}9HKQrsFrNnkH5`ZC`@`$ zMD`W02v{-L@Q9MrWF9xBbcP{_n!N7#o=YOKRt?FDq;955bhCQe$(+b{2er}+N$gYF z+53<)uGohzAZtqe5R%#;H)#Xmw*6{x^H&M&jT`9*3qkVCnMP|GKQ%k9l|N(Bb8au< z=^=QTXpsnT6ZC4V8PmCG`0`V}FBPZd3S|E91K!Cx*%~ReaU8<A@p|Pekb_Fo2M9BW zUwIcKrp>l}_GXXO^h6%})Ti!+I$-ILGatkbE_dtbaW`W>lB$1s+FiPQ#xe46+ig&$ z#l>rFI5x-K@8)3<$I9L>)ocpnY7IWHg?UV1#Fr4>TSSHCPv@{fzr-ko_!|GO9-N3T z{k=(JMI5JG%H3~$7OBD_`4-U8MrM-1Z`zwqe`hb#=Pl-VC#e^E+q%EZYTf&!pfUC* z6{ry%XI57e9}=Q+wwzy_TJSZV)f&?_QLRsp5E#(U4S%03mCmhg0SaT|gYt-r18Ve4 z<@_iF6~*oTR$l2Mf1Jg!;(@sYk@w;eBQm<mG1c_+Wr&9e=$2GIx?QL+VZ?#Cf7+95 zRJwE1gUtRR*510*l{X?MSK3Mw_P7MxRljusIsI)u;;X&*P9~~xp@y5@_l2xwmM{l) z3%2u9^RzeJX0~SLhML4_aIWmb0o4OzX#*vmI^-SmvqM8^+1CZ+MvZwK{?>Jy^3gSE zA5IemJ@s^)_{H?xjJ!9+&GuhD3jGF*hd&h%<b7o2whKp+9ljy|*5A7*j(u0;EB@qA zOS+v^d;GHzW{J<}9%}a$kgcsk)bC)d<9XD3Kr~|$YEF;cT!fafyvBg1%hJoQW#*gE z$6Z)o-%tS$BL$xu>KWXJTwP5Y(kpClnd3iw>2C5m+M$0nwo@;W&Th)DAUAt22e~8L z72Y8ZY}8S^!lG6jHsCg${#2y`Il<A0^ktoTo{OI{(AD%ryjPi$eDtf>>`hM2X(>`G z6KiB^QhgtmFer31&ZzL5uzd{cN&dzmrP~J5PKG{P8le~FGvilbJLUJ?GiAfChxTW@ z{n_Z19%WGIglpB%;fP<HYme@x@q9wy9ljEUNT@8@seduVvPpFCy?J}JPGz%0&TRzS zitXpPDg2&pcN(E3B|VP<&(<a%Dl5nMB6C~wHJ8AAFUgw8Bm;>Tf6p{J4aEy`jGI0v z6A56$JE<Us`czQ)@f`1B_65Bv;CRu8<X;sP>lUrc`!gQ$wN!CXNn)rxZO|Gg-mbj7 zB08?8-iUNma<XRvVCRrD#~rRBvKawO-jM(gk_>_ZID7^2=ohglUQlOE7$5HI+!t@Z ztH`+}#P;>-$7^0!=uB%GIDMs-H}QUWD`;cm;qDgEV{Spm6WuM=|G|NUL+u|X2-h%v zWfRSZZx;$~WKbnq*_=Cn<YA9kT>iLD=z+|TSeoJzK7ZFkv-b!Yl6#V1@(<sM>XnWw ze97@R(L5HL$=rdLIW|^YbXr^~%c}L9oeP?$H9Kq_5*{w{`5q@O9jw0!v=>*5CzM<a zJ6?4kr-fO<3o^2!8H&(r;EsAfkMHoumRevSF@_k{W6BWnkNjFz`Gnt}OcKS95M*C- zMl8&HFgaO0vUt#8a<x~-Q<h)%v#|-Ng=UvY34C%N;EO5fyI#Pi@NIflwA@5jdh<%* zvk(1Vh%~&%m68tFWRTFCA#wiF>y^o=-+RxTQ6E>d)v+!cpm&yJ9IF^>wlmgG!_f3R z%c6(~D{m<c{;vz6*wNo_PYbzD#>31u230=K2cXN~vh9aeR?>VRuN9i~6@-~eJt1V; zbXL-#GZe4H|D`qWoImOoCfRxU!cmb%E=eh37)b^k&6M*L{VYpg^M73YngXPyG`NZn z0)Yy!y~1VP-TwhLSM*QD4%x}NlhKE-L(4i(wukL1$eyziES4$-KnOrQF?GTb5kGtT zADNm1J?lc%5Xrm{aqHLh3$Fk<8C$e?XuvOel<f0pp)z9urw$Tt9|Xd+yMaLODKXk! z2uKMFs7{!PQ)kMC)NO3^eeB-x@rK9!M4cai4;D@Gy-sMDmxMiE=Vk<md6q{N7P@E> zTx<;NZ4P1MQI?Y!D?_2{cG;gAZe_ko4kVg=n^ew^)za>drc$*V{l?=~;8;Qt8TNrw zAHUA6FsX`<k2%Ek&Ks(wH64r_Kb73x9!|;?VbU@)HvnE=?Oqv3LF~`jIDE)rI7blU zGfzE7`%M5WVuYaqQIGumYSk<|(Wi8Ddh90kpCTMIlvqB#Rw^?gBO!I6qDsnE+|ACM zocPh(VTYtd_W*<A;<<&KrjK!<FW_F;;iR4EqU#x%nn#a#UYNUa5E-9@k(dmnRv^c+ z3D}a!;9CL0UM|(B+5ir~#Fwy3J)Zjg#>1p@m^oeDe=Yi{+27>$5Mj{JkSgJ0ZwuM1 zv@n?%?`aR&EiBR=rZ{PIsxFQQS*X<uQDPY0mLeOU$o<2k<oMg~DTs>}Z`ZslBC*zC z;^uTjK@s4uTbwRZQ$@24jOB(aNK0EH{ARXLu+;aKA7z<!J`;8-9v18B_U7i!`CPc9 zi}%VZ=5B2fiivp-7`;a<xcp5lSnnT5P1AL8oqo8DC802)6Gk~qnToiWuT@%Xl$QRz z{fsx`2o<ziSD_p{#9_cXmj!hwI<J;%Jp{q$Uw+Gf>MxO9sGKCA+Tm3t=u}G>@v)os z&&6tx=}Lx-sCB`rLW+<c7LMDWu9rBBCW|JuTWcN7es|s3-roGMGf)!fCR4`@Zd3W} z1XcP-qvKF-LksA`NZ!!U5JnLK0=>oRdxOxsgh)JDGKVX6rhovhH1JvZN3R2fp8(%a z@qyDoAhdrE(Mkg)1`z1Uzh?!2oSy=J@c+}=M;-s@u=M}!q8>117ct(MkHD#dN(~>X zFKqPCA;DCB)NX?9d9!MaQ8~>d6=3KyJ<9(|M*!p!K-7Pd{u3U!((wwWCR?Z0|IU+) zZvXN<9=Jau?vfm+?h@^VxIejh6(b%LD*J4p{6eL<DCVUb5g8y@0}zZ22>wCLh$k~& za$wgCysrddQlUs<Aq3H;(c;NSls|KUYS`Xwj=XM!V+iI(=+?Ww!Cq{CrDM@mJ5ov{ z2*DLEf6aLx`^7>Vz?hT0&j^jh+4#2*Ct@z6guu2>qLHailhqcvXEa7r{%dePkEr4Z zKd*G%#3DH>E^!*K|BXju)p~k&mMhOXKI8r#SZ-UB+lg-WrF(TzLN&^(NKUW9?Py07 zT9_P_X&T%UlcK?OFsOV7w=oTdyYGwFbDi;TabtpFp!gvf)GureWyxq7>YYdHaT6+7 zAM8`MtJYYOqk#6@VWTTj>T}+YeOS)V+GABQqahC;2djz{#cFni+%F(|jvei)G{5d= zU3a{f&zR*~{M;;60iE$Hko?fO?P{l>v3P^u6kaRo2J_GTQ?6i^`*u#K<qm)zXKwxy zT)iJGCZ8@2kIwj|(e@=j{wBh}r()6@1aiSz!5@zXuuJ9i#c%H=#w~wW*IjTYi`Bj< z;cCl{+P}u?;)KjX^rd7zUF_bN62~B+cR0+?z=c`>=c&1LHC}fntFhEM{MV{xRb@M> zp-m4@xbBd9?oSb#ZD%W<=-tt_`?x5BwvDw+wM%2z^}{aK%i7a=Q_H6K`Lex4hz%~? zE*hwZ@w@C>CjeaxO13-aZ1VNGF&}Qe`|~{Wx2yI1V+sIV{5{vJjfw%E3_3zWX6p8g zPx@GO3@1XV{Uan1j_+@qme#gVnc-3673$UScfL$nXifcWf9LrcYL>>-?dr~9ZC?hd zFh6)mg<xdnlzo%{fvz4qKPCTT)myO|j-fW^-7@MH4Bvn?NbnJ6;}oYhV+_7%*=Qc7 zyFVfry4^e*REw}Iuxo-+&pCeQPI^<aN{TroRqy2O1E`xW4dH!+&g)h{KcOyjEkwJm z@~s@4TyG~v>+Gf-q8_l@Qri>KBXAl3g-Vz^mE)Af{(01%kXG=K=f7dF5lxF|zlQaj z<#)CE+#i||yUWoPj@koNGN!|N-T7o-0@Ph_ix2a7{zW2<C+%1rJ{Fm&Mo*MCFgbW< zW}2OWKx;T1uL@|!fAKkgqFGteJA3u?IVfN+@LxCZpB?`H+5JDx!u$;@=Hat|=GZRb z92nMTNt#185NOom5hZDWu=2-$?VS+gUqAAnYx&39(6WCkbL4CVk9(}+>dT4B0A~f* z|JG8(57T-hSsC-M+tH#s>%R#AYhVAJv$tPNjZ3HUdw8P`ykvRue6rDWZkAc-oO9~| z$wg0rjQBRBS39&P>747^fAB;TEVRsO9S%?jclcb3@-pRZ?K|#bDV|gvT{YJ{=J>~^ zqm8XU9R7+W^soqVLh^*~8$ye!&s0(hyxIWz&Lcq$D%2*|SRSYLhlK_4YV(fc*kp_i z+`AND+bO_##ym?9)JOxEIkI5vNcIt3(P%^cZuEzFK9A8!X<diM{EqgUg3vpQhpUzf z;o|9*RXYHN@6|!dtZu0Pl2nayq?yI>`L4up<TdvS8?SITDWeJFo%*Vf@w8OcDnJ9W zGqxJQHlE%Vv*>mZppxZxT%NQ1I}_ebhKrJ*)atfkd-v}nBoSWEEwGsgKo4c$jqWB% z{>>a)D0PUs0(PgM;AUqfG=6<zgk$*bQ$oL)o*`dQ9>a^xBjLcaad;!TrvB)bTAM7~ z@LKCf(7&!ehVbhKjWBPW)#CK58s%L0Nu@D*+Mv><xXb#sA=#dk)#g#>W6Zmj#osfm z0_XD+RIPU#d%vjx0!@blB9}_>uk6)N)T>kF-;Quz*>c+C{k=YzuWy|lc_Oo~-yOf{ z^Dy?dZ0lQ~>M_q;EXUcrx5ljp{i{F$?<XoWYXheAa$tMG>iiu*`BHi2VzMBr`7>pt z%&~|>=)Whv5moXaP97XNhLbqo#YrS$G*QY<I_PkJ>i;D&MZiI%TS^BN1L=1Rbh@#Z zXv~oDlu6l08xDvxYN(a{ipnl16t$TJ+s_Tpcmaed_u~9u^vL~WtiJ4>7tohg`fH-j zX#b<3__=L}jF^#h<NwiD5a|EC_Wd6VCjRj7aN>?8a?IsX!xv)@w;L%8u9FkZm@QRc PwF4>3tIL(XF%A4*ZkxBc literal 0 HcmV?d00001 diff --git a/doc/source/images/nova.compute.api.create.png b/doc/source/images/nova.compute.api.create.png new file mode 100755 index 0000000000000000000000000000000000000000..999f39ed95afdb067f9ec47c988eb9a2bb28c35f GIT binary patch literal 50171 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