# # Create and destroy db # - name: Create DB become_user: "{{ pg_user }}" become: yes postgresql_db: state: present name: "{{ db_name }}" login_user: "{{ pg_user }}" register: result - name: assert that module reports the db was created assert: that: - result is changed - result.db == "{{ db_name }}" - result.executed_commands == ['CREATE DATABASE "{{ db_name }}"'] - name: Check that database created become_user: "{{ pg_user }}" become: yes shell: echo "select datname from pg_database where datname = '{{ db_name }}';" | psql -d postgres register: result - assert: that: - "result.stdout_lines[-1] == '(1 row)'" - name: Run create on an already created db become_user: "{{ pg_user }}" become: yes postgresql_db: state: present name: "{{ db_name }}" login_user: "{{ pg_user }}" register: result - name: assert that module reports the db was unchanged assert: that: - result is not changed - name: Destroy DB become_user: "{{ pg_user }}" become: yes postgresql_db: state: absent name: "{{ db_name }}" login_user: "{{ pg_user }}" register: result - name: assert that module reports the db was changed assert: that: - result is changed - result.executed_commands == ['DROP DATABASE "{{ db_name }}"'] - name: Check that database was destroyed become_user: "{{ pg_user }}" become: yes shell: echo "select datname from pg_database where datname = '{{ db_name }}';" | psql -d postgres register: result - assert: that: - "result.stdout_lines[-1] == '(0 rows)'" - name: Destroy DB become_user: "{{ pg_user }}" become: yes postgresql_db: state: absent name: "{{ db_name }}" login_user: "{{ pg_user }}" register: result - name: assert that removing an already removed db makes no change assert: that: - result is not changed # This corner case works to add but not to drop. This is sufficiently crazy # that I'm not going to attempt to fix it unless someone lets me know that they # need the functionality # # - postgresql_db: # state: 'present' # name: '"silly.""name"' # - shell: echo "select datname from pg_database where datname = 'silly.""name';" | psql # register: result # # - assert: # that: "result.stdout_lines[-1] == '(1 row)'" # - postgresql_db: # state: absent # name: '"silly.""name"' # - shell: echo "select datname from pg_database where datname = 'silly.""name';" | psql # register: result # # - assert: # that: "result.stdout_lines[-1] == '(0 rows)'" # # Test conn_limit, encoding, collate, ctype, template options # - name: Create a DB with conn_limit, encoding, collate, ctype, and template options become_user: "{{ pg_user }}" become: yes postgresql_db: name: '{{ db_name }}' state: 'present' conn_limit: '100' encoding: 'LATIN1' lc_collate: 'pt_BR{{ locale_latin_suffix }}' lc_ctype: 'es_ES{{ locale_latin_suffix }}' template: 'template0' login_user: "{{ pg_user }}" register: result - assert: that: - result is changed - result.executed_commands == ["CREATE DATABASE \"{{ db_name }}\" TEMPLATE \"template0\" ENCODING 'LATIN1' LC_COLLATE 'pt_BR{{ locale_latin_suffix }}' LC_CTYPE 'es_ES{{ locale_latin_suffix }}' CONNECTION LIMIT 100"] or result.executed_commands == ["CREATE DATABASE \"{{ db_name }}\" TEMPLATE \"template0\" ENCODING E'LATIN1' LC_COLLATE E'pt_BR{{ locale_latin_suffix }}' LC_CTYPE E'es_ES{{ locale_latin_suffix }}' CONNECTION LIMIT 100"] - name: Check that the DB has all of our options become_user: "{{ pg_user }}" become: yes shell: echo "select datname, datconnlimit, pg_encoding_to_char(encoding), datcollate, datctype from pg_database where datname = '{{ db_name }}';" | psql -d postgres register: result - assert: that: - "result.stdout_lines[-1] == '(1 row)'" - "'LATIN1' in result.stdout_lines[-2]" - "'pt_BR' in result.stdout_lines[-2]" - "'es_ES' in result.stdout_lines[-2]" - "'UTF8' not in result.stdout_lines[-2]" - "'en_US' not in result.stdout_lines[-2]" - "'100' in result.stdout_lines[-2]" - name: Check that running db creation with options a second time does nothing become_user: "{{ pg_user }}" become: yes postgresql_db: name: '{{ db_name }}' state: 'present' conn_limit: '100' encoding: 'LATIN1' lc_collate: 'pt_BR{{ locale_latin_suffix }}' lc_ctype: 'es_ES{{ locale_latin_suffix }}' template: 'template0' login_user: "{{ pg_user }}" register: result - assert: that: - result is not changed - name: Check that attempting to change encoding returns an error become_user: "{{ pg_user }}" become: yes postgresql_db: name: '{{ db_name }}' state: 'present' encoding: 'UTF8' lc_collate: 'pt_BR{{ locale_utf8_suffix }}' lc_ctype: 'es_ES{{ locale_utf8_suffix }}' template: 'template0' login_user: "{{ pg_user }}" register: result ignore_errors: yes - assert: that: - result is failed - name: Check that changing the conn_limit actually works become_user: "{{ pg_user }}" become: yes postgresql_db: name: '{{ db_name }}' state: 'present' conn_limit: '200' encoding: 'LATIN1' lc_collate: 'pt_BR{{ locale_latin_suffix }}' lc_ctype: 'es_ES{{ locale_latin_suffix }}' template: 'template0' login_user: "{{ pg_user }}" register: result - assert: that: - result is changed - result.executed_commands == ['ALTER DATABASE "{{ db_name }}" CONNECTION LIMIT 200'] - name: Check that conn_limit has actually been set / updated to 200 become_user: "{{ pg_user }}" become: yes shell: echo "SELECT datconnlimit AS conn_limit FROM pg_database WHERE datname = '{{ db_name }}';" | psql -d postgres register: result - assert: that: - "result.stdout_lines[-1] == '(1 row)'" - "'200' == '{{ result.stdout_lines[-2] | trim }}'" - name: Cleanup test DB become_user: "{{ pg_user }}" become: yes postgresql_db: name: '{{ db_name }}' state: 'absent' login_user: "{{ pg_user }}" - shell: echo "select datname, pg_encoding_to_char(encoding), datcollate, datctype from pg_database where datname = '{{ db_name }}';" | psql -d postgres become_user: "{{ pg_user }}" become: yes register: result - assert: that: - "result.stdout_lines[-1] == '(0 rows)'" # # Test db ownership # - name: Create an unprivileged user to own a DB become_user: "{{ pg_user }}" become: yes postgresql_user: name: "{{ item }}" encrypted: 'yes' password: "md55c8ccfd9d6711fc69a7eae647fc54f51" login_user: "{{ pg_user }}" db: postgres loop: - "{{ db_user1 }}" - "{{ db_user2 }}" - name: Create db with user ownership become_user: "{{ pg_user }}" become: yes postgresql_db: name: "{{ db_name }}" state: "present" owner: "{{ db_user1 }}" login_user: "{{ pg_user }}" register: result - assert: that: - result is changed - result.executed_commands == ['CREATE DATABASE "{{ db_name }}" OWNER "{{ db_user1 }}"'] - name: Check that the user owns the newly created DB become_user: "{{ pg_user }}" become: yes postgresql_query: db: postgres login_user: "{{ pg_user }}" query: > SELECT 1 FROM pg_catalog.pg_database WHERE datname = '{{ db_name }}' AND pg_catalog.pg_get_userbyid(datdba) = '{{ db_user1 }}' register: result - assert: that: - result.rowcount == 1 - name: Change the owner on an existing db, username with dots become_user: "{{ pg_user }}" become: yes postgresql_db: name: "{{ db_name }}" state: "present" owner: "{{ db_user2 }}" login_user: "{{ pg_user }}" register: result - assert: that: - result is changed - result.executed_commands == ['ALTER DATABASE "{{ db_name }}" OWNER TO "{{ db_user2 }}"'] - name: Check the previous step become_user: "{{ pg_user }}" become: yes postgresql_query: login_user: "{{ pg_user }}" db: postgres query: > SELECT 1 FROM pg_catalog.pg_database WHERE datname = '{{ db_name }}' AND pg_catalog.pg_get_userbyid(datdba) = '{{ db_user2 }}' register: result - assert: that: - result.rowcount == 1 - name: Change the owner on an existing db become_user: "{{ pg_user }}" become: yes postgresql_db: name: "{{ db_name }}" state: "present" owner: "{{ pg_user }}" login_user: "{{ pg_user }}" register: result - name: assert that ansible says it changed the db assert: that: - result is changed - name: Check that the user owns the newly created DB become_user: "{{ pg_user }}" become: yes shell: echo "select pg_catalog.pg_get_userbyid(datdba) from pg_catalog.pg_database where datname = '{{ db_name }}';" | psql -d postgres register: result - assert: that: - "result.stdout_lines[-1] == '(1 row)'" - "'{{ pg_user }}' == '{{ result.stdout_lines[-2] | trim }}'" - name: Cleanup db become_user: "{{ pg_user }}" become: yes postgresql_db: name: "{{ db_name }}" state: "absent" login_user: "{{ pg_user }}" - name: Check that database was destroyed become_user: "{{ pg_user }}" become: yes shell: echo "select datname from pg_database where datname = '{{ db_name }}';" | psql -d postgres register: result - assert: that: - "result.stdout_lines[-1] == '(0 rows)'" - name: Cleanup test user become_user: "{{ pg_user }}" become: yes postgresql_user: name: "{{ db_user1 }}" state: 'absent' login_user: "{{ pg_user }}" db: postgres - name: Check that they were removed become_user: "{{ pg_user }}" become: yes shell: echo "select * from pg_user where usename='{{ db_user1 }}';" | psql -d postgres register: result - assert: that: - "result.stdout_lines[-1] == '(0 rows)'"