Compare commits
18 Commits
yoga-eom
...
queens-eol
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5307f5a80e | ||
|
|
b5467a2a1f | ||
|
|
83411ec89f | ||
|
|
08750536e7 | ||
|
|
9f7ccfe408 | ||
|
|
fb2619e538 | ||
|
|
6bd857fa0e | ||
|
|
e0faeea608 | ||
|
|
61aca40e6e | ||
|
|
b293389734 | ||
|
|
050e6d58f1 | ||
|
|
7223d35c47 | ||
|
|
57f1971982 | ||
|
|
c9b2b2aa39 | ||
|
|
a42c31c221 | ||
|
|
403ec94bc1 | ||
|
|
3431b77388 | ||
|
|
eb4cacc00e |
@@ -1,4 +1,5 @@
|
||||
[gerrit]
|
||||
host=review.openstack.org
|
||||
host=review.opendev.org
|
||||
port=29418
|
||||
project=openstack/watcher.git
|
||||
defaultbranch=stable/queens
|
||||
|
||||
15
.zuul.yaml
15
.zuul.yaml
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
efficiency—and more!
|
||||
efficiency and more!
|
||||
|
||||
Watcher also supports a pluggable architecture by which custom
|
||||
optimization algorithms, data metrics and data profilers can be
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
4
tox.ini
4
tox.ini
@@ -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]
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 "
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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']))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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':
|
||||
|
||||
866
watcher/locale/de/LC_MESSAGES/watcher.po
Normal file
866
watcher/locale/de/LC_MESSAGES/watcher.po
Normal 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"
|
||||
@@ -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)"
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user