Compare commits

..

41 Commits
1.1.0 ... 1.3.1

Author SHA1 Message Date
Nguyen Hai
4a8cf8445e import zuul job settings from project-config
This is a mechanically generated patch to complete step 1 of moving
the zuul job settings out of project-config and into each project
repository.

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

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

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

Change-Id: I6e15638497fc016dca98189dc15397d61d268433
Story: #2002586
Task: #24344
2018-08-19 00:58:47 +09:00
OpenStack Proposal Bot
e28f0e7ee2 Updated from global requirements
Change-Id: I7236e4ba660824d4ae8b72f0c2f79a49ae36861b
2017-09-15 07:45:58 +00:00
zte-hanrong
b45c813d9a Add the filed of description to shell command for action.
blueprint dynamic-action-description

Change-Id: I927cf966530059d9c7af1e6e60a8d75dd3e6b812
(cherry picked from commit 08fbccc684)
2017-08-24 08:45:20 +00:00
Alexander Chadin
4a47b7886d Fix Audit Update functional test
Change-Id: Iffd70302d0b1d7a919db3e6e44bd3bbebcb1e7ce
(cherry picked from commit d6b68dc819)
2017-08-24 07:49:35 +00:00
f5eae02253 Update UPPER_CONSTRAINTS_FILE for stable/pike
Change-Id: I933e0a2cc99083aefae75648578800af7047c343
2017-07-28 21:08:25 +00:00
b6fe5c9261 Update .gitreview for stable/pike
Change-Id: I0ef7e43614425d4f88a2f3b5c2d90dfe3bb7f6c2
2017-07-28 21:08:24 +00:00
Alexander Chadin
c02f584b33 Update .gitignore because of doc migration
This patch set updates .gitignore and fixes autodoc_exclude_modules

Change-Id: If0e8a28c541b7e0711cc5a76ef93513c51080974
2017-07-26 11:58:58 +03:00
OpenStack Proposal Bot
a9405f5c2d Updated from global requirements
Change-Id: Iecde214cf1d386bb0a170f1456814a349a3c3f7d
2017-07-23 13:53:11 +00:00
Jenkins
4bb678f7a5 Merge "Add support for cron syntax" 2017-07-21 09:10:08 +00:00
Jenkins
baadbe3dca Merge "Update URLs in documents according to document migration" 2017-07-19 14:04:41 +00:00
Jenkins
24b089c057 Merge "Update permissions for post_test_hook.sh" 2017-07-19 13:42:36 +00:00
Alexander Chadin
c8acc20e82 Update permissions for post_test_hook.sh
This patch updates permissions up to 755 for post_test_hook.sh
to let it be executed using jenkins jobs.

Change-Id: I0224d10089df05729b8d479d6d910a2a2105c3f8
2017-07-19 14:45:56 +03:00
melissaml
fa91740b47 Update URLs in documents according to document migration
Change-Id: Ic1f137214fc16cdaab2e0da8fd5761a0ed153ad8
2017-07-14 11:38:36 +08:00
OpenStack Proposal Bot
504ca86b78 Updated from global requirements
Change-Id: Iee0f3a7ccade75a51bed40d08521306dd710732b
2017-07-13 14:25:08 +00:00
Jenkins
2b155f9505 Merge "Move existing content into the new standard structure" 2017-07-12 15:01:40 +00:00
Alexander Chadin
c8df16da8f Add support for cron syntax
Implements: blueprint cron-based-continuous-audits

Change-Id: Ib281964fbf9c160791d30eafe94fd83937cac23e
2017-07-10 07:30:38 +00:00
OpenStack Proposal Bot
0de3f627c5 Updated from global requirements
Change-Id: Ifd99e023666c7cfccff15cc4e7d2ffe06811dfa4
2017-07-06 01:45:35 +00:00
Jenkins
9c46ee00bb Merge "Add post_test_hook" 2017-07-06 00:22:40 +00:00
Jenkins
48703e19e4 Merge "Fix for README.rst of tests" 2017-07-06 00:21:33 +00:00
Jenkins
799084d3d1 Merge "Fixed wrap from taking negative values" 2017-07-06 00:17:15 +00:00
kavithahr
ee087b85d5 Fixed wrap from taking negative values
Now for wrap input it will take only postive integers as an input and
if any negative numbers are give it will give output as "Wrap argument
should be a positive integer".

