4
4
import json
5
5
import time
6
6
7
+ import psycopg2
7
8
import pytest
8
9
from pytest_operator .plugin import OpsTest
9
10
12
13
CHARM_SERIES ,
13
14
METADATA ,
14
15
check_patroni ,
16
+ db_connect ,
15
17
get_leader_unit ,
16
18
get_password ,
19
+ get_primary ,
20
+ get_unit_address ,
17
21
restart_patroni ,
18
22
set_password ,
19
23
)
@@ -46,6 +50,9 @@ async def test_password_rotation(ops_test: OpsTest):
46
50
any_unit_name = ops_test .model .applications [APP_NAME ].units [0 ].name
47
51
superuser_password = await get_password (ops_test , any_unit_name )
48
52
replication_password = await get_password (ops_test , any_unit_name , "replication" )
53
+ monitoring_password = await get_password (ops_test , any_unit_name , "monitoring" )
54
+ backup_password = await get_password (ops_test , any_unit_name , "backup" )
55
+ rewind_password = await get_password (ops_test , any_unit_name , "rewind" )
49
56
50
57
# Get the leader unit name (because passwords can only be set through it).
51
58
leader = None
@@ -67,11 +74,40 @@ async def test_password_rotation(ops_test: OpsTest):
67
74
assert "password" in result .keys ()
68
75
await ops_test .model .wait_for_idle (apps = [APP_NAME ], status = "active" , timeout = 1000 )
69
76
70
- new_superuser_password = await get_password (ops_test , any_unit_name )
77
+ # For monitoring, generate a specific password and pass it to the action.
78
+ new_monitoring_password = "test-password"
79
+ result = await set_password (
80
+ ops_test , unit_name = leader , username = "monitoring" , password = new_monitoring_password
81
+ )
82
+ assert "password" in result .keys ()
83
+ await ops_test .model .wait_for_idle (apps = [APP_NAME ], status = "active" , timeout = 1000 )
84
+
85
+ # For backup, generate a specific password and pass it to the action.
86
+ new_backup_password = "test-password"
87
+ result = await set_password (
88
+ ops_test , unit_name = leader , username = "backup" , password = new_backup_password
89
+ )
90
+ assert "password" in result .keys ()
91
+ await ops_test .model .wait_for_idle (apps = [APP_NAME ], status = "active" , timeout = 1000 )
71
92
93
+ # For rewind, generate a specific password and pass it to the action.
94
+ new_rewind_password = "test-password"
95
+ result = await set_password (
96
+ ops_test , unit_name = leader , username = "rewind" , password = new_rewind_password
97
+ )
98
+ assert "password" in result .keys ()
99
+ await ops_test .model .wait_for_idle (apps = [APP_NAME ], status = "active" , timeout = 1000 )
100
+
101
+ new_superuser_password = await get_password (ops_test , any_unit_name )
72
102
assert superuser_password != new_superuser_password
73
103
assert new_replication_password == await get_password (ops_test , any_unit_name , "replication" )
74
104
assert replication_password != new_replication_password
105
+ assert new_monitoring_password == await get_password (ops_test , any_unit_name , "monitoring" )
106
+ assert monitoring_password != new_monitoring_password
107
+ assert new_backup_password == await get_password (ops_test , any_unit_name , "backup" )
108
+ assert backup_password != new_backup_password
109
+ assert new_rewind_password == await get_password (ops_test , any_unit_name , "rewind" )
110
+ assert rewind_password != new_rewind_password
75
111
76
112
# Restart Patroni on any non-leader unit and check that
77
113
# Patroni and PostgreSQL continue to work.
@@ -122,6 +158,16 @@ async def test_empty_password(ops_test: OpsTest) -> None:
122
158
assert password == "None"
123
159
124
160
161
+ @pytest .mark .group (1 )
162
+ async def test_db_connection_with_empty_password (ops_test : OpsTest ):
163
+ """Test that user can't connect with empty password."""
164
+ primary = await get_primary (ops_test , f"{ APP_NAME } /0" )
165
+ address = get_unit_address (ops_test , primary )
166
+ with pytest .raises (psycopg2 .Error ):
167
+ with db_connect (address , "" ) as connection :
168
+ connection .close ()
169
+
170
+
125
171
@pytest .mark .group (1 )
126
172
async def test_no_password_change_on_invalid_password (ops_test : OpsTest ) -> None :
127
173
"""Test that in general, there is no change when password validation fails."""
0 commit comments