diff --git a/galaxy.yml b/galaxy.yml index af36461..fc7ac68 100644 --- a/galaxy.yml +++ b/galaxy.yml @@ -4,6 +4,7 @@ version: 1.0.1 readme: README.md authors: - Ben Mildren (@bmildren) + - Akim Lindberg (@akimrx) description: ProxySQL collection for Ansible license_file: LICENSE tags: diff --git a/plugins/modules/proxysql_cluster.py b/plugins/modules/proxysql_cluster.py new file mode 100644 index 0000000..4efd139 --- /dev/null +++ b/plugins/modules/proxysql_cluster.py @@ -0,0 +1,436 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright: (c) 2017, Ansible Project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +DOCUMENTATION = ''' +--- +module: proxysql_cluster +author: "Akim Lindberg (@akimrx)" +short_description: Adds or removes proxysql cluster hosts using the B(ProxySQL) admin interface +description: + - The M(community.proxysql.proxysql_cluster) module adds or removes + ProxySQL cluster hosts using the B(ProxySQL) admin interface. +options: + hostname: + description: + - The IP address or FQDN at which the proxysql cluster host can be contacted. + type: str + required: True + port: + description: + - The port at which the proxysql cluster host can be contacted. + type: int + default: 6032 + weight: + description: + - The bigger the weight of a server relative to other weights, the higher + the probability of the server being chosen from the B(ProxySQL) cluster. If + omitted the B(ProxySQL) server default for I(weight) is 0. + type: int + default: 0 + comment: + description: + - Text field that can be used for any purposes defined by the user. + Could be a description of what the host stores, a reminder of when the + host was added or disabled, or a JSON processed by some checker script. + type: str + default: '' + state: + description: + - When C(present), adds the host. When C(absent), removes the host. + type: str + choices: [ "present", "absent" ] + default: present +notes: +- Supports C(check_mode). +extends_documentation_fragment: +- community.proxysql.proxysql.managing_config +- community.proxysql.proxysql.connectivity + +''' + +EXAMPLES = ''' +--- +# This example adds a server, it saves the proxysql server config to disk, but +# avoids loading the proxysql server config to runtime (this might be because +# several servers are being added and the user wants to push the config to +# runtime in a single batch using the community.general.proxysql_manage_config +# module). It uses supplied credentials to connect to the proxysql admin +# interface. +- name: Add a server + community.proxysql.proxysql_cluster: + login_user: 'admin' + login_password: 'admin' + hostname: 'proxysql-01' + port: 6032 + weight: 1 + comment: 'Main ProxySQL server' + state: present + save_to_disk: True + load_to_runtime: False + +# This example removes a server, saves the proxysql server config to disk, and +# dynamically loads the proxysql server config to runtime. It uses credentials +# in a supplied config file to connect to the proxysql admin interface. +- name: Remove a server + community.proxysql.proxysql_cluster: + config_file: '~/proxysql.cnf' + hostname: 'proxysql-01' + save_to_disk: True + state: absent +''' + +RETURN = ''' +stdout: + description: The proxysql host modified or removed from ProxySQL cluster. + returned: + - When I(state) is C(present), returns the newly modified host. + - When I(state) is C(absent), returns the deleted record. + type: dict + "sample": { + "changed": true, + "hostname": "10.10.10.2", + "msg": "Added server to proxysql cluster", + "server": { + "hostname": "10.10.10.2", + "port": "6032", + "weight": "1", + "comment": "" + }, + "state": "present" + } +''' + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.community.proxysql.plugins.module_utils.mysql import mysql_connect, mysql_driver, mysql_driver_fail_msg +from ansible.module_utils.six import iteritems +from ansible.module_utils._text import to_native + +# =========================================== +# proxysql module specific support methods. +# + + +def perform_checks(module): + if module.params["login_port"] < 0 \ + or module.params["login_port"] > 65535: + module.fail_json( + msg="login_port must be a valid unix port number (0-65535)" + ) + + if module.params["port"] < 0 \ + or module.params["port"] > 65535: + module.fail_json(msg="port must be a valid unix port number (0-65535)") + + if mysql_driver is None: + module.fail_json(msg=mysql_driver_fail_msg) + + +def save_config_to_disk(cursor): + cursor.execute("SAVE PROXYSQL SERVERS TO DISK") + return True + + +def load_config_to_runtime(cursor): + cursor.execute("LOAD PROXYSQL SERVERS TO RUNTIME") + return True + + +class ProxySQLServer(object): + + def __init__(self, module): + self.state = module.params["state"] + self.save_to_disk = module.params["save_to_disk"] + self.load_to_runtime = module.params["load_to_runtime"] + + self.hostname = module.params["hostname"] + self.port = module.params["port"] + + config_data_keys = [ + "weight", + "comment" + ] + + self.config_data = dict( + (k, module.params[k]) + for k in config_data_keys + ) + + def check_server_config_exists(self, cursor): + query_string = ( + "SELECT count(*) AS `host_count` " + "FROM proxysql_servers " + "WHERE hostname = %s " + "AND port = %s" + ) + + query_data = [ + self.hostname, + self.port + ] + + cursor.execute(query_string, query_data) + check_count = cursor.fetchone() + return (int(check_count['host_count']) > 0) + + def check_server_config(self, cursor): + query_string = ( + "SELECT count(*) AS `host_count` " + "FROM proxysql_servers " + "WHERE hostname = %s " + "AND port = %s" + ) + + query_data = [ + self.hostname, + self.port + ] + + for col, val in iteritems(self.config_data): + if val is not None: + query_data.append(val) + query_string += " AND " + col + " = %s" + + cursor.execute(query_string, query_data) + check_count = cursor.fetchone() + + if isinstance(check_count, tuple): + return int(check_count[0]) > 0 + + return (int(check_count['host_count']) > 0) + + def get_server_config(self, cursor): + query_string = ( + "SELECT * " + "FROM proxysql_servers " + "WHERE hostname = %s " + "AND port = %s" + ) + + query_data = [ + self.hostname, + self.port + ] + + cursor.execute(query_string, query_data) + server = cursor.fetchone() + return server + + def create_server_config(self, cursor): + query_string = "INSERT INTO proxysql_servers (hostname, port" + + cols = 2 + query_data = [ + self.hostname, + self.port + ] + + for col, val in iteritems(self.config_data): + if val is not None: + cols += 1 + query_data.append(val) + query_string += ", " + col + + query_string += ( + ") VALUES (" + + "%s ," * cols + ) + + query_string = query_string[:-2] + query_string += ")" + + cursor.execute(query_string, query_data) + return True + + def update_server_config(self, cursor): + query_string = "UPDATE proxysql_servers" + + cols = 0 + query_data = [] + + for col, val in iteritems(self.config_data): + if val is not None: + cols += 1 + query_data.append(val) + if cols == 1: + query_string += " SET " + col + "= %s," + else: + query_string += " " + col + " = %s," + + query_string = query_string[:-1] + query_string += "WHERE hostname = %s AND port = %s" + + query_data.append(self.hostname) + query_data.append(self.port) + + cursor.execute(query_string, query_data) + return True + + def delete_server_config(self, cursor): + query_string = ( + "DELETE FROM proxysql_servers " + "WHERE hostname = %s " + "AND port = %s" + ) + + query_data = [ + self.hostname, + self.port + ] + + cursor.execute(query_string, query_data) + return True + + def manage_config(self, cursor, state): + if state: + if self.save_to_disk: + save_config_to_disk(cursor) + if self.load_to_runtime: + load_config_to_runtime(cursor) + + def create_server(self, check_mode, result, cursor): + if not check_mode: + result['changed'] = self.create_server_config(cursor) + result['msg'] = "Added server to proxysql cluster" + result['server'] = self.get_server_config(cursor) + self.manage_config(cursor, result['changed']) + else: + result['changed'] = True + result['msg'] = ( + "Server would have been added to " + "proxysql cluster, however check_mode " + "is enabled." + ) + + def update_server(self, check_mode, result, cursor): + if not check_mode: + result['changed'] = self.update_server_config(cursor) + result['msg'] = "Updated server in proxysql cluster" + result['server'] = self.get_server_config(cursor) + self.manage_config(cursor, result['changed']) + else: + result['changed'] = True + result['msg'] = ( + "Server would have been updated in " + "proxysql cluster, however check_mode " + "is enabled." + ) + + def delete_server(self, check_mode, result, cursor): + if not check_mode: + result['server'] = self.get_server_config(cursor) + result['changed'] = self.delete_server_config(cursor) + result['msg'] = "Deleted server from proxysql cluster" + self.manage_config(cursor, result['changed']) + else: + result['changed'] = True + result['msg'] = ( + "Server would have been deleted from " + "proxysql cluster, however check_mode " + "is enabled." + ) + +# =========================================== +# Module execution. +# + + +def main(): + module = AnsibleModule( + argument_spec=dict( + login_user=dict(default=None, type='str'), + login_password=dict(default=None, no_log=True, type='str'), + login_host=dict(default='127.0.0.1'), + login_unix_socket=dict(default=None), + login_port=dict(default=6032, type='int'), + config_file=dict(default='', type='path'), + hostname=dict(required=True, type='str'), + port=dict(default=6032, type='int'), + weight=dict(default=0, type='int'), + comment=dict(default='', type='str'), + state=dict(default='present', choices=['present', + 'absent']), + save_to_disk=dict(default=True, type='bool'), + load_to_runtime=dict(default=True, type='bool') + ), + supports_check_mode=True + ) + + perform_checks(module) + + login_user = module.params["login_user"] + login_password = module.params["login_password"] + config_file = module.params["config_file"] + + cursor = None + try: + cursor, db_conn = mysql_connect( + module, + login_user, + login_password, + config_file, + cursor_class='DictCursor' + ) + except mysql_driver.Error as e: + module.fail_json(msg="unable to connect to ProxySQL Admin Module.. %s" % to_native(e)) + + proxysql_server = ProxySQLServer(module) + result = {} + + result['state'] = proxysql_server.state + if proxysql_server.hostname: + result['hostname'] = proxysql_server.hostname + + if proxysql_server.state == "present": + try: + if not proxysql_server.check_server_config(cursor): + if not proxysql_server.check_server_config_exists(cursor): + proxysql_server.create_server( + module.check_mode, + result, + cursor + ) + else: + proxysql_server.update_server( + module.check_mode, + result, + cursor + ) + else: + result['changed'] = False + result['msg'] = ( + "The server already exists in proxysql cluster " + "and doesn't need to be updated." + ) + result['server'] = proxysql_server.get_server_config(cursor) + except mysql_driver.Error as e: + module.fail_json(msg="unable to modify server: %s" % to_native(e)) + + elif proxysql_server.state == "absent": + try: + if proxysql_server.check_server_config_exists(cursor): + proxysql_server.delete_server( + module.check_mode, + result, + cursor + ) + else: + result['changed'] = False + result['msg'] = ( + "The server is already absent from the " + "proxysql cluster memory configuration" + ) + except mysql_driver.Error as e: + module.fail_json( + msg="unable to remove server.. %s" % to_native(e) + ) + + module.exit_json(**result) + + +if __name__ == '__main__': + main() diff --git a/plugins/modules/proxysql_manage_config.py b/plugins/modules/proxysql_manage_config.py index 0ca99b3..6ba769a 100644 --- a/plugins/modules/proxysql_manage_config.py +++ b/plugins/modules/proxysql_manage_config.py @@ -31,8 +31,9 @@ description: - The I(config_settings) specifies which configuration we're writing. type: str - choices: [ "MYSQL USERS", "MYSQL SERVERS", "MYSQL QUERY RULES", - "MYSQL VARIABLES", "ADMIN VARIABLES", "SCHEDULER" ] + choices: [ "MYSQL USERS", "MYSQL SERVERS", "PROXYSQL SERVERS", + "MYSQL QUERY RULES", "MYSQL VARIABLES", "ADMIN VARIABLES", + "SCHEDULER" ] required: True direction: description: @@ -163,6 +164,7 @@ def main(): 'SAVE']), config_settings=dict(required=True, choices=['MYSQL USERS', 'MYSQL SERVERS', + 'PROXYSQL SERVERS', 'MYSQL QUERY RULES', 'MYSQL VARIABLES', 'ADMIN VARIABLES', diff --git a/tests/integration/targets/test_proxysql_cluster/defaults/main.yml b/tests/integration/targets/test_proxysql_cluster/defaults/main.yml new file mode 100644 index 0000000..7c38815 --- /dev/null +++ b/tests/integration/targets/test_proxysql_cluster/defaults/main.yml @@ -0,0 +1,10 @@ +--- +test_host: proxysql-01 +test_port: 6032 +test_weight: 1 + +test_proxysql_cluster_check_mode: false +test_proxysql_cluster_in_memory_only: false +test_proxysql_cluster_with_delayed_persist: false +test_proxysql_cluster_check_idempotence: false +test_proxysql_cluster_cleanup_after_test: true diff --git a/tests/integration/targets/test_proxysql_cluster/meta/main.yml b/tests/integration/targets/test_proxysql_cluster/meta/main.yml new file mode 100644 index 0000000..2023b8d --- /dev/null +++ b/tests/integration/targets/test_proxysql_cluster/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - setup_proxysql diff --git a/tests/integration/targets/test_proxysql_cluster/tasks/base_test.yml b/tests/integration/targets/test_proxysql_cluster/tasks/base_test.yml new file mode 100644 index 0000000..175d4a3 --- /dev/null +++ b/tests/integration/targets/test_proxysql_cluster/tasks/base_test.yml @@ -0,0 +1,59 @@ +--- +### prepare +- name: "{{ role_name }} | {{ current_test }} | are we performing a delete" + set_fact: + test_delete: "{{ current_test | regex_search('^test_delete') | ternary(true, false) }}" + +- name: "{{ role_name }} | {{ current_test }} | ensure we're in a clean state when we start" + include_tasks: "{{ test_delete|ternary('setup_test_server', 'cleanup_test_servers') }}.yml" + when: not test_proxysql_cluster_check_idempotence + +### when + +- name: "{{ role_name }} | {{ current_test }} | {{ test_delete|ternary('delete','create') }} test proxysql cluster server" + proxysql_cluster: + login_user: admin + login_password: admin + hostname: "{{ test_host }}" + port: "{{ test_port }}" + weight: "{{ test_weight }}" + state: "{{ test_delete|ternary('absent', 'present') }}" + save_to_disk: "{{ not test_proxysql_cluster_in_memory_only }}" + load_to_runtime: "{{ not test_proxysql_cluster_in_memory_only }}" + check_mode: "{{ test_proxysql_cluster_check_mode }}" + register: status + +- name: "{{ role_name }} | {{ current_test }} | persist the changes to disk, and load to runtime" + block: + + - name: "{{ role_name }} | {{ current_test }} | save the proxysql cluster servers config from memory to disk" + proxysql_manage_config: + login_user: admin + login_password: admin + action: SAVE + config_settings: PROXYSQL SERVERS + direction: TO + config_layer: DISK + + - name: "{{ role_name }} | {{ current_test }} | load the proxysql cluster servers config from memory to runtime" + proxysql_manage_config: + login_user: admin + login_password: admin + action: LOAD + config_settings: PROXYSQL SERVERS + direction: TO + config_layer: RUNTIME + + when: test_proxysql_cluster_with_delayed_persist + +- name: "{{ role_name }} | {{ current_test }} | check if test proxysql cluster server exists in memory" + shell: mysql -uadmin -padmin -h127.0.0.1 -P6032 -BNe"SELECT hostname || ',' || port || ',' || weight FROM proxysql_servers where hostname = '{{ test_host }}' and port = '{{ test_port }}' and weight = '{{ test_weight }}'" + register: memory_result + +- name: "{{ role_name }} | {{ current_test }} | check if test proxysql cluster server exists on disk" + shell: mysql -uadmin -padmin -h127.0.0.1 -P6032 -BNe"SELECT hostname || ',' || port || ',' || weight FROM disk.proxysql_servers where hostname = '{{ test_host }}' and port = '{{ test_port }}' and weight = '{{ test_weight }}'" + register: disk_result + +- name: "{{ role_name }} | {{ current_test }} | check if test proxysql cluster server exists in runtime" + shell: mysql -uadmin -padmin -h127.0.0.1 -P6032 -BNe"SELECT hostname || ',' || port || ',' || weight FROM runtime_proxysql_servers where hostname = '{{ test_host }}' and port = '{{ test_port }}' and weight = '{{ test_weight }}'" + register: runtime_result diff --git a/tests/integration/targets/test_proxysql_cluster/tasks/cleanup_test_servers.yml b/tests/integration/targets/test_proxysql_cluster/tasks/cleanup_test_servers.yml new file mode 100644 index 0000000..2b41346 --- /dev/null +++ b/tests/integration/targets/test_proxysql_cluster/tasks/cleanup_test_servers.yml @@ -0,0 +1,12 @@ +--- +- name: "{{ role_name }} | {{ current_test }} | ensure we're in a clean state when we start/finish" + block: + + - name: "{{ role_name }} | {{ current_test }} | ensure no hosts are created" + shell: mysql -uadmin -padmin -h127.0.0.1 -P6032 -BNe"DELETE FROM proxysql_servers" + + - name: "{{ role_name }} | {{ current_test }} | ensure no hosts are saved on disk" + shell: mysql -uadmin -padmin -h127.0.0.1 -P6032 -BNe"SAVE PROXYSQL SERVERS TO DISK" + + - name: "{{ role_name }} | {{ current_test }} | ensure no hosts are loaded to runtime" + shell: mysql -uadmin -padmin -h127.0.0.1 -P6032 -BNe"LOAD PROXYSQL SERVERS TO RUNTIME" diff --git a/tests/integration/targets/test_proxysql_cluster/tasks/main.yml b/tests/integration/targets/test_proxysql_cluster/tasks/main.yml new file mode 100644 index 0000000..965325e --- /dev/null +++ b/tests/integration/targets/test_proxysql_cluster/tasks/main.yml @@ -0,0 +1,88 @@ +--- +#################################################################### +# WARNING: These are designed specifically for Ansible tests # +# and should not be used as examples of how to write Ansible roles # +#################################################################### + +### tests + +- name: "{{ role_name }} | test_create_using_check_mode | test create proxysql cluster server using check mode" + import_tasks: test_create_using_check_mode.yml + vars: + test_proxysql_cluster_check_mode: true + +- name: "{{ role_name }} | test_delete_using_check_mode | test delete proxysql cluster server using check mode" + import_tasks: test_delete_using_check_mode.yml + vars: + test_proxysql_cluster_check_mode: true + +- name: "{{ role_name }} | test_create_cluster_server | test create proxysql cluster server" + import_tasks: test_create_cluster_server.yml + vars: + test_proxysql_cluster_cleanup_after_test: false +- name: "{{ role_name }} | test_create_cluster_server | test idempotence of create proxysql cluster server" + import_tasks: test_create_cluster_server.yml + vars: + test_proxysql_cluster_check_idempotence: true + +- name: "{{ role_name }} | test_delete_cluster_server | test delete proxysql cluster server" + import_tasks: test_delete_cluster_server.yml + vars: + test_proxysql_cluster_cleanup_after_test: false +- name: "{{ role_name }} | test_delete_cluster_server | test idempotence of delete proxysql cluster server" + import_tasks: test_delete_cluster_server.yml + vars: + test_proxysql_cluster_check_idempotence: true + +- name: "{{ role_name }} | test_create_cluster_server_in_memory_only | test create proxysql cluster server in memory" + import_tasks: test_create_cluster_server_in_memory_only.yml + vars: + test_proxysql_cluster_in_memory_only: true + test_proxysql_cluster_cleanup_after_test: false +- name: "{{ role_name }} | test_create_cluster_server_in_memory_only | test idempotence of create proxysql cluster server in memory" + import_tasks: test_create_cluster_server_in_memory_only.yml + vars: + test_proxysql_cluster_in_memory_only: true + test_proxysql_cluster_check_idempotence: true + +- name: "{{ role_name }} | test_delete_cluster_server_in_memory_only | test delete proxysql cluster server in memory" + import_tasks: test_delete_cluster_server_in_memory_only.yml + vars: + test_proxysql_cluster_in_memory_only: true + test_proxysql_cluster_cleanup_after_test: false +- name: "{{ role_name }} | test_delete_cluster_server_in_memory_only | test idempotence of delete proxysql cluster server in memory" + import_tasks: test_delete_cluster_server_in_memory_only.yml + vars: + test_proxysql_cluster_in_memory_only: true + test_proxysql_cluster_check_idempotence: true + +- name: "{{ role_name }} | test_delete_cluster_server_with_delayed_persist | test create proxysql cluster server with delayed save to disk/load to runtime" + import_tasks: test_delete_cluster_server_with_delayed_persist.yml + vars: + test_proxysql_cluster_in_memory_only: true + test_proxysql_cluster_with_delayed_persist: true + test_proxysql_cluster_cleanup_after_test: false +- name: "{{ role_name }} | test_create_cluster_server_with_delayed_persist | test idempotence of create proxysql cluster server with delayed save to disk/load to runtime" + import_tasks: test_delete_cluster_server_with_delayed_persist.yml + vars: + test_proxysql_cluster_in_memory_only: true + test_proxysql_cluster_with_delayed_persist: true + test_proxysql_cluster_check_idempotence: true + +- name: "{{ role_name }} | test_proxysql_cluster_server_with_delayed_persist | test delete proxysql cluster server with delayed save to disk/load to runtime" + import_tasks: test_delete_cluster_server_with_delayed_persist.yml + vars: + test_proxysql_cluster_in_memory_only: true + test_proxysql_cluster_with_delayed_persist: true + test_proxysql_cluster_cleanup_after_test: false +- name: "{{ role_name }} | test_proxysql_cluster_server_with_delayed_persist | test idempotence of delete proxysql cluster server with delayed save to disk/load to runtime" + import_tasks: test_delete_cluster_server_with_delayed_persist.yml + vars: + test_proxysql_cluster_in_memory_only: true + test_proxysql_cluster_with_delayed_persist: true + test_proxysql_cluster_check_idempotence: true + +### teardown + +- name: "{{ role_name }} | teardown | perform teardown" + import_tasks: teardown.yml diff --git a/tests/integration/targets/test_proxysql_cluster/tasks/setup_test_server.yml b/tests/integration/targets/test_proxysql_cluster/tasks/setup_test_server.yml new file mode 100644 index 0000000..5ba9f45 --- /dev/null +++ b/tests/integration/targets/test_proxysql_cluster/tasks/setup_test_server.yml @@ -0,0 +1,12 @@ +--- +- name: "{{ role_name }} | {{ current_test }} | ensure test proxysql cluster server is created when we start" + block: + + - name: "{{ role_name }} | {{ current_test }} | ensure test proxysql cluster server is created in memory" + shell: mysql -uadmin -padmin -h127.0.0.1 -P6032 -BNe"INSERT OR REPLACE INTO proxysql_servers (hostname, port, weight) VALUES ('{{ test_host }}', '{{ test_port }}', '{{ test_weight }}')" + + - name: "{{ role_name }} | {{ current_test }} | ensure test proxysql cluster server is created on disk" + shell: mysql -uadmin -padmin -h127.0.0.1 -P6032 -BNe"SAVE PROXYSQL SERVERS TO DISK" + + - name: "{{ role_name }} | {{ current_test }} | ensure test proxysql cluster server is created in runtime" + shell: mysql -uadmin -padmin -h127.0.0.1 -P6032 -BNe"LOAD PROXYSQL SERVERS TO RUNTIME" diff --git a/tests/integration/targets/test_proxysql_cluster/tasks/teardown.yml b/tests/integration/targets/test_proxysql_cluster/tasks/teardown.yml new file mode 100644 index 0000000..0cb5ae1 --- /dev/null +++ b/tests/integration/targets/test_proxysql_cluster/tasks/teardown.yml @@ -0,0 +1,6 @@ +--- +- name: "{{ role_name }} | teardown | uninstall proxysql" + apt: + name: proxysql + purge: true + state: absent diff --git a/tests/integration/targets/test_proxysql_cluster/tasks/test_create_cluster_server.yml b/tests/integration/targets/test_proxysql_cluster/tasks/test_create_cluster_server.yml new file mode 100644 index 0000000..403dee1 --- /dev/null +++ b/tests/integration/targets/test_proxysql_cluster/tasks/test_create_cluster_server.yml @@ -0,0 +1,31 @@ +--- +- name: "{{ role_name }} | test_create_cluster_server | set current test" + set_fact: + current_test: test_create_cluster_server + +- include_tasks: base_test.yml + +### then + +- name: "{{ role_name }} | {{ current_test }} | check if create server reported a change" + assert: + that: + - "status is {{ test_proxysql_cluster_check_idempotence|ternary('not changed', 'changed') }}" + +- name: "{{ role_name }} | {{ current_test }} | confirm create server did make a change in memory" + assert: + that: memory_result.stdout == '{{ test_host }},{{ test_port }},{{ test_weight }}' + +- name: "{{ role_name }} | {{ current_test }} | confirm create server did make a change on disk" + assert: + that: disk_result.stdout == '{{ test_host }},{{ test_port }},{{ test_weight }}' + +- name: "{{ role_name }} | {{ current_test }} | confirm create server did make a change to runtime" + assert: + that: runtime_result.stdout == '{{ test_host }},{{ test_port }},{{ test_weight }}' + +### perform cleanup + +- name: "{{ role_name }} | {{ current_test }} | ensure we're in a clean state when we finish" + import_tasks: cleanup_test_servers.yml + when: test_proxysql_cluster_cleanup_after_test diff --git a/tests/integration/targets/test_proxysql_cluster/tasks/test_create_cluster_server_in_memory_only.yml b/tests/integration/targets/test_proxysql_cluster/tasks/test_create_cluster_server_in_memory_only.yml new file mode 100644 index 0000000..a995c0b --- /dev/null +++ b/tests/integration/targets/test_proxysql_cluster/tasks/test_create_cluster_server_in_memory_only.yml @@ -0,0 +1,31 @@ +--- +- name: "{{ role_name }} | test_create_cluster_server_in_memory_only | set current test" + set_fact: + current_test: test_create_cluster_server_in_memory_only + +- include_tasks: base_test.yml + +### then + +- name: "{{ role_name }} | {{ current_test }} | check if create server reported a change" + assert: + that: + - "status is {{ test_proxysql_cluster_check_idempotence|ternary('not changed', 'changed') }}" + +- name: "{{ role_name }} | {{ current_test }} | confirm create server did make a change in memory" + assert: + that: memory_result.stdout == '{{ test_host }},{{ test_port }},{{ test_weight }}' + +- name: "{{ role_name }} | {{ current_test }} | confirm create server didn't make a change on disk" + assert: + that: disk_result.stdout|length == 0 + +- name: "{{ role_name }} | {{ current_test }} | confirm create server didn't make a change to runtime" + assert: + that: runtime_result.stdout|length == 0 + +### perform cleanup + +- name: "{{ role_name }} | {{ current_test }} | ensure we're in a clean state when we finish" + import_tasks: cleanup_test_servers.yml + when: test_proxysql_cluster_cleanup_after_test diff --git a/tests/integration/targets/test_proxysql_cluster/tasks/test_create_cluster_server_with_delayed_persist.yml b/tests/integration/targets/test_proxysql_cluster/tasks/test_create_cluster_server_with_delayed_persist.yml new file mode 100644 index 0000000..1f391b8 --- /dev/null +++ b/tests/integration/targets/test_proxysql_cluster/tasks/test_create_cluster_server_with_delayed_persist.yml @@ -0,0 +1,31 @@ +--- +- name: "{{ role_name }} | test_create_cluster_server_with_delayed_persist | set current test" + set_fact: + current_test: test_create_cluster_server_with_delayed_persist + +- include_tasks: base_test.yml + +### then + +- name: "{{ role_name }} | {{ current_test }} | check if create server reported a change" + assert: + that: + - "status is {{ test_proxysql_cluster_check_idempotence|ternary('not changed', 'changed') }}" + +- name: "{{ role_name }} | {{ current_test }} | confirm create server did make a change in memory" + assert: + that: memory_result.stdout == '{{ test_host }},{{ test_port }},{{ test_weight }}' + +- name: "{{ role_name }} | {{ current_test }} | confirm create server did make a change on disk" + assert: + that: disk_result.stdout == '{{ test_host }},{{ test_port }},{{ test_weight }}' + +- name: "{{ role_name }} | {{ current_test }} | confirm create server did make a change to runtime" + assert: + that: runtime_result.stdout == '{{ test_host }},{{ test_port }},{{ test_weight }}' + +### perform cleanup + +- name: "{{ role_name }} | {{ current_test }} | ensure we're in a clean state when we finish" + import_tasks: cleanup_test_servers.yml + when: test_proxysql_cluster_cleanup_after_test diff --git a/tests/integration/targets/test_proxysql_cluster/tasks/test_create_using_check_mode.yml b/tests/integration/targets/test_proxysql_cluster/tasks/test_create_using_check_mode.yml new file mode 100644 index 0000000..2c2dfa9 --- /dev/null +++ b/tests/integration/targets/test_proxysql_cluster/tasks/test_create_using_check_mode.yml @@ -0,0 +1,30 @@ +--- +- name: "{{ role_name }} | test_create_using_check_mode | set current test" + set_fact: + current_test: test_create_using_check_mode + +- include_tasks: base_test.yml + +### then + +- name: "{{ role_name }} | {{ current_test }} | check if create server in check mode reported a change" + assert: + that: + - status is changed + +- name: "{{ role_name }} | {{ current_test }} | confirm create server in check mode didn't make a change in memory" + assert: + that: memory_result.stdout|length == 0 + +- name: "{{ role_name }} | {{ current_test }} | confirm create server in check mode didn't make a change on disk" + assert: + that: disk_result.stdout|length == 0 + +- name: "{{ role_name }} | {{ current_test }} | confirm create server in check mode didn't make a change to runtime" + assert: + that: runtime_result.stdout|length == 0 + +### perform cleanup + +- name: "{{ role_name }} | {{ current_test }} | ensure we're in a clean state when we finish" + import_tasks: cleanup_test_servers.yml diff --git a/tests/integration/targets/test_proxysql_cluster/tasks/test_delete_cluster_server.yml b/tests/integration/targets/test_proxysql_cluster/tasks/test_delete_cluster_server.yml new file mode 100644 index 0000000..aa7d4c9 --- /dev/null +++ b/tests/integration/targets/test_proxysql_cluster/tasks/test_delete_cluster_server.yml @@ -0,0 +1,31 @@ +--- +- name: "{{ role_name }} | test_delete_cluster_server | set current test" + set_fact: + current_test: test_delete_cluster_server + +- include_tasks: base_test.yml + +### then + +- name: "{{ role_name }} | {{ current_test }} | check if delete server reported a change" + assert: + that: + - "status is {{ test_proxysql_cluster_check_idempotence|ternary('not changed', 'changed') }}" + +- name: "{{ role_name }} | {{ current_test }} | confirm delete server did make a change in memory" + assert: + that: memory_result.stdout|length == 0 + +- name: "{{ role_name }} | {{ current_test }} | confirm delete server did make a change on disk" + assert: + that: disk_result.stdout|length == 0 + +- name: "{{ role_name }} | {{ current_test }} | confirm delete server did make a change to runtime" + assert: + that: runtime_result.stdout|length == 0 + +### perform cleanup + +- name: "{{ role_name }} | {{ current_test }} | ensure we're in a clean state when we finish" + import_tasks: cleanup_test_servers.yml + when: test_proxysql_cluster_cleanup_after_test diff --git a/tests/integration/targets/test_proxysql_cluster/tasks/test_delete_cluster_server_in_memory_only.yml b/tests/integration/targets/test_proxysql_cluster/tasks/test_delete_cluster_server_in_memory_only.yml new file mode 100644 index 0000000..3ae8768 --- /dev/null +++ b/tests/integration/targets/test_proxysql_cluster/tasks/test_delete_cluster_server_in_memory_only.yml @@ -0,0 +1,31 @@ +--- +- name: "{{ role_name }} | test_delete_cluster_server_in_memory_only | set current test" + set_fact: + current_test: test_delete_cluster_server_in_memory_only + +- include_tasks: base_test.yml + +### then + +- name: "{{ role_name }} | {{ current_test }} | check if delete server reported a change" + assert: + that: + - "status is {{ test_proxysql_cluster_check_idempotence|ternary('not changed', 'changed') }}" + +- name: "{{ role_name }} | {{ current_test }} | confirm delete server didn't make a change in memory" + assert: + that: memory_result.stdout|length == 0 + +- name: "{{ role_name }} | {{ current_test }} | confirm delete server did make a change on disk" + assert: + that: disk_result.stdout == '{{ test_host }},{{ test_port }},{{ test_weight }}' + +- name: "{{ role_name }} | {{ current_test }} | confirm delete server did make a change to runtime" + assert: + that: runtime_result.stdout == '{{ test_host }},{{ test_port }},{{ test_weight }}' + +### perform cleanup + +- name: "{{ role_name }} | {{ current_test }} | ensure we're in a clean state when we finish" + import_tasks: cleanup_test_servers.yml + when: test_proxysql_cluster_cleanup_after_test diff --git a/tests/integration/targets/test_proxysql_cluster/tasks/test_delete_cluster_server_with_delayed_persist.yml b/tests/integration/targets/test_proxysql_cluster/tasks/test_delete_cluster_server_with_delayed_persist.yml new file mode 100644 index 0000000..9d6fab6 --- /dev/null +++ b/tests/integration/targets/test_proxysql_cluster/tasks/test_delete_cluster_server_with_delayed_persist.yml @@ -0,0 +1,31 @@ +--- +- name: "{{ role_name }} | test_delete_cluster_server_with_delayed_persist | set current test" + set_fact: + current_test: test_delete_cluster_server_with_delayed_persist + +- include_tasks: base_test.yml + +### then + +- name: "{{ role_name }} | {{ current_test }} | check if delete server reported a change" + assert: + that: + - "status is {{ test_proxysql_cluster_check_idempotence|ternary('not changed', 'changed') }}" + +- name: "{{ role_name }} | {{ current_test }} | confirm delete server did make a change in memory" + assert: + that: memory_result.stdout|length == 0 + +- name: "{{ role_name }} | {{ current_test }} | confirm delete server did make a change on disk" + assert: + that: disk_result.stdout|length == 0 + +- name: "{{ role_name }} | {{ current_test }} | confirm delete server did make a change to runtime" + assert: + that: runtime_result.stdout|length == 0 + +### perform cleanup + +- name: "{{ role_name }} | {{ current_test }} | ensure we're in a clean state when we finish" + import_tasks: cleanup_test_servers.yml + when: test_proxysql_cluster_cleanup_after_test diff --git a/tests/integration/targets/test_proxysql_cluster/tasks/test_delete_using_check_mode.yml b/tests/integration/targets/test_proxysql_cluster/tasks/test_delete_using_check_mode.yml new file mode 100644 index 0000000..1a57296 --- /dev/null +++ b/tests/integration/targets/test_proxysql_cluster/tasks/test_delete_using_check_mode.yml @@ -0,0 +1,30 @@ +--- +- name: "{{ role_name }} | test_delete_using_check_mode | set current test" + set_fact: + current_test: test_delete_using_check_mode + +- include_tasks: base_test.yml + +### then + +- name: "{{ role_name }} | {{ current_test }} | check if delete server in check mode reported a change" + assert: + that: + - status is changed + +- name: "{{ role_name }} | {{ current_test }} | confirm delete server in check mode didn't make a change in memory" + assert: + that: memory_result.stdout == '{{ test_host }},{{ test_port }},{{ test_weight }}' + +- name: "{{ role_name }} | {{ current_test }} | confirm delete server in check mode didn't make a change on disk" + assert: + that: disk_result.stdout == '{{ test_host }},{{ test_port }},{{ test_weight }}' + +- name: "{{ role_name }} | {{ current_test }} | confirm delete server in check mode didn't make a change to runtime" + assert: + that: runtime_result.stdout == '{{ test_host }},{{ test_port }},{{ test_weight }}' + +### perform cleanup + +- name: "{{ role_name }} | {{ current_test }} | ensure we're in a clean state when we finish" + import_tasks: cleanup_test_servers.yml diff --git a/tests/sanity/ignore-2.12.txt b/tests/sanity/skip-2.12.txt similarity index 100% rename from tests/sanity/ignore-2.12.txt rename to tests/sanity/skip-2.12.txt