Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add driver sanity checks (only Docker for now ...) #1882

Conversation

decentral1se
Copy link
Contributor

@decentral1se decentral1se commented Mar 26, 2019

Based on point in #1666 (comment).

Main goals of this change are: implement sanity checks that stop the sequence before anything happens if the driver is missing anything it needs to successfully run the sequence. This will help users get faster feedback when facing the litany of issues that come with using a driver (for the first time, especially ...).

@decentral1se decentral1se changed the title WIP: Proof-Of-Concept for driver sanity checks Proof-Of-Concept for driver sanity checks Mar 28, 2019
@decentral1se
Copy link
Contributor Author

This is ready for review btw ... removed the "WIP" for now

Something for ansible#1666 (comment).

Signed-off-by: Luke Murphy <[email protected]>
@decentral1se decentral1se force-pushed the feature/better-driver-sanity-checks branch from ee2adb7 to 2955fad Compare March 30, 2019 09:00
@decentral1se decentral1se changed the title Proof-Of-Concept for driver sanity checks Add driver sanity checks (only Docker for now ...) Mar 30, 2019
@decentral1se
Copy link
Contributor Author

decentral1se commented Apr 4, 2019

Logs for missing docker dependency:

(.venv) ➜  molecule (feature/better-driver-sanity-checks) ✔ molecule --version
molecule, version 2.20.0.0a3.dev28
(.venv) ➜  molecule (feature/better-driver-sanity-checks) ✔ molecule init role -r sanitycheckstest
--> Initializing new role sanitycheckstest...
Initialized role in /home/decentral1se/ansible/molecule/sanitycheckstest successfully.
(.venv) ➜  molecule (feature/better-driver-sanity-checks) ✗ cd sanitycheckstest
(.venv) ➜  sanitycheckstest (feature/better-driver-sanity-checks) ✗ molecule test
--> Validating schema /home/decentral1se/ansible/molecule/sanitycheckstest/molecule/default/molecule.yml.
Validation completed successfully.
--> Test matrix

└── default
    ├── lint
    ├── cleanup
    ├── destroy
    ├── dependency
    ├── syntax
    ├── create
    ├── prepare
    ├── converge
    ├── idempotence
    ├── side_effect
    ├── verify
    ├── cleanup
    └── destroy

--> Scenario: 'default'
--> Action: 'lint'
--> Executing Yamllint on files found in /home/decentral1se/ansible/molecule/sanitycheckstest/...
Lint completed successfully.
--> Executing Flake8 on files found in /home/decentral1se/ansible/molecule/sanitycheckstest/molecule/default/tests/...
Lint completed successfully.
--> Executing Ansible Lint on /home/decentral1se/ansible/molecule/sanitycheckstest/molecule/default/playbook.yml...
    [701] Role info should contain platforms
    /home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml:1
    {'meta/main.yml': {'galaxy_info': {'author': 'your name', 'description': 'your description', 'company': 'your company (optional)', 'license': 'license (GPLv2, CC-BY, etc)', 'min_ansible_version': 1.2, 'galaxy_tags': [], '__line__': 2, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}, 'dependencies': [], '__line__': 1, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}}

    [703] Should change default metadata: author
    /home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml:1
    {'meta/main.yml': {'galaxy_info': {'author': 'your name', 'description': 'your description', 'company': 'your company (optional)', 'license': 'license (GPLv2, CC-BY, etc)', 'min_ansible_version': 1.2, 'galaxy_tags': [], '__line__': 2, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}, 'dependencies': [], '__line__': 1, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}}

    [703] Should change default metadata: description
    /home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml:1
    {'meta/main.yml': {'galaxy_info': {'author': 'your name', 'description': 'your description', 'company': 'your company (optional)', 'license': 'license (GPLv2, CC-BY, etc)', 'min_ansible_version': 1.2, 'galaxy_tags': [], '__line__': 2, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}, 'dependencies': [], '__line__': 1, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}}

    [703] Should change default metadata: company
    /home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml:1
    {'meta/main.yml': {'galaxy_info': {'author': 'your name', 'description': 'your description', 'company': 'your company (optional)', 'license': 'license (GPLv2, CC-BY, etc)', 'min_ansible_version': 1.2, 'galaxy_tags': [], '__line__': 2, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}, 'dependencies': [], '__line__': 1, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}}

    [703] Should change default metadata: license
    /home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml:1
    {'meta/main.yml': {'galaxy_info': {'author': 'your name', 'description': 'your description', 'company': 'your company (optional)', 'license': 'license (GPLv2, CC-BY, etc)', 'min_ansible_version': 1.2, 'galaxy_tags': [], '__line__': 2, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}, 'dependencies': [], '__line__': 1, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}}

