mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-07-22 04:40:22 -07:00
New module postgresql_copy: copy data between a file and a table (#56835)
* New module postgresql_copy * New module postgresql_copy: added tests * New module postgresql_copy: changed tests * New module postgresql_copy: doc format fixes * New module postgresql_copy: fixes * New module postgresql_copy: added upper, PostgreSQL * New module postgresql_copy: fixed description * New module postgresql_copy: added note about superuser * New module postgresql_copy: remove SQLParseError * New module postgresql_copy: fixed opt_need_quotes type * New module postgresql_copy: fixed check_mode * New module postgresql_copy: small fix
This commit is contained in:
parent
0c66a5d3ca
commit
96bf243265
4 changed files with 691 additions and 4 deletions
|
@ -833,6 +833,10 @@
|
|||
- include: test_target_role.yml
|
||||
when: postgres_version_resp.stdout is version('9.1', '>=')
|
||||
|
||||
# Test postgresql_copy module
|
||||
- include: postgresql_copy.yml
|
||||
when: postgres_version_resp.stdout is version('9.4', '>=')
|
||||
|
||||
# Test postgresql_ext.
|
||||
# pg_extension system view is available from PG 9.1.
|
||||
# The tests are restricted by Fedora because there will be errors related with
|
||||
|
|
255
test/integration/targets/postgresql/tasks/postgresql_copy.yml
Normal file
255
test/integration/targets/postgresql/tasks/postgresql_copy.yml
Normal file
|
@ -0,0 +1,255 @@
|
|||
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
|
||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# The file for testing postgresql_copy module.
|
||||
|
||||
- vars:
|
||||
test_table: acme
|
||||
data_file_txt: /tmp/data.txt
|
||||
data_file_csv: /tmp/data.csv
|
||||
task_parameters: &task_parameters
|
||||
become_user: '{{ pg_user }}'
|
||||
become: True
|
||||
register: result
|
||||
pg_parameters: &pg_parameters
|
||||
login_user: '{{ pg_user }}'
|
||||
login_db: postgres
|
||||
|
||||
block:
|
||||
# Test preparation:
|
||||
- name: postgresql_copy - create test table
|
||||
<<: *task_parameters
|
||||
postgresql_table:
|
||||
<<: *pg_parameters
|
||||
name: '{{ test_table }}'
|
||||
columns:
|
||||
- id int
|
||||
- name text
|
||||
|
||||
# Insert the data:
|
||||
- name: postgresql_copy - insert rows into test table
|
||||
<<: *task_parameters
|
||||
postgresql_query:
|
||||
<<: *pg_parameters
|
||||
query: "INSERT INTO {{ test_table }} (id, name) VALUES (1, 'first')"
|
||||
|
||||
- name: postgresql_copy - ensure that test data files don't exist
|
||||
<<: *task_parameters
|
||||
file:
|
||||
path: '{{ item }}'
|
||||
state: absent
|
||||
with_items:
|
||||
- '{{ data_file_csv }}'
|
||||
- '{{ data_file_txt }}'
|
||||
|
||||
# ##############
|
||||
# Do main tests:
|
||||
|
||||
# check_mode - if it's OK, must always return changed=True:
|
||||
- name: postgresql_copy - check_mode, copy test table content to data_file_txt
|
||||
check_mode: yes
|
||||
<<: *task_parameters
|
||||
postgresql_copy:
|
||||
<<: *pg_parameters
|
||||
copy_to: '{{ data_file_txt }}'
|
||||
src: '{{ test_table }}'
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- result.changed == true
|
||||
|
||||
# check that nothing changed after the previous step:
|
||||
- name: postgresql_copy - check that data_file_txt doesn't exist
|
||||
<<: *task_parameters
|
||||
ignore_errors: yes
|
||||
shell: head -n 1 '{{ data_file_txt }}'
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- result.failed == true
|
||||
- result.rc == 1
|
||||
|
||||
# check_mode - if it's OK, must always return changed=True:
|
||||
- name: postgresql_copy - check_mode, copy test table content from data_file_txt
|
||||
check_mode: yes
|
||||
<<: *task_parameters
|
||||
postgresql_copy:
|
||||
<<: *pg_parameters
|
||||
copy_from: '{{ data_file_txt }}'
|
||||
dst: '{{ test_table }}'
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- result.changed == true
|
||||
|
||||
# check that nothing changed after the previous step:
|
||||
- name: postgresql_copy - check that test table continue to have one row
|
||||
<<: *task_parameters
|
||||
postgresql_query:
|
||||
<<: *pg_parameters
|
||||
query: 'SELECT * FROM {{ test_table }}'
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- result.rowcount == 1
|
||||
|
||||
# check_mode - test must fail because test table doesn't exist:
|
||||
- name: postgresql_copy - check_mode, copy non existent table to data_file_txt
|
||||
check_mode: yes
|
||||
ignore_errors: yes
|
||||
<<: *task_parameters
|
||||
postgresql_copy:
|
||||
<<: *pg_parameters
|
||||
copy_to: '{{ data_file_txt }}'
|
||||
src: non_existent_table
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- result.failed == true
|
||||
- result.queries is not defined
|
||||
|
||||
- name: postgresql_copy - copy test table data to data_file_txt
|
||||
<<: *task_parameters
|
||||
postgresql_copy:
|
||||
<<: *pg_parameters
|
||||
copy_to: '{{ data_file_txt }}'
|
||||
src: '{{ test_table }}'
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- result.changed == true
|
||||
- result.queries == ["COPY \"{{ test_table }}\" TO '{{ data_file_txt }}'"]
|
||||
- result.src == '{{ test_table }}'
|
||||
- result.dst == '{{ data_file_txt }}'
|
||||
|
||||
# check the prev test
|
||||
- name: postgresql_copy - check data_file_txt exists and not empty
|
||||
<<: *task_parameters
|
||||
shell: 'head -n 1 {{ data_file_txt }}'
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- result.stdout == '1\tfirst'
|
||||
|
||||
# test different options and columns
|
||||
- name: postgresql_copy - copy test table data to data_file_csv with options and columns
|
||||
<<: *task_parameters
|
||||
postgresql_copy:
|
||||
<<: *pg_parameters
|
||||
copy_to: '{{ data_file_csv }}'
|
||||
src: '{{ test_table }}'
|
||||
columns:
|
||||
- id
|
||||
- name
|
||||
options:
|
||||
format: csv
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- result.changed == true
|
||||
- result.queries == ["COPY \"{{ test_table }}\" (id,name) TO '{{ data_file_csv }}' (format csv)"]
|
||||
- result.src == '{{ test_table }}'
|
||||
- result.dst == '{{ data_file_csv }}'
|
||||
|
||||
# check the prev test
|
||||
- name: postgresql_copy - check data_file_csv exists and not empty
|
||||
<<: *task_parameters
|
||||
shell: 'head -n 1 {{ data_file_csv }}'
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- result.stdout == '1,first'
|
||||
|
||||
- name: postgresql_copy - copy from data_file_csv to test table
|
||||
<<: *task_parameters
|
||||
postgresql_copy:
|
||||
<<: *pg_parameters
|
||||
copy_from: '{{ data_file_csv }}'
|
||||
dst: '{{ test_table }}'
|
||||
columns:
|
||||
- id
|
||||
- name
|
||||
options:
|
||||
format: csv
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- result.changed == true
|
||||
- result.queries == ["COPY \"{{ test_table }}\" (id,name) FROM '{{ data_file_csv }}' (format csv)"]
|
||||
- result.dst == '{{ test_table }}'
|
||||
- result.src == '{{ data_file_csv }}'
|
||||
|
||||
- name: postgresql_copy - check that there are two rows in test table after the prev step
|
||||
<<: *task_parameters
|
||||
postgresql_query:
|
||||
<<: *pg_parameters
|
||||
query: "SELECT * FROM {{ test_table }} WHERE id = '1' AND name = 'first'"
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- result.rowcount == 2
|
||||
|
||||
- name: postgresql_copy - test program option, copy to program
|
||||
<<: *task_parameters
|
||||
postgresql_copy:
|
||||
<<: *pg_parameters
|
||||
src: '{{ test_table }}'
|
||||
copy_to: '/bin/true'
|
||||
program: yes
|
||||
columns: id, name
|
||||
options:
|
||||
delimiter: '|'
|
||||
when: ansible_distribution != 'FreeBSD'
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- result.changed == true
|
||||
- result.queries == ["COPY \"{{ test_table }}\" (id, name) TO PROGRAM '/bin/true' (delimiter '|')"]
|
||||
- result.src == '{{ test_table }}'
|
||||
- result.dst == '/bin/true'
|
||||
when: ansible_distribution != 'FreeBSD'
|
||||
|
||||
- name: postgresql_copy - test program option, copy from program
|
||||
<<: *task_parameters
|
||||
postgresql_copy:
|
||||
<<: *pg_parameters
|
||||
dst: '{{ test_table }}'
|
||||
copy_from: 'echo 1,first'
|
||||
program: yes
|
||||
columns: id, name
|
||||
options:
|
||||
delimiter: ','
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- result.changed == true
|
||||
- result.queries == ["COPY \"{{ test_table }}\" (id, name) FROM PROGRAM 'echo 1,first' (delimiter ',')"]
|
||||
- result.dst == '{{ test_table }}'
|
||||
- result.src == 'echo 1,first'
|
||||
when: ansible_distribution != 'FreeBSD'
|
||||
|
||||
- name: postgresql_copy - check that there are three rows in test table after the prev step
|
||||
<<: *task_parameters
|
||||
postgresql_query:
|
||||
<<: *pg_parameters
|
||||
query: "SELECT * FROM {{ test_table }} WHERE id = '1' AND name = 'first'"
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- result.rowcount == 3
|
||||
|
||||
# clean up
|
||||
- name: postgresql_copy - remove test table
|
||||
<<: *task_parameters
|
||||
postgresql_table:
|
||||
<<: *pg_parameters
|
||||
name: '{{ test_table }}'
|
||||
state: absent
|
||||
|
||||
- name: postgresql_copy - remove test data files
|
||||
<<: *task_parameters
|
||||
file:
|
||||
path: '{{ item }}'
|
||||
state: absent
|
||||
with_items:
|
||||
- '{{ data_file_csv }}'
|
||||
- '{{ data_file_txt }}'
|
Loading…
Add table
Add a link
Reference in a new issue