From 0b8dd84b18ffac05085cf387ea445f15754cc2b3 Mon Sep 17 00:00:00 2001 From: Eyal Date: Tue, 3 Sep 2019 16:34:57 +0300 Subject: [PATCH] Add a cookiecutter template to generate custom stuff * Custom actions and yaql expressions Change-Id: I5843135fb8adbeb73d1e205cf81f4c60e8b5b306 --- doc/source/contributor/extending_yaql.rst | 10 +- mistral/db/sqlalchemy/migration/cli.py | 8 + tools/cookiecutter-mistral-custom/README.rst | 37 ++++ .../cookiecutter.json | 8 + .../run_cookiecutter.sh | 12 ++ .../update_actions.sh | 4 + .../{{cookiecutter.project_name}}/LICENSE | 202 ++++++++++++++++++ .../{{cookiecutter.project_name}}/README.rst | 24 +++ .../requirements.txt | 6 + .../{{cookiecutter.project_name}}/setup.cfg | 44 ++++ .../{{cookiecutter.project_name}}/setup.py | 19 ++ .../{{cookiecutter.project_name}}/tox.ini | 29 +++ .../{{cookiecutter.pkg_name}}/__init__.py | 0 .../{{cookiecutter.pkg_name}}/actions.py | 25 +++ .../expression_functions.py | 28 +++ .../tests/__init__.py | 0 .../tests/test_action.py | 24 +++ .../tests/test_expressions.py | 41 ++++ 18 files changed, 516 insertions(+), 5 deletions(-) create mode 100644 tools/cookiecutter-mistral-custom/README.rst create mode 100644 tools/cookiecutter-mistral-custom/cookiecutter.json create mode 100755 tools/cookiecutter-mistral-custom/run_cookiecutter.sh create mode 100755 tools/cookiecutter-mistral-custom/update_actions.sh create mode 100644 tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/LICENSE create mode 100644 tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/README.rst create mode 100644 tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/requirements.txt create mode 100644 tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/setup.cfg create mode 100644 tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/setup.py create mode 100644 tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/tox.ini create mode 100644 tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/__init__.py create mode 100644 tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/actions.py create mode 100644 tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/expression_functions.py create mode 100644 tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/tests/__init__.py create mode 100644 tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/tests/test_action.py create mode 100644 tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/tests/test_expressions.py diff --git a/doc/source/contributor/extending_yaql.rst b/doc/source/contributor/extending_yaql.rst index 1e9b47ebd..241ed5ef6 100644 --- a/doc/source/contributor/extending_yaql.rst +++ b/doc/source/contributor/extending_yaql.rst @@ -28,7 +28,7 @@ Tutorial packages=find_packages(), install_requires=["mistral", "yaql"], entry_points={ - "mistral.yaql_functions": [ + "mistral.expression.functions": [ "random_uuid = my_package.sub_package.yaql:random_uuid_" ] } @@ -36,7 +36,7 @@ Tutorial Publish the ``random_uuid_`` function in the ``entry_points`` section, in the -``mistral.yaql_functions`` namespace in ``setup.py``. This function will be +``mistral.expression.functions`` namespace in ``setup.py``. This function will be defined later. Note that the package name will be used in Pip and must not overlap with @@ -161,8 +161,8 @@ Development While developing, it is sufficient to add the root source folder (the parent folder of ``my_package``) to the ``PYTHONPATH`` environment variable and the line ``random_uuid = my_package.sub_package.yaql:random_uuid_`` in the Mistral -entry points in the ``mistral.yaql_functions`` namespace. If the path to the -parent folder of ``my_package`` is ``/path/to/my_project``. +entry points in the ``mistral.expression.functions`` namespace. +If the path to the parent folder of ``my_package`` is ``/path/to/my_project``. .. code-block:: bash @@ -172,5 +172,5 @@ parent folder of ``my_package`` is ``/path/to/my_project``. .. code-block:: ini [entry_points] - mistral.yaql_functions = + mistral.expression.functions = random_uuid = my_package.sub_package.yaql:random_uuid_ diff --git a/mistral/db/sqlalchemy/migration/cli.py b/mistral/db/sqlalchemy/migration/cli.py index eb70ff6bc..380cce344 100644 --- a/mistral/db/sqlalchemy/migration/cli.py +++ b/mistral/db/sqlalchemy/migration/cli.py @@ -76,6 +76,11 @@ def do_populate(config, cmd): workflows.sync_db() +def do_populate_actions(config, cmd): + LOG.info("Populating actions db") + action_manager.sync_db() + + def do_revision(config, cmd): do_alembic_command( config, cmd, @@ -100,6 +105,9 @@ def add_command_parsers(subparsers): parser = subparsers.add_parser('populate') parser.set_defaults(func=do_populate) + parser = subparsers.add_parser('populate_actions') + parser.set_defaults(func=do_populate_actions) + parser = subparsers.add_parser('stamp') parser.add_argument('--sql', action='store_true') parser.add_argument('revision', nargs='?') diff --git a/tools/cookiecutter-mistral-custom/README.rst b/tools/cookiecutter-mistral-custom/README.rst new file mode 100644 index 000000000..23bab5829 --- /dev/null +++ b/tools/cookiecutter-mistral-custom/README.rst @@ -0,0 +1,37 @@ +cookiecutter-mistral-custom +=========================== + +A minimal [cookiecutter](https://github.com/audreyr/cookiecutter) template for Mistral custom actions, expressions + +Usage +----- + +This will run the cookiecutter and will install it if needed + +.. code-block:: bash + + $ run_cookiecutter.sh + +| Install the python project when finish editing ([sudo] pip install [folder]) +| Run the script to update the actions in the database +| NOTE: default configuration file is /etc/mistral/mistral.conf + +.. code-block:: bash + + $ update_actions.sh [/path/to/mistral/conf] + +Explanation +----------- + +The generated directory contains a minimal python project for mistral custom actions +and expressions. + +It also has the following: + +* LICENSE + An Apache 2 license if you choose another license then update the setup.cfg file +* README + A basic README file +* Testing + Tox to manage test environments using pytest and flake8 + diff --git a/tools/cookiecutter-mistral-custom/cookiecutter.json b/tools/cookiecutter-mistral-custom/cookiecutter.json new file mode 100644 index 000000000..bcb06889a --- /dev/null +++ b/tools/cookiecutter-mistral-custom/cookiecutter.json @@ -0,0 +1,8 @@ +{ + "author": "mistral mistraly", + "email": "mistral@mistral.com", + "project_name": "example-action", + "pkg_name": "{{ cookiecutter.project_name.lower().replace(' ', '_').replace('-', '_') }}", + "summary": "A mistral custom action example", + "version": "0.1.0" +} diff --git a/tools/cookiecutter-mistral-custom/run_cookiecutter.sh b/tools/cookiecutter-mistral-custom/run_cookiecutter.sh new file mode 100755 index 000000000..9eea26e29 --- /dev/null +++ b/tools/cookiecutter-mistral-custom/run_cookiecutter.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +if [ ! -f "/usr/local/bin/cookiecutter" ] +then + echo "Installing cookiecutter" + if [[ $EUID -ne 0 ]]; then + SUDO=sudo + fi + $SUDO pip install cookiecutter +fi + +cookiecutter . diff --git a/tools/cookiecutter-mistral-custom/update_actions.sh b/tools/cookiecutter-mistral-custom/update_actions.sh new file mode 100755 index 000000000..b2fd4a916 --- /dev/null +++ b/tools/cookiecutter-mistral-custom/update_actions.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +config_file=${$1:-'/etc/mistral/conf'} +mistral-db-manage --config-file $config_file populate_actions \ No newline at end of file diff --git a/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/LICENSE b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/LICENSE new file mode 100644 index 000000000..7a4a3ea24 --- /dev/null +++ b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/README.rst b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/README.rst new file mode 100644 index 000000000..06e043348 --- /dev/null +++ b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/README.rst @@ -0,0 +1,24 @@ +{{ cookiecutter.project_name }} +{{ cookiecutter.project_name|count * "=" }} + +{{ cookiecutter.summary }} + +Usage +----- + +Installation +------------ + +Requirements +^^^^^^^^^^^^ + +Compatibility +------------- + +Licence +------- + +Authors +------- + +`{{ cookiecutter.project_name }}` was written by `{{ cookiecutter.author }} <{{ cookiecutter.email }}>`_. diff --git a/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/requirements.txt b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/requirements.txt new file mode 100644 index 000000000..27aff6a48 --- /dev/null +++ b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/requirements.txt @@ -0,0 +1,6 @@ +# 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. + + + diff --git a/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/setup.cfg b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/setup.cfg new file mode 100644 index 000000000..58f5b2447 --- /dev/null +++ b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/setup.cfg @@ -0,0 +1,44 @@ +[metadata] +name = {{ cookiecutter.project_name }} +license = Apache 2.0 +summary = {{ cookiecutter.summary }} +description-file = + README.rst +long_description_content_type = text/x-rst +author = {{ cookiecutter.author }} +author-email = {{ cookiecutter.email }} +version = {{cookiecutter.version}} +classifier = + Intended Audience :: Developers + License :: OSI Approved :: Apache Software License + Programming Language :: Python + Programming Language :: Python :: 2 + Programming Language :: Python :: 2.7 + Programming Language :: Python :: 3 + Programming Language :: Python :: 3.5 + Programming Language :: Python :: 3.6 + Programming Language :: Python :: 3.7 + Topic :: Utilities + +[options] +packages = + {{ cookiecutter.pkg_name }} + +install_requires = + mistral_lib>=1.2.0 + yaql>=1.1.3 + +[options.entry_points] +mistral.actions = + test.my_action = {{cookiecutter.pkg_name}}.actions:MyAction + +mistral.expression.functions = + test.my_function = {{cookiecutter.pkg_name}}.expression_functions:my_function_ + +[wheel] +universal = 1 + +[tool:pytest] +filterwarnings = + # Show any DeprecationWarnings once + once::DeprecationWarning diff --git a/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/setup.py b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/setup.py new file mode 100644 index 000000000..b75cca776 --- /dev/null +++ b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/setup.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python + +# Copyright 2019 - Nokia Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import setuptools + +setuptools.setup() diff --git a/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/tox.ini b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/tox.ini new file mode 100644 index 000000000..226408b3c --- /dev/null +++ b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/tox.ini @@ -0,0 +1,29 @@ +[tox] +envlist = py27, py35, py36, py37, pep8 + +[testenv] +usedevelop = True +sitepackages = False +deps = + pytest + -r{toxinidir}/requirements.txt +commands = + pytest {posargs} + +[testenv:pep8] +basepython = python3 +deps = flake8 + flake8-import-order + flake8-blind-except + flake8-builtins + flake8-docstrings + flake8-rst-docstrings + flake8-logging-format +commands = flake8 + + +[flake8] +exclude = .tox,.eggs +show-source = true +ignore = D100,D101,D102,D103,D104,D105,D107,G200,G201,W503,W504 +enable-extensions=G \ No newline at end of file diff --git a/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/__init__.py b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/actions.py b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/actions.py new file mode 100644 index 000000000..57853535a --- /dev/null +++ b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/actions.py @@ -0,0 +1,25 @@ +# Copyright 2019 - Nokia Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from mistral_lib import actions + + +class MyAction(actions.Action): + def __init__(self, param): + # store the incoming params + self.param = param + + def run(self, context): + # return your results here + return {'status': 0} diff --git a/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/expression_functions.py b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/expression_functions.py new file mode 100644 index 000000000..a6b276cb4 --- /dev/null +++ b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/expression_functions.py @@ -0,0 +1,28 @@ +# Copyright 2019 - Nokia Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +from time import time +from uuid import UUID +from uuid import uuid5 + + +def my_function_(context): + """Generate a UUID using the execution ID and the clock.""" + # fetch the current workflow execution ID found in the context + execution_id = context['__execution']['id'] + + time_str = str(time()) + execution_uuid = UUID(execution_id) + return uuid5(execution_uuid, time_str) diff --git a/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/tests/__init__.py b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/tests/test_action.py b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/tests/test_action.py new file mode 100644 index 000000000..6d946a6ec --- /dev/null +++ b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/tests/test_action.py @@ -0,0 +1,24 @@ +# Copyright 2019 - Nokia Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import unittest + +from {{cookiecutter.pkg_name}}.actions import MyAction + + +class MyTestCase(unittest.TestCase): + def test_action(self): + action = MyAction(None) + + self.assertDictEqual(action.run(None), {'status': 0}) diff --git a/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/tests/test_expressions.py b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/tests/test_expressions.py new file mode 100644 index 000000000..ed4edf1d8 --- /dev/null +++ b/tools/cookiecutter-mistral-custom/{{cookiecutter.project_name}}/{{cookiecutter.pkg_name}}/tests/test_expressions.py @@ -0,0 +1,41 @@ +# Copyright 2019 - Nokia Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import unittest +import uuid +from uuid import UUID + + +from {{cookiecutter.pkg_name}}.expression_functions import my_function_ + + +class MyTestCase(unittest.TestCase): + def test_my_function(self): + context = {'__execution': {'id': uuid.uuid4().hex}} + result = my_function_(context) + + # should not throw an exception + UUID(str(result), version=5)