Change-Id: I375dab0bdd53ee464f5634162472000119f247cb
2017-07-05 18:06:10 +05:30
Alexander Chadin
8524016170 Add post_test_hook
This patch set adds post_test_hook.sh which allows to
set jenkins job to execute functional jobs.

Change-Id: Icc4cdf8680da3ae83f36b3455fb32aecae2fb57f
2017-07-05 12:11:50 +03:00
Yumeng Bao
ed5e1b86c3 Move existing content into the new standard structure
This patch rearranges and reformats existing content.

Change-Id: I05088140504ba55abc724115828a7a977bd5c087
2017-07-05 16:10:09 +08:00
Alexander Chadin
42bf82c22c Fix for README.rst of tests
This patch set fixes one of steps to prepare functional env.

Change-Id: Ibb2536e61f847cda2590674e50d34d68726926a8
2017-07-05 11:07:38 +03:00
Yumeng Bao
0d0192c472 switch to openstackdocstheme
Depends-On: Ia750cb049c0f53a234ea70ce1f2bbbb7a2aa9454
Change-Id: I93dfcbd516810c41a1d64e872a28a539ec4f3155
2017-07-04 09:56:28 +08:00
Jenkins
641cd44adb Merge "Updated from global requirements" 2017-06-28 12:44:55 +00:00
Jenkins
da715f8e70 Merge "Enable some off-by-default checks" 2017-06-28 12:44:43 +00:00
OpenStack Proposal Bot
abe14a14d4 Updated from global requirements
Change-Id: Iffc25e19f78014db1d50b7778bf550f900f24a35
2017-06-27 12:23:00 +00:00
Yumeng Bao
984601ecfa Turn on warning-is-error in sphinx build
Turn on the flag to ensure that future warnings in the doc build
trigger a build failure.

Change-Id: I6f93e229cfd9bc56208750d1ddfe88404f89ab8e
2017-06-26 20:17:57 +08:00
blue55
f32956493b Enable some off-by-default checks
Some of the available checks are disabled by default, like:
[H106] Don’t put vim configuration in source files
[H203] Use assertIs(Not)None to check for None

Change-Id: I2809ab2cce76dd31a04d3cca0e97cdad26c14cb4
2017-06-23 10:13:40 +08:00
Jenkins
1e2a13fe1a Merge "Add CLI for Action Plan Cancel" 2017-06-19 09:17:59 +00:00
OpenStack Proposal Bot
417b3a2669 Updated from global requirements
Change-Id: Ie3692b21a749dec23583f302a42a822c5922bff5
2017-06-10 11:48:35 +00:00
aditi
3f25b6b223 Add CLI for Action Plan Cancel
This patch CLI for for action plan cancel
watcher action plan cancel <action-plan-uuid>

Change-Id: I9c8d53107b1926d6ce4532d7c696dc36c84c6cf8
Partially-Implements: blueprint cancel-action-plan
2017-05-31 11:19:20 +00:00
OpenStack Proposal Bot
5cbce9fb20 Updated from global requirements
Change-Id: I7e4668bd04f9a439296644f6d9dd181ba0b2ae9d
2017-05-23 12:00:31 +00:00
OpenStack Proposal Bot
f379b1544c Updated from global requirements
Change-Id: I02ae2ad14f93141e3aaadc873d43fec076480686
2017-05-17 03:58:59 +00:00
OpenStack Proposal Bot
30f49c9f70 Updated from global requirements
Change-Id: Ia162a2106be6cb4982c694d5a37d9c2ed845f143
2017-05-03 12:23:47 +00:00
Jenkins
af13d9cdd1 Merge "Updated from global requirements" 2017-05-03 12:21:47 +00:00
OpenStack Proposal Bot
8952b2fbd2 Updated from global requirements
Change-Id: I14c857805f9156640e9c0fd57233ca4cf2b5d99f
2017-05-01 14:08:23 +00:00
M V P Nitesh
66681ef9c9 Add 'rm -f .testrepository/times.dbm' command in testenv
Running py2* post py3* tests results in error. Add
'rm -f .testrepository/times.dbm' command in testenv to
resolve this.

