# Copyright: (c) 2019, Tobias Birkefeld (@tcraxs) # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) # Preparation for tests. - name: postgresql_sequence - create DB become_user: "{{ pg_user }}" become: yes postgresql_db: state: present name: "{{ db_name }}" owner: "{{ db_user1 }}" login_user: "{{ pg_user }}" - name: postgresql_sequence - create a user to be owner of a database become_user: "{{ pg_user }}" become: yes postgresql_user: name: "{{ db_user1 }}" state: present encrypted: yes password: password role_attr_flags: LOGIN db: "{{ db_name }}" login_user: "{{ pg_user }}" - name: Create a user to be owner of a sequence become_user: "{{ pg_user }}" become: yes postgresql_user: name: "{{ db_user2 }}" state: present encrypted: yes password: password role_attr_flags: LOGIN db: "{{ db_name }}" login_user: "{{ pg_user }}" - name: postgresql_sequence - create a schema become_user: "{{ pg_user }}" become: yes postgresql_schema: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: foobar_schema #################### # Test: create sequence in checkmode - name: postgresql_sequence - create a new seqeunce with name "foobar" in check_mode become_user: "{{ pg_user }}" become: yes check_mode: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: foobar register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is changed - result.sequence == 'foobar' - result.queries == ["CREATE SEQUENCE \"public\".\"foobar\""] # Real SQL check - name: postgresql_sequence - check that the new seqeunce "foobar" not exists become: yes become_user: "{{ pg_user }}" postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT sequence_name FROM information_schema.sequences WHERE sequence_name = 'foobar'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 0 - result.statusmessage == 'SELECT 0' #################### # Test: create sequence - name: postgresql_sequence - create a new seqeunce with name "foobar" become_user: "{{ pg_user }}" become: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: foobar register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is changed - result.sequence == 'foobar' - result.queries == ["CREATE SEQUENCE \"public\".\"foobar\""] # Real SQL check - name: postgresql_sequence - check that the new seqeunce "foobar" exists become_user: "{{ pg_user }}" become: yes postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT sequence_name FROM information_schema.sequences WHERE sequence_name = 'foobar'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 1 #################### # Test: drop sequence in checkmode - name: postgresql_sequence - drop a sequence called foobar become_user: "{{ pg_user }}" become: yes check_mode: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: foobar state: absent register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is changed - result.sequence == 'foobar' - result.queries == ["DROP SEQUENCE \"public\".\"foobar\""] # Real SQL check - name: postgresql_sequence - check that the seqeunce "foobar" still exists become_user: "{{ pg_user }}" become: yes postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT sequence_name FROM information_schema.sequences WHERE sequence_name = 'foobar'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 1 #################### # Test: drop sequence - name: postgresql_sequence - drop a sequence called foobar become_user: "{{ pg_user }}" become: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: foobar state: absent register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is changed - result.sequence == 'foobar' - result.queries == ["DROP SEQUENCE \"public\".\"foobar\""] # Real SQL check - name: postgresql_sequence - check that the seqeunce "foobar" not exists become_user: "{{ pg_user }}" become: yes postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT sequence_name FROM information_schema.sequences WHERE sequence_name = 'foobar'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 0 #################### # Test: drop nonexistent sequence - name: postgresql_sequence - drop a sequence called foobar which does not exists become_user: "{{ pg_user }}" become: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: foobar state: absent register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is not changed - result.sequence == 'foobar' - result.queries == [] # Real SQL check - name: postgresql_sequence - check that the seqeunce "foobar" not exists become_user: "{{ pg_user }}" become: yes postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT sequence_name FROM information_schema.sequences WHERE sequence_name = 'foobar'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 0 #################### # Test: create sequence with options - name: postgresql_sequence - create an descending sequence called foobar_desc, starting at 101 and which cycle between 1 to 1000 become_user: "{{ pg_user }}" become: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: foobar_desc increment: -1 start: 101 minvalue: 1 maxvalue: 1000 cycle: yes register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is changed - result.sequence == 'foobar_desc' - result.increment == '-1' - result.minvalue == '1' - result.maxvalue == '1000' - result.cycle == 'YES' - result.queries == ["CREATE SEQUENCE \"public\".\"foobar_desc\" INCREMENT BY -1 MINVALUE 1 MAXVALUE 1000 START WITH 101 CYCLE"] # Real SQL check - name: postgresql_sequence - check that the new seqeunce "foobar_desc" exists postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT sequence_name FROM information_schema.sequences WHERE sequence_name = 'foobar_desc'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 1 #################### # Test: rename a sequence in checkmode - name: postgresql_sequence - rename an existing sequence named foobar_desc to foobar_with_options become_user: "{{ pg_user }}" become: yes check_mode: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: foobar_desc rename_to: foobar_with_options register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is changed - result.sequence == 'foobar_desc' - result.newname == 'foobar_with_options' - result.queries == ["ALTER SEQUENCE \"public\".\"foobar_desc\" RENAME TO \"foobar_with_options\""] # Real SQL check - name: postgresql_sequence - check that the seqeunce "foobar_desc" still exists and is not renamed become_user: "{{ pg_user }}" become: yes postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT sequence_name FROM information_schema.sequences WHERE sequence_name = 'foobar_desc'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 1 #################### # Test: rename a sequence - name: postgresql_sequence - rename an existing sequence named foobar_desc to foobar_with_options become_user: "{{ pg_user }}" become: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: foobar_desc rename_to: foobar_with_options register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is changed - result.sequence == 'foobar_desc' - result.newname == 'foobar_with_options' - result.queries == ["ALTER SEQUENCE \"public\".\"foobar_desc\" RENAME TO \"foobar_with_options\""] # Real SQL check - name: postgresql_sequence - check that the renamed seqeunce "foobar_with_options" exists become_user: "{{ pg_user }}" become: yes postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT sequence_name FROM information_schema.sequences WHERE sequence_name = 'foobar_with_options'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 1 #################### # Test: change schema of a sequence in checkmode - name: postgresql_sequence - change schema of an existing sequence from public to foobar_schema become_user: "{{ pg_user }}" become: yes check_mode: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: foobar_with_options newschema: foobar_schema register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is changed - result.sequence == 'foobar_with_options' - result.schema == 'public' - result.newschema == 'foobar_schema' - result.queries == ["ALTER SEQUENCE \"public\".\"foobar_with_options\" SET SCHEMA \"foobar_schema\""] # Real SQL check - name: postgresql_sequence - check that the seqeunce "foobar_with_options" still exists in the old schema become_user: "{{ pg_user }}" become: yes postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT sequence_name,sequence_schema FROM information_schema.sequences WHERE sequence_name = 'foobar_with_options' AND sequence_schema = 'public'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 1 #################### # Test: change schema of a sequence - name: postgresql_sequence - change schema of an existing sequence from public to foobar_schema become_user: "{{ pg_user }}" become: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: foobar_with_options newschema: foobar_schema register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is changed - result.sequence == 'foobar_with_options' - result.schema == 'public' - result.newschema == 'foobar_schema' - result.queries == ["ALTER SEQUENCE \"public\".\"foobar_with_options\" SET SCHEMA \"foobar_schema\""] # Real SQL check - name: postgresql_sequence - check that the seqeunce "foobar_with_options" exists in new schema become_user: "{{ pg_user }}" become: yes postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT sequence_name,sequence_schema FROM information_schema.sequences WHERE sequence_name = 'foobar_with_options' AND sequence_schema = 'foobar_schema'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 1 #################### # Test: change owner of a sequence in checkmode - name: postgresql_sequence - change owner of an existing sequence from "{{ pg_user }}" to "{{ db_user1 }}" become_user: "{{ pg_user }}" become: yes check_mode: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: foobar_with_options schema: foobar_schema owner: "{{ db_user1 }}" register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is changed - result.sequence == 'foobar_with_options' - result.owner == "{{ pg_user }}" - result.queries == ["ALTER SEQUENCE \"foobar_schema\".\"foobar_with_options\" OWNER TO \"{{ db_user1 }}\""] # Real SQL check - name: postgresql_sequence - check that the seqeunce "foobar_with_options" has still the old owner become_user: "{{ pg_user }}" become: yes postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT c.relname,a.rolname,n.nspname FROM pg_class as c JOIN pg_authid as a on (c.relowner = a.oid) JOIN pg_namespace as n on (c.relnamespace = n.oid) WHERE c.relkind = 'S' and c.relname = 'foobar_with_options' and n.nspname = 'foobar_schema' and a.rolname = '{{ pg_user }}'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 1 #################### # Test: change owner of a sequence - name: postgresql_sequence - change owner of an existing sequence from "{{ pg_user }}" to "{{ db_user1 }}" become_user: "{{ pg_user }}" become: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: foobar_with_options schema: foobar_schema owner: "{{ db_user1 }}" register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is changed - result.sequence == 'foobar_with_options' - result.owner == "{{ pg_user }}" - result.queries == ["ALTER SEQUENCE \"foobar_schema\".\"foobar_with_options\" OWNER TO \"{{ db_user1 }}\""] # Real SQL check - name: postgresql_sequence - check that the seqeunce "foobar_with_options" has a new owner become_user: "{{ pg_user }}" become: yes postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT c.relname,a.rolname,n.nspname FROM pg_class as c JOIN pg_authid as a on (c.relowner = a.oid) JOIN pg_namespace as n on (c.relnamespace = n.oid) WHERE c.relkind = 'S' and c.relname = 'foobar_with_options' and n.nspname = 'foobar_schema' and a.rolname = '{{ db_user1 }}'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 1 #################### # Test: drop seqeunce with cascade # CREATE SEQUENCE seq1; # CREATE TABLE t1 (f1 INT NOT NULL DEFAULT nextval('seq1')); # DROP SEQUENCE seq1 CASCADE; - name: postgresql_sequence - create sequence for drop cascade test become_user: "{{ pg_user }}" become: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: seq1 - name: postgresql_sequence - create table which use seqeunce for drop cascade test become_user: "{{ pg_user }}" become: yes postgresql_table: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: t1 columns: - f1 INT NOT NULL DEFAULT nextval('seq1') #################### # Test: drop seqeunce with cascade in checkmode - name: postgresql_sequence - drop with cascade a sequence called seq1 become_user: "{{ pg_user }}" become: yes check_mode: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: seq1 state: absent cascade: yes register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is changed - result.sequence == 'seq1' - result.queries == ["DROP SEQUENCE \"public\".\"seq1\" CASCADE"] # Real SQL check - name: postgresql_sequence - check that the seqeunce "seq1" still exists become_user: "{{ pg_user }}" become: yes postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT sequence_name FROM information_schema.sequences WHERE sequence_name = 'seq1'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 1 #################### # Test: drop seqeunce with cascade - name: postgresql_sequence - drop with cascade a sequence called seq1 become_user: "{{ pg_user }}" become: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: seq1 state: absent cascade: yes register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is changed - result.sequence == 'seq1' - result.queries == ["DROP SEQUENCE \"public\".\"seq1\" CASCADE"] # Real SQL check - name: postgresql_sequence - check that the seqeunce "seq1" not exists become_user: "{{ pg_user }}" become: yes postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT sequence_name FROM information_schema.sequences WHERE sequence_name = 'seq1'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 0 #################### # Test: create sequence with owner in checkmode - name: postgresql_sequence - create a new seqeunce with name "foobar2" with owner "{{ db_user2 }}" become_user: "{{ pg_user }}" become: yes check_mode: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: foobar2 owner: "{{ db_user2 }}" register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is changed - result.sequence == 'foobar2' - result.queries == ["CREATE SEQUENCE \"public\".\"foobar2\"", "ALTER SEQUENCE \"public\".\"foobar2\" OWNER TO \"ansible_db_user2\""] # Real SQL check - name: postgresql_sequence - check that the new seqeunce "foobar2" does not exists become_user: "{{ pg_user }}" become: yes postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT sequence_name FROM information_schema.sequences WHERE sequence_name = 'foobar2'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 0 #################### # Test: create sequence with owner - name: postgresql_sequence - create a new seqeunce with name "foobar2" with owner "{{ db_user2 }}" become_user: "{{ pg_user }}" become: yes postgresql_sequence: db: "{{ db_name }}" login_user: "{{ pg_user }}" name: foobar2 owner: "{{ db_user2 }}" register: result # Checks - name: postgresql_sequence - check with assert the output assert: that: - result is changed - result.sequence == 'foobar2' - result.queries == ["CREATE SEQUENCE \"public\".\"foobar2\"", "ALTER SEQUENCE \"public\".\"foobar2\" OWNER TO \"ansible_db_user2\""] # Real SQL check - name: postgresql_sequence - check that the new seqeunce "foobar2" exists become_user: "{{ pg_user }}" become: yes postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT sequence_name FROM information_schema.sequences WHERE sequence_name = 'foobar2'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 1 - name: postgresql_sequence - check that the seqeunce "foobar2" has owner "{{ db_user2 }}" become_user: "{{ pg_user }}" become: yes postgresql_query: db: "{{ db_name }}" login_user: "{{ pg_user }}" query: "SELECT c.relname,a.rolname,n.nspname FROM pg_class as c JOIN pg_authid as a on (c.relowner = a.oid) JOIN pg_namespace as n on (c.relnamespace = n.oid) WHERE c.relkind = 'S' and c.relname = 'foobar2' and n.nspname = 'public' and a.rolname = '{{ db_user2 }}'" register: result - name: postgresql_sequence - check with assert the output assert: that: - result.rowcount == 1 # Cleanup - name: postgresql_sequence - destroy DB become_user: "{{ pg_user }}" become: yes postgresql_db: state: absent name: "{{ db_name }}" login_user: "{{ pg_user }}"