An error occurred during the test sequence action: 'lint'. Cleaning up.
--> Scenario: 'default'
--> Action: 'cleanup'
Skipping, cleanup playbook not configured.
--> Scenario: 'default'
--> Action: 'destroy'
--> Sanity checks: 'docker'
ERROR: Missing Docker driver dependency. Please install via 'molecule[docker]' or refer to your INSTALL.rst driver documentation file

Logs for not having docker daemon running:

(.venv) ➜  sanitycheckstest (feature/better-driver-sanity-checks) ✗ pip install 'molecule[docker]'
Requirement already satisfied: molecule[docker] in /home/decentral1se/ansible/molecule (2.20.0.0a3.dev28)
Requirement already satisfied: flake8<4,>=3.6.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (3.7.7)
Requirement already satisfied: yamllint<2,>=1.11.1 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (1.15.0)
Requirement already satisfied: ansible-lint<5,>=4.0.2 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (4.1.0)
Requirement already satisfied: anyconfig==0.9.7 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (0.9.7)
Requirement already satisfied: cerberus==1.2 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (1.2)
Requirement already satisfied: click==6.7 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (6.7)
Requirement already satisfied: click-completion==0.3.1 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (0.3.1)
Requirement already satisfied: colorama==0.3.9 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (0.3.9)
Requirement already satisfied: cookiecutter==1.6.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (1.6.0)
Requirement already satisfied: idna<2.8 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (2.7)
Requirement already satisfied: python-gilt==1.2.1 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (1.2.1)
Requirement already satisfied: Jinja2==2.10 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (2.10)
Requirement already satisfied: pbr==5.1.1 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (5.1.1)
Requirement already satisfied: pexpect==4.6.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (4.6.0)
Requirement already satisfied: psutil==5.4.6 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (5.4.6)
Requirement already satisfied: PyYAML==3.13 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (3.13)
Requirement already satisfied: sh==1.12.14 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (1.12.14)
Requirement already satisfied: six==1.11.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (1.11.0)
Requirement already satisfied: tabulate==0.8.2 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (0.8.2)
Requirement already satisfied: testinfra==1.19.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (1.19.0)
Requirement already satisfied: tree-format==0.1.2 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from molecule[docker]) (0.1.2)
Collecting docker>=2.0.0 (from molecule[docker])
  Using cached https://files.pythonhosted.org/packages/48/68/c3afca1a5aa8d2997ec3b8ee822a4d752cf85907b321f07ea86888545152/docker-3.7.2-py2.py3-none-any.whl