Change-Id: Ie704b12c413c9e8cc0b2649c1d2bbc03a3b61a11
2017-04-25 12:55:27 +05:30
Jenkins
4285b388ca Merge "Updated from global requirements" 2017-04-12 12:23:36 +00:00
M V P Nitesh
156d660cd3 Optimize the link address
Use https instead of http to ensure the safety

Change-Id: Ieeea614ce26b99b007a89cb12a8e83f120b64d32
2017-04-10 16:15:11 +05:30
29 changed files with 269 additions and 89 deletions

6
.gitignore vendored
View File

@@ -6,6 +6,7 @@
# Packages
*.egg
*.egg-info
.eggs
dist
build
eggs
@@ -42,7 +43,7 @@ output/*/index.html
# Sphinx
doc/build
doc/source/api
doc/source/reference/api
# pbr generates these
AUTHORS
@@ -55,3 +56,6 @@ ChangeLog
sftp-config.json
/.idea/
# Desktop Service Store
*.DS_Store

View File

@@ -2,3 +2,4 @@
host=review.openstack.org
port=29418
project=openstack/python-watcherclient.git
defaultbranch=stable/pike

12
.zuul.yaml Normal file
View File

@@ -0,0 +1,12 @@
- project:
templates:
- openstack-python-jobs
- openstack-python35-jobs
- publish-openstack-sphinx-docs
- check-requirements
- openstackclient-plugin-jobs
check:
jobs:
- openstack-tox-cover:
voting: false

View File

@@ -2,8 +2,8 @@
Team and repository tags
========================
.. image:: http://governance.openstack.org/badges/python-watcherclient.svg
:target: http://governance.openstack.org/reference/tags/index.html
.. image:: https://governance.openstack.org/badges/python-watcherclient.svg
:target: https://governance.openstack.org/reference/tags/index.html
.. Change things from this point on

31
doc/source/cli/index.rst Normal file
View File

@@ -0,0 +1,31 @@
=============================
Command-line Tool Reference
=============================
In order to use the CLI, you must provide your OpenStack username,
password, tenant, and auth endpoint. Use the corresponding
configuration options (``--os-username``, ``--os-password``,
``--os-tenant-id``, and ``--os-auth-url``) or set them in environment
variables::
export OS_USERNAME=user
export OS_PASSWORD=pass
export OS_TENANT_ID=b363706f891f48019483f8bd6503c54b
export OS_AUTH_URL=http://auth.example.com:5000/v2.0
The command line tool will attempt to reauthenticate using your
provided credentials for every request. You can override this behavior
by manually supplying an auth token using ``--os-watcher-url`` and
``--os-auth-token``. You can alternatively set these environment
variables::
export OS_WATCHER_URL=http://watcher.example.org:9322/
export OS_AUTH_TOKEN=3bcc3d3a03f44e3d8377f9247b0ad155
Once you've configured your authentication parameters, you can run
``watcher help`` to see a complete listing of available commands.
.. toctree::
watcher
openstack_cli

View File

@@ -24,9 +24,9 @@ OpenStack infra-optim Service (Watcher), by using our additional plugin
In order to use the CLI, you must provide your OpenStack username, password,
project (historically called tenant), and auth endpoint. You can use
configuration options :option:`--os-username`, :option:`--os-password`,
:option:`--os-tenant-id` (or :option:`--os-tenant-name`),
and :option:`--os-auth-url`, or set the corresponding
configuration options :option:``--os-username``, :option:``--os-password``,
:option:``--os-tenant-id`` (or :option:``--os-tenant-name``),
and :option:``--os-auth-url``, or set the corresponding
environment variables::
$ export OS_USERNAME=user
@@ -37,14 +37,14 @@ environment variables::
The command-line tool will attempt to reauthenticate using the provided
credentials for every request. You can override this behavior by manually
supplying an auth token using :option:`--watcher-url` and
:option:`--os-auth-token`, or by setting the corresponding environment variables::
supplying an auth token using :option:``--watcher-url`` and
:option:``--os-auth-token``, or by setting the corresponding environment variables::
export WATCHER_URL=http://watcher.example.org:9322/
export OS_AUTH_TOKEN=3bcc3d3a03f44e3d8377f9247b0ad155
Since Keystone can return multiple regions in the Service Catalog, you can
specify the one you want with :option:`--os-region-name` or set the following
specify the one you want with :option:``--os-region-name`` or set the following
environment variable. (It defaults to the first in the list returned.)
::

View File

@@ -1,6 +1,6 @@
==============================================
===============================================
:program:`watcher` Command-Line Interface (CLI)
==============================================
===============================================
.. program:: watcher
.. highlight:: bash
@@ -23,9 +23,9 @@ OpenStack infra-optim Service (Watcher).
In order to use the CLI, you must provide your OpenStack username, password,
project (historically called tenant), and auth endpoint. You can use
configuration options :option:`--os-username`, :option:`--os-password`,
:option:`--os-tenant-id` (or :option:`--os-tenant-name`),
and :option:`--os-auth-url`, or set the corresponding
configuration options :option:``--os-username``, :option:``--os-password``,
:option:``--os-tenant-id`` (or :option:``--os-tenant-name``),
and :option:``--os-auth-url``, or set the corresponding
environment variables::
$ export OS_USERNAME=user
@@ -36,14 +36,14 @@ environment variables::
The command-line tool will attempt to reauthenticate using the provided
credentials for every request. You can override this behavior by manually
supplying an auth token using :option:`--watcher-url` and
:option:`--os-auth-token`, or by setting the corresponding environment variables::
supplying an auth token using :option:``--watcher-url`` and
:option:``--os-auth-token``, or by setting the corresponding environment variables::
$ export WATCHER_URL=http://watcher.example.org:9322/
$ export OS_AUTH_TOKEN=3bcc3d3a03f44e3d8377f9247b0ad155
Since Keystone can return multiple regions in the Service Catalog, you can
specify the one you want with :option:`--os-region-name` or set the following
specify the one you want with :option:``--os-region-name`` or set the following
environment variable. (It defaults to the first in the list returned.)
::

View File

@@ -11,6 +11,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from watcherclient import version as watcherclient_version
# -- General configuration ----------------------------------------------------
@@ -19,9 +20,8 @@ from watcherclient import version as watcherclient_version
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ['sphinx.ext.autodoc',
'sphinx.ext.viewcode',
'oslosphinx',
]
'openstackdocstheme',
]
# autodoc generation is a bit aggressive and a nuisance when doing heavy
# text edit cycles.
# execute "export SPHINX_DEBUG=1" in your terminal to disable
@@ -69,7 +69,8 @@ pygments_style = 'sphinx'
# html_theme_path = ["."]
# html_theme = '_theme'
# html_static_path = ['_static']
html_theme_options = {'incubating': True}
html_theme = 'openstackdocs'
# html_theme_path = [openstackdocstheme.get_html_theme_path()]
# Output file base name for HTML help builder.
htmlhelp_basename = '%sdoc' % project
@@ -86,3 +87,13 @@ latex_documents = [
u'OpenStack Foundation', 'manual'
),
]
# openstackdocstheme options
repository_name = 'openstack/python-watcherclient'
bug_project = 'python-watcherclient'
bug_tag = ''
# Must set this variable to include year, month, day, hours, and minutes.
html_last_updated_fmt = '%Y-%m-%d %H:%M'
#html_theme_options = {"show_other_versions": "True"}

View File

@@ -1,8 +1,8 @@
.. _contributing:
===================================
====================================
Contributing to python-watcherclient
===================================
====================================
If you're interested in contributing to the python-watcherclient project,
the following will help get you started.

View File

@@ -1,42 +1,15 @@
Python bindings to the OpenStack Watcher API
============================================
This is a client for OpenStack Watcher API. There's :doc:`a Python API
<api_v1>` (the :mod:`watcherclient` modules), and a :doc:`command-line script
<cli>` (installed as :program:`watcher`). Each implements the entire
This is a client for OpenStack Watcher API. There's a Python API
(the :mod:`watcherclient` modules), and a command-line script
(installed as :program:`watcher`). Each implements the entire
OpenStack Watcher API.
You'll need credentials for an OpenStack cloud in order to use the watcher client.
Contents:
.. toctree::
:maxdepth: 1
:maxdepth: 2
cli/index
reference/index
installation
api_v1
cli
openstack_cli
contributing
Contributing
============
Code is hosted at `git.openstack.org`_. Submit bugs to the Watcher project on
`Launchpad`_. Submit code to the openstack/python-watcherclient project using
`Gerrit`_.
.. _git.openstack.org: https://git.openstack.org/cgit/openstack/python-watcherclient
.. _Launchpad: https://launchpad.net/watcher
.. _Gerrit: http://docs.openstack.org/infra/manual/developers.html#development-workflow
Testing
-------
The preferred way to run the unit tests is using ``tox``.
See `Consistent Testing Interface`_ for more details.
.. _Consistent Testing Interface: http://git.openstack.org/cgit/openstack/governance/tree/reference/project-testing-interface.rst
.. _Watcher: https://wiki.openstack.org/wiki/Watcher

View File

@@ -0,0 +1,8 @@
======================
Python API Reference
======================
.. toctree::
:maxdepth: 2
autoindex

View File

@@ -80,12 +80,6 @@ Refer to the modules themselves, for more details.
watcherclient Modules
=====================
.. toctree::
:maxdepth: 1
modules <api/autoindex>
.. _watcherclient.v1.audit: api/watcherclient.v1.audit.html#watcherclient.v1.audit.Audit
.. _watcherclient.v1.client.Client: api/watcherclient.v1.client.html#watcherclient.v1.client.Client
.. _Client: api/watcherclient.v1.client.html#watcherclient.v1.client.Client

View File

@@ -0,0 +1,14 @@
==========================
Python Library Reference
==========================
In order to use the python api directly, you must first obtain an auth
token and identify which endpoint you wish to speak to. Once you have
done so, you can use the API like so.
.. toctree::
:maxdepth: 2
api/index
api_v1

View File

@@ -3,12 +3,12 @@
# process, which may cause wedges in the gate later.
Babel!=2.4.0,>=2.3.4 # BSD
cliff>=2.3.0 # Apache-2.0
osc-lib>=1.2.0 # Apache-2.0
oslo.i18n>=2.1.0 # Apache-2.0
cliff>=2.8.0 # Apache-2.0
osc-lib>=1.7.0 # Apache-2.0
oslo.i18n!=3.15.2,>=2.1.0 # Apache-2.0
oslo.utils>=3.20.0 # Apache-2.0
pbr!=2.1.0,>=2.0.0 # Apache-2.0
PrettyTable<0.8,>=0.7.1 # BSD
keystoneauth1>=2.18.0 # Apache-2.0
keystoneauth1>=3.1.0 # Apache-2.0
six>=1.9.0 # MIT
PyYAML>=3.10.0 # MIT

View File

@@ -54,6 +54,7 @@ openstack.infra_optim.v1 =
optimize_actionplan_create = watcherclient.v1.action_plan_shell:CreateActionPlan
optimize_actionplan_update = watcherclient.v1.action_plan_shell:UpdateActionPlan
optimize_actionplan_start = watcherclient.v1.action_plan_shell:StartActionPlan
optimize_actionplan_cancel = watcherclient.v1.action_plan_shell:CancelActionPlan
optimize_action_show = watcherclient.v1.action_shell:ShowAction
optimize_action_list = watcherclient.v1.action_shell:ListAction
@@ -90,6 +91,7 @@ watcherclient.v1 =
actionplan_update = watcherclient.v1.action_plan_shell:UpdateActionPlan
actionplan_start = watcherclient.v1.action_plan_shell:StartActionPlan
actionplan_delete = watcherclient.v1.action_plan_shell:DeleteActionPlan
actionplan_cancel = watcherclient.v1.action_plan_shell:CancelActionPlan
action_show = watcherclient.v1.action_shell:ShowAction
action_list = watcherclient.v1.action_shell:ListAction
@@ -102,11 +104,15 @@ watcherclient.v1 =
[pbr]
autodoc_index_modules = True
autodoc_exclude_modules =
watcherclient.tests.*
api_doc_dir = reference/api
[build_sphinx]
source-dir = doc/source
build-dir = doc/build
all_files = 1
warning-is-error = 1
[bdist_wheel]
universal = 1

View File

@@ -2,18 +2,18 @@
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
coverage>=4.0 # Apache-2.0
coverage!=4.4,>=4.0 # Apache-2.0
fixtures>=3.0.0 # Apache-2.0/BSD
hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0
mock>=2.0 # BSD
oslosphinx>=4.7.0 # Apache-2.0
openstackdocstheme>=1.16.0 # Apache-2.0
oslotest>=1.10.0 # Apache-2.0
python-subunit>=0.0.18 # Apache-2.0/BSD
sphinx>=1.5.1 # BSD
sphinx>=1.6.2 # BSD
testrepository>=0.0.18 # Apache-2.0/BSD
testscenarios>=0.4 # Apache-2.0/BSD
testtools>=1.4.0 # MIT
tempest>=14.0.0 # Apache-2.0
tempest>=16.1.0 # Apache-2.0
# Needed for pypi packaging
wheel # MIT

View File

@@ -6,13 +6,14 @@ skipsdist = True
[testenv]
usedevelop = True
install_command =
constraints: pip install -U --force-reinstall -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages}
constraints: pip install -U --force-reinstall -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=stable/pike} {opts} {packages}
pip install -U {opts} {packages}
setenv =
VIRTUAL_ENV={envdir}
OS_TEST_PATH=./watcherclient/tests/unit
deps = -r{toxinidir}/test-requirements.txt
commands = python setup.py testr --slowest --testr-args='{posargs}'
commands = rm -f .testrepository/times.dbm
python setup.py testr --slowest --testr-args='{posargs}'
[testenv:pep8]
commands = flake8
@@ -49,6 +50,7 @@ commands = python setup.py testr --slowest --testr-args='--concurrency=1 {posarg
[flake8]
# E123, E125 skipped as they are invalid PEP-8.
show-source = True
enable-extensions = H203,H106
ignore = E123,E125
builtins = _
exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build

View File

@@ -204,6 +204,8 @@ def print_dict(dct, dict_property="Property", wrap=0):
v = six.text_type(v)
if wrap > 0:
v = textwrap.fill(six.text_type(v), wrap)
elif wrap < 0:
raise ValueError(_("Wrap argument should be a positive integer"))
# if value has a newline, add in multiple rows
# e.g. fault with stacktrace
if v and isinstance(v, six.string_types) and r'\n' in v:

View File

@@ -75,7 +75,7 @@ def import_versioned_module(version, submodule=None):
return importutils.import_module(module)
def split_and_deserialize(string):
def split_and_deserialize(string, exclude_fields=[]):
"""Split and try to JSON deserialize a string.
Gets a string with the KEY=VALUE format, split it (using '=' as the
@@ -88,10 +88,11 @@ def split_and_deserialize(string):
except ValueError:
raise exc.CommandError(_('Attributes must be a list of '
'PATH=VALUE not "%s"') % string)
try:
value = jsonutils.loads(value)
except ValueError:
pass
if key not in exclude_fields:
try:
value = jsonutils.loads(value)
except ValueError:
pass
return (key, value)
@@ -104,7 +105,7 @@ def args_array_to_dict(kwargs, key_to_convert):
return kwargs
def args_array_to_patch(op, attributes):
def args_array_to_patch(op, attributes, exclude_fields=[]):
patch = []
for attr in attributes:
# Sanitize
@@ -112,7 +113,8 @@ def args_array_to_patch(op, attributes):
attr = '/' + attr
if op in ['add', 'replace']:
path, value = split_and_deserialize(attr)
path, value = split_and_deserialize(attr,
exclude_fields=exclude_fields)
patch.append({'op': op, 'path': path, 'value': value})
elif op == "remove":

View File

@@ -16,7 +16,7 @@ Functional tests
The following procedure gets you started with Tempest testing but you can also
refer to the `Tempest documentation`_ for more details.
.. _Tempest documentation: http://docs.openstack.org/developer/tempest/
.. _Tempest documentation: https://docs.openstack.org/tempest/latest/
Tempest installation
@@ -52,7 +52,7 @@ variables.
To run functional tests you need to go to python-watcherclient folder, install
all requirements and execute ``tempest run`` command::
$ pip install -r requirements.txt test-requirements.txt
$ pip install -r requirements.txt -r test-requirements.txt
$ pip install .
$ tempest run --regex watcherclient.tests.functional

View File

@@ -0,0 +1,53 @@
#!/bin/bash -xe
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# This script is executed inside post_test_hook function in devstack gate.
# Default gate uses /opt/stack/new... but some of us may install differently
STACK_DIR=$BASE/new/devstack
function generate_testr_results {
if [ -f .testrepository/0 ]; then
sudo .tox/functional/bin/testr last --subunit > $WORKSPACE/testrepository.subunit
sudo mv $WORKSPACE/testrepository.subunit $BASE/logs/testrepository.subunit
sudo /usr/os-testr-env/bin/subunit2html $BASE/logs/testrepository.subunit $BASE/logs/testr_results.html
sudo gzip -9 $BASE/logs/testrepository.subunit
sudo gzip -9 $BASE/logs/testr_results.html
sudo chown jenkins:jenkins $BASE/logs/testrepository.subunit.gz $BASE/logs/testr_results.html.gz
sudo chmod a+r $BASE/logs/testrepository.subunit.gz $BASE/logs/testr_results.html.gz
fi
}
export WATCHERCLIENT_DIR="$BASE/new/python-watcherclient"
sudo chown -R jenkins:stack $WATCHERCLIENT_DIR
# Get admin credentials
cd $STACK_DIR
source openrc admin admin
# Go to the watcherclient dir
cd $WATCHERCLIENT_DIR
# Run tests
echo "Running watcherclient functional test suite"
set +e
# Preserve env for OS_ credentials
sudo -E -H -u jenkins tox -efunctional
EXIT_CODE=$?
set -e
# Collect and parse result
generate_testr_results
exit $EXIT_CODE

View File

@@ -25,7 +25,8 @@ class AuditTests(base.TestCase):
list_fields = ['UUID', 'Audit Type', 'State', 'Goal', 'Strategy']
detailed_list_fields = list_fields + ['Created At', 'Updated At',
'Deleted At', 'Parameters',
'Interval', 'Audit Scope']
'Interval', 'Audit Scope',
'Next Run Time']
audit_template_name = 'a' + uuidutils.generate_uuid()
audit_uuid = None

View File

@@ -257,3 +257,25 @@ class ActionPlanShellTest(base.CommandTestCase):
self.assertEqual(1, exit_code)
self.assertEqual('', result)
def test_do_action_plan_cancel(self):
action_plan = resource.ActionPlan(mock.Mock(), ACTION_PLAN_1)
self.m_action_plan_mgr.cancel.return_value = action_plan
exit_code, result = self.run_cmd(
'actionplan cancel 5869da81-4876-4687-a1ed-12cd64cf53d9')
self.assertEqual(0, exit_code)
self.assertEqual(
self.resource_as_dict(action_plan, self.FIELDS, self.FIELD_LABELS),
result)
self.m_action_plan_mgr.cancel.assert_called_once_with(
'5869da81-4876-4687-a1ed-12cd64cf53d9')
def test_do_action_plan_cancel_not_uuid(self):
exit_code, result = self.run_cmd(
'actionplan cancel not_uuid',
formatting=None)
self.assertEqual(1, exit_code)
self.assertEqual('', result)

3
watcherclient/tests/unit/v1/test_action_shell.py Normal file → Executable file
View File

@@ -30,6 +30,7 @@ ACTION_1 = {
'action_type': 'migrate',
'parents': ['239f02a5-9649-4e14-9d33-ac2bf67cb755'],
'input_parameters': {"test": 1},
'description': 'test',
'created_at': datetime.datetime.now().isoformat(),
'updated_at': None,
'deleted_at': None,
@@ -42,6 +43,7 @@ ACTION_2 = {
'action_type': 'migrate',
'parents': ['67653274-eb24-c7ba-70f6-a84e73d80843'],
'input_parameters': {"test": 2},
'description': 'test',
'created_at': datetime.datetime.now().isoformat(),
'updated_at': None,
'deleted_at': None,
@@ -53,6 +55,7 @@ ACTION_3 = {
'parents': [],
'state': 'PENDING',
'action_type': 'sleep',
'description': 'test',
'created_at': datetime.datetime.now().isoformat(),
'updated_at': None,
'deleted_at': None,

View File

@@ -68,6 +68,7 @@ AUDIT_1 = {
'interval': None,
'scope': '',
'auto_trigger': False,
'next_run_time': None,
}
AUDIT_2 = {
@@ -85,6 +86,7 @@ AUDIT_2 = {
'interval': None,
'scope': '',
'auto_trigger': False,
'next_run_time': None,
}
AUDIT_3 = {
@@ -102,6 +104,7 @@ AUDIT_3 = {
'interval': 3600,
'scope': '',
'auto_trigger': True,
'next_run_time': None,
}

View File

@@ -89,3 +89,12 @@ class ActionPlanManager(base.Manager):
def start(self, action_plan_id):
patch = [{'op': 'replace', 'value': 'PENDING', 'path': '/state'}]
return self._update(self._path(action_plan_id), patch)
def cancel(self, action_plan_id):
action_plan = self.get(action_plan_id)
if action_plan.state == "ONGOING":
patch = [{'op': 'replace', 'value': 'CANCELLING',
'path': '/state'}]
else:
patch = [{'op': 'replace', 'value': 'CANCELLED', 'path': '/state'}]
return self._update(self._path(action_plan_id), patch)

View File

@@ -301,3 +301,29 @@ class DeleteActionPlan(command.Command):
raise exceptions.ValidationError()
client.action_plan.delete(action_plan)
class CancelActionPlan(command.ShowOne):
"""Cancel action plan command."""
def get_parser(self, prog_name):
parser = super(CancelActionPlan, self).get_parser(prog_name)
parser.add_argument(
'action_plan',
metavar='<action-plan>',
help=_("UUID of the action_plan."))
return parser
def take_action(self, parsed_args):
client = getattr(self.app.client_manager, "infra-optim")
if not uuidutils.is_uuid_like(parsed_args.action_plan):
raise exceptions.ValidationError()
action_plan = client.action_plan.cancel(parsed_args.action_plan)
columns = res_fields.ACTION_PLAN_FIELDS
column_headers = res_fields.ACTION_PLAN_FIELD_LABELS
return column_headers, utils.get_item_properties(action_plan, columns)

View File

@@ -150,8 +150,9 @@ class CreateAudit(command.ShowOne):
'-i', '--interval',
dest='interval',
metavar='<interval>',
help=_('Audit interval (in seconds). '
"Only used if the audit is CONTINUOUS."))
help=_('Audit interval (in seconds or cron format). '
'Cron inteval can be used like: "*/5 * * * *". '
'Only used if the audit is CONTINUOUS.'))
parser.add_argument(
'-g', '--goal',
dest='goal',
@@ -242,7 +243,8 @@ class UpdateAudit(command.ShowOne):
raise exceptions.ValidationError()
patch = common_utils.args_array_to_patch(
parsed_args.op, parsed_args.attributes[0])
parsed_args.op, parsed_args.attributes[0],
exclude_fields=['/interval'])
audit = client.audit.update(parsed_args.audit, patch)

