@@ -126,24 +126,16 @@ def test_backup_via_unprivileged_user(self):
126
126
node .safe_psql (
127
127
"postgres" ,
128
128
"GRANT EXECUTE ON FUNCTION pg_stop_backup(boolean) TO backup" )
129
- elif self .get_vestion (node ) < self .version_to_num ('15.0' ):
129
+ elif self .get_version (node ) < self .version_to_num ('15.0' ):
130
130
node .safe_psql (
131
131
"postgres" ,
132
- "GRANT EXECUTE ON FUNCTION "
133
- "pg_stop_backup(boolean, boolean) TO backup" )
134
- # Do this for ptrack backups
135
- node .safe_psql (
136
- "postgres" ,
137
- "GRANT EXECUTE ON FUNCTION pg_stop_backup() TO backup" )
132
+ "GRANT EXECUTE ON FUNCTION pg_stop_backup() TO backup; "
133
+ "GRANT EXECUTE ON FUNCTION pg_stop_backup(boolean, boolean) TO backup;" )
138
134
else :
139
135
node .safe_psql (
140
136
"postgres" ,
141
- "GRANT EXECUTE ON FUNCTION "
142
- "pg_backup_stop(boolean) TO backup" )
143
- # Do this for ptrack backups
144
- node .safe_psql (
145
- "postgres" ,
146
- "GRANT EXECUTE ON FUNCTION pg_backup_stop() TO backup" )
137
+ "GRANT EXECUTE ON FUNCTION pg_backup_stop() TO backup; "
138
+ "GRANT EXECUTE ON FUNCTION pg_backup_stop(boolean) TO backup;" )
147
139
148
140
self .backup_node (
149
141
backup_dir , 'node' , node , options = ['-U' , 'backup' ])
@@ -193,7 +185,10 @@ def setUpClass(cls):
193
185
set_replication = True ,
194
186
initdb_params = ['--data-checksums' , '--auth-host=md5' ]
195
187
)
196
- modify_pg_hba (cls .node )
188
+
189
+ cls .username = cls .pb .get_username ()
190
+
191
+ cls .modify_pg_hba (cls .node )
197
192
198
193
cls .pb .init_pb (cls .backup_dir )
199
194
cls .pb .add_instance (cls .backup_dir , cls .node .name , cls .node )
@@ -203,7 +198,7 @@ def setUpClass(cls):
203
198
except StartNodeException :
204
199
raise unittest .skip ("Node hasn't started" )
205
200
206
- if cls .pb .get_version (cls .node ) < 150000 :
201
+ if cls .pb .get_version (cls .node ) < 100000 :
207
202
cls .node .safe_psql (
208
203
"postgres" ,
209
204
"CREATE ROLE backup WITH LOGIN PASSWORD 'password'; "
@@ -218,6 +213,21 @@ def setUpClass(cls):
218
213
"GRANT EXECUTE ON FUNCTION txid_current() TO backup; "
219
214
"GRANT EXECUTE ON FUNCTION txid_current_snapshot() TO backup; "
220
215
"GRANT EXECUTE ON FUNCTION txid_snapshot_xmax(txid_snapshot) TO backup;" )
216
+ elif cls .pb .get_version (cls .node ) < 150000 :
217
+ cls .node .safe_psql (
218
+ "postgres" ,
219
+ "CREATE ROLE backup WITH LOGIN PASSWORD 'password'; "
220
+ "GRANT USAGE ON SCHEMA pg_catalog TO backup; "
221
+ "GRANT EXECUTE ON FUNCTION current_setting(text) TO backup; "
222
+ "GRANT EXECUTE ON FUNCTION pg_is_in_recovery() TO backup; "
223
+ "GRANT EXECUTE ON FUNCTION pg_start_backup(text, boolean, boolean) TO backup; "
224
+ "GRANT EXECUTE ON FUNCTION pg_stop_backup() TO backup; "
225
+ "GRANT EXECUTE ON FUNCTION pg_stop_backup(boolean, boolean) TO backup; "
226
+ "GRANT EXECUTE ON FUNCTION pg_create_restore_point(text) TO backup; "
227
+ "GRANT EXECUTE ON FUNCTION pg_switch_wal() TO backup; "
228
+ "GRANT EXECUTE ON FUNCTION txid_current() TO backup; "
229
+ "GRANT EXECUTE ON FUNCTION txid_current_snapshot() TO backup; "
230
+ "GRANT EXECUTE ON FUNCTION txid_snapshot_xmax(txid_snapshot) TO backup;" )
221
231
else :
222
232
cls .node .safe_psql (
223
233
"postgres" ,
@@ -229,7 +239,7 @@ def setUpClass(cls):
229
239
"GRANT EXECUTE ON FUNCTION pg_backup_stop() TO backup; "
230
240
"GRANT EXECUTE ON FUNCTION pg_backup_stop(boolean) TO backup; "
231
241
"GRANT EXECUTE ON FUNCTION pg_create_restore_point(text) TO backup; "
232
- "GRANT EXECUTE ON FUNCTION pg_switch_xlog () TO backup; "
242
+ "GRANT EXECUTE ON FUNCTION pg_switch_wal () TO backup; "
233
243
"GRANT EXECUTE ON FUNCTION txid_current() TO backup; "
234
244
"GRANT EXECUTE ON FUNCTION txid_current_snapshot() TO backup; "
235
245
"GRANT EXECUTE ON FUNCTION txid_snapshot_xmax(txid_snapshot) TO backup;" )
@@ -244,12 +254,13 @@ def tearDownClass(cls):
244
254
245
255
@unittest .skipIf (skip_test , "Module pexpect isn't installed. You need to install it." )
246
256
def setUp (self ):
247
- self .cmd = ['backup' ,
257
+ self .pb_cmd = ['backup' ,
248
258
'-B' , self .backup_dir ,
249
259
'--instance' , self .node .name ,
250
260
'-h' , '127.0.0.1' ,
251
261
'-p' , str (self .node .port ),
252
262
'-U' , 'backup' ,
263
+ '-d' , 'postgres' ,
253
264
'-b' , 'FULL'
254
265
]
255
266
@@ -269,136 +280,106 @@ def test_empty_password(self):
269
280
""" Test case: PGPB_AUTH03 - zero password length """
270
281
try :
271
282
self .assertIn ("ERROR: no password supplied" ,
272
- str (run_pb_with_auth ([self .pb .probackup_path ] + self .cmd , '\0 \r \n ' ))
273
- )
283
+ self .run_pb_with_auth ('\0 \r \n ' ))
274
284
except (TIMEOUT , ExceptionPexpect ) as e :
275
285
self .fail (e .value )
276
286
277
287
def test_wrong_password (self ):
278
288
""" Test case: PGPB_AUTH04 - incorrect password """
279
- try :
280
- self .assertIn ("password authentication failed" ,
281
- str (run_pb_with_auth ([self .pb .probackup_path ] + self .cmd , 'wrong_password\r \n ' ))
282
- )
283
- except (TIMEOUT , ExceptionPexpect ) as e :
284
- self .fail (e .value )
289
+ self .assertIn ("password authentication failed" ,
290
+ self .run_pb_with_auth ('wrong_password\r \n ' ))
285
291
286
292
def test_right_password (self ):
287
293
""" Test case: PGPB_AUTH01 - correct password """
288
- try :
289
- self .assertIn ("completed" ,
290
- str (run_pb_with_auth ([self .pb .probackup_path ] + self .cmd , 'password\r \n ' ))
291
- )
292
- except (TIMEOUT , ExceptionPexpect ) as e :
293
- self .fail (e .value )
294
+ self .assertIn ("completed" ,
295
+ self .run_pb_with_auth ('password\r \n ' ))
294
296
295
297
def test_right_password_and_wrong_pgpass (self ):
296
298
""" Test case: PGPB_AUTH05 - correct password and incorrect .pgpass (-W)"""
297
299
line = ":" .join (['127.0.0.1' , str (self .node .port ), 'postgres' , 'backup' , 'wrong_password' ])
298
- create_pgpass (self .pgpass_file , line )
299
- try :
300
- self .assertIn ("completed" ,
301
- str (run_pb_with_auth ([self .pb .probackup_path ] + self .cmd + ['-W' ], 'password\r \n ' ))
302
- )
303
- except (TIMEOUT , ExceptionPexpect ) as e :
304
- self .fail (e .value )
300
+ self .create_pgpass (self .pgpass_file , line )
301
+ self .assertIn ("completed" ,
302
+ self .run_pb_with_auth ('password\r \n ' , add_args = ["-W" ]))
305
303
306
304
def test_ctrl_c_event (self ):
307
305
""" Test case: PGPB_AUTH02 - send interrupt signal """
308
306
try :
309
- run_pb_with_auth ([ self .pb . probackup_path ] + self . cmd , kill = True )
307
+ self .run_pb_with_auth ( kill = True )
310
308
except TIMEOUT :
311
309
self .fail ("Error: CTRL+C event ignored" )
312
310
313
311
def test_pgpassfile_env (self ):
314
312
""" Test case: PGPB_AUTH06 - set environment var PGPASSFILE """
315
313
path = os .path .join (self .pb .tmp_path , module_name , 'pgpass.conf' )
316
314
line = ":" .join (['127.0.0.1' , str (self .node .port ), 'postgres' , 'backup' , 'password' ])
317
- create_pgpass (path , line )
315
+ self . create_pgpass (path , line )
318
316
self .pb .test_env ["PGPASSFILE" ] = path
319
- try :
320
- self .assertEqual (
321
- "OK" ,
322
- self .pb .show_pb (self .backup_dir , self .node .name , self .pb .run_pb (self .cmd + ['-w' ]))["status" ],
323
- "ERROR: Full backup status is not valid."
324
- )
325
- except ProbackupException as e :
326
- self .fail (e )
317
+ self .assertEqual (
318
+ "OK" ,
319
+ self .pb .show_pb (self .backup_dir , self .node .name , self .pb .run_pb (self .pb_cmd + ['-w' ]))["status" ],
320
+ "ERROR: Full backup status is not valid."
321
+ )
327
322
328
323
def test_pgpass (self ):
329
324
""" Test case: PGPB_AUTH07 - Create file .pgpass in home dir. """
330
325
line = ":" .join (['127.0.0.1' , str (self .node .port ), 'postgres' , 'backup' , 'password' ])
331
- create_pgpass (self .pgpass_file , line )
332
- try :
333
- self .assertEqual (
334
- "OK" ,
335
- self .pb .show_pb (self .backup_dir , self .node .name , self .pb .run_pb (self .cmd + ['-w' ]))["status" ],
336
- "ERROR: Full backup status is not valid."
337
- )
338
- except ProbackupException as e :
339
- self .fail (e )
326
+ self .create_pgpass (self .pgpass_file , line )
327
+ self .assertEqual (
328
+ "OK" ,
329
+ self .pb .show_pb (self .backup_dir , self .node .name , self .pb .run_pb (self .pb_cmd + ['-w' ]))["status" ],
330
+ "ERROR: Full backup status is not valid."
331
+ )
340
332
341
333
def test_pgpassword (self ):
342
334
""" Test case: PGPB_AUTH08 - set environment var PGPASSWORD """
343
335
self .pb .test_env ["PGPASSWORD" ] = "password"
344
- try :
345
- self .assertEqual (
346
- "OK" ,
347
- self .pb .show_pb (self .backup_dir , self .node .name , self .pb .run_pb (self .cmd + ['-w' ]))["status" ],
348
- "ERROR: Full backup status is not valid."
349
- )
350
- except ProbackupException as e :
351
- self .fail (e )
336
+ self .assertEqual (
337
+ "OK" ,
338
+ self .pb .show_pb (self .backup_dir , self .node .name , self .pb .run_pb (self .pb_cmd + ['-w' ]))["status" ],
339
+ "ERROR: Full backup status is not valid."
340
+ )
352
341
353
342
def test_pgpassword_and_wrong_pgpass (self ):
354
343
""" Test case: PGPB_AUTH09 - Check priority between PGPASSWORD and .pgpass file"""
355
344
line = ":" .join (['127.0.0.1' , str (self .node .port ), 'postgres' , 'backup' , 'wrong_password' ])
356
- create_pgpass (self .pgpass_file , line )
345
+ self . create_pgpass (self .pgpass_file , line )
357
346
self .pb .test_env ["PGPASSWORD" ] = "password"
358
- try :
359
- self .assertEqual (
360
- "OK" ,
361
- self .pb .show_pb (self .backup_dir , self .node .name , self .pb .run_pb (self .cmd + ['-w' ]))["status" ],
362
- "ERROR: Full backup status is not valid."
363
- )
364
- except ProbackupException as e :
365
- self .fail (e )
366
-
347
+ self .assertEqual (
348
+ "OK" ,
349
+ self .pb .show_pb (self .backup_dir , self .node .name , self .pb .run_pb (self .pb_cmd + ['-w' ]))["status" ],
350
+ "ERROR: Full backup status is not valid."
351
+ )
367
352
368
- def run_pb_with_auth (cmd , password = None , kill = False ):
369
- try :
370
- with spawn (" " .join (cmd ), encoding = 'utf-8' , timeout = 10 ) as probackup :
353
+ def run_pb_with_auth (self , password = None , add_args = [], kill = False ):
354
+ with spawn (self .pb .probackup_path , self .pb_cmd + add_args , encoding = 'utf-8' , timeout = 10 ) as probackup :
371
355
result = probackup .expect (u"Password for user .*:" , 5 )
372
356
if kill :
373
357
probackup .kill (signal .SIGINT )
374
358
elif result == 0 :
375
359
probackup .sendline (password )
376
360
probackup .expect (EOF )
377
- return probackup .before
361
+ return str ( probackup .before )
378
362
else :
379
363
raise ExceptionPexpect ("Other pexpect errors." )
380
- except TIMEOUT :
381
- raise TIMEOUT ("Timeout error." )
382
- except ExceptionPexpect :
383
- raise ExceptionPexpect ("Pexpect error." )
384
-
385
-
386
- def modify_pg_hba (node ):
387
- """
388
- Description:
389
- Add trust authentication for user postgres. Need for add new role and set grant.
390
- :param node:
391
- :return None:
392
- """
393
- hba_conf = os .path .join (node .data_dir , "pg_hba.conf" )
394
- with open (hba_conf , 'r+' ) as fio :
395
- data = fio .read ()
396
- fio .seek (0 )
397
- fio .write ('host\t all\t postgres\t 127.0.0.1/0\t trust\n ' + data )
398
-
399
-
400
- def create_pgpass (path , line ):
401
- with open (path , 'w' ) as passfile :
402
- # host:port:db:username:password
403
- passfile .write (line )
404
- os .chmod (path , 0o600 )
364
+
365
+
366
+ @classmethod
367
+ def modify_pg_hba (cls , node ):
368
+ """
369
+ Description:
370
+ Add trust authentication for user postgres. Need for add new role and set grant.
371
+ :param node:
372
+ :return None:
373
+ """
374
+ hba_conf = os .path .join (node .data_dir , "pg_hba.conf" )
375
+ with open (hba_conf , 'r+' ) as fio :
376
+ data = fio .read ()
377
+ fio .seek (0 )
378
+ fio .write ('host\t all\t %s\t 127.0.0.1/0\t trust\n %s' % (cls .username , data ))
379
+
380
+
381
+ def create_pgpass (self , path , line ):
382
+ with open (path , 'w' ) as passfile :
383
+ # host:port:db:username:password
384
+ passfile .write (line )
385
+ os .chmod (path , 0o600 )
0 commit comments