Requirement already satisfied: entrypoints<0.4.0,>=0.3.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from flake8<4,>=3.6.0->molecule[docker]) (0.3)
Requirement already satisfied: mccabe<0.7.0,>=0.6.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from flake8<4,>=3.6.0->molecule[docker]) (0.6.1)
Requirement already satisfied: pyflakes<2.2.0,>=2.1.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from flake8<4,>=3.6.0->molecule[docker]) (2.1.1)
Requirement already satisfied: pycodestyle<2.6.0,>=2.5.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from flake8<4,>=3.6.0->molecule[docker]) (2.5.0)
Requirement already satisfied: pathspec>=0.5.3 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from yamllint<2,>=1.11.1->molecule[docker]) (0.5.9)
Requirement already satisfied: ansible in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from ansible-lint<5,>=4.0.2->molecule[docker]) (2.7.9)
Requirement already satisfied: ruamel.yaml in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from ansible-lint<5,>=4.0.2->molecule[docker]) (0.15.89)
Requirement already satisfied: requests>=2.18.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from cookiecutter==1.6.0->molecule[docker]) (2.21.0)
Requirement already satisfied: binaryornot>=0.2.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from cookiecutter==1.6.0->molecule[docker]) (0.4.4)
Requirement already satisfied: future>=0.15.2 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from cookiecutter==1.6.0->molecule[docker]) (0.17.1)
Requirement already satisfied: whichcraft>=0.4.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from cookiecutter==1.6.0->molecule[docker]) (0.5.2)
Requirement already satisfied: jinja2-time>=0.1.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from cookiecutter==1.6.0->molecule[docker]) (0.2.0)
Requirement already satisfied: poyo>=0.1.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from cookiecutter==1.6.0->molecule[docker]) (0.4.2)
Requirement already satisfied: git-url-parse in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from python-gilt==1.2.1->molecule[docker]) (1.2.2)
Requirement already satisfied: fasteners in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from python-gilt==1.2.1->molecule[docker]) (0.14.1)
Requirement already satisfied: MarkupSafe>=0.23 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from Jinja2==2.10->molecule[docker]) (1.1.1)
Requirement already satisfied: ptyprocess>=0.5 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from pexpect==4.6.0->molecule[docker]) (0.6.0)
Requirement already satisfied: pytest!=3.0.2 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from testinfra==1.19.0->molecule[docker]) (4.3.1)
Requirement already satisfied: websocket-client>=0.32.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from docker>=2.0.0->molecule[docker]) (0.56.0)
Requirement already satisfied: docker-pycreds>=0.4.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from docker>=2.0.0->molecule[docker]) (0.4.0)
Requirement already satisfied: setuptools in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from ansible->ansible-lint<5,>=4.0.2->molecule[docker]) (40.8.0)
Requirement already satisfied: paramiko in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from ansible->ansible-lint<5,>=4.0.2->molecule[docker]) (2.4.2)
Requirement already satisfied: cryptography in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from ansible->ansible-lint<5,>=4.0.2->molecule[docker])(2.6.1)
Requirement already satisfied: urllib3<1.25,>=1.21.1 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from requests>=2.18.0->cookiecutter==1.6.0->molecule[docker]) (1.24.1)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from requests>=2.18.0->cookiecutter==1.6.0->molecule[docker]) (3.0.4)
Requirement already satisfied: certifi>=2017.4.17 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from requests>=2.18.0->cookiecutter==1.6.0->molecule[docker]) (2019.3.9)
Requirement already satisfied: arrow in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from jinja2-time>=0.1.0->cookiecutter==1.6.0->molecule[docker]) (0.13.1)
Requirement already satisfied: monotonic>=0.1 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from fasteners->python-gilt==1.2.1->molecule[docker])(1.5)
Requirement already satisfied: pluggy>=0.7 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from pytest!=3.0.2->testinfra==1.19.0->molecule[docker])(0.9.0)
Requirement already satisfied: py>=1.5.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from pytest!=3.0.2->testinfra==1.19.0->molecule[docker]) (1.8.0)
Requirement already satisfied: more-itertools>=4.0.0; python_version > "2.7" in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from pytest!=3.0.2->testinfra==1.19.0->molecule[docker]) (6.0.0)
Requirement already satisfied: attrs>=17.4.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from pytest!=3.0.2->testinfra==1.19.0->molecule[docker]) (19.1.0)
Requirement already satisfied: atomicwrites>=1.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from pytest!=3.0.2->testinfra==1.19.0->molecule[docker]) (1.3.0)
Requirement already satisfied: pynacl>=1.0.1 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from paramiko->ansible->ansible-lint<5,>=4.0.2->molecule[docker]) (1.3.0)
Requirement already satisfied: pyasn1>=0.1.7 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from paramiko->ansible->ansible-lint<5,>=4.0.2->molecule[docker]) (0.4.5)
Requirement already satisfied: bcrypt>=3.1.3 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from paramiko->ansible->ansible-lint<5,>=4.0.2->molecule[docker]) (3.1.6)
Requirement already satisfied: asn1crypto>=0.21.0 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from cryptography->ansible->ansible-lint<5,>=4.0.2->molecule[docker]) (0.24.0)
Requirement already satisfied: cffi!=1.11.3,>=1.8 in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from cryptography->ansible->ansible-lint<5,>=4.0.2->molecule[docker]) (1.12.2)
Requirement already satisfied: python-dateutil in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from arrow->jinja2-time>=0.1.0->cookiecutter==1.6.0->molecule[docker]) (2.8.0)
Requirement already satisfied: pycparser in /home/decentral1se/ansible/molecule/.venv/lib/python3.7/site-packages (from cffi!=1.11.3,>=1.8->cryptography->ansible->ansible-lint<5,>=4.0.2->molecule[docker]) (2.19)
Installing collected packages: docker
Successfully installed docker-3.7.2
(.venv) ➜  sanitycheckstest (feature/better-driver-sanity-checks) ✗ sudo service docker stop
(.venv) ➜  sanitycheckstest (feature/better-driver-sanity-checks) ✗ molecule test
--> Validating schema /home/decentral1se/ansible/molecule/sanitycheckstest/molecule/default/molecule.yml.
Validation completed successfully.
--> Test matrix