9
watcherclient/v1/resource_fields.py Normal file → Executable file
View File

@@ -32,11 +32,12 @@ AUDIT_TEMPLATE_SHORT_LIST_FIELD_LABELS = ['UUID', 'Name', 'Goal', 'Strategy']
# Audit
AUDIT_FIELDS = ['uuid', 'created_at', 'updated_at', 'deleted_at',
'state', 'audit_type', 'parameters', 'interval', 'goal_name',
'strategy_name', 'scope', 'auto_trigger']
'strategy_name', 'scope', 'auto_trigger', 'next_run_time']
AUDIT_FIELD_LABELS = ['UUID', 'Created At', 'Updated At', 'Deleted At',
'State', 'Audit Type', 'Parameters', 'Interval', 'Goal',
'Strategy', 'Audit Scope', 'Auto Trigger']
'Strategy', 'Audit Scope', 'Auto Trigger',
'Next Run Time']
AUDIT_SHORT_LIST_FIELDS = ['uuid', 'audit_type',
'state', 'goal_name', 'strategy_name',
@@ -63,11 +64,11 @@ ACTION_PLAN_SHORT_LIST_FIELD_LABELS = ['UUID', 'Audit', 'State',
# Action
ACTION_FIELDS = ['uuid', 'created_at', 'updated_at', 'deleted_at', 'parents',
'state', 'action_plan_uuid', 'action_type',
'input_parameters']
'input_parameters', 'description']
ACTION_FIELD_LABELS = ['UUID', 'Created At', 'Updated At', 'Deleted At',
'Parents', 'State', 'Action Plan', 'Action',
'Parameters']
'Parameters', 'Description']
ACTION_SHORT_LIST_FIELDS = ['uuid', 'parents',
'state', 'action_plan_uuid', 'action_type']