# # # class BaseSource(object): SUPPORTS_MULTIVALUE_PTR = False SUPPORTS_POOL_VALUE_STATUS = False SUPPORTS_ROOT_NS = False SUPPORTS_DYNAMIC_SUBNETS = False def __init__(self, id): self.id = id if not getattr(self, 'log', False): raise NotImplementedError( 'Abstract base class, log property missing' ) if not hasattr(self, 'SUPPORTS_GEO'): raise NotImplementedError( 'Abstract base class, SUPPORTS_GEO property missing' ) if not hasattr(self, 'SUPPORTS'): raise NotImplementedError( 'Abstract base class, SUPPORTS property missing' ) @property def SUPPORTS_DYNAMIC(self): return False def populate(self, zone, target=False, lenient=False): ''' Loads all records the provider knows about for the provided zone When `target` is True the populate call is being made to load the current state of the provider. When `lenient` is True the populate call may skip record validation and do a "best effort" load of data. That will allow through some common, but not best practices stuff that we otherwise would reject. E.g. no trailing . or missing escapes for ;. When target is True (loading current state) this method should return True if the zone exists or False if it does not. ''' raise NotImplementedError( 'Abstract base class, populate method missing' ) def supports(self, record): return record._type in self.SUPPORTS def __repr__(self): return self.__class__.__name__