|
|
|
#
|
|
|
|
# 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)'"
|