diff --git a/README.md b/README.md index 34e9316..07c3214 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # MySQL collection for Ansible -[![Plugins CI](https://github.com/ansible-collections/community.mysql/workflows/Plugins%20CI/badge.svg?event=push)](https://github.com/ansible-collections/community.mysql/actions?query=workflow%3A"Plugins+CI") [![Roles CI](https://github.com/ansible-collections/community.mysql/workflows/Roles%20CI/badge.svg?event=push)](https://github.com/ansible-collections/community.mysql/actions?query=workflow%3A"Roles+CI") [![Codecov](https://img.shields.io/codecov/c/github/ansible-collections/community.mysql)](https://codecov.io/gh/ansible-collections/community.mysql) ![](https://img.shields.io/matrix/mysql:ansible.com.svg?server_fqdn=ansible-accounts.ems.host&label=Discuss%20on%20Matrix%20%23mysql:ansible.com&logo=matrix) +[![Plugins CI](https://github.com/ansible-collections/community.mysql/workflows/Plugins%20CI/badge.svg?event=push)](https://github.com/ansible-collections/community.mysql/actions?query=workflow%3A"Plugins+CI") [![Roles CI](https://github.com/ansible-collections/community.mysql/workflows/Roles%20CI/badge.svg?event=push)](https://github.com/ansible-collections/community.mysql/actions?query=workflow%3A"Roles+CI") [![Codecov](https://img.shields.io/codecov/c/github/ansible-collections/community.mysql)](https://codecov.io/gh/ansible-collections/community.mysql) [![Discuss on Matrix at #mysql:ansible.com](https://img.shields.io/matrix/mysql:ansible.com.svg?server_fqdn=ansible-accounts.ems.host&label=Discuss%20on%20Matrix%20at%20%23mysql:ansible.com&logo=matrix)](https://matrix.to/#/#mysql:ansible.com) This collection is a part of the Ansible package. diff --git a/changelogs/fragments/497_mysql_info_returns_connector_name_and_version.yml b/changelogs/fragments/497_mysql_info_returns_connector_name_and_version.yml new file mode 100644 index 0000000..11fc4f5 --- /dev/null +++ b/changelogs/fragments/497_mysql_info_returns_connector_name_and_version.yml @@ -0,0 +1,3 @@ +--- +minor_changes: + - mysql_info - add ``connector_name`` and ``connector_version`` to returned values (https://github.com/ansible-collections/community.mysql/pull/497). diff --git a/plugins/module_utils/mysql.py b/plugins/module_utils/mysql.py index fa438f3..2cafcb6 100644 --- a/plugins/module_utils/mysql.py +++ b/plugins/module_utils/mysql.py @@ -38,46 +38,41 @@ mysql_driver_fail_msg = ('A MySQL module is required: for Python 2.7 either PyMy from ansible_collections.community.mysql.plugins.module_utils.database import mysql_quote_identifier -def get_driver_name(mysql_driver): +def get_connector_name(connector): """ (class) -> str - Return the name of the driver (pymysql or mysqlclient (MySQLdb)) - or 'Unknown' if the driver name is not pymysql or MySQLdb. When adding a - connector here, also modify get_driver_version. + Return the name of the connector (pymysql or mysqlclient (MySQLdb)) + or 'Unknown' if not pymysql or MySQLdb. When adding a + connector here, also modify get_connector_version. """ - if mysql_driver is None or not hasattr(mysql_driver, '__name__'): + if connector is None or not hasattr(connector, '__name__'): return 'Unknown' - if mysql_driver.__name__ not in ['pymysql', 'MySQLdb']: - return 'Unknown' - - return mysql_driver.__name__ + return connector.__name__ -def get_driver_version(mysql_driver): +def get_connector_version(connector): """ (class) -> str Return the version of pymysql or mysqlclient (MySQLdb). - If the driver name is unknown, this method also return 'Unknown' + Return 'Unknown' if the connector name is unknown. """ - if mysql_driver is None: + if connector is None: return 'Unknown' - driver_name = get_driver_name(mysql_driver) + connector_name = get_connector_name(connector) - if driver_name == 'Unknown': - return 'Unknown' - - if driver_name == 'pymysql': + if connector_name == 'pymysql': # pymysql has two methods: # - __version__ that returns the string: 0.7.11.None - # - VERSION that returns the tupple (0, 7, 11, None) - v = mysql_driver.VERSION[:3] + # - VERSION that returns the tuple (0, 7, 11, None) + v = connector.VERSION[:3] return '.'.join(map(str, v)) - - if driver_name == 'MySQLdb': + elif connector_name == 'MySQLdb': # version_info returns the tuple (2, 1, 1, 'final', 0) - v = mysql_driver.version_info[:3] + v = connector.version_info[:3] return '.'.join(map(str, v)) + else: + return 'Unknown' def parse_from_mysql_config_file(cnf): diff --git a/plugins/modules/mysql_info.py b/plugins/modules/mysql_info.py index b550d14..11b1a80 100644 --- a/plugins/modules/mysql_info.py +++ b/plugins/modules/mysql_info.py @@ -58,6 +58,7 @@ seealso: author: - Andrew Klychkov (@Andersson007) - Sebastian Gumprich (@rndmh3ro) +- Laurent Indermühle (@laurent-indermuehle) extends_documentation_fragment: - community.mysql.mysql @@ -207,18 +208,20 @@ slave_hosts: sample: - { "2": { "Host": "", "Master_id": 1, "Port": 3306 } } connector_name: - description: Name of the python connector used by the plugin. When the driver is not identified, returns C(Unknown). + description: Name of the python connector used by the module. When the connector is not identified, returns C(Unknown). returned: always type: str sample: - "pymysql" - "MySQLdb" + version_added: '3.6.0' connector_version: - description: Version of the python connector used by the plugin. When the driver is not identified, returns C(Unknown). + description: Version of the python connector used by the module. When the connector is not identified, returns C(Unknown). returned: always type: str sample: - "1.0.2" + version_added: '3.6.0' ''' from decimal import Decimal @@ -229,8 +232,8 @@ from ansible_collections.community.mysql.plugins.module_utils.mysql import ( mysql_common_argument_spec, mysql_driver, mysql_driver_fail_msg, - get_driver_name, - get_driver_version, + get_connector_name, + get_connector_version, ) from ansible.module_utils.six import iteritems from ansible.module_utils._text import to_native @@ -573,8 +576,8 @@ def main(): if mysql_driver is None: module.fail_json(msg=mysql_driver_fail_msg) - driver_name = get_driver_name(mysql_driver) - driver_version = get_driver_version(mysql_driver) + connector_name = get_connector_name(mysql_driver) + connector_version = get_connector_version(mysql_driver) try: cursor, db_conn = mysql_connect(module, login_user, login_password, @@ -584,7 +587,7 @@ def main(): except Exception as e: msg = ('unable to connect to database using %s %s, check login_user ' 'and login_password are correct or %s has the credentials. ' - 'Exception message: %s' % (driver_name, driver_version, config_file, to_native(e))) + 'Exception message: %s' % (connector_name, connector_version, config_file, to_native(e))) module.fail_json(msg) ############################### @@ -593,8 +596,8 @@ def main(): mysql = MySQL_Info(module, cursor) module.exit_json(changed=False, - connector_name=driver_name, - connector_version=driver_version, + connector_name=connector_name, + connector_version=connector_version, **mysql.get_info(filter_, exclude_fields, return_empty_dbs)) diff --git a/tests/integration/targets/test_mysql_info/tasks/connector_info.yml b/tests/integration/targets/test_mysql_info/tasks/connector_info.yml new file mode 100644 index 0000000..ba76f59 --- /dev/null +++ b/tests/integration/targets/test_mysql_info/tasks/connector_info.yml @@ -0,0 +1,32 @@ +--- +# Added in 3.6.0 in +# https://github.com/ansible-collections/community.mysql/pull/497 + +# TODO: Refactor in PR490. +- name: Connector info | Assert connector_name exists and has expected values + ansible.builtin.assert: + that: + - result.connector_name is defined + - result.connector_name is in ['pymysql', 'MySQLdb'] + success_msg: >- + Assertions passed, result.connector_name is {{ result.connector_name }} + fail_msg: >- + Assertion failed, result.connector_name is + {{ result.connector_name | d('Unknown')}} which is different than expected + pymysql or MySQLdb + +# TODO: Refactor in PR490. +- name: Connector info | Assert connector_version exists and has expected values + ansible.builtin.assert: + that: + - result.connector_version is defined + - > + result.connector_version == 'Unknown' + or result.connector_version is version(connector_ver, '==') + success_msg: >- + Assertions passed, result.connector_version is + {{ result.connector_version }} + fail_msg: >- + Assertion failed, result.connector_version is + {{ result.connector_version }} which is different than expected + {{ connector_ver }} diff --git a/tests/integration/targets/test_mysql_info/tasks/main.yml b/tests/integration/targets/test_mysql_info/tasks/main.yml index f0e29d4..a01f915 100644 --- a/tests/integration/targets/test_mysql_info/tasks/main.yml +++ b/tests/integration/targets/test_mysql_info/tasks/main.yml @@ -57,6 +57,10 @@ - result.engines != {} - result.users != {} + - name: mysql_info - Test connector informations display + ansible.builtin.import_tasks: + file: connector_info.yml + # Access by non-default cred file - name: mysql_info - check non-default cred file mysql_info: