Compare commits

..

9 Commits

Author SHA1 Message Date
Luigi Toscano
2e033d7b96 Native Zuul v3 watcher-grenade job + some cleanup
Create a native Zuul v3 grenade job. It matches the existing job,
even though it doesn't call any local hook as the current legacy
job does (because no local hook exists and it should be rewritten
as zuul configuration if it did).

The new job reuses the variable definition of the devstack watcher
job, so clean up that job as well:
- do not depend on devstack-gate, which is not needed and will be
  deprecated soon anyway;
- use the new way (tempest_plugins) to define which tempest plugin
  should be installed;
- remove the definition of USE_PYTHON3: true and simply inherit
  the value set by devstack;
- remove the definition of PYTHONUNBUFFERED, not really set
  anywhere else and only useful back in the days in Jenkins.

Change-Id: Ib0ed3c0f395e1b85b8f25f6e438c414165baab32
(cherry picked from commit ed59145354)
2020-08-06 10:32:17 +02:00
limin0801
0543ccfe74 Watcher API supports strategy name when creating audit template
when directly using the `curl` command to create audit template,
strategy name can be accepted.

Closes-Bug: #1884174

Change-Id: I7c0ca760a7fa414faca03c5293df34a84aad6fac
(cherry picked from commit 3f7a508a2e)
2020-07-10 01:15:40 +00:00
Zuul
ec62bbe5bd Merge "Compatible with old scope format" into stable/ussuri 2020-06-19 07:53:38 +00:00
licanwei
cbb06e6765 Check if scope is None
if scope is None, don't create data model

Change-Id: Icf611966c9b0a3882615d778ee6c72a8da73841d
Closed-Bug: #1881920
(cherry picked from commit 9f0138e1cf)
2020-06-19 01:46:15 +00:00
licanwei
6e1be3cca4 Compatible with old scope format
Scope format changed from old to new after bp cdm-scoping.

old format:
  - availability_zones:
    - name: nova
  - host_aggregates:
    - id: 1
    - name: agg
  - exclude:
    - compute_nodes:
      - name: w012

new format:
- compute:
  - availability_zones:
    - name: nova
  - host_aggregates:
    - id: 1
    - name: agg
  - exclude:
    - compute_nodes:
      - name: w012

Change-Id: I2b5cd4d1cee19f5588e4d2185eb074343fff1187
Closed-Bug: #1882049
(cherry picked from commit 4a1915bec4)
2020-06-11 02:15:25 +00:00
Chris MacNaughton
043ebb71c6 Monkey patch original current_thread _active
Monkey patch the original current_thread to use the up-to-date _active
global variable. This solution is based on that documented at:
https://github.com/eventlet/eventlet/issues/592

Change-Id: I194eedd505d45137963eb40d1b1d5da2309caeac
Closes-Bug: #1863021
(cherry picked from commit 0b4c4f1de6)
2020-05-15 09:25:40 +00:00
OpenStack Proposal Bot
870e6d75e0 Imported Translations from Zanata
For more information about this automatic import see:
https://docs.openstack.org/i18n/latest/reviewing-translation-import.html

Change-Id: Ie708859051162cc7a68cfdf289398f6df1abe6c8
2020-04-26 09:05:18 +00:00
OpenStack Release Bot
3069f83731 Update TOX_CONSTRAINTS_FILE for stable/ussuri
Update the URL to the upper-constraints file to point to the redirect
rule on releases.openstack.org so that anyone working on this branch
will switch to the correct upper-constraints list automatically when
the requirements repository branches.

Until the requirements repository has as stable/ussuri branch, tests will
continue to use the upper-constraints list on master.

Change-Id: I80ec47827b91977dde874246fb94dbbeeeb7ef14
2020-04-23 09:48:50 +00:00
OpenStack Release Bot
d7d534f5d1 Update .gitreview for stable/ussuri
Change-Id: I72fffb815f040dd4f1b13a73455276f70bd10aaf
2020-04-23 09:48:48 +00:00
189 changed files with 441 additions and 1084 deletions

View File

@@ -2,4 +2,4 @@
host=review.opendev.org
port=29418
project=openstack/watcher.git
defaultbranch=stable/victoria
defaultbranch=stable/ussuri

View File

@@ -1,10 +1,9 @@
- project:
queue: watcher
templates:
- check-requirements
- openstack-cover-jobs
- openstack-lower-constraints-jobs
- openstack-python3-victoria-jobs
- openstack-python3-ussuri-jobs
- publish-openstack-docs-pti
- release-notes-jobs-python3
check:
@@ -17,6 +16,7 @@
- watcher-tls-test
- watcher-tempest-functional-ipv6-only
gate:
queue: watcher
jobs:
- watcher-tempest-functional
- watcher-tempest-functional-ipv6-only
@@ -102,7 +102,7 @@
- job:
name: watcher-tempest-multinode
parent: watcher-tempest-functional
nodeset: openstack-two-node-focal
nodeset: openstack-two-node-bionic
roles:
- zuul: openstack/tempest
group-vars:

View File

@@ -22,6 +22,9 @@
# All configuration values have a default; values that are commented out
# serve to show the default.
from watcher import version as watcher_version
extensions = [
'openstackdocstheme',
'os_api_ref',
@@ -43,13 +46,21 @@ project = u'Infrastructure Optimization API Reference'
copyright = u'2010-present, OpenStack Foundation'
# openstackdocstheme options
openstackdocs_repo_name = 'openstack/watcher'
openstackdocs_auto_name = False
openstackdocs_bug_project = 'watcher'
openstackdocs_bug_tag = ''
repository_name = 'openstack/watcher'
bug_project = 'watcher'
bug_tag = ''
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The full version, including alpha/beta/rc tags.
release = watcher_version.version_info.release_string()
# The short X.Y version.
version = watcher_version.version_string
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'native'
pygments_style = 'sphinx'
# -- Options for HTML output --------------------------------------------------
@@ -64,6 +75,10 @@ html_theme_options = {
"sidebar_mode": "toc",
}
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
html_last_updated_fmt = '%Y-%m-%d %H:%M'
# -- Options for LaTeX output -------------------------------------------------
# Grouping the document tree into LaTeX files. List of tuples

2
babel.cfg Normal file
View File

@@ -0,0 +1,2 @@
[python: **.py]

View File

@@ -298,7 +298,7 @@ function start_watcher_api {
service_protocol="http"
fi
if [[ "$WATCHER_USE_WSGI_MODE" == "uwsgi" ]]; then
run_process "watcher-api" "$(which uwsgi) --procname-prefix watcher-api --ini $WATCHER_UWSGI_CONF"
run_process "watcher-api" "$WATCHER_BIN_DIR/uwsgi --procname-prefix watcher-api --ini $WATCHER_UWSGI_CONF"
watcher_url=$service_protocol://$SERVICE_HOST/infra-optim
else
watcher_url=$service_protocol://$SERVICE_HOST:$service_port

View File

@@ -13,6 +13,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import unicode_literals
import importlib
import inspect

View File

@@ -1,10 +1,10 @@
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
openstackdocstheme>=2.2.1 # Apache-2.0
sphinx>=2.0.0,!=2.1.0 # BSD
openstackdocstheme>=1.20.0 # Apache-2.0
sphinx>=1.8.0,!=2.1.0,!=3.0.0 # BSD
sphinxcontrib-pecanwsme>=0.8.0 # Apache-2.0
sphinxcontrib-svg2pdfconverter>=0.1.0 # BSD
reno>=3.1.0 # Apache-2.0
reno>=2.7.0 # Apache-2.0
sphinxcontrib-apidoc>=0.2.0 # BSD
os-api-ref>=1.4.0 # Apache-2.0

View File

@@ -14,6 +14,7 @@
import os
import sys
from watcher import version as watcher_version
from watcher import objects
objects.register_all()
@@ -59,6 +60,16 @@ master_doc = 'index'
project = u'Watcher'
copyright = u'OpenStack Foundation'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
# The full version, including alpha/beta/rc tags.
release = watcher_version.version_info.release_string()
# The short X.Y version.
version = watcher_version.version_string
# A list of ignored prefixes for module index sorting.
modindex_common_prefix = ['watcher.']
@@ -83,7 +94,7 @@ add_module_names = True
suppress_warnings = ['app.add_directive']
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'native'
pygments_style = 'sphinx'
# -- Options for man page output --------------------------------------------
@@ -114,13 +125,12 @@ html_theme = 'openstackdocs'
# Output file base name for HTML help builder.
htmlhelp_basename = '%sdoc' % project
html_last_updated_fmt = '%Y-%m-%d %H:%M'
#openstackdocstheme options
openstackdocs_repo_name = 'openstack/watcher'
openstackdocs_pdf_link = True
openstackdocs_auto_name = False
openstackdocs_bug_project = 'watcher'
openstackdocs_bug_tag = ''
repository_name = 'openstack/watcher'
bug_project = 'watcher'
bug_tag = ''
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass
@@ -128,7 +138,7 @@ openstackdocs_bug_tag = ''
latex_documents = [
('index',
'doc-watcher.tex',
u'Watcher Documentation',
u'%s Documentation' % project,
u'OpenStack Foundation', 'manual'),
]

View File

@@ -5,10 +5,11 @@ appdirs==1.4.3
APScheduler==3.5.1
asn1crypto==0.24.0
automaton==1.14.0
Babel==2.5.3
beautifulsoup4==4.6.0
cachetools==2.0.1
certifi==2018.1.18
cffi==1.14.0
cffi==1.11.5
chardet==3.0.4
cliff==2.11.0
cmd2==0.8.1
@@ -30,11 +31,12 @@ extras==1.0.0
fasteners==0.14.1
fixtures==3.0.0
freezegun==0.3.10
future==0.16.0
futurist==1.8.0
gitdb2==2.0.3
GitPython==2.1.8
gnocchiclient==7.0.1
greenlet==0.4.15
greenlet==0.4.13
idna==2.6
imagesize==1.0.0
iso8601==0.1.12
@@ -42,23 +44,26 @@ Jinja2==2.10
jmespath==0.9.3
jsonpatch==1.21
jsonpointer==2.0
jsonschema==3.2.0
jsonschema==2.6.0
keystoneauth1==3.4.0
keystonemiddleware==4.21.0
kombu==5.0.0
kombu==4.1.0
linecache2==1.0.0
logutils==0.3.5
lxml==4.5.1
lxml==4.1.1
Mako==1.0.7
MarkupSafe==1.1.1
MarkupSafe==1.0
mccabe==0.2.1
microversion_parse==0.2.1
mock==2.0.0
monotonic==1.4
mox3==0.25.0
msgpack==0.5.6
munch==2.2.0
netaddr==0.7.19
netifaces==0.10.6
networkx==2.4
networkx==2.2
openstackdocstheme==1.20.0
openstacksdk==0.12.0
os-api-ref===1.4.0
os-client-config==1.29.0
@@ -70,7 +75,7 @@ oslo.cache==1.29.0
oslo.concurrency==3.26.0
oslo.config==5.2.0
oslo.context==2.21.0
oslo.db==4.44.0
oslo.db==4.35.0
oslo.i18n==3.20.0
oslo.log==3.37.0
oslo.messaging==8.1.2
@@ -113,7 +118,8 @@ python-novaclient==14.1.0
python-openstackclient==3.14.0
python-subunit==1.2.0
pytz==2018.3
PyYAML==3.13
PyYAML==3.12
reno==2.7.0
repoze.lru==0.7
requests==2.18.4
requestsexceptions==1.4.0
@@ -122,17 +128,22 @@ rfc3986==1.1.0
Routes==2.4.1
simplegeneric==0.8.1
simplejson==3.13.2
six==1.11.0
smmap2==2.0.3
snowballstemmer==1.2.1
Sphinx==1.6.5
sphinxcontrib-httpdomain==1.6.1
sphinxcontrib-pecanwsme==0.8.0
sphinxcontrib-websupport==1.0.1
SQLAlchemy==1.2.5
sqlalchemy-migrate==0.11.0
sqlparse==0.2.4
statsd==3.2.2
stestr==2.0.0
stevedore==1.28.0
taskflow==3.8.0
taskflow==3.7.1
Tempita==0.5.2
tenacity==4.12.0
tenacity==4.9.0
testresources==2.0.1
testscenarios==0.5.0
testtools==2.3.0

View File

@@ -53,6 +53,7 @@ source_suffix = '.rst'
master_doc = 'index'
# General information about the project.
project = u'watcher'
copyright = u'2016, Watcher developers'
# Release notes are version independent
@@ -90,15 +91,11 @@ exclude_patterns = ['_build']
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'native'
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# openstackdocstheme options
openstackdocs_repo_name = 'openstack/watcher'
openstackdocs_bug_project = 'watcher'
openstackdocs_bug_tag = ''
# -- Options for HTML output --------------------------------------------------

View File

@@ -21,7 +21,6 @@ Contents:
:maxdepth: 1
unreleased
ussuri
train
stein
rocky

View File

@@ -1,651 +0,0 @@
# Andi Chandler <andi@gowling.com>, 2017. #zanata
# Andi Chandler <andi@gowling.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: python-watcher\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-11-08 01:22+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-11-07 06:15+0000\n"
"Last-Translator: Andi Chandler <andi@gowling.com>\n"
"Language-Team: English (United Kingdom)\n"
"Language: en_GB\n"
"X-Generator: Zanata 4.3.3\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.10.0"
msgstr "1.10.0"
msgid "1.11.0"
msgstr "1.11.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 "1.9.0"
msgstr "1.9.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 start_time and end_time fields in audits table. User can set the start "
"time and/or end time when creating CONTINUOUS audit."
msgstr ""
"Add start_time and end_time fields in audits table. User can set the start "
"time and/or end time when creating CONTINUOUS audit."
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 for one compute node maintenance, without having the user's "
"application been interrupted. If given one backup node, the strategy will "
"firstly migrate all instances from the maintenance node to the backup node. "
"If the backup node is not provided, it will migrate all instances, relying "
"on nova-scheduler."
msgstr ""
"Added a strategy for one compute node maintenance, without having the user's "
"application been interrupted. If given one backup node, the strategy will "
"firstly migrate all instances from the maintenance node to the backup node. "
"If the backup node is not provided, it will migrate all instances, relying "
"on nova-scheduler."
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 new tool ``watcher-status upgrade check``."
msgstr "Added new tool ``watcher-status upgrade check``."
msgid ""
"Added notifications about cancelling of action plan. Now event based plugins "
"know when action plan cancel started and completed."
msgstr ""
"Added notifications about cancelling of action plan. Now event based plugins "
"know when action plan cancel started and completed."
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 ""
"Audits have 'name' field now, that is more friendly to end users. Audit's "
"name can't exceed 63 characters."
msgstr ""
"Audits have 'name' field now, that is more friendly to end users. Audit's "
"name can't exceed 63 characters."
msgid "Bug Fixes"
msgstr "Bug Fixes"
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 "Deprecation Notes"
msgstr "Deprecation 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 ""
"Feature to exclude instances from audit scope based on project_id is added. "
"Now instances from particular project in OpenStack can be excluded from "
"audit defining scope in audit templates."
msgstr ""
"Feature to exclude instances from audit scope based on project_id is added. "
"Now instances from particular project in OpenStack can be excluded from "
"audit defining scope in audit templates."
msgid ""
"Instance cold migration logic is now replaced with using Nova migrate "
"Server(migrate Action) API which has host option since v2.56."
msgstr ""
"Instance cold migration logic is now replaced with using Nova migrate "
"Server(migrate Action) API which has host option since v2.56."
msgid "New Features"
msgstr "New Features"
msgid ""
"New framework for ``watcher-status upgrade check`` command is added. This "
"framework allows adding various checks which can be run before a Watcher "
"upgrade to ensure if the upgrade can be performed safely."
msgstr ""
"New framework for ``watcher-status upgrade check`` command is added. This "
"framework allows adding various checks which can be run before a Watcher "
"upgrade to ensure if the upgrade can be performed safely."
msgid "Newton Series Release Notes"
msgstr "Newton Series Release Notes"
msgid ""
"Nova API version is now set to 2.56 by default. This needs the migrate "
"action of migration type cold with destination_node parameter to work."
msgstr ""
"Nova API version is now set to 2.56 by default. This needs the migrate "
"action of migration type cold with destination_node parameter to work."
msgid "Ocata Series Release Notes"
msgstr "Ocata Series Release Notes"
msgid ""
"Operator can now use new CLI tool ``watcher-status upgrade check`` to check "
"if Watcher deployment can be safely upgraded from N-1 to N release."
msgstr ""
"Operator can now use new CLI tool ``watcher-status upgrade check`` to check "
"if Watcher deployment can be safely upgraded from N-1 to N release."
msgid "Pike Series Release Notes"
msgstr "Pike Series Release Notes"
msgid "Prelude"
msgstr "Prelude"
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 "Queens Series Release Notes"
msgstr "Queens Series Release Notes"
msgid "Rocky Series Release Notes"
msgstr "Rocky Series Release Notes"
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 ""
"The migrate action of migration type cold with destination_node parameter "
"was fixed. Before fixing, it booted an instance in the service project as a "
"migrated instance."
msgstr ""
"The migrate action of migration type cold with destination_node parameter "
"was fixed. Before fixing, it booted an instance in the service project as a "
"migrated instance."
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 "Upgrade Notes"
msgstr "Upgrade Notes"
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 consumes Nova notifications to update its internal Compute "
"CDM(Cluster Data Model). All the notifications as below"
msgstr ""
"Watcher consumes Nova notifications to update its internal Compute "
"CDM(Cluster Data Model). All the notifications as below"
msgid "Watcher database can now be upgraded thanks to Alembic."
msgstr "Watcher database can now be upgraded thanks to Alembic."
msgid ""
"Watcher got an ability to calculate multiple global efficacy indicators "
"during audit's execution. Now global efficacy can be calculated for many "
"resource types (like volumes, instances, network) if strategy supports "
"efficacy indicators."
msgstr ""
"Watcher got an ability to calculate multiple global efficacy indicators "
"during audit's execution. Now global efficacy can be calculated for many "
"resource types (like volumes, instances, network) if strategy supports "
"efficacy indicators."
msgid ""
"Watcher has a whole scope of the cluster, when building compute CDM which "
"includes all instances. It filters excluded instances when migration during "
"the audit."
msgstr ""
"Watcher has a whole scope of the cluster, when building compute CDM which "
"includes all instances. It filters excluded instances when migration during "
"the audit."
msgid ""
"Watcher removes the support to Nova legacy notifications because of Nova "
"will deprecate them."
msgstr ""
"Watcher removes the support to Nova legacy notifications because of Nova "
"will deprecate them."
msgid ""
"Watcher services can be launched in HA mode. From now on Watcher Decision "
"Engine and Watcher Applier services may be deployed on different nodes to "
"run in active-active or active-passive mode. Any ONGOING Audits or Action "
"Plans will be CANCELLED if service they are executed on is restarted."
msgstr ""
"Watcher services can be launched in HA mode. From now on Watcher Decision "
"Engine and Watcher Applier services may be deployed on different nodes to "
"run in active-active or active-passive mode. Any ONGOING Audits or Action "
"Plans will be CANCELLED if service they are executed on is restarted."
msgid ""
"Watcher starts to support API microversions since Stein cycle. From now "
"onwards all API changes should be made with saving backward compatibility. "
"To specify API version operator should use OpenStack-API-Version HTTP "
"header. If operator wants to know the mininum and maximum supported versions "
"by API, he/she can access /v1 resource and Watcher API will return "
"appropriate headers in response."
msgstr ""
"Watcher starts to support API microversions since the Stein cycle. From now "
"onwards all API changes should be made with saving backward compatibility. "
"To specify API version operator should use OpenStack-API-Version HTTP "
"header. If operator wants to know the minimum and maximum supported versions "
"by API, he/she can access /v1 resource and Watcher API will return "
"appropriate headers in response."
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."
msgid "instance.create.end"
msgstr "instance.create.end"
msgid "instance.delete.end"
msgstr "instance.delete.end"
msgid "instance.live_migration_force_complete.end"
msgstr "instance.live_migration_force_complete.end"
msgid "instance.live_migration_post_dest.end"
msgstr "instance.live_migration_post_dest.end"
msgid "instance.lock"
msgstr "instance.lock"
msgid "instance.pause.end"
msgstr "instance.pause.end"
msgid "instance.power_off.end"
msgstr "instance.power_off.end"
msgid "instance.power_on.end"
msgstr "instance.power_on.end"
msgid "instance.rebuild.end"
msgstr "instance.rebuild.end"
msgid "instance.rescue.end"
msgstr "instance.rescue.end"
msgid "instance.resize_confirm.end"
msgstr "instance.resize_confirm.end"
msgid "instance.restore.end"
msgstr "instance.restore.end"
msgid "instance.resume.end"
msgstr "instance.resume.end"
msgid "instance.shelve.end"
msgstr "instance.shelve.end"
msgid "instance.shutdown.end"
msgstr "instance.shutdown.end"
msgid "instance.soft_delete.end"
msgstr "instance.soft_delete.end"
msgid "instance.suspend.end"
msgstr "instance.suspend.end"
msgid "instance.unlock"
msgstr "instance.unlock"
msgid "instance.unpause.end"
msgstr "instance.unpause.end"
msgid "instance.unrescue.end"
msgstr "instance.unrescue.end"
msgid "instance.unshelve.end"
msgstr "instance.unshelve.end"
msgid "instance.update"
msgstr "instance.update"
msgid "new:"
msgstr "new:"
msgid "pre-existing:"
msgstr "pre-existing:"
msgid "service.create"
msgstr "service.create"
msgid "service.delete"
msgstr "service.delete"
msgid "service.update"
msgstr "service.update"

View File

@@ -1,33 +0,0 @@
# Gérald LONLAS <g.lonlas@gmail.com>, 2016. #zanata
msgid ""
msgstr ""
"Project-Id-Version: python-watcher\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 02:21+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2016-10-22 06:44+0000\n"
"Last-Translator: Gérald LONLAS <g.lonlas@gmail.com>\n"
"Language-Team: French\n"
"Language: fr\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
msgid "0.29.0"
msgstr "0.29.0"
msgid "Contents:"
msgstr "Contenu :"
msgid "Current Series Release Notes"
msgstr "Note de la release actuelle"
msgid "New Features"
msgstr "Nouvelles fonctionnalités"
msgid "Newton Series Release Notes"
msgstr "Note de release pour Newton"
msgid "Welcome to watcher's Release Notes documentation!"
msgstr "Bienvenue dans la documentation de la note de Release de Watcher"

View File

@@ -1,6 +0,0 @@
===========================
Ussuri Series Release Notes
===========================
.. release-notes::
:branch: stable/ussuri

View File

@@ -5,16 +5,16 @@
apscheduler>=3.5.1 # MIT License
jsonpatch>=1.21 # BSD
keystoneauth1>=3.4.0 # Apache-2.0
jsonschema>=3.2.0 # MIT
jsonschema>=2.6.0 # MIT
keystonemiddleware>=4.21.0 # Apache-2.0
lxml>=4.5.1 # BSD
lxml>=4.1.1 # BSD
croniter>=0.3.20 # MIT License
os-resource-classes>=0.4.0
oslo.concurrency>=3.26.0 # Apache-2.0
oslo.cache>=1.29.0 # Apache-2.0
oslo.config>=5.2.0 # Apache-2.0
oslo.context>=2.21.0 # Apache-2.0
oslo.db>=4.44.0 # Apache-2.0
oslo.db>=4.35.0 # Apache-2.0
oslo.i18n>=3.20.0 # Apache-2.0
oslo.log>=3.37.0 # Apache-2.0
oslo.messaging>=8.1.2 # Apache-2.0
@@ -39,11 +39,12 @@ python-neutronclient>=6.7.0 # Apache-2.0
python-novaclient>=14.1.0 # Apache-2.0
python-openstackclient>=3.14.0 # Apache-2.0
python-ironicclient>=2.5.0 # Apache-2.0
six>=1.11.0 # MIT
SQLAlchemy>=1.2.5 # MIT
stevedore>=1.28.0 # Apache-2.0
taskflow>=3.8.0 # Apache-2.0
taskflow>=3.7.1 # Apache-2.0
WebOb>=1.8.5 # MIT
WSME>=0.9.2 # MIT
networkx>=2.4 # BSD
networkx>=2.2;python_version>='3.4' # BSD
microversion_parse>=0.2.1 # Apache-2.0
futurist>=1.8.0 # Apache-2.0

View File

@@ -19,7 +19,6 @@ classifier =
Programming Language :: Python :: 3
Programming Language :: Python :: 3.6
Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8
[files]
packages =
@@ -108,3 +107,18 @@ watcher_cluster_data_model_collectors =
compute = watcher.decision_engine.model.collector.nova:NovaClusterDataModelCollector
storage = watcher.decision_engine.model.collector.cinder:CinderClusterDataModelCollector
baremetal = watcher.decision_engine.model.collector.ironic:BaremetalClusterDataModelCollector
[compile_catalog]
directory = watcher/locale
domain = watcher
[update_catalog]
domain = watcher
output_dir = watcher/locale
input_file = watcher/locale/watcher.pot
[extract_messages]
keywords = _ gettext ngettext l_ lazy_gettext _LI _LW _LE _LC
mapping_file = babel.cfg
output_file = watcher/locale/watcher.pot

View File

@@ -5,7 +5,8 @@
coverage>=4.5.1 # Apache-2.0
doc8>=0.8.0 # Apache-2.0
freezegun>=0.3.10 # Apache-2.0
hacking>=3.0.1,<3.1.0 # Apache-2.0
hacking>=3.0,<3.1.0 # Apache-2.0
mock>=2.0.0 # BSD
oslotest>=3.3.0 # Apache-2.0
os-testr>=1.0.0 # Apache-2.0
testscenarios>=0.5.0 # Apache-2.0/BSD

View File

@@ -13,7 +13,7 @@ install_command = pip install {opts} {packages}
setenv =
VIRTUAL_ENV={envdir}
deps =
-c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/victoria}
-c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/ussuri}
-r{toxinidir}/test-requirements.txt
-r{toxinidir}/requirements.txt
commands =
@@ -26,12 +26,12 @@ passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY
commands =
doc8 doc/source/ CONTRIBUTING.rst HACKING.rst README.rst
flake8
bandit -r watcher -x watcher/tests/* -n5 -ll -s B320,B322
bandit -r watcher -x watcher/tests/* -n5 -ll -s B320
[testenv:venv]
setenv = PYTHONHASHSEED=0
deps =
-c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/victoria}
-c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/ussuri}
-r{toxinidir}/doc/requirements.txt
-r{toxinidir}/test-requirements.txt
-r{toxinidir}/requirements.txt
@@ -105,7 +105,6 @@ extension =
N340 = checks:check_oslo_i18n_wrapper
N341 = checks:check_builtins_gettext
N342 = checks:no_redundant_import_alias
N366 = checks:import_stock_mock
paths = ./watcher/hacking

View File

@@ -13,6 +13,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import unicode_literals
from oslo_config import cfg
from watcher.api import hooks

View File

@@ -15,9 +15,9 @@
# under the License.
from http import client as http_client
from oslo_config import cfg
from pecan import hooks
from six.moves import http_client
from watcher.common import context

View File

@@ -24,6 +24,7 @@ from xml import etree as et
from oslo_log import log
from oslo_serialization import jsonutils
import six
import webob
from watcher._i18n import _
@@ -83,10 +84,12 @@ class ParsableErrorMiddleware(object):
'</error_message>' % state['status_code']]
state['headers'].append(('Content-Type', 'application/xml'))
else:
app_iter = [i.decode('utf-8') for i in app_iter]
if six.PY3:
app_iter = [i.decode('utf-8') for i in app_iter]
body = [jsonutils.dumps(
{'error_message': '\n'.join(app_iter)})]
body = [item.encode('utf-8') for item in body]
if six.PY3:
body = [item.encode('utf-8') for item in body]
state['headers'].append(('Content-Type', 'application/json'))
state['headers'].append(('Content-Length', str(len(body[0]))))
else:

View File

@@ -20,6 +20,7 @@ import itertools
from oslo_config import cfg
from oslo_log import log
from oslo_utils import timeutils
import six
from watcher.common import context as watcher_context
from watcher.common import scheduling
@@ -82,7 +83,7 @@ class APISchedulingService(scheduling.BackgroundSchedulerService):
service = objects.Service.get(context, service_id)
last_heartbeat = (service.last_seen_up or service.updated_at or
service.created_at)
if isinstance(last_heartbeat, str):
if isinstance(last_heartbeat, six.string_types):
# NOTE(russellb) If this service came in over rpc via
# conductor, then the timestamp will be a string and needs to be
# converted back to a datetime.

View File

@@ -18,9 +18,11 @@
#
import abc
import six
class BaseActionPlanHandler(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class BaseActionPlanHandler(object):
@abc.abstractmethod
def execute(self):
raise NotImplementedError()

View File

@@ -19,12 +19,14 @@
import abc
import jsonschema
import six
from watcher.common import clients
from watcher.common.loader import loadable
class BaseAction(loadable.Loadable, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class BaseAction(loadable.Loadable):
# NOTE(jed): by convention we decided
# that the attribute "resource_id" is the unique id of
# the resource to which the Action applies to allow us to use it in the

View File

@@ -15,6 +15,8 @@
# limitations under the License.
#
from __future__ import unicode_literals
from oslo_log import log
from watcher.applier.loading import default

View File

@@ -186,7 +186,7 @@ class Migrate(base.BaseAction):
return self.migrate(destination=self.destination_node)
def revert(self):
return self.migrate(destination=self.source_node)
LOG.info('Migrate action do not revert!')
def abort(self):
nova = nova_helper.NovaHelper(osc=self.osc)

View File

@@ -95,7 +95,7 @@ class Resize(base.BaseAction):
return self.resize()
def revert(self):
LOG.warning("revert not supported")
return self.migrate(destination=self.source_node)
def pre_condition(self):
# TODO(jed): check if the instance exists / check if the instance is on

View File

@@ -26,9 +26,11 @@ See: :doc:`../architecture` for more details on this component.
"""
import abc
import six
class BaseApplier(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class BaseApplier(object):
@abc.abstractmethod
def execute(self, action_plan_uuid):
raise NotImplementedError()

View File

@@ -11,6 +11,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import unicode_literals
from watcher.common.loader import default

View File

@@ -17,6 +17,7 @@
#
import abc
import six
import time
import eventlet
@@ -39,7 +40,8 @@ CANCEL_STATE = [objects.action_plan.State.CANCELLING,
objects.action_plan.State.CANCELLED]
class BaseWorkFlowEngine(loadable.Loadable, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class BaseWorkFlowEngine(loadable.Loadable):
def __init__(self, config, context=None, applier_manager=None):
"""Constructor

View File

@@ -25,11 +25,8 @@ from taskflow import task as flow_task
from watcher.applier.workflow_engine import base
from watcher.common import exception
from watcher import conf
from watcher import objects
CONF = conf.CONF
LOG = log.getLogger(__name__)
@@ -130,11 +127,9 @@ class DefaultWorkFlowEngine(base.BaseWorkFlowEngine):
class TaskFlowActionContainer(base.BaseTaskFlowActionContainer):
def __init__(self, db_action, engine):
self.name = "action_type:{0} uuid:{1}".format(db_action.action_type,
db_action.uuid)
super(TaskFlowActionContainer, self).__init__(self.name,
db_action,
engine)
name = "action_type:{0} uuid:{1}".format(db_action.action_type,
db_action.uuid)
super(TaskFlowActionContainer, self).__init__(name, db_action, engine)
def do_pre_execute(self):
db_action = self.engine.notify(self._db_action,
@@ -163,12 +158,6 @@ class TaskFlowActionContainer(base.BaseTaskFlowActionContainer):
self.action.post_condition()
def do_revert(self, *args, **kwargs):
# NOTE: Not rollback action plan
if not CONF.watcher_applier.rollback_when_actionplan_failed:
LOG.info("Failed actionplan rollback option is turned off, and "
"the following action will be skipped: %s", self.name)
return
LOG.warning("Revert action: %s", self.name)
try:
# TODO(jed): do we need to update the states in case of failure?

View File

@@ -13,6 +13,7 @@
from oslo_context import context
from oslo_log import log
from oslo_utils import timeutils
import six
LOG = log.getLogger(__name__)
@@ -68,7 +69,7 @@ class RequestContext(context.RequestContext):
self.project_id = project_id
if not timestamp:
timestamp = timeutils.utcnow()
if isinstance(timestamp, str):
if isinstance(timestamp, six.string_types):
timestamp = timeutils.parse_isotime(timestamp)
self.timestamp = timestamp
self.user_name = user_name

View File

@@ -14,10 +14,14 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import unicode_literals
import abc
import six
class BaseLoader(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class BaseLoader(object):
@abc.abstractmethod
def list_available(self):

View File

@@ -14,6 +14,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import unicode_literals
from oslo_config import cfg
from oslo_log import log
from stevedore import driver as drivermanager

View File

@@ -16,10 +16,13 @@
import abc
import six
from watcher.common import service
class Loadable(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class Loadable(object):
"""Generic interface for dynamically loading a driver/entry point.
This defines the contract in order to let the loader manager inject
@@ -45,7 +48,8 @@ LoadableSingletonMeta = type(
"LoadableSingletonMeta", (abc.ABCMeta, service.Singleton), {})
class LoadableSingleton(object, metaclass=LoadableSingletonMeta):
@six.add_metaclass(LoadableSingletonMeta)
class LoadableSingleton(object):
"""Generic interface for dynamically loading a driver as a singleton.
This defines the contract in order to let the loader manager inject

View File

@@ -15,9 +15,11 @@
# under the License.
import abc
import six
class ServiceManager(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class ServiceManager(object):
@abc.abstractproperty
def service_name(self):

View File

@@ -28,6 +28,7 @@ from oslo_config import cfg
from oslo_log import log
from oslo_utils import strutils
from oslo_utils import uuidutils
import six
from watcher.common import exception
@@ -81,7 +82,7 @@ def safe_rstrip(value, chars=None):
:return: Stripped value.
"""
if not isinstance(value, str):
if not isinstance(value, six.string_types):
LOG.warning(
"Failed to remove trailing character. Returning original object."
"Supplied object is not a string: %s,", value)
@@ -103,7 +104,7 @@ def is_hostname_safe(hostname):
"""
m = r'^[a-z0-9]([a-z0-9\-]{0,61}[a-z0-9])?$'
return (isinstance(hostname, str) and
return (isinstance(hostname, six.string_types) and
(re.match(m, hostname) is not None))

View File

@@ -43,20 +43,11 @@ APPLIER_MANAGER_OPTS = [
help='Select the engine to use to execute the workflow'),
]
APPLIER_OPTS = [
cfg.BoolOpt('rollback_when_actionplan_failed',
default=False,
help='If set True, the failed actionplan will rollback '
'when executing. Defaule value is False.'),
]
def register_opts(conf):
conf.register_group(watcher_applier)
conf.register_opts(APPLIER_MANAGER_OPTS, group=watcher_applier)
conf.register_opts(APPLIER_OPTS, group=watcher_applier)
def list_opts():
return [(watcher_applier, APPLIER_MANAGER_OPTS),
(watcher_applier, APPLIER_OPTS)]
return [(watcher_applier, APPLIER_MANAGER_OPTS)]

View File

@@ -18,6 +18,7 @@ Base classes for storage engines
import abc
from oslo_config import cfg
from oslo_db import api as db_api
import six
_BACKEND_MAPPING = {'sqlalchemy': 'watcher.db.sqlalchemy.api'}
IMPL = db_api.DBAPI.from_config(cfg.CONF, backend_mapping=_BACKEND_MAPPING,
@@ -29,7 +30,8 @@ def get_instance():
return IMPL
class BaseConnection(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class BaseConnection(object):
"""Base class for storage system connections."""
@abc.abstractmethod

View File

@@ -15,6 +15,8 @@
# limitations under the License.
#
from __future__ import print_function
import collections
import datetime
import itertools
@@ -23,6 +25,7 @@ import sys
from oslo_log import log
from oslo_utils import strutils
import prettytable as ptable
from six.moves import input
from watcher._i18n import _
from watcher._i18n import lazy_translation_enabled

View File

@@ -18,6 +18,7 @@
# limitations under the License.
#
import abc
import six
from oslo_config import cfg
from oslo_log import log
@@ -35,11 +36,9 @@ CONF = cfg.CONF
LOG = log.getLogger(__name__)
class BaseMetaClass(service.Singleton, abc.ABCMeta):
pass
class BaseAuditHandler(object, metaclass=BaseMetaClass):
@six.add_metaclass(abc.ABCMeta)
@six.add_metaclass(service.Singleton)
class BaseAuditHandler(object):
@abc.abstractmethod
def execute(self, audit, request_context):
@@ -58,7 +57,8 @@ class BaseAuditHandler(object, metaclass=BaseMetaClass):
raise NotImplementedError()
class AuditHandler(BaseAuditHandler, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class AuditHandler(BaseAuditHandler):
def __init__(self):
super(AuditHandler, self).__init__()

View File

@@ -16,10 +16,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from urllib import parse as urlparse
from oslo_config import cfg
from oslo_log import log
import six.moves.urllib.parse as urlparse
from watcher.common import clients
from watcher.common import exception

View File

@@ -15,11 +15,13 @@
# limitations under the License.
import abc
import six
from watcher.common.loader import loadable
class Goal(loadable.Loadable, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class Goal(loadable.Loadable):
def __init__(self, config):
super(Goal, self).__init__(config)

View File

@@ -27,8 +27,11 @@ import abc
import jsonschema
from oslo_serialization import jsonutils
import six
class EfficacySpecification(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class EfficacySpecification(object):
def __init__(self):
self._indicators_specs = self.get_indicators_specifications()

View File

@@ -18,6 +18,7 @@ import abc
import jsonschema
from jsonschema import SchemaError
from jsonschema import ValidationError
import six
from oslo_log import log
from oslo_serialization import jsonutils
@@ -28,7 +29,8 @@ from watcher.common import exception
LOG = log.getLogger(__name__)
class IndicatorSpecification(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class IndicatorSpecification(object):
def __init__(self, name=None, description=None, unit=None, required=True):
self.name = name

View File

@@ -19,6 +19,9 @@
# limitations under the License.
#
from __future__ import unicode_literals
from watcher.common.loader import default

View File

@@ -25,9 +25,11 @@ See: :doc:`../architecture` for more details on this component.
"""
import abc
import six
class Model(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class Model(object):
@abc.abstractmethod
def to_string(self):

View File

@@ -110,6 +110,7 @@ import time
from oslo_config import cfg
from oslo_log import log
import six
from watcher.common import clients
from watcher.common.loader import loadable
@@ -119,8 +120,8 @@ LOG = log.getLogger(__name__)
CONF = cfg.CONF
class BaseClusterDataModelCollector(loadable.LoadableSingleton,
metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class BaseClusterDataModelCollector(loadable.LoadableSingleton):
STALE_MODEL = model_root.ModelRoot(stale=True)

View File

@@ -13,6 +13,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import six
from oslo_log import log
from watcher.common import cinder_helper
@@ -287,7 +289,7 @@ class CinderModelBuilder(base.BaseModelBuilder):
:param instance: Cinder Volume object.
:return: A volume node for the graph.
"""
attachments = [{k: v for k, v in iter(d.items()) if k in (
attachments = [{k: v for k, v in six.iteritems(d) if k in (
'server_id', 'attachment_id')} for d in volume.attachments]
volume_attributes = {

View File

@@ -16,12 +16,14 @@
import abc
import six
from watcher.decision_engine.model.element import base
from watcher.objects import fields as wfields
class BaremetalResource(base.Element, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class BaremetalResource(base.Element):
VERSION = '1.0'

View File

@@ -21,6 +21,7 @@ import collections
from lxml import etree
from oslo_log import log
import six
from watcher.objects import base
from watcher.objects import fields as wfields
@@ -28,8 +29,9 @@ from watcher.objects import fields as wfields
LOG = log.getLogger(__name__)
@six.add_metaclass(abc.ABCMeta)
class Element(base.WatcherObject, base.WatcherObjectDictCompat,
base.WatcherComparableObject, metaclass=abc.ABCMeta):
base.WatcherComparableObject):
# Initial version
VERSION = '1.0'

View File

@@ -16,12 +16,14 @@
import abc
import six
from watcher.decision_engine.model.element import base
from watcher.objects import fields as wfields
class ComputeResource(base.Element, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class ComputeResource(base.Element):
VERSION = '1.0'

View File

@@ -16,12 +16,14 @@
import abc
import six
from watcher.decision_engine.model.element import base
from watcher.objects import fields as wfields
class StorageResource(base.Element, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class StorageResource(base.Element):
VERSION = '1.0'

View File

@@ -21,6 +21,7 @@ from lxml import etree
import networkx as nx
from oslo_concurrency import lockutils
from oslo_log import log
import six
from watcher._i18n import _
from watcher.common import exception
@@ -92,9 +93,9 @@ class ModelRoot(nx.DiGraph, base.Model):
:param node: :py:class:`~.node.ComputeNode` object or node UUID
:type node: str or :py:class:`~.instance.Instance`
"""
if isinstance(instance, str):
if isinstance(instance, six.string_types):
instance = self.get_instance_by_uuid(instance)
if isinstance(node, str):
if isinstance(node, six.string_types):
node = self.get_node_by_uuid(node)
self.assert_node(node)
self.assert_instance(instance)
@@ -103,9 +104,9 @@ class ModelRoot(nx.DiGraph, base.Model):
@lockutils.synchronized("model_root")
def unmap_instance(self, instance, node):
if isinstance(instance, str):
if isinstance(instance, six.string_types):
instance = self.get_instance_by_uuid(instance)
if isinstance(node, str):
if isinstance(node, six.string_types):
node = self.get_node_by_uuid(node)
self.remove_edge(instance.uuid, node.uuid)
@@ -366,9 +367,9 @@ class StorageModelRoot(nx.DiGraph, base.Model):
:param pool: :py:class:`~.node.Pool` object or pool name
:param node: :py:class:`~.node.StorageNode` object or node host
"""
if isinstance(pool, str):
if isinstance(pool, six.string_types):
pool = self.get_pool_by_pool_name(pool)
if isinstance(node, str):
if isinstance(node, six.string_types):
node = self.get_node_by_name(node)
self.assert_node(node)
self.assert_pool(pool)
@@ -382,9 +383,9 @@ class StorageModelRoot(nx.DiGraph, base.Model):
:param pool: :py:class:`~.node.Pool` object or pool name
:param node: :py:class:`~.node.StorageNode` object or node name
"""
if isinstance(pool, str):
if isinstance(pool, six.string_types):
pool = self.get_pool_by_pool_name(pool)
if isinstance(node, str):
if isinstance(node, six.string_types):
node = self.get_node_by_name(node)
self.remove_edge(pool.name, node.host)
@@ -410,9 +411,9 @@ class StorageModelRoot(nx.DiGraph, base.Model):
:param volume: :py:class:`~.volume.Volume` object or volume UUID
:param pool: :py:class:`~.node.Pool` object or pool name
"""
if isinstance(volume, str):
if isinstance(volume, six.string_types):
volume = self.get_volume_by_uuid(volume)
if isinstance(pool, str):
if isinstance(pool, six.string_types):
pool = self.get_pool_by_pool_name(pool)
self.assert_pool(pool)
self.assert_volume(volume)
@@ -426,9 +427,9 @@ class StorageModelRoot(nx.DiGraph, base.Model):
:param volume: :py:class:`~.volume.Volume` object or volume UUID
:param pool: :py:class:`~.node.Pool` object or pool name
"""
if isinstance(volume, str):
if isinstance(volume, six.string_types):
volume = self.get_volume_by_uuid(volume)
if isinstance(pool, str):
if isinstance(pool, six.string_types):
pool = self.get_pool_by_pool_name(pool)
self.remove_edge(volume.uuid, pool.name)

View File

@@ -17,9 +17,11 @@
# limitations under the License.
import abc
import six
class NotificationEndpoint(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class NotificationEndpoint(object):
def __init__(self, collector):
super(NotificationEndpoint, self).__init__()

View File

@@ -14,6 +14,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import six
from oslo_log import log
from watcher.common import cinder_helper
from watcher.common import exception
@@ -159,7 +161,7 @@ class CinderNotification(base.NotificationEndpoint):
return 'attachment_id'
attachments = [
{_keyReplace(k): v for k, v in iter(d.items())
{_keyReplace(k): v for k, v in six.iteritems(d)
if k in ('instance_uuid', 'id')}
for d in data['volume_attachment']
]

View File

@@ -19,6 +19,7 @@
import re
import oslo_messaging as om
import six
class NotificationFilter(om.NotificationFilter):
@@ -80,7 +81,7 @@ class NotificationFilter(om.NotificationFilter):
elif regex is not None and data is None:
return True
elif (regex is not None and
isinstance(data, str) and
isinstance(data, six.string_types) and
not regex.match(data)):
return True

View File

@@ -45,11 +45,13 @@ See :doc:`../architecture` for more details on this component.
"""
import abc
import six
from watcher.common.loader import loadable
class BasePlanner(loadable.Loadable, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class BasePlanner(loadable.Loadable):
@classmethod
def get_config_opts(cls):

View File

@@ -16,11 +16,13 @@
#
import abc
import six
from watcher.common import context
class BaseScope(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class BaseScope(object):
"""A base class for Scope mechanism
Child of this class is called when audit launches strategy. This strategy

View File

@@ -17,11 +17,13 @@
# limitations under the License.
import abc
import six
from watcher.common.loader import loadable
class ScoringEngine(loadable.Loadable, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class ScoringEngine(loadable.Loadable):
"""A base class for all the Scoring Engines.
A Scoring Engine is an instance of a data model, to which the learning
@@ -95,7 +97,8 @@ class ScoringEngine(loadable.Loadable, metaclass=abc.ABCMeta):
return []
class ScoringEngineContainer(loadable.Loadable, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class ScoringEngineContainer(loadable.Loadable):
"""A base class for all the Scoring Engines Containers.
A Scoring Engine Container is an abstraction which allows to plugin

View File

@@ -56,11 +56,13 @@ Two approaches to dealing with this can be envisaged:
"""
import abc
import six
from watcher.decision_engine.solution import efficacy
class BaseSolution(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class BaseSolution(object):
def __init__(self, goal, strategy):
"""Base Solution constructor

View File

@@ -17,9 +17,11 @@
# limitations under the License.
#
import abc
import six
class BaseSolutionComparator(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class BaseSolutionComparator(object):
@abc.abstractmethod
def compare(self, sol1, sol2):
raise NotImplementedError()

View File

@@ -17,9 +17,11 @@
# limitations under the License.
#
import abc
import six
class BaseSolutionEvaluator(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class BaseSolutionEvaluator(object):
@abc.abstractmethod
def evaluate(self, solution):
raise NotImplementedError()

View File

@@ -18,12 +18,14 @@
# limitations under the License.
import abc
import six
from watcher import notifications
from watcher.objects import fields
class StrategyContext(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class StrategyContext(object):
def execute_strategy(self, audit, request_context):
"""Execute the strategy for the given an audit

View File

@@ -17,9 +17,11 @@
# limitations under the License.
#
import abc
import six
class BaseSelector(object, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class BaseSelector(object):
@abc.abstractmethod
def select(self):

View File

@@ -37,6 +37,7 @@ which are dynamically loaded by Watcher at launch time.
"""
import abc
import six
from oslo_config import cfg
from oslo_log import log
@@ -120,7 +121,8 @@ class StrategyEndpoint(object):
return [available_datasource, available_metrics, available_cdm]
class BaseStrategy(loadable.Loadable, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class BaseStrategy(loadable.Loadable):
"""A base class for all the strategies
A Strategy is an algorithm implementation which is able to find a
@@ -469,7 +471,8 @@ class BaseStrategy(loadable.Loadable, metaclass=abc.ABCMeta):
input_parameters=parameters)
class DummyBaseStrategy(BaseStrategy, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class DummyBaseStrategy(BaseStrategy):
@classmethod
def get_goal_name(cls):
@@ -482,7 +485,8 @@ class DummyBaseStrategy(BaseStrategy, metaclass=abc.ABCMeta):
return []
class UnclassifiedStrategy(BaseStrategy, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class UnclassifiedStrategy(BaseStrategy):
"""This base class is used to ease the development of new strategies
The goal defined within this strategy can be used to simplify the
@@ -496,7 +500,8 @@ class UnclassifiedStrategy(BaseStrategy, metaclass=abc.ABCMeta):
return "unclassified"
class ServerConsolidationBaseStrategy(BaseStrategy, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class ServerConsolidationBaseStrategy(BaseStrategy):
REASON_FOR_DISABLE = 'watcher_disabled'
@@ -505,14 +510,16 @@ class ServerConsolidationBaseStrategy(BaseStrategy, metaclass=abc.ABCMeta):
return "server_consolidation"
class ThermalOptimizationBaseStrategy(BaseStrategy, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class ThermalOptimizationBaseStrategy(BaseStrategy):
@classmethod
def get_goal_name(cls):
return "thermal_optimization"
class WorkloadStabilizationBaseStrategy(BaseStrategy, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class WorkloadStabilizationBaseStrategy(BaseStrategy):
def __init__(self, *args, **kwargs):
super(WorkloadStabilizationBaseStrategy, self
@@ -524,14 +531,16 @@ class WorkloadStabilizationBaseStrategy(BaseStrategy, metaclass=abc.ABCMeta):
return "workload_balancing"
class NoisyNeighborBaseStrategy(BaseStrategy, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class NoisyNeighborBaseStrategy(BaseStrategy):
@classmethod
def get_goal_name(cls):
return "noisy_neighbor"
class SavingEnergyBaseStrategy(BaseStrategy, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class SavingEnergyBaseStrategy(BaseStrategy):
@classmethod
def get_goal_name(cls):
@@ -544,7 +553,8 @@ class SavingEnergyBaseStrategy(BaseStrategy, metaclass=abc.ABCMeta):
return []
class ZoneMigrationBaseStrategy(BaseStrategy, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class ZoneMigrationBaseStrategy(BaseStrategy):
@classmethod
def get_goal_name(cls):
@@ -557,7 +567,8 @@ class ZoneMigrationBaseStrategy(BaseStrategy, metaclass=abc.ABCMeta):
return []
class HostMaintenanceBaseStrategy(BaseStrategy, metaclass=abc.ABCMeta):
@six.add_metaclass(abc.ABCMeta)
class HostMaintenanceBaseStrategy(BaseStrategy):
REASON_FOR_MAINTAINING = 'watcher_maintaining'

View File

@@ -19,6 +19,7 @@
#
from oslo_log import log
import six
from watcher._i18n import _
from watcher.common import exception
@@ -131,7 +132,7 @@ class VMWorkloadConsolidation(base.ServerConsolidationBaseStrategy):
:param instance:
"""
if isinstance(instance.state, str):
if isinstance(instance.state, six.string_types):
return instance.state
elif isinstance(instance.state, element.InstanceState):
return instance.state.value
@@ -147,7 +148,7 @@ class VMWorkloadConsolidation(base.ServerConsolidationBaseStrategy):
:param node:
"""
if isinstance(node.status, str):
if isinstance(node.status, six.string_types):
return node.status
elif isinstance(node.status, element.ServiceState):
return node.status.value

View File

@@ -17,6 +17,8 @@
# limitations under the License.
#
from __future__ import division
from oslo_log import log
from watcher._i18n import _

View File

@@ -13,6 +13,7 @@
#
from dateutil.parser import parse
import six
from oslo_log import log
@@ -281,7 +282,7 @@ class ZoneMigration(base.ZoneMigrationBaseStrategy):
action_counter = ActionCounter(total_limit,
per_pool_limit, per_node_limit)
for k, targets in iter(filtered_targets.items()):
for k, targets in six.iteritems(filtered_targets):
if k == VOLUME:
self.volumes_migration(targets, action_counter)
elif k == INSTANCE:
@@ -579,7 +580,7 @@ class ZoneMigration(base.ZoneMigrationBaseStrategy):
filter_list = []
priority_filter_map = self.get_priority_filter_map()
for k, v in iter(self.priority.items()):
for k, v in six.iteritems(self.priority):
if k in priority_filter_map:
filter_list.append(priority_filter_map[k](v))
@@ -709,7 +710,7 @@ class BaseFilter(object):
return {}
for cond in list(reversed(self.condition)):
for k, v in iter(targets.items()):
for k, v in six.iteritems(targets):
if not self.is_allowed(k):
continue
LOG.debug("filter:%s with the key: %s", cond, k)

View File

@@ -19,6 +19,7 @@
import copy
import futurist
from futurist import waiters
import six
from oslo_config import cfg
from oslo_log import log
@@ -28,7 +29,8 @@ CONF = cfg.CONF
LOG = log.getLogger(__name__)
class DecisionEngineThreadPool(object, metaclass=service.Singleton):
@six.add_metaclass(service.Singleton)
class DecisionEngineThreadPool(object):
"""Singleton threadpool to submit general tasks to"""
def __init__(self):

View File

@@ -285,31 +285,3 @@ def no_redundant_import_alias(logical_line):
"""
if re.match(re_redundant_import_alias, logical_line):
yield(0, "N342: No redundant import alias.")
@flake8ext
def import_stock_mock(logical_line):
"""Use python's mock, not the mock library.
Since we `dropped support for python 2`__, we no longer need to use the
mock library, which existed to backport py3 functionality into py2.
Which must be done by saying::
from unittest import mock
...because if you say::
import mock
...you definitely will not be getting the standard library mock. That will
always import the third party mock library. This check can be removed in
the future (and we can start saying ``import mock`` again) if we manage to
purge these transitive dependencies.
.. __: https://review.opendev.org/#/c/717540
N366
"""
if logical_line == 'import mock':
yield (0, "N366: You must explicitly import python's mock: "
"``from unittest import mock``")

View File

@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: watcher VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2020-04-26 02:09+0000\n"
"POT-Creation-Date: 2020-04-26 01:47+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: watcher VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2020-04-26 02:09+0000\n"
"POT-Creation-Date: 2020-04-26 01:47+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -15,6 +15,7 @@
"""Utility methods for objects"""
import ast
import six
from oslo_serialization import jsonutils
from oslo_versionedobjects import fields
@@ -66,7 +67,7 @@ class ListOfUUIDsField(fields.AutoTypedField):
class FlexibleDict(fields.FieldType):
@staticmethod
def coerce(obj, attr, value):
if isinstance(value, str):
if isinstance(value, six.string_types):
value = ast.literal_eval(value)
return dict(value)
@@ -86,7 +87,7 @@ class FlexibleDictField(fields.AutoTypedField):
class FlexibleListOfDict(fields.FieldType):
@staticmethod
def coerce(obj, attr, value):
if isinstance(value, str):
if isinstance(value, six.string_types):
value = ast.literal_eval(value)
return list(value)
@@ -105,7 +106,7 @@ class FlexibleListOfDictField(fields.AutoTypedField):
class Json(fields.FieldType):
def coerce(self, obj, attr, value):
if isinstance(value, str):
if isinstance(value, six.string_types):
loaded = jsonutils.loads(value)
return loaded
return value

View File

@@ -23,12 +23,12 @@
# NOTE(deva): import auth_token so we can override a config option
import copy
from unittest import mock
from urllib import parse as urlparse
import mock
from oslo_config import cfg
import pecan
import pecan.testing
from six.moves.urllib import parse as urlparse
from watcher.api import hooks
from watcher.common import context as watcher_context

View File

@@ -12,7 +12,7 @@
# License for the specific language governing permissions and limitations
# under the License.
import importlib
import imp
from oslo_config import cfg
from watcher.api import config as api_config
from watcher.tests.api import base
@@ -23,13 +23,13 @@ class TestRoot(base.FunctionalTest):
def test_config_enable_webhooks_auth(self):
acl_public_routes = ['/']
cfg.CONF.set_override('enable_webhooks_auth', True, 'api')
importlib.reload(api_config)
imp.reload(api_config)
self.assertEqual(acl_public_routes,
api_config.app['acl_public_routes'])
def test_config_disable_webhooks_auth(self):
acl_public_routes = ['/', '/v1/webhooks/.*']
cfg.CONF.set_override('enable_webhooks_auth', False, 'api')
importlib.reload(api_config)
imp.reload(api_config)
self.assertEqual(acl_public_routes,
api_config.app['acl_public_routes'])

View File

@@ -14,8 +14,9 @@
"""Tests for the Pecan API hooks."""
from unittest import mock
from __future__ import unicode_literals
import mock
from oslo_config import cfg
import oslo_messaging as messaging
from oslo_serialization import jsonutils

View File

@@ -15,7 +15,7 @@
from apscheduler.schedulers import background
import datetime
import freezegun
from unittest import mock
import mock
from watcher.api import scheduling
from watcher.notifications import service

View File

@@ -14,6 +14,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import unicode_literals
from oslo_config import cfg
import wsme

View File

@@ -12,7 +12,7 @@
import datetime
import itertools
from unittest import mock
import mock
from oslo_config import cfg
from oslo_serialization import jsonutils

View File

@@ -12,7 +12,7 @@
import datetime
import itertools
from unittest import mock
import mock
from oslo_config import cfg
from oslo_serialization import jsonutils

View File

@@ -12,13 +12,13 @@
import datetime
import itertools
from unittest import mock
from urllib import parse as urlparse
import mock
from webtest.app import AppError
from oslo_config import cfg
from oslo_serialization import jsonutils
from oslo_utils import timeutils
import webtest.app as webtest_app
from six.moves.urllib import parse as urlparse
from wsme import types as wtypes
from watcher.api.controllers.v1 import audit_template as api_audit_template
@@ -603,7 +603,7 @@ class TestPost(FunctionalTestWithSetup):
audit_template_dict = post_get_test_audit_template(
goal=self.fake_goal1.uuid,
strategy=self.fake_strategy1.uuid, scope=scope)
with self.assertRaisesRegex(webtest_app.AppError,
with self.assertRaisesRegex(AppError,
"be included and excluded together"):
self.post_json('/audit_templates', audit_template_dict)

View File

@@ -13,14 +13,14 @@
import datetime
from dateutil import tz
import itertools
from unittest import mock
from urllib import parse as urlparse
import mock
from oslo_config import cfg
from oslo_serialization import jsonutils
from oslo_utils import timeutils
from wsme import types as wtypes
from six.moves.urllib import parse as urlparse
from watcher.api.controllers.v1 import audit as api_audit
from watcher.common import utils
from watcher.db import api as db_api

View File

@@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from unittest import mock
import mock
from oslo_serialization import jsonutils

View File

@@ -12,7 +12,7 @@
from oslo_config import cfg
from oslo_serialization import jsonutils
from urllib import parse as urlparse
from six.moves.urllib import parse as urlparse
from watcher.common import utils
from watcher.tests.api import base as api_base

View File

@@ -12,7 +12,7 @@
from oslo_config import cfg
from oslo_serialization import jsonutils
from urllib import parse as urlparse
from six.moves.urllib import parse as urlparse
from watcher.tests.api import base as api_base
from watcher.tests.objects import utils as obj_utils

View File

@@ -10,11 +10,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from unittest import mock
from urllib import parse as urlparse
import mock
from oslo_config import cfg
from oslo_serialization import jsonutils
from six.moves.urllib import parse as urlparse
from watcher.common import utils
from watcher.decision_engine import rpcapi as deapi

View File

@@ -13,7 +13,7 @@
# License for the specific language governing permissions and limitations
# under the License.
from unittest import mock
import mock
import webtest
import wsme
from wsme import types as wtypes

View File

@@ -10,7 +10,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from unittest import mock
import mock
from watcher.decision_engine import rpcapi as deapi
from watcher import objects

View File

@@ -15,7 +15,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from unittest import mock
import mock
from watcher.applier.action_plan import default
from watcher.applier import default as ap_applier

View File

@@ -12,6 +12,7 @@
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import unicode_literals
from watcher.applier.actions import base as abase
from watcher.applier.loading import default

View File

@@ -13,9 +13,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from unittest import mock
from __future__ import unicode_literals
import jsonschema
import mock
from watcher.applier.actions import base as baction
from watcher.applier.actions import change_node_power_state

View File

@@ -13,9 +13,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from unittest import mock
from __future__ import unicode_literals
import jsonschema
import mock
from watcher.applier.actions import base as baction
from watcher.applier.actions import change_nova_service_state

View File

@@ -13,9 +13,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from unittest import mock
from __future__ import unicode_literals
import jsonschema
import mock
from watcher.applier.actions import base as baction
from watcher.applier.actions import migration
@@ -185,29 +187,6 @@ class TestMigration(base.TestCase):
dest_hostname="compute2-hostname"
)
def test_revert_live_migration(self):
self.m_helper.find_instance.return_value = self.INSTANCE_UUID
self.action.revert()
self.m_helper_cls.assert_called_once_with(osc=self.m_osc)
self.m_helper.live_migrate_instance.assert_called_once_with(
instance_id=self.INSTANCE_UUID,
dest_hostname="compute1-hostname"
)
def test_revert_cold_migration(self):
self.m_helper.find_instance.return_value = self.INSTANCE_UUID
self.action_cold.revert()
self.m_helper_cls.assert_called_once_with(osc=self.m_osc)
self.m_helper.watcher_non_live_migrate_instance.\
assert_called_once_with(
instance_id=self.INSTANCE_UUID,
dest_hostname="compute1-hostname"
)
def test_abort_live_migrate(self):
migration = mock.MagicMock()
migration.id = "2"

View File

@@ -13,8 +13,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import unicode_literals
import jsonschema
from unittest import mock
import mock
from watcher.applier.actions import base as baction
from watcher.applier.actions import resize

View File

@@ -15,7 +15,7 @@
import jsonschema
from unittest import mock
import mock
from watcher.applier.actions import sleep
from watcher.tests import base

View File

@@ -12,9 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from unittest import mock
from __future__ import unicode_literals
import jsonschema
import mock
from watcher.applier.actions import base as baction
from watcher.applier.actions import volume_migration

View File

@@ -18,7 +18,7 @@
#
from unittest import mock
import mock
from watcher.applier.messaging import trigger
from watcher.common import utils

View File

@@ -16,7 +16,7 @@
# limitations under the License.
#
from unittest import mock
import mock
import oslo_messaging as om
from watcher.applier import manager as applier_manager

View File

@@ -17,8 +17,7 @@
# limitations under the License.
#
from unittest import mock
import mock
import oslo_messaging as om
from watcher.applier import rpcapi

Some files were not shown because too many files have changed in this diff Show More