@@ -288,36 +288,49 @@ def usage(self, callback=None, errback=None, **kwargs):
288288 zone = self .zone , callback = callback , errback = errback , ** kwargs
289289 )
290290
291- def export (self , callback = None , errback = None ):
291+ def export (self , callback = None , errback = None , timeout = 300 , poll_interval = 2 ):
292292 """
293293 Export zone as a BIND-compatible zone file.
294+
295+ This method initiates the export, polls the status until complete or failed,
296+ and downloads the zone file.
294297
295298 :param callback: optional callback
296299 :param errback: optional error callback
300+ :param int timeout: maximum time to wait for export completion in seconds (default: 300)
301+ :param int poll_interval: time between status checks in seconds (default: 2)
297302 :return: zone file content as string
303+ :raises ZoneException: if export fails or times out
298304 """
299- return self . _rest . export ( self . zone , callback = callback , errback = errback )
305+ import time
300306
301- def initiate_export (self , callback = None , errback = None ):
302- """
303- Initiate zone export job.
307+ # Initiate the export
308+ self ._rest .initiate_zonefile_export (self .zone )
304309
305- :param callback: optional callback
306- :param errback: optional error callback
307- :return: export status response
308- """
309- return self . _rest . initiate_export (
310- self . zone , callback = callback , errback = errback
311- )
310+ # Poll the status until complete or failed
311+ start_time = time . time ()
312+ while True :
313+ if time . time () - start_time > timeout :
314+ raise ZoneException (
315+ f"Zone export timed out after { timeout } seconds"
316+ )
312317
313- def export_status (self , callback = None , errback = None ):
314- """
315- Check zone export status.
318+ status_response = self ._rest .status_zonefile_export (self .zone )
319+ status = status_response .get ("status" )
316320
317- :param callback: optional callback
318- :param errback: optional error callback
319- :return: export status response
320- """
321- return self ._rest .export_status (
321+ if status == "COMPLETE" :
322+ break
323+ elif status == "FAILED" :
324+ error_msg = status_response .get ("message" , "Unknown error" )
325+ raise ZoneException (f"Zone export failed: { error_msg } " )
326+
327+ time .sleep (poll_interval )
328+
329+ # Download the zone file
330+ zone_file = self ._rest .get_zonefile_export (
322331 self .zone , callback = callback , errback = errback
323332 )
333+
334+ if callback :
335+ return callback (zone_file )
336+ return zone_file
0 commit comments