// Package libdns defines the core interfaces that should be implemented // by DNS provider clients. They are small and idiomatic Go interfaces with // well-defined semantics. // // All interface implementations must be safe for concurrent/parallel use. // For example, if AppendRecords() is called at the same time and two API // requests are made to the provider at the same time, the result of both // requests must be visible after they both complete; if the provider does // not synchronize the writing of the zone file and one request overwrites // the other, then the client implementation must take care to synchronize // on behalf of the incompetent provider. This synchronization need not be // global, for example: the scope of synchronization might only need to be // within the same zone, allowing multiple requests at once as long as all // of them are for different zones. (Exact logic depends on the provider.) package libdns import ( "context" "time" ) // RecordGetter can get records from a DNS zone. type RecordGetter interface { // GetRecords returns all the records in the DNS zone. // // Implementations must honor context cancellation and be safe for // concurrent use. GetRecords(ctx context.Context, zone string) ([]Record, error) } // RecordAppender can non-destructively add new records to a DNS zone. type RecordAppender interface { // AppendRecords creates the requested records in the given zone // and returns the populated records that were created. It never // changes existing records. // // Implementations must honor context cancellation and be safe for // concurrent use. AppendRecords(ctx context.Context, zone string, recs []Record) ([]Record, error) } // RecordSetter can set new or update existing records in a DNS zone. type RecordSetter interface { // SetRecords updates the zone so that the records described in the // input are reflected in the output. It may create or overwrite // records or -- depending on the record type -- delete records to // maintain parity with the input. No other records are affected. // It returns the records which were set. // // Records that have an ID associating it with a particular resource // on the provider will be directly replaced. If no ID is given, this // method may use what information is given to do lookups and will // ensure that only necessary changes are made to the zone. // // Implementations must honor context cancellation and be safe for // concurrent use. SetRecords(ctx context.Context, zone string, recs []Record) ([]Record, error) } // RecordDeleter can delete records from a DNS zone. type RecordDeleter interface { // DeleteRecords deletes the given records from the zone if they exist. // It returns the records that were deleted. // // Records that have an ID to associate it with a particular resource on // the provider will be directly deleted. If no ID is given, this method // may use what information is given to do lookups and delete only // matching records. // // Implementations must honor context cancellation and be safe for // concurrent use. DeleteRecords(ctx context.Context, zone string, recs []Record) ([]Record, error) } // Record is a generalized representation of a DNS record. type Record struct { // provider-specific metadata ID string // general record fields Type string Name string Value string TTL time.Duration }