@@ -1883,3 +1883,157 @@ def test_parent_choosing_2(self):
1883
1883
1884
1884
# Clean after yourself
1885
1885
self .del_test_dir (module_name , fname )
1886
+
1887
+ # @unittest.skip("skip")
1888
+ def test_backup_with_less_privileges_role (self ):
1889
+ """
1890
+ check permissions correctness from documentation:
1891
+ https://github.com/postgrespro/pg_probackup/blob/master/Documentation.md#configuring-the-database-cluster
1892
+ """
1893
+ fname = self .id ().split ('.' )[3 ]
1894
+ backup_dir = os .path .join (self .tmp_path , module_name , fname , 'backup' )
1895
+ node = self .make_simple_node (
1896
+ base_dir = os .path .join (module_name , fname , 'node' ),
1897
+ set_replication = True ,
1898
+ initdb_params = ['--data-checksums' ],
1899
+ pg_options = {
1900
+ 'archive_timeout' : '30s' ,
1901
+ 'checkpoint_timeout' : '30s' })
1902
+
1903
+ if self .ptrack :
1904
+ node .append_conf ('postgresql.auto.conf' , 'ptrack_enable = on' )
1905
+
1906
+ self .init_pb (backup_dir )
1907
+ self .add_instance (backup_dir , 'node' , node )
1908
+ self .set_archiving (backup_dir , 'node' , node )
1909
+ node .slow_start ()
1910
+
1911
+ node .safe_psql (
1912
+ 'postgres' ,
1913
+ 'CREATE DATABASE backupdb' )
1914
+
1915
+ # PG 9.5
1916
+ if self .get_version (node ) < 90600 :
1917
+ node .safe_psql (
1918
+ 'backupdb' ,
1919
+ "BEGIN; "
1920
+ "CREATE ROLE backup WITH LOGIN; "
1921
+ "GRANT USAGE ON SCHEMA pg_catalog TO backup; "
1922
+ "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; "
1923
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; "
1924
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean) TO backup; "
1925
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup() TO backup; "
1926
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup; "
1927
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; "
1928
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup; "
1929
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
1930
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; "
1931
+ "COMMIT;"
1932
+ )
1933
+ # PG 9.6
1934
+ elif self .get_version (node ) > 90600 and self .get_version (node ) < 100000 :
1935
+ node .safe_psql (
1936
+ 'backupdb' ,
1937
+ "BEGIN; "
1938
+ "CREATE ROLE backup WITH LOGIN; "
1939
+ "GRANT USAGE ON SCHEMA pg_catalog TO backup; "
1940
+ "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; "
1941
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; "
1942
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup; "
1943
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean) TO backup; "
1944
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup; "
1945
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; "
1946
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; "
1947
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup; "
1948
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
1949
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; "
1950
+ "COMMIT;"
1951
+ )
1952
+ # >= 10
1953
+ else :
1954
+ node .safe_psql (
1955
+ 'backupdb' ,
1956
+ "BEGIN; "
1957
+ "CREATE ROLE backup WITH LOGIN; "
1958
+ "GRANT USAGE ON SCHEMA pg_catalog TO backup; "
1959
+ "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; "
1960
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; "
1961
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup; "
1962
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) TO backup; "
1963
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup; "
1964
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; "
1965
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; "
1966
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup; "
1967
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
1968
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; "
1969
+ "COMMIT;"
1970
+ )
1971
+
1972
+ # enable STREAM backup
1973
+ node .safe_psql (
1974
+ 'backupdb' ,
1975
+ 'ALTER ROLE backup WITH REPLICATION;' )
1976
+
1977
+ # FULL backup
1978
+ self .backup_node (
1979
+ backup_dir , 'node' , node ,
1980
+ datname = 'backupdb' , options = ['--stream' , '-U' , 'backup' ])
1981
+ self .backup_node (
1982
+ backup_dir , 'node' , node ,
1983
+ datname = 'backupdb' , options = ['-U' , 'backup' ])
1984
+
1985
+ # PAGE
1986
+ self .backup_node (
1987
+ backup_dir , 'node' , node , backup_type = 'page' ,
1988
+ datname = 'backupdb' , options = ['-U' , 'backup' ])
1989
+ self .backup_node (
1990
+ backup_dir , 'node' , node , backup_type = 'page' , datname = 'backupdb' ,
1991
+ options = ['--stream' , '-U' , 'backup' ])
1992
+
1993
+ # DELTA
1994
+ self .backup_node (
1995
+ backup_dir , 'node' , node , backup_type = 'delta' ,
1996
+ datname = 'backupdb' , options = ['-U' , 'backup' ])
1997
+ self .backup_node (
1998
+ backup_dir , 'node' , node , backup_type = 'delta' ,
1999
+ datname = 'backupdb' , options = ['--stream' , '-U' , 'backup' ])
2000
+
2001
+ # Restore as replica
2002
+ replica = self .make_simple_node (
2003
+ base_dir = os .path .join (module_name , fname , 'replica' ))
2004
+ replica .cleanup ()
2005
+
2006
+ self .restore_node (backup_dir , 'node' , replica )
2007
+ self .set_replica (node , replica )
2008
+ self .add_instance (backup_dir , 'replica' , replica )
2009
+ self .set_archiving (backup_dir , 'replica' , replica , replica = True )
2010
+
2011
+ replica .slow_start (replica = True )
2012
+
2013
+ # FULL backup from replica
2014
+ self .backup_node (
2015
+ backup_dir , 'replica' , replica ,
2016
+ datname = 'backupdb' , options = ['--stream' , '-U' , 'backup' ])
2017
+
2018
+ self .backup_node (
2019
+ backup_dir , 'replica' , replica , datname = 'backupdb' ,
2020
+ options = ['-U' , 'backup' , '--log-level-file=verbose' ])
2021
+
2022
+ # PAGE
2023
+ self .backup_node (
2024
+ backup_dir , 'replica' , replica , backup_type = 'page' ,
2025
+ datname = 'backupdb' , options = ['-U' , 'backup' ])
2026
+ self .backup_node (
2027
+ backup_dir , 'replica' , replica , backup_type = 'page' ,
2028
+ datname = 'backupdb' , options = ['--stream' , '-U' , 'backup' ])
2029
+
2030
+ # DELTA
2031
+ self .backup_node (
2032
+ backup_dir , 'replica' , replica , backup_type = 'delta' ,
2033
+ datname = 'backupdb' , options = ['-U' , 'backup' ])
2034
+ self .backup_node (
2035
+ backup_dir , 'replica' , replica , backup_type = 'delta' ,
2036
+ datname = 'backupdb' , options = ['--stream' , '-U' , 'backup' ])
2037
+
2038
+ # Clean after yourself
2039
+ self .del_test_dir (module_name , fname )
0 commit comments