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