wrapper.go raw

   1  package iijdpf
   2  
   3  import (
   4  	"context"
   5  	"errors"
   6  	"fmt"
   7  
   8  	dpfzones "github.com/mimuret/golang-iij-dpf/pkg/apis/dpf/v1/zones"
   9  	dpfapiutils "github.com/mimuret/golang-iij-dpf/pkg/apiutils"
  10  	dpftypes "github.com/mimuret/golang-iij-dpf/pkg/types"
  11  )
  12  
  13  func (d *DNSProvider) addTxtRecord(ctx context.Context, zoneID, fqdn, rdata string) error {
  14  	r, err := dpfapiutils.GetRecordFromZoneID(ctx, d.client, zoneID, fqdn, dpfzones.TypeTXT)
  15  	if err != nil && !errors.Is(err, dpfapiutils.ErrRecordNotFound) {
  16  		return err
  17  	}
  18  
  19  	if r != nil {
  20  		r.RData = append(r.RData, dpfzones.RecordRDATA{Value: rdata})
  21  
  22  		_, _, err = dpfapiutils.SyncUpdate(ctx, d.client, r, nil)
  23  		if err != nil {
  24  			return fmt.Errorf("failed to update record: %w", err)
  25  		}
  26  
  27  		return nil
  28  	}
  29  
  30  	record := &dpfzones.Record{
  31  		AttributeMeta: dpfzones.AttributeMeta{ZoneID: zoneID},
  32  		Name:          fqdn,
  33  		TTL:           dpftypes.NullablePositiveInt32(d.config.TTL),
  34  		RRType:        dpfzones.TypeTXT,
  35  		RData:         dpfzones.RecordRDATASlice{dpfzones.RecordRDATA{Value: rdata}},
  36  		Description:   "ACME",
  37  	}
  38  
  39  	_, _, err = dpfapiutils.SyncCreate(ctx, d.client, record, nil)
  40  	if err != nil {
  41  		return fmt.Errorf("failed to create record: %w", err)
  42  	}
  43  
  44  	return nil
  45  }
  46  
  47  func (d *DNSProvider) deleteTxtRecord(ctx context.Context, zoneID, fqdn, rdata string) error {
  48  	r, err := dpfapiutils.GetRecordFromZoneID(ctx, d.client, zoneID, fqdn, dpfzones.TypeTXT)
  49  	if err != nil {
  50  		if errors.Is(err, dpfapiutils.ErrRecordNotFound) {
  51  			// empty target rrset
  52  			return nil
  53  		}
  54  
  55  		return err
  56  	}
  57  
  58  	if len(r.RData) == 1 {
  59  		// delete rrset
  60  		_, _, err = dpfapiutils.SyncDelete(ctx, d.client, r)
  61  		if err != nil {
  62  			return fmt.Errorf("failed to delete record: %w", err)
  63  		}
  64  
  65  		return nil
  66  	}
  67  
  68  	// delete rdata
  69  	rdataSlice := dpfzones.RecordRDATASlice{}
  70  
  71  	for _, v := range r.RData {
  72  		if v.Value != rdata {
  73  			rdataSlice = append(rdataSlice, v)
  74  		}
  75  	}
  76  
  77  	r.RData = rdataSlice
  78  
  79  	_, _, err = dpfapiutils.SyncUpdate(ctx, d.client, r, nil)
  80  	if err != nil {
  81  		return fmt.Errorf("failed to update record: %w", err)
  82  	}
  83  
  84  	return nil
  85  }
  86  
  87  func (d *DNSProvider) commit(ctx context.Context, zoneID string) error {
  88  	apply := &dpfzones.ZoneApply{
  89  		AttributeMeta: dpfzones.AttributeMeta{ZoneID: zoneID},
  90  		Description:   "ACME Processing",
  91  	}
  92  
  93  	_, _, err := dpfapiutils.SyncApply(ctx, d.client, apply, nil)
  94  	if err != nil {
  95  		return fmt.Errorf("failed to apply zone: %w", err)
  96  	}
  97  
  98  	return nil
  99  }
 100