Skip to content

Commit 984bf53

Browse files
Added search for PGPORT and PGUSER environment variables (#401)
* Added search for PGPORT and PGUSER environment variables * Fix linter * Added changelog fragment * Added unit and integration tests * Refactoring the script * Fix linter * Added a new test and code refactoring --------- Co-authored-by: aleksvagachev <aleksvagachev@yandex.ru>
1 parent 6ca702c commit 984bf53

File tree

4 files changed

+82
-2
lines changed

4 files changed

+82
-2
lines changed

changelogs/fragments/0-postgres.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
minor_changes:
2+
- postgresql - when receiving the connection parameters, the ``PGPORT`` and ``PGUSER`` environment variables are checked. The order of assigning values ``environment variables`` -> ``default values`` -> ``set values`` (https://github.com/ansible-collections/community.postgresql/issues/311).

plugins/module_utils/postgres.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
from datetime import timedelta
1616
from decimal import Decimal
17+
from os import environ
1718

1819
psycopg2 = None # This line needs for unit tests
1920
try:
@@ -37,12 +38,22 @@ def postgres_common_argument_spec():
3738
3839
The options are commonly used by most of PostgreSQL modules.
3940
"""
41+
# Getting a dictionary of environment variables
42+
env_vars = environ
43+
4044
return dict(
41-
login_user=dict(default='postgres', aliases=['login']),
45+
login_user=dict(
46+
default='postgres' if not env_vars.get("PGUSER") else env_vars.get("PGUSER"),
47+
aliases=['login']
48+
),
4249
login_password=dict(default='', no_log=True),
4350
login_host=dict(default='', aliases=['host']),
4451
login_unix_socket=dict(default='', aliases=['unix_socket']),
45-
port=dict(type='int', default=5432, aliases=['login_port']),
52+
port=dict(
53+
type='int',
54+
default=5432 if not env_vars.get("PGPORT") else int(env_vars.get("PGPORT")),
55+
aliases=['login_port']
56+
),
4657
ssl_mode=dict(default='prefer', choices=['allow', 'disable', 'prefer', 'require', 'verify-ca', 'verify-full']),
4758
ca_cert=dict(aliases=['ssl_rootcert']),
4859
connect_params=dict(default={}, type='dict'),

tests/integration/targets/postgresql_ping/tasks/postgresql_ping_initial.yml

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,63 @@
4646
- result.server_version == {}
4747
- result is not changed
4848

49+
- name: postgresql_ping - check ping of the database on non-existent port does not return anything
50+
become_user: "{{ pg_user }}"
51+
become: true
52+
environment:
53+
PGPORT: 5435
54+
ignore_errors: true
55+
postgresql_ping:
56+
db: "{{ db_default }}"
57+
login_user: "{{ pg_user }}"
58+
register: result
59+
60+
- assert:
61+
that:
62+
- result.is_available == false
63+
- result.server_version == {}
64+
- result is not changed
65+
66+
- name: postgresql_ping - check ping of the database by a non-existent user does not return anything
67+
become_user: "{{ pg_user }}"
68+
become: true
69+
environment:
70+
PGUSER: 'test_user'
71+
ignore_errors: true
72+
postgresql_ping:
73+
db: "{{ db_default }}"
74+
register: result
75+
76+
- assert:
77+
that:
78+
- result.is_available == false
79+
- result.server_version == {}
80+
- result is not changed
81+
82+
- name: Creating a "test_user" in postresql
83+
shell:
84+
cmd: psql -U "{{ pg_user }}" -c "CREATE ROLE test_user WITH LOGIN PASSWORD 'TEST_PASSWORD';"
85+
86+
- name: postgresql_ping - check ping of the database by a existent user
87+
become_user: "{{ pg_user }}"
88+
become: true
89+
environment:
90+
PGUSER: 'test_user'
91+
ignore_errors: true
92+
postgresql_ping:
93+
db: "{{ db_default }}"
94+
login_password: "TEST_PASSWORD"
95+
register: result
96+
97+
- assert:
98+
that:
99+
- result.is_available == true
100+
- result.server_version != {}
101+
- result.server_version.raw is search('PostgreSQL')
102+
- result.server_version.major != ''
103+
- result.server_version.minor != ''
104+
- result is not changed
105+
49106
- name: postgresql_ping - ping DB with SSL
50107
become_user: "{{ pg_user }}"
51108
become: true

tests/unit/plugins/module_utils/test_postgres.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from __future__ import (absolute_import, division, print_function)
55
__metaclass__ = type
6+
from os import environ
67

78
import pytest
89

@@ -65,6 +66,15 @@ def test_postgres_common_argument_spec(self):
6566
)
6667
assert pg.postgres_common_argument_spec() == expected_dict
6768

69+
# Setting new values for checking environment variables
70+
expected_dict['port']['default'] = 5435
71+
expected_dict['login_user']['default'] = 'test_user'
72+
73+
# Setting environment variables
74+
environ['PGUSER'] = 'test_user'
75+
environ['PGPORT'] = '5435'
76+
assert pg.postgres_common_argument_spec() == expected_dict
77+
6878

6979
@pytest.fixture
7080
def m_psycopg2():

0 commit comments

Comments
 (0)