Compare commits

...

18 Commits

Author SHA1 Message Date
OpenDev Sysadmins
5307f5a80e OpenDev Migration Patch
This commit was bulk generated and pushed by the OpenDev sysadmins
as a part of the Git hosting and code review systems migration
detailed in these mailing list posts:

http://lists.openstack.org/pipermail/openstack-discuss/2019-March/003603.html
http://lists.openstack.org/pipermail/openstack-discuss/2019-April/004920.html

Attempts have been made to correct repository namespaces and
hostnames based on simple pattern matching, but it's possible some
were updated incorrectly or missed entirely. Please reach out to us
via the contact information listed at https://opendev.org/ with any
questions you may have.
2019-04-19 19:40:46 +00:00
Ian Wienand
b5467a2a1f Replace openstack.org git:// URLs with https://
This is a mechanically generated change to replace openstack.org
git:// URLs with https:// equivalents.

This is in aid of a planned future move of the git hosting
infrastructure to a self-hosted instance of gitea (https://gitea.io),
which does not support the git wire protocol at this stage.

This update should result in no functional change.

For more information see the thread at

 http://lists.openstack.org/pipermail/openstack-discuss/2019-March/003825.html

Change-Id: I886b29ba8a1814cf876e70b5b20504a221d32fa1
2019-03-24 20:36:26 +00:00
Alexander Chadin
83411ec89f Fix stop_watcher function
Apache should be reloaded after watcher-api is disabled.

Change-Id: Ifee0e7701849348630568aa36b3f3c4c62d3382e
2018-12-10 13:55:44 +00:00
licanwei
08750536e7 optimize get_instances_by_node
We can set host filed in search_opts.
refer to:
https://developer.openstack.org/api-ref/compute/?expanded=list-servers-detail#list-servers

Change-Id: I36b27167d7223f3bf6bb05995210af41ad01fc6d
2018-11-06 13:39:14 +00:00
Tatiana Kholkina
9f7ccfe408 Use limit -1 for nova servers list
By default nova has a limit for returned items in a single response [1].
We should pass limit=-1 to get all items.

[1] https://docs.openstack.org/nova/rocky/configuration/config.html

Change-Id: I1fabd909c4c0356ef5fcb7c51718fb4513e6befa
2018-10-16 08:37:45 +00:00
Tatiana Kholkina
fb2619e538 Provide region name while initialize clients
Add new option 'region_name' to config for each client section.

Change-Id: Ifad8908852f4be69dd294a4c4ab28d2e1df265e8
Closes-Bug: #1787937
(cherry picked from commit 925b971377)
2018-09-21 12:31:04 +00:00
Nguyen Hai
6bd857fa0e import zuul job settings from project-config
This is a mechanically generated patch to complete step 1 of moving
the zuul job settings out of project-config and into each project
repository.

Because there will be a separate patch on each branch, the branch
specifiers for branch-specific jobs have been removed.

Because this patch is generated by a script, there may be some
cosmetic changes to the layout of the YAML file(s) as the contents are
normalized.

See the python3-first goal document for details:
https://governance.openstack.org/tc/goals/stein/python3-first.html

Change-Id: I35a8ce3dc54cb662ee9154e343cf50fe96f64807
Story: #2002586
Task: #24344
2018-08-19 00:59:08 +09:00
Clark Boylan
e0faeea608 Remove undefined job
The legacy-rally-dsvm-watcher-rally job does not exist but it is listed
in the .zuul.yaml config. This is a zuul configuration error. Remove
this job which does not exist to fix zuul.

Change-Id: I1bbfd373ad12b98696ab2ddb78e56e6503cc4c4d
2018-07-03 13:27:12 -07:00
Zuul
61aca40e6e Merge "Update auth_uri option to www_authenticate_uri" into stable/queens 2018-06-05 07:49:22 +00:00
caoyuan
b293389734 Delete the unnecessary '-'
fix a typo

Change-Id: I4ecdb827d94ef0ae88e2f37db9d1a53525140947
(cherry picked from commit 4844baa816)
2018-05-16 05:03:45 +00:00
caoyuan
050e6d58f1 Update auth_uri option to www_authenticate_uri
Option auth_uri from group keystone_authtoken is deprecated in Queens [1].
Use option www_authenticate_uri from group keystone_authtoken.

[1]https://review.openstack.org/#/c/508522/

Change-Id: I2ef330d7f9b632e9a81d22a8edec3c88eb532ff5
(cherry picked from commit 8c916930c8)
2018-05-15 07:57:53 +00:00
Zuul
7223d35c47 Merge "Imported Translations from Zanata" into stable/queens 2018-03-06 05:30:53 +00:00
Zuul
57f1971982 Merge "Add a hacking rule for string interpolation at logging" into stable/queens 2018-03-06 02:42:13 +00:00
OpenStack Proposal Bot
c9b2b2aa39 Imported Translations from Zanata
For more information about this automatic import see:
https://docs.openstack.org/i18n/latest/reviewing-translation-import.html

Change-Id: Ia00d11dd76a27a5c052c7a512cadaefa168d0340
2018-03-03 07:22:16 +00:00
Andreas Jaeger
a42c31c221 Fix exception string format
The string %(action) is not valid, it misses the conversion specified,
add s for string.

Note that this leads to an untranslatable string, since our translation
tools check for valid formats and fail. In this case the failure comes
from a source code fail.

Change-Id: I2e630928dc32542a8a7c02657a9f0ab1eaab62ff
2018-03-02 20:57:41 +00:00
ForestLee
403ec94bc1 Add a hacking rule for string interpolation at logging
String interpolation should be delayed to be handled by
the logging code, rather than being done at the point
of the logging call.
See the oslo i18n guideline
* https://docs.openstack.org/oslo.i18n/latest/user/guidelines.html#adding-variables-to-log-messages
and
* https://github.com/openstack-dev/hacking/blob/master/hacking/checks/other.py#L39
Closes-Bug: #1596829

Change-Id: Ibba5791669c137be1483805db657beb907030227
2018-02-28 12:13:10 +00:00
OpenStack Release Bot
3431b77388 Update UPPER_CONSTRAINTS_FILE for stable/queens
The new stable upper-constraints file is only available
after the openstack/requirements repository is branched.
This will happen around the RC1 timeframe.

Recheck and merge this change once the requirements
repository has been branched.

The CI system will work with this patch before the requirements
repository is branched because zuul configues the job to run
with a local copy of the file and defaults to the master branch.
However, accepting the patch will break the test configuration
on developers' local systems, so please wait until after the
requirements repository is branched to merge the patch.

Change-Id: I8ec196a62e7c0146f25045e643073f414ae69249
2018-02-08 16:34:03 +00:00
OpenStack Release Bot
eb4cacc00e Update .gitreview for stable/queens
Change-Id: I4ac0da37285c34471654bb5125c034b415c6031d
2018-02-08 16:33:58 +00:00
44 changed files with 1133 additions and 584 deletions

View File

@@ -1,4 +1,5 @@
[gerrit]
host=review.openstack.org
host=review.opendev.org
port=29418
project=openstack/watcher.git
defaultbranch=stable/queens

View File

@@ -1,9 +1,16 @@
- project:
templates:
- openstack-python-jobs
- openstack-python35-jobs
- publish-openstack-sphinx-docs
- check-requirements
- release-notes-jobs
check:
jobs:
- watcher-tempest-multinode
- legacy-rally-dsvm-watcher-rally
gate:
queue: watcher
- job:
name: watcher-tempest-base-multinode
parent: legacy-dsvm-base-multinode
@@ -11,7 +18,7 @@
post-run: playbooks/legacy/watcher-tempest-base-multinode/post.yaml
timeout: 4200
required-projects:
- openstack-infra/devstack-gate
- openstack/devstack-gate
- openstack/python-openstackclient
- openstack/python-watcherclient
- openstack/watcher
@@ -31,8 +38,8 @@
post-run: playbooks/legacy/watcherclient-tempest-functional/post.yaml
timeout: 4200
required-projects:
- openstack-dev/devstack
- openstack-infra/devstack-gate
- openstack/devstack
- openstack/devstack-gate
- openstack/python-openstackclient
- openstack/python-watcherclient
- openstack/watcher

View File

@@ -314,6 +314,7 @@ function start_watcher {
function stop_watcher {
if [[ "$WATCHER_USE_MOD_WSGI" == "True" ]]; then
disable_apache_site watcher-api
restart_apache_server
else
stop_process watcher-api
fi

View File

@@ -35,7 +35,7 @@ VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP
NOVA_INSTANCES_PATH=/opt/stack/data/instances
# Enable the Ceilometer plugin for the compute agent
enable_plugin ceilometer git://git.openstack.org/openstack/ceilometer
enable_plugin ceilometer https://git.openstack.org/openstack/ceilometer
disable_service ceilometer-acentral,ceilometer-collector,ceilometer-api
LOGFILE=$DEST/logs/stack.sh.log

View File

@@ -25,13 +25,13 @@ MULTI_HOST=1
disable_service n-cpu
# Enable the Watcher Dashboard plugin
enable_plugin watcher-dashboard git://git.openstack.org/openstack/watcher-dashboard
enable_plugin watcher-dashboard https://git.openstack.org/openstack/watcher-dashboard
# Enable the Watcher plugin
enable_plugin watcher git://git.openstack.org/openstack/watcher
enable_plugin watcher https://git.openstack.org/openstack/watcher
# Enable the Ceilometer plugin
enable_plugin ceilometer git://git.openstack.org/openstack/ceilometer
enable_plugin ceilometer https://git.openstack.org/openstack/ceilometer
# This is the controller node, so disable the ceilometer compute agent
disable_service ceilometer-acompute

View File

@@ -165,7 +165,7 @@ You can easily generate and update a sample configuration file
named :ref:`watcher.conf.sample <watcher_sample_configuration_files>` by using
these following commands::
$ git clone git://git.openstack.org/openstack/watcher
$ git clone https://git.openstack.org/openstack/watcher
$ cd watcher/
$ tox -e genconfig
$ vi etc/watcher/watcher.conf.sample

View File

@@ -19,7 +19,7 @@ model. To enable the Watcher plugin with DevStack, add the following to the
`[[local|localrc]]` section of your controller's `local.conf` to enable the
Watcher plugin::
enable_plugin watcher git://git.openstack.org/openstack/watcher
enable_plugin watcher https://git.openstack.org/openstack/watcher
For more detailed instructions, see `Detailed DevStack Instructions`_. Check
out the `DevStack documentation`_ for more information regarding DevStack.

View File

@@ -26,7 +26,7 @@
[keystone_authtoken]
...
auth_uri = http://controller:5000
www_authenticate_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password

View File

@@ -10,7 +10,7 @@ Infrastructure Optimization service
verify.rst
next-steps.rst
The Infrastructure Optimization service (watcher) provides
The Infrastructure Optimization service (Watcher) provides
flexible and scalable resource optimization service for
multi-tenant OpenStack-based clouds.
@@ -21,7 +21,7 @@ applier. This provides a robust framework to realize a wide
range of cloud optimization goals, including the reduction
of data center operating costs, increased system performance
via intelligent virtual machine migration, increased energy
efficiencyand more!
efficiency and more!
Watcher also supports a pluggable architecture by which custom
optimization algorithms, data metrics and data profilers can be

View File

@@ -13,12 +13,12 @@
set -x
cat > clonemap.yaml << EOF
clonemap:
- name: openstack-infra/devstack-gate
- name: openstack/devstack-gate
dest: devstack-gate
EOF
/usr/zuul-env/bin/zuul-cloner -m clonemap.yaml --cache-dir /opt/git \
git://git.openstack.org \
openstack-infra/devstack-gate
https://opendev.org \
openstack/devstack-gate
executable: /bin/bash
chdir: '{{ ansible_user_dir }}/workspace'
environment: '{{ zuul | zuul_legacy_vars }}'
@@ -30,9 +30,9 @@
cat << 'EOF' >>"/tmp/dg-local.conf"
[[local|localrc]]
TEMPEST_PLUGINS='/opt/stack/new/watcher-tempest-plugin'
enable_plugin ceilometer git://git.openstack.org/openstack/ceilometer
enable_plugin ceilometer https://opendev.org/openstack/ceilometer
# Enable watcher devstack plugin.
enable_plugin watcher git://git.openstack.org/openstack/watcher
enable_plugin watcher https://opendev.org/openstack/watcher
EOF
executable: /bin/bash

View File

@@ -13,12 +13,12 @@
set -x
cat > clonemap.yaml << EOF
clonemap:
- name: openstack-infra/devstack-gate
- name: openstack/devstack-gate
dest: devstack-gate
EOF
/usr/zuul-env/bin/zuul-cloner -m clonemap.yaml --cache-dir /opt/git \
git://git.openstack.org \
openstack-infra/devstack-gate
https://opendev.org \
openstack/devstack-gate
executable: /bin/bash
chdir: '{{ ansible_user_dir }}/workspace'
environment: '{{ zuul | zuul_legacy_vars }}'
@@ -29,7 +29,7 @@
set -x
cat << 'EOF' >>"/tmp/dg-local.conf"
[[local|localrc]]
enable_plugin watcher git://git.openstack.org/openstack/watcher
enable_plugin watcher https://opendev.org/openstack/watcher
EOF
executable: /bin/bash

View File

@@ -1,398 +0,0 @@
# Andi Chandler <andi@gowling.com>, 2017. #zanata
# Andi Chandler <andi@gowling.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: watcher\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-01-26 00:18+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-01-27 12:50+0000\n"
"Last-Translator: Andi Chandler <andi@gowling.com>\n"
"Language-Team: English (United Kingdom)\n"
"Language: en-GB\n"
"X-Generator: Zanata 3.9.6\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
msgid "0.29.0"
msgstr "0.29.0"
msgid "0.34.0"
msgstr "0.34.0"
msgid "1.0.0"
msgstr "1.0.0"
msgid "1.1.0"
msgstr "1.1.0"
msgid "1.3.0"
msgstr "1.3.0"
msgid "1.4.0"
msgstr "1.4.0"
msgid "1.4.1"
msgstr "1.4.1"
msgid "1.5.0"
msgstr "1.5.0"
msgid "1.6.0"
msgstr "1.6.0"
msgid "1.7.0"
msgstr "1.7.0"
msgid "Add a service supervisor to watch Watcher deamons."
msgstr "Add a service supervisor to watch Watcher daemons."
msgid "Add action for compute node power on/off"
msgstr "Add action for compute node power on/off"
msgid ""
"Add description property for dynamic action. Admin can see detail "
"information of any specify action."
msgstr ""
"Add description property for dynamic action. Admin can see detail "
"information of any specify action."
msgid "Add notifications related to Action object."
msgstr "Add notifications related to Action object."
msgid "Add notifications related to Action plan object."
msgstr "Add notifications related to Action plan object."
msgid "Add notifications related to Audit object."
msgstr "Add notifications related to Audit object."
msgid "Add notifications related to Service object."
msgstr "Add notifications related to Service object."
msgid ""
"Add superseded state for an action plan if the cluster data model has "
"changed after it has been created."
msgstr ""
"Add superseded state for an action plan if the cluster data model has "
"changed after it has been created."
msgid "Added SUSPENDED audit state"
msgstr "Added SUSPENDED audit state"
msgid ""
"Added a generic scoring engine module, which will standarize interactions "
"with scoring engines through the common API. It is possible to use the "
"scoring engine by different Strategies, which improve the code and data "
"model re-use."
msgstr ""
"Added a generic scoring engine module, which will standardise interactions "
"with scoring engines through the common API. It is possible to use the "
"scoring engine by different Strategies, which improve the code and data "
"model re-use."
msgid ""
"Added a new strategy based on the airflow of servers. This strategy makes "
"decisions to migrate VMs to make the airflow uniform."
msgstr ""
"Added a new strategy based on the airflow of servers. This strategy makes "
"decisions to migrate VMs to make the airflow uniform."
msgid ""
"Added a standard way to both declare and fetch configuration options so that "
"whenever the administrator generates the Watcher configuration sample file, "
"it contains the configuration options of the plugins that are currently "
"available."
msgstr ""
"Added a standard way to both declare and fetch configuration options so that "
"whenever the administrator generates the Watcher configuration sample file, "
"it contains the configuration options of the plugins that are currently "
"available."
msgid ""
"Added a strategy based on the VM workloads of hypervisors. This strategy "
"makes decisions to migrate workloads to make the total VM workloads of each "
"hypervisor balanced, when the total VM workloads of hypervisor reaches "
"threshold."
msgstr ""
"Added a strategy based on the VM workloads of hypervisors. This strategy "
"makes decisions to migrate workloads to make the total VM workloads of each "
"hypervisor balanced, when the total VM workloads of hypervisor reaches "
"threshold."
msgid ""
"Added a strategy that monitors if there is a higher load on some hosts "
"compared to other hosts in the cluster and re-balances the work across hosts "
"to minimize the standard deviation of the loads in the cluster."
msgstr ""
"Added a strategy that monitors if there is a higher load on some hosts "
"compared to other hosts in the cluster and re-balances the work across hosts "
"to minimise the standard deviation of the loads in the cluster."
msgid ""
"Added a way to add a new action without having to amend the source code of "
"the default planner."
msgstr ""
"Added a way to add a new action without having to amend the source code of "
"the default planner."
msgid ""
"Added a way to check state of strategy before audit's execution. "
"Administrator can use \"watcher strategy state <strategy_name>\" command to "
"get information about metrics' availability, datasource's availability and "
"CDM's availability."
msgstr ""
"Added a way to check state of strategy before audit's execution. "
"Administrator can use \"watcher strategy state <strategy_name>\" command to "
"get information about metrics' availability, datasource's availability and "
"CDM's availability."
msgid ""
"Added a way to compare the efficacy of different strategies for a give "
"optimization goal."
msgstr ""
"Added a way to compare the efficacy of different strategies for a give "
"optimisation goal."
msgid ""
"Added a way to create periodic audit to be able to optimize continuously the "
"cloud infrastructure."
msgstr ""
"Added a way to create periodic audit to be able to continuously optimise the "
"cloud infrastructure."
msgid ""
"Added a way to return the of available goals depending on which strategies "
"have been deployed on the node where the decison engine is running."
msgstr ""
"Added a way to return the of available goals depending on which strategies "
"have been deployed on the node where the decision engine is running."
msgid ""
"Added an in-memory cache of the cluster model built up and kept fresh via "
"notifications from services of interest in addition to periodic syncing "
"logic."
msgstr ""
"Added an in-memory cache of the cluster model built up and kept fresh via "
"notifications from services of interest in addition to periodic syncing "
"logic."
msgid ""
"Added binding between apscheduler job and Watcher decision engine service. "
"It will allow to provide HA support in the future."
msgstr ""
"Added binding between apscheduler job and Watcher decision engine service. "
"It will allow to provide HA support in the future."
msgid "Added cinder cluster data model"
msgstr "Added cinder cluster data model"
msgid ""
"Added gnocchi support as data source for metrics. Administrator can change "
"data source for each strategy using config file."
msgstr ""
"Added Gnocchi support as data source for metrics. Administrator can change "
"data source for each strategy using config file."
msgid "Added policies to handle user rights to access Watcher API."
msgstr "Added policies to handle user rights to access Watcher API."
msgid "Added storage capacity balance strategy."
msgstr "Added storage capacity balance strategy."
msgid ""
"Added strategy \"Zone migration\" and it's goal \"Hardware maintenance\". "
"The strategy migrates many instances and volumes efficiently with minimum "
"downtime automatically."
msgstr ""
"Added strategy \"Zone migration\" and it's goal \"Hardware maintenance\". "
"The strategy migrates many instances and volumes efficiently with minimum "
"downtime automatically."
msgid ""
"Added strategy to identify and migrate a Noisy Neighbor - a low priority VM "
"that negatively affects peformance of a high priority VM by over utilizing "
"Last Level Cache."
msgstr ""
"Added strategy to identify and migrate a Noisy Neighbour - a low priority VM "
"that negatively affects performance of a high priority VM by over utilising "
"Last Level Cache."
msgid ""
"Added the functionality to filter out instances which have metadata field "
"'optimize' set to False. For now, this is only available for the "
"basic_consolidation strategy (if \"check_optimize_metadata\" configuration "
"option is enabled)."
msgstr ""
"Added the functionality to filter out instances which have metadata field "
"'optimize' set to False. For now, this is only available for the "
"basic_consolidation strategy (if \"check_optimize_metadata\" configuration "
"option is enabled)."
msgid "Added using of JSONSchema instead of voluptuous to validate Actions."
msgstr "Added using of JSONSchema instead of voluptuous to validate Actions."
msgid "Added volume migrate action"
msgstr "Added volume migrate action"
msgid ""
"Adds audit scoper for storage data model, now watcher users can specify "
"audit scope for storage CDM in the same manner as compute scope."
msgstr ""
"Adds audit scoper for storage data model, now watcher users can specify "
"audit scope for storage CDM in the same manner as compute scope."
msgid "Adds baremetal data model in Watcher"
msgstr "Adds baremetal data model in Watcher"
msgid ""
"Allow decision engine to pass strategy parameters, like optimization "
"threshold, to selected strategy, also strategy to provide parameters info to "
"end user."
msgstr ""
"Allow decision engine to pass strategy parameters, like optimisation "
"threshold, to selected strategy, also strategy to provide parameters info to "
"end user."
msgid "Centralize all configuration options for Watcher."
msgstr "Centralise all configuration options for Watcher."
msgid "Contents:"
msgstr "Contents:"
msgid ""
"Copy all audit templates parameters into audit instead of having a reference "
"to the audit template."
msgstr ""
"Copy all audit templates parameters into audit instead of having a reference "
"to the audit template."
msgid "Current Series Release Notes"
msgstr "Current Series Release Notes"
msgid ""
"Each CDM collector can have its own CDM scoper now. This changed Scope JSON "
"schema definition for the audit template POST data. Please see audit "
"template create help message in python-watcherclient."
msgstr ""
"Each CDM collector can have its own CDM scoper now. This changed Scope JSON "
"schema definition for the audit template POST data. Please see audit "
"template create help message in python-watcherclient."
msgid ""
"Enhancement of vm_workload_consolidation strategy by using 'memory.resident' "
"metric in place of 'memory.usage', as memory.usage shows the memory usage "
"inside guest-os and memory.resident represents volume of RAM used by "
"instance on host machine."
msgstr ""
"Enhancement of vm_workload_consolidation strategy by using 'memory.resident' "
"metric in place of 'memory.usage', as memory.usage shows the memory usage "
"inside guest-os and memory.resident represents volume of RAM used by "
"instance on host machine."
msgid ""
"Existing workload_balance strategy based on the VM workloads of CPU. This "
"feature improves the strategy. By the input parameter \"metrics\", it makes "
"decision to migrate a VM base on CPU or memory utilization."
msgstr ""
"Existing workload_balance strategy based on the VM workloads of CPU. This "
"feature improves the strategy. By the input parameter \"metrics\", it makes "
"decision to migrate a VM base on CPU or memory utilisation."
msgid "New Features"
msgstr "New Features"
msgid "Newton Series Release Notes"
msgstr "Newton Series Release Notes"
msgid "Ocata Series Release Notes"
msgstr "Ocata Series Release Notes"
msgid "Pike Series Release Notes"
msgstr "Pike Series Release Notes"
msgid ""
"Provide a notification mechanism into Watcher that supports versioning. "
"Whenever a Watcher object is created, updated or deleted, a versioned "
"notification will, if it's relevant, be automatically sent to notify in "
"order to allow an event-driven style of architecture within Watcher. "
"Moreover, it will also give other services and/or 3rd party softwares (e.g. "
"monitoring solutions or rules engines) the ability to react to such events."
msgstr ""
"Provide a notification mechanism into Watcher that supports versioning. "
"Whenever a Watcher object is created, updated or deleted, a versioned "
"notification will, if it's relevant, be automatically sent to notify in "
"order to allow an event-driven style of architecture within Watcher. "
"Moreover, it will also give other services and/or 3rd party software (e.g. "
"monitoring solutions or rules engines) the ability to react to such events."
msgid ""
"Provides a generic way to define the scope of an audit. The set of audited "
"resources will be called \"Audit scope\" and will be defined in each audit "
"template (which contains the audit settings)."
msgstr ""
"Provides a generic way to define the scope of an audit. The set of audited "
"resources will be called \"Audit scope\" and will be defined in each audit "
"template (which contains the audit settings)."
msgid ""
"The graph model describes how VMs are associated to compute hosts. This "
"allows for seeing relationships upfront between the entities and hence can "
"be used to identify hot/cold spots in the data center and influence a "
"strategy decision."
msgstr ""
"The graph model describes how VMs are associated to compute hosts. This "
"allows for seeing relationships upfront between the entities and hence can "
"be used to identify hot/cold spots in the data centre and influence a "
"strategy decision."
msgid ""
"There is new ability to create Watcher continuous audits with cron interval. "
"It means you may use, for example, optional argument '--interval \"\\*/5 \\* "
"\\* \\* \\*\"' to launch audit every 5 minutes. These jobs are executed on a "
"best effort basis and therefore, we recommend you to use a minimal cron "
"interval of at least one minute."
msgstr ""
"There is new ability to create Watcher continuous audits with cron interval. "
"It means you may use, for example, optional argument '--interval \"\\*/5 \\* "
"\\* \\* \\*\"' to launch audit every 5 minutes. These jobs are executed on a "
"best effort basis and therefore, we recommend you to use a minimal cron "
"interval of at least one minute."
msgid ""
"Watcher can continuously optimize the OpenStack cloud for a specific "
"strategy or goal by triggering an audit periodically which generates an "
"action plan and run it automatically."
msgstr ""
"Watcher can continuously optimise the OpenStack cloud for a specific "
"strategy or goal by triggering an audit periodically which generates an "
"action plan and run it automatically."
msgid ""
"Watcher can now run specific actions in parallel improving the performances "
"dramatically when executing an action plan."
msgstr ""
"Watcher can now run specific actions in parallel improving the performance "
"dramatically when executing an action plan."
msgid "Watcher database can now be upgraded thanks to Alembic."
msgstr "Watcher database can now be upgraded thanks to Alembic."
msgid ""
"Watcher supports multiple metrics backend and relies on Ceilometer and "
"Monasca."
msgstr ""
"Watcher supports multiple metrics backend and relies on Ceilometer and "
"Monasca."
msgid "Welcome to watcher's Release Notes documentation!"
msgstr "Welcome to watcher's Release Notes documentation!"
msgid ""
"all Watcher objects have been refactored to support OVO (oslo."
"versionedobjects) which was a prerequisite step in order to implement "
"versioned notifications."
msgstr ""
"all Watcher objects have been refactored to support OVO (oslo."
"versionedobjects) which was a prerequisite step in order to implement "
"versioned notifications."

View File

@@ -7,7 +7,7 @@ skipsdist = True
usedevelop = True
whitelist_externals = find
rm
install_command = pip install -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages}
install_command = pip install -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=stable/queens} {opts} {packages}
setenv =
VIRTUAL_ENV={envdir}
deps = -r{toxinidir}/test-requirements.txt
@@ -55,7 +55,7 @@ filename = *.py,app.wsgi
show-source=True
ignore= H105,E123,E226,N320,H202
builtins= _
enable-extensions = H106,H203
enable-extensions = H106,H203,H904
exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build,*sqlalchemy/alembic/versions/*,demo/,releasenotes
[testenv:wheel]

View File

@@ -63,7 +63,7 @@ class ContextHook(hooks.PecanHook):
auth_url = headers.get('X-Auth-Url')
if auth_url is None:
importutils.import_module('keystonemiddleware.auth_token')
auth_url = cfg.CONF.keystone_authtoken.auth_uri
auth_url = cfg.CONF.keystone_authtoken.www_authenticate_uri
state.request.context = context.make_context(
auth_token=auth_token,

View File

@@ -113,8 +113,10 @@ class Migrate(base.BaseAction):
dest_hostname=destination)
except nova_helper.nvexceptions.ClientException as e:
LOG.debug("Nova client exception occurred while live "
"migrating instance %s.Exception: %s" %
(self.instance_uuid, e))
"migrating instance "
"%(instance)s.Exception: %(exception)s",
{'instance': self.instance_uuid, 'exception': e})
except Exception as e:
LOG.exception(e)
LOG.critical("Unexpected error occurred. Migration failed for "

View File

@@ -40,10 +40,10 @@ def main():
if host == '127.0.0.1':
LOG.info('serving on 127.0.0.1:%(port)s, '
'view at %(protocol)s://127.0.0.1:%(port)s' %
'view at %(protocol)s://127.0.0.1:%(port)s',
dict(protocol=protocol, port=port))
else:
LOG.info('serving on %(protocol)s://%(host)s:%(port)s' %
LOG.info('serving on %(protocol)s://%(host)s:%(port)s',
dict(protocol=protocol, host=host, port=port))
api_schedule = scheduling.APISchedulingService()

View File

@@ -139,13 +139,13 @@ class CinderHelper(object):
volume = self.get_volume(volume.id)
time.sleep(retry_interval)
retry -= 1
LOG.debug("retry count: %s" % retry)
LOG.debug("Waiting to complete deletion of volume %s" % volume.id)
LOG.debug("retry count: %s", retry)
LOG.debug("Waiting to complete deletion of volume %s", volume.id)
if self._can_get_volume(volume.id):
LOG.error("Volume deletion error: %s" % volume.id)
LOG.error("Volume deletion error: %s", volume.id)
return False
LOG.debug("Volume %s was deleted successfully." % volume.id)
LOG.debug("Volume %s was deleted successfully.", volume.id)
return True
def check_migrated(self, volume, retry_interval=10):
@@ -179,8 +179,7 @@ class CinderHelper(object):
LOG.error(error_msg)
return False
LOG.debug(
"Volume migration succeeded : "
"volume %s is now on host '%s'." % (
"Volume migration succeeded : volume %s is now on host '%s'.", (
volume.id, host_name))
return True
@@ -194,8 +193,8 @@ class CinderHelper(object):
message=(_("Volume type must be same for migrating")))
source_node = getattr(volume, 'os-vol-host-attr:host')
LOG.debug("Volume %s found on host '%s'."
% (volume.id, source_node))
LOG.debug("Volume %s found on host '%s'.",
(volume.id, source_node))
self.cinder.volumes.migrate_volume(
volume, dest_node, False, True)
@@ -211,8 +210,8 @@ class CinderHelper(object):
source_node = getattr(volume, 'os-vol-host-attr:host')
LOG.debug(
"Volume %s found on host '%s'." % (
volume.id, source_node))
"Volume %s found on host '%s'.",
(volume.id, source_node))
self.cinder.volumes.retype(
volume, dest_type, "on-demand")
@@ -234,14 +233,14 @@ class CinderHelper(object):
LOG.debug('Waiting volume creation of {0}'.format(new_volume))
time.sleep(retry_interval)
retry -= 1
LOG.debug("retry count: %s" % retry)
LOG.debug("retry count: %s", retry)
if getattr(new_volume, 'status') != 'available':
error_msg = (_("Failed to create volume '%(volume)s. ") %
{'volume': new_volume.id})
raise Exception(error_msg)
LOG.debug("Volume %s was created successfully." % new_volume)
LOG.debug("Volume %s was created successfully.", new_volume)
return new_volume
def delete_volume(self, volume):

View File

@@ -83,8 +83,10 @@ class OpenStackClients(object):
novaclient_version = self._get_client_option('nova', 'api_version')
nova_endpoint_type = self._get_client_option('nova', 'endpoint_type')
nova_region_name = self._get_client_option('nova', 'region_name')
self._nova = nvclient.Client(novaclient_version,
endpoint_type=nova_endpoint_type,
region_name=nova_region_name,
session=self.session)
return self._nova
@@ -96,8 +98,10 @@ class OpenStackClients(object):
glanceclient_version = self._get_client_option('glance', 'api_version')
glance_endpoint_type = self._get_client_option('glance',
'endpoint_type')
glance_region_name = self._get_client_option('glance', 'region_name')
self._glance = glclient.Client(glanceclient_version,
interface=glance_endpoint_type,
region_name=glance_region_name,
session=self.session)
return self._glance
@@ -110,8 +114,11 @@ class OpenStackClients(object):
'api_version')
gnocchiclient_interface = self._get_client_option('gnocchi',
'endpoint_type')
gnocchiclient_region_name = self._get_client_option('gnocchi',
'region_name')
adapter_options = {
"interface": gnocchiclient_interface
"interface": gnocchiclient_interface,
"region_name": gnocchiclient_region_name
}
self._gnocchi = gnclient.Client(gnocchiclient_version,
@@ -127,8 +134,10 @@ class OpenStackClients(object):
cinderclient_version = self._get_client_option('cinder', 'api_version')
cinder_endpoint_type = self._get_client_option('cinder',
'endpoint_type')
cinder_region_name = self._get_client_option('cinder', 'region_name')
self._cinder = ciclient.Client(cinderclient_version,
endpoint_type=cinder_endpoint_type,
region_name=cinder_region_name,
session=self.session)
return self._cinder
@@ -141,9 +150,12 @@ class OpenStackClients(object):
'api_version')
ceilometer_endpoint_type = self._get_client_option('ceilometer',
'endpoint_type')
ceilometer_region_name = self._get_client_option('ceilometer',
'region_name')
self._ceilometer = ceclient.get_client(
ceilometerclient_version,
endpoint_type=ceilometer_endpoint_type,
region_name=ceilometer_region_name,
session=self.session)
return self._ceilometer
@@ -156,6 +168,8 @@ class OpenStackClients(object):
'monasca', 'api_version')
monascaclient_interface = self._get_client_option(
'monasca', 'interface')
monascaclient_region = self._get_client_option(
'monasca', 'region_name')
token = self.session.get_token()
watcher_clients_auth_config = CONF.get(_CLIENTS_AUTH_GROUP)
service_type = 'monitoring'
@@ -172,7 +186,8 @@ class OpenStackClients(object):
'password': watcher_clients_auth_config.password,
}
endpoint = self.session.get_endpoint(service_type=service_type,
interface=monascaclient_interface)
interface=monascaclient_interface,
region_name=monascaclient_region)
self._monasca = monclient.Client(
monascaclient_version, endpoint, **monasca_kwargs)
@@ -188,9 +203,11 @@ class OpenStackClients(object):
'api_version')
neutron_endpoint_type = self._get_client_option('neutron',
'endpoint_type')
neutron_region_name = self._get_client_option('neutron', 'region_name')
self._neutron = netclient.Client(neutronclient_version,
endpoint_type=neutron_endpoint_type,
region_name=neutron_region_name,
session=self.session)
self._neutron.format = 'json'
return self._neutron
@@ -202,7 +219,9 @@ class OpenStackClients(object):
ironicclient_version = self._get_client_option('ironic', 'api_version')
endpoint_type = self._get_client_option('ironic', 'endpoint_type')
ironic_region_name = self._get_client_option('ironic', 'region_name')
self._ironic = irclient.get_client(ironicclient_version,
os_endpoint_type=endpoint_type,
region_name=ironic_region_name,
session=self.session)
return self._ironic

View File

@@ -305,7 +305,7 @@ class ActionFilterCombinationProhibited(Invalid):
class UnsupportedActionType(UnsupportedError):
msg_fmt = _("Provided %(action_type) is not supported yet")
msg_fmt = _("Provided %(action_type)s is not supported yet")
class EfficacyIndicatorNotFound(ResourceNotFound):

View File

@@ -72,7 +72,8 @@ class NovaHelper(object):
raise exception.ComputeNodeNotFound(name=node_hostname)
def get_instance_list(self):
return self.nova.servers.list(search_opts={'all_tenants': True})
return self.nova.servers.list(search_opts={'all_tenants': True},
limit=-1)
def get_flavor_list(self):
return self.nova.flavors.list(**{'is_public': None})
@@ -106,7 +107,7 @@ class NovaHelper(object):
return True
else:
LOG.debug("confirm resize failed for the "
"instance %s" % instance.id)
"instance %s", instance.id)
return False
def wait_for_volume_status(self, volume, status, timeout=60,
@@ -154,19 +155,20 @@ class NovaHelper(object):
"""
new_image_name = ""
LOG.debug(
"Trying a non-live migrate of instance '%s' " % instance_id)
"Trying a non-live migrate of instance '%s' ", instance_id)
# Looking for the instance to migrate
instance = self.find_instance(instance_id)
if not instance:
LOG.debug("Instance %s not found !" % instance_id)
LOG.debug("Instance %s not found !", instance_id)
return False
else:
# NOTE: If destination node is None call Nova API to migrate
# instance
host_name = getattr(instance, "OS-EXT-SRV-ATTR:host")
LOG.debug(
"Instance %s found on host '%s'." % (instance_id, host_name))
"Instance %(instance)s found on host '%(host)s'.",
{'instance': instance_id, 'host': host_name})
if dest_hostname is None:
previous_status = getattr(instance, 'status')
@@ -186,12 +188,12 @@ class NovaHelper(object):
return False
LOG.debug(
"cold migration succeeded : "
"instance %s is now on host '%s'." % (
"instance %s is now on host '%s'.", (
instance_id, new_hostname))
return True
else:
LOG.debug(
"cold migration for instance %s failed" % instance_id)
"cold migration for instance %s failed", instance_id)
return False
if not keep_original_image_name:
@@ -220,7 +222,7 @@ class NovaHelper(object):
for network_name, network_conf_obj in addresses.items():
LOG.debug(
"Extracting network configuration for network '%s'" %
"Extracting network configuration for network '%s'",
network_name)
network_names_list.append(network_name)
@@ -241,7 +243,7 @@ class NovaHelper(object):
stopped_ok = self.stop_instance(instance_id)
if not stopped_ok:
LOG.debug("Could not stop instance: %s" % instance_id)
LOG.debug("Could not stop instance: %s", instance_id)
return False
# Building the temporary image which will be used
@@ -251,7 +253,7 @@ class NovaHelper(object):
if not image_uuid:
LOG.debug(
"Could not build temporary image of instance: %s" %
"Could not build temporary image of instance: %s",
instance_id)
return False
@@ -299,8 +301,10 @@ class NovaHelper(object):
blocks.append(
block_device_mapping_v2_item)
LOG.debug("Detaching volume %s from instance: %s" % (
volume_id, instance_id))
LOG.debug(
"Detaching volume %(volume)s from "
"instance: %(instance)s",
{'volume': volume_id, 'instance': instance_id})
# volume.detach()
self.nova.volumes.delete_server_volume(instance_id,
volume_id)
@@ -308,11 +312,12 @@ class NovaHelper(object):
if not self.wait_for_volume_status(volume, "available", 5,
10):
LOG.debug(
"Could not detach volume %s from instance: %s" % (
volume_id, instance_id))
"Could not detach volume %(volume)s "
"from instance: %(instance)s",
{'volume': volume_id, 'instance': instance_id})
return False
except ciexceptions.NotFound:
LOG.debug("Volume '%s' not found " % image_id)
LOG.debug("Volume '%s' not found ", image_id)
return False
# We create the new instance from
@@ -331,18 +336,21 @@ class NovaHelper(object):
if not new_instance:
LOG.debug(
"Could not create new instance "
"for non-live migration of instance %s" % instance_id)
"for non-live migration of instance %s", instance_id)
return False
try:
LOG.debug("Detaching floating ip '%s' from instance %s" % (
floating_ip, instance_id))
LOG.debug(
"Detaching floating ip '%(floating_ip)s' "
"from instance %(instance)s",
{'floating_ip': floating_ip, 'instance': instance_id})
# We detach the floating ip from the current instance
instance.remove_floating_ip(floating_ip)
LOG.debug(
"Attaching floating ip '%s' to the new instance %s" % (
floating_ip, new_instance.id))
"Attaching floating ip '%(ip)s' to the new "
"instance %(id)s",
{'ip': floating_ip, 'id': new_instance.id})
# We attach the same floating ip to the new instance
new_instance.add_floating_ip(floating_ip)
@@ -354,12 +362,12 @@ class NovaHelper(object):
# Deleting the old instance (because no more useful)
delete_ok = self.delete_instance(instance_id)
if not delete_ok:
LOG.debug("Could not delete instance: %s" % instance_id)
LOG.debug("Could not delete instance: %s", instance_id)
return False
LOG.debug(
"Instance %s has been successfully migrated "
"to new host '%s' and its new id is %s." % (
"to new host '%s' and its new id is %s.", (
instance_id, new_host_name, new_instance.id))
return True
@@ -376,8 +384,10 @@ class NovaHelper(object):
:param instance_id: the unique id of the instance to resize.
:param flavor: the name or ID of the flavor to resize to.
"""
LOG.debug("Trying a resize of instance %s to flavor '%s'" % (
instance_id, flavor))
LOG.debug(
"Trying a resize of instance %(instance)s to "
"flavor '%(flavor)s'",
{'instance': instance_id, 'flavor': flavor})
# Looking for the instance to resize
instance = self.find_instance(instance_id)
@@ -394,17 +404,17 @@ class NovaHelper(object):
"instance %s. Exception: %s", instance_id, e)
if not flavor_id:
LOG.debug("Flavor not found: %s" % flavor)
LOG.debug("Flavor not found: %s", flavor)
return False
if not instance:
LOG.debug("Instance not found: %s" % instance_id)
LOG.debug("Instance not found: %s", instance_id)
return False
instance_status = getattr(instance, 'OS-EXT-STS:vm_state')
LOG.debug(
"Instance %s is in '%s' status." % (instance_id,
instance_status))
"Instance %(id)s is in '%(status)s' status.",
{'id': instance_id, 'status': instance_status})
instance.resize(flavor=flavor_id)
while getattr(instance,
@@ -442,17 +452,20 @@ class NovaHelper(object):
destination_node is None, nova scheduler choose
the destination host
"""
LOG.debug("Trying to live migrate instance %s " % (instance_id))
LOG.debug(
"Trying a live migrate instance %(instance)s ",
{'instance': instance_id})
# Looking for the instance to migrate
instance = self.find_instance(instance_id)
if not instance:
LOG.debug("Instance not found: %s" % instance_id)
LOG.debug("Instance not found: %s", instance_id)
return False
else:
host_name = getattr(instance, 'OS-EXT-SRV-ATTR:host')
LOG.debug(
"Instance %s found on host '%s'." % (instance_id, host_name))
"Instance %(instance)s found on host '%(host)s'.",
{'instance': instance_id, 'host': host_name})
# From nova api version 2.25(Mitaka release), the default value of
# block_migration is None which is mapped to 'auto'.
@@ -474,7 +487,7 @@ class NovaHelper(object):
if host_name != new_hostname and instance.status == 'ACTIVE':
LOG.debug(
"Live migration succeeded : "
"instance %s is now on host '%s'." % (
"instance %s is now on host '%s'.", (
instance_id, new_hostname))
return True
else:
@@ -485,7 +498,7 @@ class NovaHelper(object):
and retry:
instance = self.nova.servers.get(instance.id)
if not getattr(instance, 'OS-EXT-STS:task_state'):
LOG.debug("Instance task state: %s is null" % instance_id)
LOG.debug("Instance task state: %s is null", instance_id)
break
LOG.debug(
'Waiting the migration of {0} to {1}'.format(
@@ -501,13 +514,13 @@ class NovaHelper(object):
LOG.debug(
"Live migration succeeded : "
"instance %s is now on host '%s'." % (
instance_id, host_name))
"instance %(instance)s is now on host '%(host)s'.",
{'instance': instance_id, 'host': host_name})
return True
def abort_live_migrate(self, instance_id, source, destination, retry=240):
LOG.debug("Aborting live migration of instance %s" % instance_id)
LOG.debug("Aborting live migration of instance %s", instance_id)
migration = self.get_running_migration(instance_id)
if migration:
migration_id = getattr(migration[0], "id")
@@ -520,7 +533,7 @@ class NovaHelper(object):
LOG.exception(e)
else:
LOG.debug(
"No running migrations found for instance %s" % instance_id)
"No running migrations found for instance %s", instance_id)
while retry:
instance = self.nova.servers.get(instance_id)
@@ -585,7 +598,7 @@ class NovaHelper(object):
host = self.nova.hosts.get(hostname)
if not host:
LOG.debug("host not found: %s" % hostname)
LOG.debug("host not found: %s", hostname)
return False
else:
host[0].update(
@@ -607,18 +620,19 @@ class NovaHelper(object):
key-value pairs to associate to the image as metadata.
"""
LOG.debug(
"Trying to create an image from instance %s ..." % instance_id)
"Trying to create an image from instance %s ...", instance_id)
# Looking for the instance
instance = self.find_instance(instance_id)
if not instance:
LOG.debug("Instance not found: %s" % instance_id)
LOG.debug("Instance not found: %s", instance_id)
return None
else:
host_name = getattr(instance, 'OS-EXT-SRV-ATTR:host')
LOG.debug(
"Instance %s found on host '%s'." % (instance_id, host_name))
"Instance %(instance)s found on host '%(host)s'.",
{'instance': instance_id, 'host': host_name})
# We need to wait for an appropriate status
# of the instance before we can build an image from it
@@ -645,14 +659,15 @@ class NovaHelper(object):
if not image:
break
status = image.status
LOG.debug("Current image status: %s" % status)
LOG.debug("Current image status: %s", status)
if not image:
LOG.debug("Image not found: %s" % image_uuid)
LOG.debug("Image not found: %s", image_uuid)
else:
LOG.debug(
"Image %s successfully created for instance %s" % (
image_uuid, instance_id))
"Image %(image)s successfully created for "
"instance %(instance)s",
{'image': image_uuid, 'instance': instance_id})
return image_uuid
return None
@@ -661,16 +676,16 @@ class NovaHelper(object):
:param instance_id: the unique id of the instance to delete.
"""
LOG.debug("Trying to remove instance %s ..." % instance_id)
LOG.debug("Trying to remove instance %s ...", instance_id)
instance = self.find_instance(instance_id)
if not instance:
LOG.debug("Instance not found: %s" % instance_id)
LOG.debug("Instance not found: %s", instance_id)
return False
else:
self.nova.servers.delete(instance_id)
LOG.debug("Instance %s removed." % instance_id)
LOG.debug("Instance %s removed.", instance_id)
return True
def stop_instance(self, instance_id):
@@ -678,21 +693,21 @@ class NovaHelper(object):
:param instance_id: the unique id of the instance to stop.
"""
LOG.debug("Trying to stop instance %s ..." % instance_id)
LOG.debug("Trying to stop instance %s ...", instance_id)
instance = self.find_instance(instance_id)
if not instance:
LOG.debug("Instance not found: %s" % instance_id)
LOG.debug("Instance not found: %s", instance_id)
return False
elif getattr(instance, 'OS-EXT-STS:vm_state') == "stopped":
LOG.debug("Instance has been stopped: %s" % instance_id)
LOG.debug("Instance has been stopped: %s", instance_id)
return True
else:
self.nova.servers.stop(instance_id)
if self.wait_for_instance_state(instance, "stopped", 8, 10):
LOG.debug("Instance %s stopped." % instance_id)
LOG.debug("Instance %s stopped.", instance_id)
return True
else:
return False
@@ -733,11 +748,11 @@ class NovaHelper(object):
return False
while instance.status not in status_list and retry:
LOG.debug("Current instance status: %s" % instance.status)
LOG.debug("Current instance status: %s", instance.status)
time.sleep(sleep)
instance = self.nova.servers.get(instance.id)
retry -= 1
LOG.debug("Current instance status: %s" % instance.status)
LOG.debug("Current instance status: %s", instance.status)
return instance.status in status_list
def create_instance(self, node_id, inst_name="test", image_id=None,
@@ -753,26 +768,26 @@ class NovaHelper(object):
It returns the unique id of the created instance.
"""
LOG.debug(
"Trying to create new instance '%s' "
"from image '%s' with flavor '%s' ..." % (
inst_name, image_id, flavor_name))
"Trying to create new instance '%(inst)s' "
"from image '%(image)s' with flavor '%(flavor)s' ...",
{'inst': inst_name, 'image': image_id, 'flavor': flavor_name})
try:
self.nova.keypairs.findall(name=keypair_name)
except nvexceptions.NotFound:
LOG.debug("Key pair '%s' not found " % keypair_name)
LOG.debug("Key pair '%s' not found ", keypair_name)
return
try:
image = self.glance.images.get(image_id)
except glexceptions.NotFound:
LOG.debug("Image '%s' not found " % image_id)
LOG.debug("Image '%s' not found ", image_id)
return
try:
flavor = self.nova.flavors.find(name=flavor_name)
except nvexceptions.NotFound:
LOG.debug("Flavor '%s' not found " % flavor_name)
LOG.debug("Flavor '%s' not found ", flavor_name)
return
# Make sure all security groups exist
@@ -780,7 +795,7 @@ class NovaHelper(object):
group_id = self.get_security_group_id_from_name(sec_group_name)
if not group_id:
LOG.debug("Security group '%s' not found " % sec_group_name)
LOG.debug("Security group '%s' not found ", sec_group_name)
return
net_list = list()
@@ -789,7 +804,7 @@ class NovaHelper(object):
nic_id = self.get_network_id_from_name(network_name)
if not nic_id:
LOG.debug("Network '%s' not found " % network_name)
LOG.debug("Network '%s' not found ", network_name)
return
net_obj = {"net-id": nic_id}
net_list.append(net_obj)
@@ -815,14 +830,16 @@ class NovaHelper(object):
if create_new_floating_ip and instance.status == 'ACTIVE':
LOG.debug(
"Creating a new floating IP"
" for instance '%s'" % instance.id)
" for instance '%s'", instance.id)
# Creating floating IP for the new instance
floating_ip = self.nova.floating_ips.create()
instance.add_floating_ip(floating_ip)
LOG.debug("Instance %s associated to Floating IP '%s'" % (
instance.id, floating_ip.ip))
LOG.debug(
"Instance %(instance)s associated to "
"Floating IP '%(ip)s'",
{'instance': instance.id, 'ip': floating_ip.ip})
return instance
@@ -855,8 +872,9 @@ class NovaHelper(object):
def get_instances_by_node(self, host):
return [instance for instance in
self.nova.servers.list(search_opts={"all_tenants": True})
if self.get_hostname(instance) == host]
self.nova.servers.list(search_opts={"all_tenants": True,
"host": host},
limit=-1)]
def get_hostname(self, instance):
return str(getattr(instance, 'OS-EXT-SRV-ATTR:host'))
@@ -896,7 +914,7 @@ class NovaHelper(object):
LOG.debug('Waiting volume update to {0}'.format(new_volume))
time.sleep(retry_interval)
retry -= 1
LOG.debug("retry count: %s" % retry)
LOG.debug("retry count: %s", retry)
if getattr(new_volume, 'status') != "in-use":
LOG.error("Volume update retry timeout or error")
return False
@@ -904,5 +922,6 @@ class NovaHelper(object):
host_name = getattr(new_volume, "os-vol-host-attr:host")
LOG.debug(
"Volume update succeeded : "
"Volume %s is now on host '%s'." % (new_volume.id, host_name))
"Volume %s is now on host '%s'.",
(new_volume.id, host_name))
return True

View File

@@ -30,7 +30,10 @@ CEILOMETER_CLIENT_OPTS = [
default='internalURL',
help='Type of endpoint to use in ceilometerclient.'
'Supported values: internalURL, publicURL, adminURL'
'The default is internalURL.')]
'The default is internalURL.'),
cfg.StrOpt('region_name',
help='Region in Identity service catalog to use for '
'communication with the OpenStack service.')]
def register_opts(conf):

View File

@@ -29,7 +29,10 @@ CINDER_CLIENT_OPTS = [
default='publicURL',
help='Type of endpoint to use in cinderclient.'
'Supported values: internalURL, publicURL, adminURL'
'The default is publicURL.')]
'The default is publicURL.'),
cfg.StrOpt('region_name',
help='Region in Identity service catalog to use for '
'communication with the OpenStack service.')]
def register_opts(conf):

View File

@@ -29,7 +29,10 @@ GLANCE_CLIENT_OPTS = [
default='publicURL',
help='Type of endpoint to use in glanceclient.'
'Supported values: internalURL, publicURL, adminURL'
'The default is publicURL.')]
'The default is publicURL.'),
cfg.StrOpt('region_name',
help='Region in Identity service catalog to use for '
'communication with the OpenStack service.')]
def register_opts(conf):

View File

@@ -30,6 +30,9 @@ GNOCCHI_CLIENT_OPTS = [
help='Type of endpoint to use in gnocchi client.'
'Supported values: internal, public, admin'
'The default is public.'),
cfg.StrOpt('region_name',
help='Region in Identity service catalog to use for '
'communication with the OpenStack service.'),
cfg.IntOpt('query_max_retries',
default=10,
help='How many times Watcher is trying to query again'),

View File

@@ -29,7 +29,10 @@ IRONIC_CLIENT_OPTS = [
default='publicURL',
help='Type of endpoint to use in ironicclient.'
'Supported values: internalURL, publicURL, adminURL'
'The default is publicURL.')]
'The default is publicURL.'),
cfg.StrOpt('region_name',
help='Region in Identity service catalog to use for '
'communication with the OpenStack service.')]
def register_opts(conf):

View File

@@ -29,7 +29,10 @@ MONASCA_CLIENT_OPTS = [
default='internal',
help='Type of interface used for monasca endpoint.'
'Supported values: internal, public, admin'
'The default is internal.')]
'The default is internal.'),
cfg.StrOpt('region_name',
help='Region in Identity service catalog to use for '
'communication with the OpenStack service.')]
def register_opts(conf):

View File

@@ -29,7 +29,10 @@ NEUTRON_CLIENT_OPTS = [
default='publicURL',
help='Type of endpoint to use in neutronclient.'
'Supported values: internalURL, publicURL, adminURL'
'The default is publicURL.')]
'The default is publicURL.'),
cfg.StrOpt('region_name',
help='Region in Identity service catalog to use for '
'communication with the OpenStack service.')]
def register_opts(conf):

View File

@@ -29,7 +29,10 @@ NOVA_CLIENT_OPTS = [
default='publicURL',
help='Type of endpoint to use in novaclient.'
'Supported values: internalURL, publicURL, adminURL'
'The default is publicURL.')]
'The default is publicURL.'),
cfg.StrOpt('region_name',
help='Region in Identity service catalog to use for '
'communication with the OpenStack service.')]
def register_opts(conf):

View File

@@ -48,7 +48,7 @@ class AuditEndpoint(object):
self._oneshot_handler.execute(audit, context)
def trigger_audit(self, context, audit_uuid):
LOG.debug("Trigger audit %s" % audit_uuid)
LOG.debug("Trigger audit %s", audit_uuid)
self.executor.submit(self.do_trigger_audit,
context,
audit_uuid)

View File

@@ -255,7 +255,7 @@ class CapacityNotificationEndpoint(CinderNotification):
ctxt.request_id = metadata['message_id']
ctxt.project_domain = event_type
LOG.info("Event '%(event)s' received from %(publisher)s "
"with metadata %(metadata)s" %
"with metadata %(metadata)s",
dict(event=event_type,
publisher=publisher_id,
metadata=metadata))
@@ -286,7 +286,7 @@ class VolumeCreateEnd(VolumeNotificationEndpoint):
ctxt.request_id = metadata['message_id']
ctxt.project_domain = event_type
LOG.info("Event '%(event)s' received from %(publisher)s "
"with metadata %(metadata)s" %
"with metadata %(metadata)s",
dict(event=event_type,
publisher=publisher_id,
metadata=metadata))
@@ -311,7 +311,7 @@ class VolumeUpdateEnd(VolumeNotificationEndpoint):
ctxt.request_id = metadata['message_id']
ctxt.project_domain = event_type
LOG.info("Event '%(event)s' received from %(publisher)s "
"with metadata %(metadata)s" %
"with metadata %(metadata)s",
dict(event=event_type,
publisher=publisher_id,
metadata=metadata))
@@ -369,7 +369,7 @@ class VolumeDeleteEnd(VolumeNotificationEndpoint):
ctxt.request_id = metadata['message_id']
ctxt.project_domain = event_type
LOG.info("Event '%(event)s' received from %(publisher)s "
"with metadata %(metadata)s" %
"with metadata %(metadata)s",
dict(event=event_type,
publisher=publisher_id,
metadata=metadata))

View File

@@ -229,7 +229,7 @@ class ServiceUpdated(VersionedNotificationEndpoint):
ctxt.request_id = metadata['message_id']
ctxt.project_domain = event_type
LOG.info("Event '%(event)s' received from %(publisher)s "
"with metadata %(metadata)s" %
"with metadata %(metadata)s",
dict(event=event_type,
publisher=publisher_id,
metadata=metadata))
@@ -275,7 +275,7 @@ class InstanceCreated(VersionedNotificationEndpoint):
ctxt.request_id = metadata['message_id']
ctxt.project_domain = event_type
LOG.info("Event '%(event)s' received from %(publisher)s "
"with metadata %(metadata)s" %
"with metadata %(metadata)s",
dict(event=event_type,
publisher=publisher_id,
metadata=metadata))
@@ -310,7 +310,7 @@ class InstanceUpdated(VersionedNotificationEndpoint):
ctxt.request_id = metadata['message_id']
ctxt.project_domain = event_type
LOG.info("Event '%(event)s' received from %(publisher)s "
"with metadata %(metadata)s" %
"with metadata %(metadata)s",
dict(event=event_type,
publisher=publisher_id,
metadata=metadata))
@@ -337,7 +337,7 @@ class InstanceDeletedEnd(VersionedNotificationEndpoint):
ctxt.request_id = metadata['message_id']
ctxt.project_domain = event_type
LOG.info("Event '%(event)s' received from %(publisher)s "
"with metadata %(metadata)s" %
"with metadata %(metadata)s",
dict(event=event_type,
publisher=publisher_id,
metadata=metadata))
@@ -372,7 +372,7 @@ class LegacyInstanceUpdated(UnversionedNotificationEndpoint):
ctxt.request_id = metadata['message_id']
ctxt.project_domain = event_type
LOG.info("Event '%(event)s' received from %(publisher)s "
"with metadata %(metadata)s" %
"with metadata %(metadata)s",
dict(event=event_type,
publisher=publisher_id,
metadata=metadata))
@@ -399,7 +399,7 @@ class LegacyInstanceCreatedEnd(UnversionedNotificationEndpoint):
ctxt.request_id = metadata['message_id']
ctxt.project_domain = event_type
LOG.info("Event '%(event)s' received from %(publisher)s "
"with metadata %(metadata)s" %
"with metadata %(metadata)s",
dict(event=event_type,
publisher=publisher_id,
metadata=metadata))
@@ -426,7 +426,7 @@ class LegacyInstanceDeletedEnd(UnversionedNotificationEndpoint):
ctxt.request_id = metadata['message_id']
ctxt.project_domain = event_type
LOG.info("Event '%(event)s' received from %(publisher)s "
"with metadata %(metadata)s" %
"with metadata %(metadata)s",
dict(event=event_type,
publisher=publisher_id,
metadata=metadata))
@@ -459,7 +459,7 @@ class LegacyLiveMigratedEnd(UnversionedNotificationEndpoint):
ctxt.request_id = metadata['message_id']
ctxt.project_domain = event_type
LOG.info("Event '%(event)s' received from %(publisher)s "
"with metadata %(metadata)s" %
"with metadata %(metadata)s",
dict(event=event_type,
publisher=publisher_id,
metadata=metadata))
@@ -486,7 +486,7 @@ class LegacyInstanceResizeConfirmEnd(UnversionedNotificationEndpoint):
ctxt.request_id = metadata['message_id']
ctxt.project_domain = event_type
LOG.info("Event '%(event)s' received from %(publisher)s "
"with metadata %(metadata)s" %
"with metadata %(metadata)s",
dict(event=event_type,
publisher=publisher_id,
metadata=metadata))
@@ -513,7 +513,7 @@ class LegacyInstanceRebuildEnd(UnversionedNotificationEndpoint):
ctxt.request_id = metadata['message_id']
ctxt.project_domain = event_type
LOG.info("Event '%(event)s' received from %(publisher)s "
"with metadata %(metadata)s" %
"with metadata %(metadata)s",
dict(event=event_type,
publisher=publisher_id,
metadata=metadata))

View File

@@ -91,16 +91,16 @@ def _reload_scoring_engines(refresh=False):
for name in engines.keys():
se_impl = default.DefaultScoringLoader().load(name)
LOG.debug("Found Scoring Engine plugin: %s" % se_impl.get_name())
LOG.debug("Found Scoring Engine plugin: %s", se_impl.get_name())
_scoring_engine_map[se_impl.get_name()] = se_impl
engine_containers = \
default.DefaultScoringContainerLoader().list_available()
for container_id, container_cls in engine_containers.items():
LOG.debug("Found Scoring Engine container plugin: %s" %
LOG.debug("Found Scoring Engine container plugin: %s",
container_id)
for se in container_cls.get_scoring_engine_list():
LOG.debug("Found Scoring Engine plugin: %s" %
LOG.debug("Found Scoring Engine plugin: %s",
se.get_name())
_scoring_engine_map[se.get_name()] = se

View File

@@ -277,7 +277,7 @@ class BasicConsolidation(base.ServerConsolidationBaseStrategy):
resource_id = "%s_%s" % (node.uuid, node.hostname)
LOG.error(
"No values returned by %(resource_id)s "
"for %(metric_name)s" % dict(
"for %(metric_name)s", dict(
resource_id=resource_id,
metric_name=self.METRIC_NAMES[
self.config.datasource]['host_cpu_usage']))
@@ -297,7 +297,7 @@ class BasicConsolidation(base.ServerConsolidationBaseStrategy):
if instance_cpu_utilization is None:
LOG.error(
"No values returned by %(resource_id)s "
"for %(metric_name)s" % dict(
"for %(metric_name)s", dict(
resource_id=instance.uuid,
metric_name=self.METRIC_NAMES[
self.config.datasource]['instance_cpu_usage']))

View File

@@ -199,10 +199,10 @@ class NoisyNeighbor(base.NoisyNeighborBaseStrategy):
hosts_need_release[node.uuid] = {
'priority_vm': potential_priority_instance,
'noisy_vm': potential_noisy_instance}
LOG.debug("Priority VM found: %s" % (
potential_priority_instance.uuid))
LOG.debug("Noisy VM found: %s" % (
potential_noisy_instance.uuid))
LOG.debug("Priority VM found: %s",
potential_priority_instance.uuid)
LOG.debug("Noisy VM found: %s",
potential_noisy_instance.uuid)
loop_break_flag = True
break

View File

@@ -194,7 +194,8 @@ class OutletTempControl(base.ThermalOptimizationBaseStrategy):
LOG.warning("%s: no outlet temp data", resource_id)
continue
LOG.debug("%s: outlet temperature %f" % (resource_id, outlet_temp))
LOG.debug("%(resource)s: outlet temperature %(temp)f",
{'resource': resource_id, 'temp': outlet_temp})
instance_data = {'node': node, 'outlet_temp': outlet_temp}
if outlet_temp >= self.threshold:
# mark the node to release resources

View File

@@ -318,7 +318,8 @@ class UniformAirflow(base.BaseStrategy):
LOG.warning("%s: no airflow data", resource_id)
continue
LOG.debug("%s: airflow %f" % (resource_id, airflow))
LOG.debug("%(resource)s: airflow %(airflow)f",
{'resource': resource_id, 'airflow': airflow})
nodemap = {'node': node, 'airflow': airflow}
if airflow >= self.threshold_airflow:
# mark the node to release resources

View File

@@ -168,7 +168,7 @@ class VMWorkloadConsolidation(base.ServerConsolidationBaseStrategy):
return instance.state.value
else:
LOG.error('Unexpected instance state type, '
'state=%(state)s, state_type=%(st)s.' %
'state=%(state)s, state_type=%(st)s.',
dict(state=instance.state,
st=type(instance.state)))
raise exception.WatcherException
@@ -184,7 +184,7 @@ class VMWorkloadConsolidation(base.ServerConsolidationBaseStrategy):
return node.status.value
else:
LOG.error('Unexpected node status type, '
'status=%(status)s, status_type=%(st)s.' %
'status=%(status)s, status_type=%(st)s.',
dict(status=node.status,
st=type(node.status)))
raise exception.WatcherException
@@ -233,7 +233,7 @@ class VMWorkloadConsolidation(base.ServerConsolidationBaseStrategy):
# migration mechanism to move non active VMs.
LOG.error(
'Cannot live migrate: instance_uuid=%(instance_uuid)s, '
'state=%(instance_state)s.' % dict(
'state=%(instance_state)s.', dict(
instance_uuid=instance.uuid,
instance_state=instance_state_str))
return

View File

@@ -203,7 +203,7 @@ class WorkloadStabilization(base.WorkloadStabilizationBaseStrategy):
if avg_meter is None:
LOG.warning(
"No values returned by %(resource_id)s "
"for %(metric_name)s" % dict(
"for %(metric_name)s", dict(
resource_id=instance.uuid, metric_name=meter))
return
if meter == 'cpu_util':
@@ -375,12 +375,12 @@ class WorkloadStabilization(base.WorkloadStabilizationBaseStrategy):
normalized_load = self.normalize_hosts_load(hosts_load)
for metric in self.metrics:
metric_sd = self.get_sd(normalized_load, metric)
LOG.info("Standard deviation for %s is %s."
% (metric, metric_sd))
LOG.info("Standard deviation for %s is %s.",
(metric, metric_sd))
if metric_sd > float(self.thresholds[metric]):
LOG.info("Standard deviation of %s exceeds"
" appropriate threshold %s."
% (metric, metric_sd))
" appropriate threshold %s.",
(metric, metric_sd))
return self.simulate_migrations(hosts_load)
def add_migration(self,

View File

@@ -312,7 +312,7 @@ class ZoneMigration(base.ZoneMigrationBaseStrategy):
else:
self.instances_migration(targets, action_counter)
LOG.debug("action total: %s, pools: %s, nodes %s " % (
LOG.debug("action total: %s, pools: %s, nodes %s ", (
action_counter.total_count,
action_counter.per_pool_count,
action_counter.per_node_count))
@@ -413,13 +413,13 @@ class ZoneMigration(base.ZoneMigrationBaseStrategy):
pool = getattr(volume, 'os-vol-host-attr:host')
if action_counter.is_pool_max(pool):
LOG.debug("%s has objects to be migrated, but it has"
" reached the limit of parallelization." % pool)
" reached the limit of parallelization.", pool)
continue
src_type = volume.volume_type
dst_pool, dst_type = self.get_dst_pool_and_type(pool, src_type)
LOG.debug(src_type)
LOG.debug("%s %s" % (dst_pool, dst_type))
LOG.debug("%s %s", (dst_pool, dst_type))
if self.is_available(volume):
if src_type == dst_type:
@@ -448,7 +448,7 @@ class ZoneMigration(base.ZoneMigrationBaseStrategy):
if action_counter.is_node_max(src_node):
LOG.debug("%s has objects to be migrated, but it has"
" reached the limit of parallelization." % src_node)
" reached the limit of parallelization.", src_node)
continue
dst_node = self.get_dst_node(src_node)
@@ -643,7 +643,7 @@ class ActionCounter(object):
if not self.is_total_max() and not self.is_pool_max(pool):
self.per_pool_count[pool] += 1
self.total_count += 1
LOG.debug("total: %s, per_pool: %s" % (
LOG.debug("total: %s, per_pool: %s", (
self.total_count, self.per_pool_count))
return True
return False
@@ -660,7 +660,7 @@ class ActionCounter(object):
if not self.is_total_max() and not self.is_node_max(node):
self.per_node_count[node] += 1
self.total_count += 1
LOG.debug("total: %s, per_node: %s" % (
LOG.debug("total: %s, per_node: %s", (
self.total_count, self.per_node_count))
return True
return False
@@ -679,9 +679,9 @@ class ActionCounter(object):
"""
if pool not in self.per_pool_count:
self.per_pool_count[pool] = 0
LOG.debug("the number of parallel per pool %s is %s " %
LOG.debug("the number of parallel per pool %s is %s ",
(pool, self.per_pool_count[pool]))
LOG.debug("per pool limit is %s" % self.per_pool_limit)
LOG.debug("per pool limit is %s", self.per_pool_limit)
return self.per_pool_count[pool] >= self.per_pool_limit
def is_node_max(self, node):
@@ -724,7 +724,7 @@ class BaseFilter(object):
for k, v in six.iteritems(targets):
if not self.is_allowed(k):
continue
LOG.debug("filter:%s with the key: %s" % (cond, k))
LOG.debug("filter:%s with the key: %s", (cond, k))
targets[k] = self.exec_filter(v, cond)
LOG.debug(targets)
@@ -778,7 +778,7 @@ class ProjectSortFilter(SortMovingToFrontFilter):
"""
project_id = self.get_project_id(item)
LOG.debug("project_id: %s, sort_key: %s" % (project_id, sort_key))
LOG.debug("project_id: %s, sort_key: %s", (project_id, sort_key))
return project_id == sort_key
def get_project_id(self, item):
@@ -812,7 +812,7 @@ class ComputeHostSortFilter(SortMovingToFrontFilter):
"""
host = self.get_host(item)
LOG.debug("host: %s, sort_key: %s" % (host, sort_key))
LOG.debug("host: %s, sort_key: %s", (host, sort_key))
return host == sort_key
def get_host(self, item):
@@ -840,7 +840,7 @@ class StorageHostSortFilter(SortMovingToFrontFilter):
"""
host = self.get_host(item)
LOG.debug("host: %s, sort_key: %s" % (host, sort_key))
LOG.debug("host: %s, sort_key: %s", (host, sort_key))
return host == sort_key
def get_host(self, item):
@@ -867,7 +867,7 @@ class ComputeSpecSortFilter(BaseFilter):
result = items
if sort_key not in self.accept_keys:
LOG.warning("Invalid key is specified: %s" % sort_key)
LOG.warning("Invalid key is specified: %s", sort_key)
else:
result = self.get_sorted_items(items, sort_key)
@@ -912,11 +912,11 @@ class ComputeSpecSortFilter(BaseFilter):
:returns: memory size of item
"""
LOG.debug("item: %s, flavors: %s" % (item, flavors))
LOG.debug("item: %s, flavors: %s", (item, flavors))
for flavor in flavors:
LOG.debug("item.flavor: %s, flavor: %s" % (item.flavor, flavor))
LOG.debug("item.flavor: %s, flavor: %s", (item.flavor, flavor))
if item.flavor.get('id') == flavor.id:
LOG.debug("flavor.ram: %s" % flavor.ram)
LOG.debug("flavor.ram: %s", flavor.ram)
return flavor.ram
def get_vcpu_num(self, item, flavors):
@@ -927,11 +927,11 @@ class ComputeSpecSortFilter(BaseFilter):
:returns: vcpu number of item
"""
LOG.debug("item: %s, flavors: %s" % (item, flavors))
LOG.debug("item: %s, flavors: %s", (item, flavors))
for flavor in flavors:
LOG.debug("item.flavor: %s, flavor: %s" % (item.flavor, flavor))
LOG.debug("item.flavor: %s, flavor: %s", (item.flavor, flavor))
if item.flavor.get('id') == flavor.id:
LOG.debug("flavor.vcpus: %s" % flavor.vcpus)
LOG.debug("flavor.vcpus: %s", flavor.vcpus)
return flavor.vcpus
def get_disk_size(self, item, flavors):
@@ -942,11 +942,11 @@ class ComputeSpecSortFilter(BaseFilter):
:returns: disk size of item
"""
LOG.debug("item: %s, flavors: %s" % (item, flavors))
LOG.debug("item: %s, flavors: %s", (item, flavors))
for flavor in flavors:
LOG.debug("item.flavor: %s, flavor: %s" % (item.flavor, flavor))
LOG.debug("item.flavor: %s, flavor: %s", (item.flavor, flavor))
if item.flavor.get('id') == flavor.id:
LOG.debug("flavor.disk: %s" % flavor.disk)
LOG.debug("flavor.disk: %s", flavor.disk)
return flavor.disk
@@ -960,7 +960,7 @@ class StorageSpecSortFilter(BaseFilter):
result = items
if sort_key not in self.accept_keys:
LOG.warning("Invalid key is specified: %s" % sort_key)
LOG.warning("Invalid key is specified: %s", sort_key)
return result
if sort_key == 'created_at':

View File

@@ -0,0 +1,866 @@
# 265
# Andreas Jaeger <jaegerandi@gmail.com>, 2018. #zanata
# Frank Kloeker <eumel@arcor.de>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: watcher VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2018-02-12 10:48+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-03-02 09:00+0000\n"
"Last-Translator: Andreas Jaeger <jaegerandi@gmail.com>\n"
"Language-Team: German\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"X-Generator: Zanata 4.3.3\n"
msgid " (may include orphans)"
msgstr "(kann Waisen einschließen)"
msgid " (orphans excluded)"
msgstr "(Waisen ausgeschlossen)"
#, python-format
msgid "%(client)s connection failed. Reason: %(reason)s"
msgstr "Die Verbindung von %(client)s ist fehlgeschlagen. Grund: %(reason)s"
#, python-format
msgid "%(field)s can't be updated."
msgstr "%(field)s kann nicht aktualisiert werden."
#, python-format
msgid "%(parameter)s has to be of type %(parameter_type)s"
msgstr "%(parameter)s muss vom Typ %(parameter_type)s sein"
#, python-format
msgid "%s is not JSON serializable"
msgstr "%s ist nicht JSON serialisierbar"
#, python-format
msgid ""
"'%(strategy)s' strategy does relate to the '%(goal)s' goal. Possible "
"choices: %(choices)s"
msgstr ""
"Die Strategie '%(strategy)s' bezieht sich auf das Ziel'%(goal)s'. Mögliche "
"Auswahlmöglichkeiten: %(choices)s"
#, python-format
msgid "'%s' is a mandatory attribute and can not be removed"
msgstr "'%s' ist ein obligatorisches Attribut und kann nicht entfernt werden"
#, python-format
msgid "'%s' is an internal attribute and can not be updated"
msgstr "'%s' ist ein internes Attribut und kann nicht aktualisiert werden"
msgid "'add' and 'replace' operations needs value"
msgstr "'add' und 'replace' Operationen benötigt Wert"
msgid "'obj' argument type is not valid"
msgstr "Der Argumenttyp 'obj' ist nicht gültig"
#, python-format
msgid "'obj' argument type is not valid: %s"
msgstr "Der Argumenttyp 'obj' ist nicht gültig: %s"
#, python-format
msgid "A datetime.datetime is required here. Got %s"
msgstr "Eine datetime.datetime ist hier erforderlich. Bekam %s"
#, python-format
msgid "A goal with UUID %(uuid)s already exists"
msgstr "Ein Ziel mit UUID %(uuid)s ist bereits vorhanden"
#, python-format
msgid "A scoring engine with UUID %(uuid)s already exists"
msgstr "Eine Scoring-Engine mit UUID %(uuid)s ist bereits vorhanden"
#, python-format
msgid "A service with name %(name)s is already working on %(host)s."
msgstr "Ein Dienst mit dem Namen %(name)s arbeitet bereits auf %(host)s."
#, python-format
msgid "A strategy with UUID %(uuid)s already exists"
msgstr "Eine Strategie mit UUID %(uuid)s ist bereits vorhanden"
msgid "A valid goal_id or audit_template_id must be provided"
msgstr "Eine gültige goal_id oder audit_template_id muss angegeben werden"
#, python-format
msgid "Action %(action)s could not be found"
msgstr "Aktion %(action)s konnte nicht gefunden werden"
#, python-format
msgid "Action %(action)s was not eagerly loaded"
msgstr "Aktion %(action)s wurde nicht eifrig geladen"
#, python-format
msgid "Action Plan %(action_plan)s is currently running."
msgstr "Der Aktionsplan %(action_plan)s wird gerade ausgeführt."
#, python-format
msgid "Action Plan %(action_plan)s is referenced by one or multiple actions"
msgstr ""
"Der Aktionsplan %(action_plan)s wird durch eine oder mehrere Aktionen "
"referenziert"
#, python-format
msgid "Action Plan with UUID %(uuid)s is cancelled by user"
msgstr "Der Aktionsplan mit der UUID %(uuid)s wird vom Benutzer abgebrochen"
msgid "Action Plans"
msgstr "Aktionspläne"
#, python-format
msgid "Action plan %(action_plan)s is invalid"
msgstr "Der Aktionsplan %(action_plan)s ist ungültig"
#, python-format
msgid "Action plan %(action_plan)s is referenced by one or multiple goals"
msgstr ""
"Der Aktionsplan %(action_plan)s wird von einem oder mehreren Zielen "
"referenziert"
#, python-format
msgid "Action plan %(action_plan)s was not eagerly loaded"
msgstr "Der Aktionsplan %(action_plan)s wurde nicht eifrig geladen"
#, python-format
msgid "ActionPlan %(action_plan)s could not be found"
msgstr "ActionPlan %(action_plan)s konnte nicht gefunden werden"
msgid "Actions"
msgstr "Aktionen"
msgid "Actuator"
msgstr "Betätiger"
#, python-format
msgid "Adding a new attribute (%s) to the root of the resource is not allowed"
msgstr ""
"Das Hinzufügen eines neuen Attributs (%s) zum Stamm der Ressource ist nicht "
"zulässig"
msgid "Airflow Optimization"
msgstr "Luftstrom-Optimierung"
#, python-format
msgid "An action description with type %(action_type)s is already exist."
msgstr ""
"Eine Aktionsbeschreibung vom Typ %(action_type)s ist bereits vorhanden."
#, python-format
msgid "An action plan with UUID %(uuid)s already exists"
msgstr "Ein Aktionsplan mit UUID %(uuid)s ist bereits vorhanden"
#, python-format
msgid "An action with UUID %(uuid)s already exists"
msgstr "Eine Aktion mit UUID %(uuid)s ist bereits vorhanden"
#, python-format
msgid "An audit with UUID or name %(audit)s already exists"
msgstr "Ein Audit mit UUID oder Name %(audit)s ist bereits vorhanden"
#, python-format
msgid "An audit_template with UUID or name %(audit_template)s already exists"
msgstr ""
"Ein Audit_Template mit UUID oder Name %(audit_template)s ist bereits "
"vorhanden"
msgid "An indicator value should be a number"
msgstr "Ein Indikatorwert sollte eine Zahl sein"
#, python-format
msgid "An object of class %s is required here"
msgstr "Ein Objekt der Klasse %s ist hier erforderlich"
msgid "An unknown exception occurred"
msgstr "Eine unbekannte Ausnahme ist aufgetreten"
msgid "At least one feature is required"
msgstr "Mindestens eine Funktion ist erforderlich"
#, python-format
msgid "Audit %(audit)s could not be found"
msgstr "Audit %(audit)s konnte nicht gefunden werden"
#, python-format
msgid "Audit %(audit)s is invalid"
msgstr "Audit %(audit)s ist ungültig"
#, python-format
msgid "Audit %(audit)s is referenced by one or multiple action plans"
msgstr ""
"Audit %(audit)s wird von einem oder mehreren Aktionsplänen referenziert"
#, python-format
msgid "Audit %(audit)s was not eagerly loaded"
msgstr "Audit %(audit)s wurde nicht eifrig geladen"
msgid "Audit Templates"
msgstr "Prüfungsvorlagen"
#, python-format
msgid "Audit parameter %(parameter)s are not allowed"
msgstr "Prüfparameter %(parameter)s sind nicht erlaubt"
#, python-format
msgid "Audit type %(audit_type)s could not be found"
msgstr "Audit-Typ %(audit_type)s konnte nicht gefunden werden"
#, python-format
msgid "AuditTemplate %(audit_template)s could not be found"
msgstr "AuditTemplate %(audit_template)s konnte nicht gefunden werden"
#, python-format
msgid ""
"AuditTemplate %(audit_template)s is referenced by one or multiple audits"
msgstr ""
"AuditTemplate %(audit_template)s wird von einem oder mehreren Audits "
"referenziert"
msgid "Audits"
msgstr "Audits"
msgid "Basic offline consolidation"
msgstr "Grundlegende Offline-Konsolidierung"
msgid "CDMCs"
msgstr "CDMCs"
msgid "Cannot compile public API routes"
msgstr "Öffentliche API-Routen können nicht kompiliert werden"
msgid "Cannot create an action directly"
msgstr "Eine Aktion kann nicht direkt erstellt werden"
msgid "Cannot delete an action directly"
msgstr "Eine Aktion kann nicht direkt gelöscht werden"
msgid "Cannot modify an action directly"
msgstr "Eine Aktion kann nicht direkt geändert werden"
msgid "Cannot overwrite UUID for an existing Action Plan."
msgstr ""
"UUID für einen vorhandenen Aktionsplan kann nicht überschrieben werden."
msgid "Cannot overwrite UUID for an existing Action."
msgstr "UUID kann für eine vorhandene Aktion nicht überschrieben werden."
msgid "Cannot overwrite UUID for an existing Audit Template."
msgstr "UUID für eine vorhandene Auditvorlage kann nicht überschrieben werden."
msgid "Cannot overwrite UUID for an existing Audit."
msgstr "UUID für ein vorhandenes Audit kann nicht überschrieben werden."
msgid "Cannot overwrite UUID for an existing Goal."
msgstr "UUID für ein vorhandenes Ziel kann nicht überschrieben werden."
msgid "Cannot overwrite UUID for an existing Scoring Engine."
msgstr ""
"UUID für eine vorhandene Scoring Engine kann nicht überschrieben werden."
msgid "Cannot overwrite UUID for an existing Strategy."
msgstr "UUID kann für eine vorhandene Strategie nicht überschrieben werden."
msgid "Cannot overwrite UUID for an existing efficacy indicator."
msgstr ""
"UUID kann für einen vorhandenen Wirksamkeitsindikator nicht überschrieben "
"werden."
msgid "Cannot remove 'goal' attribute from an audit template"
msgstr "Das Attribut 'goal' kann nicht aus einer Audit-Vorlage entfernt werden"
msgid "Conflict"
msgstr "Konflikt"
#, python-format
msgid ""
"Could not compute the global efficacy for the '%(goal)s' goal using the "
"'%(strategy)s' strategy."
msgstr ""
"Die globale Wirksamkeit für das Ziel '%(goal)s' konnte nicht mit der "
"Strategie '%(strategy)s' berechnet werden."
#, python-format
msgid "Could not load any strategy for goal %(goal)s"
msgstr "Konnte keine Strategie für Ziel %(goal)s laden"
#, python-format
msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s"
msgstr "Patch '%(patch)s' konnte nicht angewendet werden. Grund:%(reason)s"
#, python-format
msgid "Couldn't delete when state is '%(state)s'."
msgstr "Konnte nicht gelöscht werden, wenn der Status '%(state)s' ist."
#, python-format
msgid "Datasource %(datasource)s is not available."
msgstr "Datenquelle %(datasource)s ist nicht verfügbar."
#, python-format
msgid "Datasource %(datasource)s is not supported by strategy %(strategy)s"
msgstr ""
"Die Datenquelle %(datasource)s wird von der Strategie %(strategy)s nicht "
"unterstützt"
msgid "Do you want to delete objects up to the specified maximum number? [y/N]"
msgstr ""
"Möchten Sie Objekte bis zur angegebenen maximalen Anzahl löschen? [J/N]"
#, python-format
msgid "Domain name seems ambiguous: %s"
msgstr "Domänenname scheint mehrdeutig: %s"
#, python-format
msgid "Domain not Found: %s"
msgstr "Domain nicht gefunden: %s"
msgid "Dummy Strategy using sample Scoring Engines"
msgstr "Dummy-Strategie mit Sample Scoring Engines"
msgid "Dummy goal"
msgstr "Dummy Ziel"
msgid "Dummy strategy"
msgstr "Dummy-Strategie"
msgid "Dummy strategy with resize"
msgstr "Dummy-Strategie mit Größenänderung"
#, python-format
msgid "Efficacy indicator %(efficacy_indicator)s could not be found"
msgstr ""
"Der Wirksamkeitsindikator %(efficacy_indicator)s konnte nicht gefunden werden"
#, python-format
msgid "Error loading plugin '%(name)s'"
msgstr "Fehler beim Laden des Plugins '%(name)s'"
#, python-format
msgid "ErrorDocumentMiddleware received an invalid status %s"
msgstr "ErrorDocumentMiddleware hat einen ungültigen Status %s erhalten"
#, python-format
msgid "Expected a logical name but received %(name)s"
msgstr "Erwartete einen logischen Namen, erhielt aber %(name)s"
#, python-format
msgid "Expected a logical name or uuid but received %(name)s"
msgstr ""
"Erwartete einen logischen Namen oder eine UUID, erhielt jedoch %(name)s"
#, python-format
msgid "Expected a uuid but received %(uuid)s"
msgstr "Erwartet eine Uuid aber %(uuid)s erhalten"
#, python-format
msgid "Expected a uuid or int but received %(identity)s"
msgstr "Erwartet eine Uuid oder Int aber %(identity)s erhalten"
#, python-format
msgid "Expected an interval or cron syntax but received %(name)s"
msgstr "Erwartete eine Intervall- oder Cron-Syntax, aber erhielt %(name)s"
#, python-format
msgid "Failed to create volume '%(volume)s. "
msgstr "Fehler beim Erstellen des Datenträgers '%(volume)s."
#, python-format
msgid "Failed to delete volume '%(volume)s. "
msgstr "Fehler beim Löschen des Datenträgers '%(volume)s."
#, python-format
msgid "Filter operator is not valid: %(operator)s not in %(valid_operators)s"
msgstr ""
"Filter Operator ist nicht gültig: %(operator)s nicht in %(valid_operators)s"
msgid "Filtering actions on both audit and action-plan is prohibited"
msgstr ""
"Das Filtern von Aktionen sowohl im Audit- als auch im Aktionsplan ist "
"verboten"
msgid "Goal"
msgstr "Ziel"
#, python-format
msgid "Goal %(goal)s could not be found"
msgstr "Ziel %(goal)s konnte nicht gefunden werden"
#, python-format
msgid "Goal %(goal)s is invalid"
msgstr "Ziel %(goal)s ist ungültig"
msgid "Goals"
msgstr "Ziele"
msgid "Hardware Maintenance"
msgstr "Hardware-Wartung"
#, python-format
msgid "Here below is a table containing the objects that can be purged%s:"
msgstr ""
"Hier unten ist eine Tabelle mit den Objekten, die gelöscht werden können: %s"
msgid "Illegal argument"
msgstr "Illegales Argument"
#, python-format
msgid ""
"Incorrect mapping: could not find associated weight for %s in weight dict."
msgstr ""
"Inkorrektes Mapping: Die zugehörige Gewichtung für %s im Gewicht dict konnte "
"nicht gefunden werden."
#, python-format
msgid "Interval of audit must be specified for %(audit_type)s."
msgstr "Das Intervall der Prüfung muss für %(audit_type)s angegeben werden."
#, python-format
msgid "Interval of audit must not be set for %(audit_type)s."
msgstr ""
"Das Intervall der Prüfung darf nicht für %(audit_type)s festgelegt werden."
#, python-format
msgid "Invalid filter: %s"
msgstr "Ungültiger Filter: %s"
msgid "Invalid number of features, expected 9"
msgstr "Ungültige Anzahl der erwarteten Features 9"
#, python-format
msgid "Invalid query: %(start_time)s > %(end_time)s"
msgstr "Ungültige Abfrage: %(start_time)s > %(end_time)s"
#, python-format
msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'"
msgstr "Ungültige Sortierrichtung: %s. Akzeptable Werte sind 'asc' oder 'desc'"
msgid "Invalid state for swapping volume"
msgstr "Ungültiger Status für das Auslagern des Datenträgers"
#, python-format
msgid "Invalid state: %(state)s"
msgstr "Ungültiger Status: %(state)s"
msgid "JSON list expected in feature argument"
msgstr "JSON-Liste in Feature-Argument erwartet"
msgid "Keystone API endpoint is missing"
msgstr "Der Keystone-API-Endpunkt fehlt"
msgid "Limit must be positive"
msgstr "Limit muss positiv sein"
msgid "Limit should be positive"
msgstr "Limit sollte positiv sein"
msgid "Maximum time since last check-in for up service."
msgstr "Maximale Zeit seit dem letzten Check-in für den Up-Service."
#, python-format
msgid "Migration of type '%(migration_type)s' is not supported."
msgstr "Die Migration vom Typ '%(migration_type)s' wird nicht unterstützt."
msgid ""
"Name of this node. This can be an opaque identifier. It is not necessarily a "
"hostname, FQDN, or IP address. However, the node name must be valid within "
"an AMQP key, and if using ZeroMQ, a valid hostname, FQDN, or IP address."
msgstr ""
"Name dieses Knotens. Dies kann eine undurchsichtige Kennung sein. Es ist "
"nicht unbedingt ein Hostname, FQDN oder IP-Adresse. Der Knotenname muss "
"jedoch innerhalb eines AMQP-Schlüssels und bei Verwendung von ZeroMQ ein "
"gültiger Hostname, FQDN oder eine gültige IP-Adresse sein."
#, python-format
msgid "No %(metric)s metric for %(host)s found."
msgstr "Keine %(metric)s Metrik für %(host)s gefunden."
msgid "No rows were returned"
msgstr "Es wurden keine Zeilen zurückgegeben"
#, python-format
msgid "No strategy could be found to achieve the '%(goal)s' goal."
msgstr ""
"Es konnte keine Strategie gefunden werden, um das Ziel '%(goal)s' zu "
"erreichen."
msgid "No such metric"
msgstr "Keine solche Metrik"
#, python-format
msgid "No values returned by %(resource_id)s for %(metric_name)s."
msgstr "Keine Werte von %(resource_id)s für %(metric_name)s zurückgegeben."
msgid "Noisy Neighbor"
msgstr "Lauter Nachbar"
msgid "Not authorized"
msgstr "Nicht berechtigt"
msgid "Not supported"
msgstr "Nicht unterstützt"
msgid "Operation not permitted"
msgstr "Operation unzulässig"
msgid "Outlet temperature based strategy"
msgstr "Auslasstemperatur basierte Strategie"
#, python-format
msgid ""
"Payload not populated when trying to send notification \"%(class_name)s\""
msgstr ""
"Payload wurde nicht ausgefüllt, wenn versucht wird, eine Benachrichtigung "
"'%(class_name)s' zu senden"
msgid "Plugins"
msgstr "Plugins"
#, python-format
msgid "Policy doesn't allow %(action)s to be performed."
msgstr "Die Richtlinie lässt nicht zu, dass %(action)s ausgeführt werden."
#, python-format
msgid "Project name seems ambiguous: %s"
msgstr "Der Projektname erscheint mehrdeutig: %s"
#, python-format
msgid "Project not Found: %s"
msgstr "Projekt nicht gefunden: %s"
#, python-format
msgid "Provided cron is invalid: %(message)s"
msgstr "Bereitgestellter Cron ist ungültig: %(message)s"
#, python-format
msgid "Purge results summary%s:"
msgstr "Zusammenfassung der Bereinigungsergebnisse %s:"
msgid ""
"Ratio of actual attached volumes migrated to planned attached volumes "
"migrate."
msgstr ""
"Das Verhältnis der tatsächlich angehängten Datenträger, die zu geplanten "
"angehängten Datenträger migriert wurden, wird migriert."
msgid ""
"Ratio of actual cold migrated instances to planned cold migrate instances."
msgstr ""
"Verhältnis von tatsächlichen kalt migrierten Instanzen zu geplanten kalten "
"migrieren Instanzen."
msgid ""
"Ratio of actual detached volumes migrated to planned detached volumes "
"migrate."
msgstr ""
"Das Verhältnis der tatsächlich abgetrennten Datenträger, die in geplante, "
"getrennte Datenträger migriert wurden, wird migriert."
msgid ""
"Ratio of actual live migrated instances to planned live migrate instances."
msgstr ""
"Verhältnis von tatsächlichen migrierten Live-Instanzen zu geplanten Live-"
"Migrationsinstanzen"
msgid ""
"Ratio of released compute nodes divided by the total number of enabled "
"compute nodes."
msgstr ""
"Verhältnis der freigegebenen Compute-Knoten geteilt durch die Gesamtzahl der "
"aktivierten Compute-Knoten."
#, python-format
msgid "Role name seems ambiguous: %s"
msgstr "Der Rollenname scheint mehrdeutig: %s"
#, python-format
msgid "Role not Found: %s"
msgstr "Rolle nicht gefunden: %s"
msgid "Saving Energy"
msgstr "Energie sparen"
msgid "Saving Energy Strategy"
msgstr "Energiestrategie speichern"
#, python-format
msgid "Scoring Engine with name=%s not found"
msgstr "Scoring Engine mit name=%s nicht gefunden"
#, python-format
msgid "ScoringEngine %(scoring_engine)s could not be found"
msgstr "ScoringEngine %(scoring_engine)s konnte nicht gefunden werden"
msgid "Seconds between running periodic tasks."
msgstr "Sekunden zwischen dem Ausführen periodischer Aufgaben."
msgid "Server Consolidation"
msgstr "Serverkonsolidierung"
msgid ""
"Specifies the minimum level for which to send notifications. If not set, no "
"notifications will be sent. The default is for this option to be at the "
"`INFO` level."
msgstr ""
"Gibt die Mindeststufe an, für die Benachrichtigungen gesendet werden. Wenn "
"nicht festgelegt, werden keine Benachrichtigungen gesendet. Standardmäßig "
"ist diese Option auf der INFO-Ebene."
msgid ""
"Specify parameters but no predefined strategy for audit, or no parameter "
"spec in predefined strategy"
msgstr ""
"Geben Sie Parameter, aber keine vordefinierte Strategie für das Audit oder "
"keine Parameterspezifikation in der vordefinierten Strategie an"
#, python-format
msgid "State transition not allowed: (%(initial_state)s -> %(new_state)s)"
msgstr "Statusübergang nicht erlaubt: (%(initial_state)s -> %(new_state)s)"
msgid "Storage Capacity Balance Strategy"
msgstr "Storage Capacity Balance-Strategie"
msgid "Strategies"
msgstr "Strategien"
#, python-format
msgid "Strategy %(strategy)s could not be found"
msgstr "Strategie %(strategy)s konnte nicht gefunden werden"
#, python-format
msgid "Strategy %(strategy)s is invalid"
msgstr "Strategie %(strategy)s ist ungültig"
#, python-format
msgid "The %(name)s %(id)s could not be found"
msgstr " Die %(name)s %(id)s konnte nicht gefunden werden"
#, python-format
msgid "The %(name)s resource %(id)s could not be found"
msgstr "Die %(name)s Ressource %(id)s konnte nicht gefunden werden"
#, python-format
msgid "The %(name)s resource %(id)s is not soft deleted"
msgstr "Die %(name)s Ressource %(id)s wird nicht weich gelöscht"
#, python-format
msgid "The action %(action_id)s execution failed."
msgstr "Die Ausführung der Aktion %(action_id)s ist fehlgeschlagen."
#, python-format
msgid "The action description %(action_id)s cannot be found."
msgstr "Die Aktionsbeschreibung %(action_id)s konnte nicht gefunden werden."
msgid "The audit template UUID or name specified is invalid"
msgstr "Die UUID oder der Name der Überprüfungsvorlage ist ungültig"
#, python-format
msgid "The baremetal resource '%(name)s' could not be found"
msgstr "Die Barmetal-Ressource '%(name)s' konnte nicht gefunden werden"
#, python-format
msgid "The capacity %(capacity)s is not defined for '%(resource)s'"
msgstr "Die Kapazität %(capacity)s ist nicht definiert für '%(resource)s'"
#, python-format
msgid "The cluster data model '%(cdm)s' could not be built"
msgstr "Das Clusterdatenmodell '%(cdm)s' konnte nicht erstellt werden"
msgid "The cluster state is not defined"
msgstr "Der Clusterstatus ist nicht definiert"
msgid "The cluster state is stale"
msgstr "Der Clusterstatus ist veraltet"
#, python-format
msgid "The compute node %(name)s could not be found"
msgstr "Der Compute-Knoten %(name)s konnte nicht gefunden werden"
#, python-format
msgid "The compute resource '%(name)s' could not be found"
msgstr "Die Rechenressource '%(name)s' konnte nicht gefunden werden"
#, python-format
msgid "The identifier '%(name)s' is a reserved word"
msgstr "Der Bezeichner '%(name)s' ist ein reserviertes Wort"
#, python-format
msgid ""
"The indicator '%(name)s' with value '%(value)s' and spec type "
"'%(spec_type)s' is invalid."
msgstr ""
"Das Kennzeichen '%(name)s' mit dem Wert '%(value)s' und dem "
"Spezifikationstyp '%(spec_type)s' ist ungültig."
#, python-format
msgid "The instance '%(name)s' could not be found"
msgstr "Die Instanz '%(name)s' konnte nicht gefunden werden"
#, python-format
msgid "The ironic node %(uuid)s could not be found"
msgstr "Der Ironic Knoten %(uuid)s konnte nicht gefunden werden"
msgid "The list of compute node(s) in the cluster is empty"
msgstr "Die Liste der Compute-Knoten im Cluster ist leer"
msgid "The list of storage node(s) in the cluster is empty"
msgstr "Die Liste der Speicherknoten im Cluster ist leer"
msgid "The metrics resource collector is not defined"
msgstr "Der Metrikressourcen-Collector ist nicht definiert"
msgid "The number of VM migrations to be performed."
msgstr "Die Anzahl der VM-Migrationen, die ausgeführt werden sollen."
msgid "The number of attached volumes actually migrated."
msgstr "Die Anzahl der angehängten Datenträger wurde tatsächlich migriert."
msgid "The number of attached volumes planned to migrate."
msgstr "Die Anzahl der angehängten Datenträger, die migriert werden sollen."
msgid "The number of compute nodes to be released."
msgstr "Die Anzahl der zu veröffentlichenden Compute-Knoten."
msgid "The number of detached volumes actually migrated."
msgstr "Die Anzahl der gelösten Datenträger wurde tatsächlich migriert."
msgid "The number of detached volumes planned to migrate."
msgstr "Die Anzahl der gelöschten Datenträger, die migriert werden sollen."
msgid "The number of instances actually cold migrated."
msgstr "Die Anzahl der tatsächlich kalten Instanzen wurde migriert."
msgid "The number of instances actually live migrated."
msgstr "Die Anzahl der tatsächlich migrierten Instanzen."
msgid "The number of instances planned to cold migrate."
msgstr "Die Anzahl der geplanten Fälle für eine Kaltmigration."
msgid "The number of instances planned to live migrate."
msgstr "Die Anzahl der geplanten Live-Migrationen."
#, python-format
msgid ""
"The number of objects (%(num)s) to delete from the database exceeds the "
"maximum number of objects (%(max_number)s) specified."
msgstr ""
"Die Anzahl der zu löschenden Objekte (%(num)s) aus der Datenbank "
"überschreitet die maximale Anzahl der angegebenen Objekte (%(max_number)s)."
#, python-format
msgid "The pool %(name)s could not be found"
msgstr "Der Pool %(name)skonnte nicht gefunden werden"
#, python-format
msgid "The service %(service)s cannot be found."
msgstr "Der Service %(service)s kann nicht gefunden werden."
#, python-format
msgid "The storage node %(name)s could not be found"
msgstr "Der Speicherknoten %(name)s konnte nicht gefunden werden"
#, python-format
msgid "The storage resource '%(name)s' could not be found"
msgstr "Die Speicherressource '%(name)s' konnte nicht gefunden werden"
msgid "The target state is not defined"
msgstr "Der Zielzustand ist nicht definiert"
msgid "The total number of enabled compute nodes."
msgstr "Die Gesamtzahl der aktivierten Compute-Knoten."
#, python-format
msgid "The volume '%(name)s' could not be found"
msgstr "Der Datenträger '%(name)s' konnte nicht gefunden werden"
#, python-format
msgid "There are %(count)d objects set for deletion. Continue? [y/N]"
msgstr "Es sind %(count)d Objekte zum Löschen eingestellt. Fortsetzen? [J/N]"
msgid "Thermal Optimization"
msgstr "Thermische Optimierung"
msgid "Total"
msgstr "Gesamt"
msgid "Unable to parse features: "
msgstr "Die Analyse von Features ist nicht möglich:"
#, python-format
msgid "Unable to parse features: %s"
msgstr "Die Funktionen können nicht analysiert werden: %s"
msgid "Unacceptable parameters"
msgstr "Inakzeptable Parameter"
msgid "Unclassified"
msgstr "Nicht klassifiziert"
#, python-format
msgid "Unexpected keystone client error occurred: %s"
msgstr "Unerwarteter Keystone Fehler trat auf: %s"
msgid "Uniform airflow migration strategy"
msgstr "Einheitliche Luftstrommigrationsstrategie"
#, python-format
msgid "User name seems ambiguous: %s"
msgstr "Der Benutzername scheint mehrdeutig zu sein: %s"
#, python-format
msgid "User not Found: %s"
msgstr "Benutzer nicht gefunden: %s"
msgid "VM Workload Consolidation Strategy"
msgstr "VM-Workload-Konsolidierungsstrategie"
msgid "Volume type must be different for retyping"
msgstr "Der Volume-Typ muss sich beim erneuten Eintippen unterscheiden"
msgid "Volume type must be same for migrating"
msgstr "Der Volume-Typ muss für die Migration identisch sein"
msgid ""
"Watcher database schema is already under version control; use upgrade() "
"instead"
msgstr ""
"Watcher-Datenbankschema ist bereits unter Versionskontrolle; Verwenden Sie "
"stattdessen upgrade()"
#, python-format
msgid "Workflow execution error: %(error)s"
msgstr "Workflow-Ausführungsfehler: %(error)s"
msgid "Workload Balance Migration Strategy"
msgstr "Workload-Balance-Migrationsstrategie"
msgid "Workload Balancing"
msgstr "Workload-Ausgleich"
msgid "Workload stabilization"
msgstr "Workload-Stabilisierung"
#, python-format
msgid "Wrong type. Expected '%(type)s', got '%(value)s'"
msgstr "Falscher Typ. Erwartete '%(type)s', bekam '%(value)s'"
#, python-format
msgid ""
"You shouldn't use any other IDs of %(resource)s if you use wildcard "
"character."
msgstr ""
"Sie sollten keine anderen IDs von %(resource)s verwenden, wenn Sie "
"Platzhalterzeichen verwenden."
msgid "Zone migration"
msgstr "Zonenmigration"
msgid "destination type is required when migration type is swap"
msgstr "Zieltyp ist erforderlich, wenn der Migrationstyp Swap ist"
msgid "host_aggregates can't be included and excluded together"
msgstr ""
"host_aggregates können nicht zusammen eingeschlossen und ausgeschlossen "
"werden"

View File

@@ -4,15 +4,15 @@ msgid ""
msgstr ""
"Project-Id-Version: watcher VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2018-01-26 00:18+0000\n"
"POT-Creation-Date: 2018-02-12 10:48+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-01-27 12:51+0000\n"
"Last-Translator: Andi Chandler <andi@gowling.com>\n"
"Language-Team: English (United Kingdom)\n"
"Language: en-GB\n"
"X-Generator: Zanata 3.9.6\n"
"Language: en_GB\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
msgid " (may include orphans)"

View File

@@ -222,7 +222,7 @@ class TestContextHook(base.FunctionalTest):
user_id=headers['X-User-Id'],
domain_id=headers['X-User-Domain-Id'],
domain_name=headers['X-User-Domain-Name'],
auth_url=cfg.CONF.keystone_authtoken.auth_uri,
auth_url=cfg.CONF.keystone_authtoken.www_authenticate_uri,
project=headers['X-Project-Name'],
project_id=headers['X-Project-Id'],
show_deleted=None,
@@ -243,7 +243,7 @@ class TestContextHook(base.FunctionalTest):
user_id=headers['X-User-Id'],
domain_id=headers['X-User-Domain-Id'],
domain_name=headers['X-User-Domain-Name'],
auth_url=cfg.CONF.keystone_authtoken.auth_uri,
auth_url=cfg.CONF.keystone_authtoken.www_authenticate_uri,
project=headers['X-Project-Name'],
project_id=headers['X-Project-Id'],
show_deleted=None,
@@ -265,7 +265,7 @@ class TestContextHook(base.FunctionalTest):
user_id=headers['X-User-Id'],
domain_id=headers['X-User-Domain-Id'],
domain_name=headers['X-User-Domain-Name'],
auth_url=cfg.CONF.keystone_authtoken.auth_uri,
auth_url=cfg.CONF.keystone_authtoken.www_authenticate_uri,
project=headers['X-Project-Name'],
project_id=headers['X-Project-Id'],
show_deleted=None,

View File

@@ -60,7 +60,8 @@ class TestCase(BaseTestCase):
cfg.CONF.set_override("auth_type", "admin_token",
group='keystone_authtoken')
cfg.CONF.set_override("auth_uri", "http://127.0.0.1/identity",
cfg.CONF.set_override("www_authenticate_uri",
"http://127.0.0.1/identity",
group='keystone_authtoken')
app_config_path = os.path.join(os.path.dirname(__file__), 'config.py')

View File

@@ -120,6 +120,7 @@ class TestClients(base.TestCase):
mock_call.assert_called_once_with(
CONF.nova_client.api_version,
endpoint_type=CONF.nova_client.endpoint_type,
region_name=CONF.nova_client.region_name,
session=mock_session)
@mock.patch.object(clients.OpenStackClients, 'session')
@@ -155,6 +156,7 @@ class TestClients(base.TestCase):
mock_call.assert_called_once_with(
CONF.glance_client.api_version,
interface=CONF.glance_client.endpoint_type,
region_name=CONF.glance_client.region_name,
session=mock_session)
@mock.patch.object(clients.OpenStackClients, 'session')
@@ -191,7 +193,8 @@ class TestClients(base.TestCase):
mock_call.assert_called_once_with(
CONF.gnocchi_client.api_version,
adapter_options={
"interface": CONF.gnocchi_client.endpoint_type},
"interface": CONF.gnocchi_client.endpoint_type,
"region_name": CONF.gnocchi_client.region_name},
session=mock_session)
@mock.patch.object(clients.OpenStackClients, 'session')
@@ -229,6 +232,7 @@ class TestClients(base.TestCase):
mock_call.assert_called_once_with(
CONF.cinder_client.api_version,
endpoint_type=CONF.cinder_client.endpoint_type,
region_name=CONF.cinder_client.region_name,
session=mock_session)
@mock.patch.object(clients.OpenStackClients, 'session')
@@ -266,6 +270,7 @@ class TestClients(base.TestCase):
CONF.ceilometer_client.api_version,
None,
endpoint_type=CONF.ceilometer_client.endpoint_type,
region_name=CONF.ceilometer_client.region_name,
session=mock_session)
@mock.patch.object(clients.OpenStackClients, 'session')
@@ -314,6 +319,7 @@ class TestClients(base.TestCase):
mock_call.assert_called_once_with(
CONF.neutron_client.api_version,
endpoint_type=CONF.neutron_client.endpoint_type,
region_name=CONF.neutron_client.region_name,
session=mock_session)
@mock.patch.object(clients.OpenStackClients, 'session')