@@ -1883,3 +1883,157 @@ def test_parent_choosing_2(self):
18831883
18841884# Clean after yourself
18851885self .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 )