└── default
    ├── lint
    ├── cleanup
    ├── destroy
    ├── dependency
    ├── syntax
    ├── create
    ├── prepare
    ├── converge
    ├── idempotence
    ├── side_effect
    ├── verify
    ├── cleanup
    └── destroy

--> Scenario: 'default'
--> Action: 'lint'
--> Executing Yamllint on files found in /home/decentral1se/ansible/molecule/sanitycheckstest/...
Lint completed successfully.
--> Executing Flake8 on files found in /home/decentral1se/ansible/molecule/sanitycheckstest/molecule/default/tests/...
Lint completed successfully.
--> Executing Ansible Lint on /home/decentral1se/ansible/molecule/sanitycheckstest/molecule/default/playbook.yml...
    [701] Role info should contain platforms
    /home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml:1
    {'meta/main.yml': {'galaxy_info': {'author': 'your name', 'description': 'your description', 'company': 'your company (optional)', 'license': 'license (GPLv2, CC-BY, etc)', 'min_ansible_version': 1.2, 'galaxy_tags': [], '__line__': 2, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}, 'dependencies': [], '__line__': 1, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}}

    [703] Should change default metadata: author
    /home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml:1
    {'meta/main.yml': {'galaxy_info': {'author': 'your name', 'description': 'your description', 'company': 'your company (optional)', 'license': 'license (GPLv2, CC-BY, etc)', 'min_ansible_version': 1.2, 'galaxy_tags': [], '__line__': 2, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}, 'dependencies': [], '__line__': 1, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}}

    [703] Should change default metadata: description
    /home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml:1
    {'meta/main.yml': {'galaxy_info': {'author': 'your name', 'description': 'your description', 'company': 'your company (optional)', 'license': 'license (GPLv2, CC-BY, etc)', 'min_ansible_version': 1.2, 'galaxy_tags': [], '__line__': 2, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}, 'dependencies': [], '__line__': 1, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}}

    [703] Should change default metadata: company
    /home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml:1
    {'meta/main.yml': {'galaxy_info': {'author': 'your name', 'description': 'your description', 'company': 'your company (optional)', 'license': 'license (GPLv2, CC-BY, etc)', 'min_ansible_version': 1.2, 'galaxy_tags': [], '__line__': 2, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}, 'dependencies': [], '__line__': 1, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}}

    [703] Should change default metadata: license
    /home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml:1
    {'meta/main.yml': {'galaxy_info': {'author': 'your name', 'description': 'your description', 'company': 'your company (optional)', 'license': 'license (GPLv2, CC-BY, etc)', 'min_ansible_version': 1.2, 'galaxy_tags': [], '__line__': 2, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}, 'dependencies': [], '__line__': 1, '__file__': '/home/decentral1se/ansible/molecule/sanitycheckstest/meta/main.yml'}}

An error occurred during the test sequence action: 'lint'. Cleaning up.
--> Scenario: 'default'
--> Action: 'cleanup'
Skipping, cleanup playbook not configured.
--> Scenario: 'default'
--> Action: 'destroy'
--> Sanity checks: 'docker'
ERROR: Unable to contact the Docker daemon. Please refer to https://docs.docker.com/config/daemon/ for managing the daemon

@decentral1se
Copy link
Contributor Author

Right, I'm going to merge this one then and let's see where it takes us! Thanks for the review!

@decentral1se decentral1se merged commit bff5067 into ansible:master Apr 9, 2019
@decentral1se decentral1se deleted the feature/better-driver-sanity-checks branch April 9, 2019 21:10
decentral1se added a commit to decentral1se/molecule that referenced this pull request Apr 10, 2019
webknjaz pushed a commit that referenced this pull request Apr 10, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants