@@ -302,6 +302,13 @@ def stop(self):
302302
303303 return self
304304
305+ def restart (self ):
306+ """ Restarts cluster """
307+ params = {"-D" : self .data_dir }
308+ self .pg_ctl ("restart" , params )
309+
310+ return self
311+
305312 def reload (self ):
306313 """Reloads config files"""
307314 params = {"-D" : self .data_dir }
@@ -321,7 +328,7 @@ def cleanup(self):
321328
322329 return self
323330
324- def psql (self , dbname , query ):
331+ def psql (self , dbname , query = None , filename = None ):
325332 """Executes a query by the psql
326333
327334 Returns a tuple (code, stdout, stderr) in which:
@@ -331,9 +338,16 @@ def psql(self, dbname, query):
331338 """
332339 psql = self .get_bin_path ("psql" )
333340 psql_params = [
334- psql , "-XAtq" , "-c" , query , "- p %s" % self .port , dbname
341+ psql , "-XAtq" , "-p %s" % self .port , dbname
335342 ]
336343
344+ if query :
345+ psql_params .extend (("-c" , query ))
346+ elif filename :
347+ psql_params .extend (("-f" , filename ))
348+ else :
349+ raise QueryException ('Query or filename must be provided' )
350+
337351 # start psql process
338352 process = subprocess .Popen (
339353 psql_params ,
@@ -356,6 +370,35 @@ def safe_psql(self, dbname, query):
356370 raise ClusterException ("psql failed:\n " + err )
357371 return out
358372
373+ def dump (self , dbname , filename ):
374+ """Invoke pg_dump and exports database to a file as an sql script"""
375+ path = self .base_dir + "/" + filename
376+ params = [
377+ self .get_bin_path ("pg_dump" ),
378+ "-p %s" % self .port ,
379+ "-f" , path ,
380+ dbname
381+ ]
382+
383+ with open (self .error_filename , "a" ) as file_err :
384+ ret = subprocess .call (params , stderr = file_err )
385+ if ret :
386+ raise ClusterException ("Dump creation failed" )
387+
388+ def restore (self , dbname , filename , node = None ):
389+ """ Restore database from dump file
390+
391+ dbname name of database we're restoring data to
392+ filename path to the dump file
393+ node the cluster node where the dump was taken from (if node
394+ wasn't specified then assume the same cluster)
395+ """
396+ if not node :
397+ node = self
398+
399+ path = node .base_dir + "/" + filename
400+ self .psql (dbname , filename = path )
401+
359402 def poll_query_until (self , dbname , query ):
360403 """Runs a query once a second until it returs True"""
361404 max_attemps = 60
0 commit comments