mirror of
https://github.com/kubernetes-sigs/external-dns.git
synced 2025-08-07 01:56:57 +02:00
Merge pull request #4346 from khuedoan/az-private-dns-zone-name-filter
feat(azure): add zone name filter for Azure Private DNS
This commit is contained in:
commit
c506a20de6
@ -430,7 +430,13 @@ spec:
|
|||||||
pathType: Prefix
|
pathType: Prefix
|
||||||
```
|
```
|
||||||
|
|
||||||
When using ExternalDNS with ingress objects it will automatically create DNS records based on host names specified in ingress objects that match the domain-filter argument in the externaldns deployment manifest. When those host names are removed or renamed the corresponding DNS records are also altered.
|
When you use ExternalDNS with Ingress resources, it automatically creates DNS records based on the hostnames listed in those Ingress objects.
|
||||||
|
Those hostnames must match the filters that you defined (if any):
|
||||||
|
|
||||||
|
- By default, `--domain-filter` filters Azure Private DNS zone.
|
||||||
|
- If you use `--domain-filter` together with `--zone-name-filter`, the behavior changes: `--domain-filter` then filters Ingress domains, not the Azure Private DNS zone name.
|
||||||
|
|
||||||
|
When those hostnames are removed or renamed the corresponding DNS records are also altered.
|
||||||
|
|
||||||
Create the deployment, service and ingress object:
|
Create the deployment, service and ingress object:
|
||||||
|
|
||||||
|
@ -737,7 +737,13 @@ spec:
|
|||||||
number: 80
|
number: 80
|
||||||
```
|
```
|
||||||
|
|
||||||
When using ExternalDNS with `ingress` objects it will automatically create DNS records based on host names specified in ingress objects that match the domain-filter argument in the external-dns deployment manifest. When those host names are removed or renamed the corresponding DNS records are also altered.
|
When you use ExternalDNS with Ingress resources, it automatically creates DNS records based on the hostnames listed in those Ingress objects.
|
||||||
|
Those hostnames must match the filters that you defined (if any):
|
||||||
|
|
||||||
|
- By default, `--domain-filter` filters Azure DNS zone.
|
||||||
|
- If you use `--domain-filter` together with `--zone-name-filter`, the behavior changes: `--domain-filter` then filters Ingress domains, not the Azure DNS zone name.
|
||||||
|
|
||||||
|
When those hostnames are removed or renamed the corresponding DNS records are also altered.
|
||||||
|
|
||||||
Create the deployment, service and ingress object:
|
Create the deployment, service and ingress object:
|
||||||
|
|
||||||
|
2
main.go
2
main.go
@ -255,7 +255,7 @@ func main() {
|
|||||||
case "azure-dns", "azure":
|
case "azure-dns", "azure":
|
||||||
p, err = azure.NewAzureProvider(cfg.AzureConfigFile, domainFilter, zoneNameFilter, zoneIDFilter, cfg.AzureSubscriptionID, cfg.AzureResourceGroup, cfg.AzureUserAssignedIdentityClientID, cfg.AzureActiveDirectoryAuthorityHost, cfg.DryRun)
|
p, err = azure.NewAzureProvider(cfg.AzureConfigFile, domainFilter, zoneNameFilter, zoneIDFilter, cfg.AzureSubscriptionID, cfg.AzureResourceGroup, cfg.AzureUserAssignedIdentityClientID, cfg.AzureActiveDirectoryAuthorityHost, cfg.DryRun)
|
||||||
case "azure-private-dns":
|
case "azure-private-dns":
|
||||||
p, err = azure.NewAzurePrivateDNSProvider(cfg.AzureConfigFile, domainFilter, zoneIDFilter, cfg.AzureSubscriptionID, cfg.AzureResourceGroup, cfg.AzureUserAssignedIdentityClientID, cfg.AzureActiveDirectoryAuthorityHost, cfg.DryRun)
|
p, err = azure.NewAzurePrivateDNSProvider(cfg.AzureConfigFile, domainFilter, zoneNameFilter, zoneIDFilter, cfg.AzureSubscriptionID, cfg.AzureResourceGroup, cfg.AzureUserAssignedIdentityClientID, cfg.AzureActiveDirectoryAuthorityHost, cfg.DryRun)
|
||||||
case "bluecat":
|
case "bluecat":
|
||||||
p, err = bluecat.NewBluecatProvider(cfg.BluecatConfigFile, cfg.BluecatDNSConfiguration, cfg.BluecatDNSServerName, cfg.BluecatDNSDeployType, cfg.BluecatDNSView, cfg.BluecatGatewayHost, cfg.BluecatRootZone, cfg.TXTPrefix, cfg.TXTSuffix, domainFilter, zoneIDFilter, cfg.DryRun, cfg.BluecatSkipTLSVerify)
|
p, err = bluecat.NewBluecatProvider(cfg.BluecatConfigFile, cfg.BluecatDNSConfiguration, cfg.BluecatDNSServerName, cfg.BluecatDNSDeployType, cfg.BluecatDNSView, cfg.BluecatGatewayHost, cfg.BluecatRootZone, cfg.TXTPrefix, cfg.TXTSuffix, domainFilter, zoneIDFilter, cfg.DryRun, cfg.BluecatSkipTLSVerify)
|
||||||
case "vinyldns":
|
case "vinyldns":
|
||||||
|
@ -48,6 +48,7 @@ type PrivateRecordSetsClient interface {
|
|||||||
type AzurePrivateDNSProvider struct {
|
type AzurePrivateDNSProvider struct {
|
||||||
provider.BaseProvider
|
provider.BaseProvider
|
||||||
domainFilter endpoint.DomainFilter
|
domainFilter endpoint.DomainFilter
|
||||||
|
zoneNameFilter endpoint.DomainFilter
|
||||||
zoneIDFilter provider.ZoneIDFilter
|
zoneIDFilter provider.ZoneIDFilter
|
||||||
dryRun bool
|
dryRun bool
|
||||||
resourceGroup string
|
resourceGroup string
|
||||||
@ -60,7 +61,7 @@ type AzurePrivateDNSProvider struct {
|
|||||||
// NewAzurePrivateDNSProvider creates a new Azure Private DNS provider.
|
// NewAzurePrivateDNSProvider creates a new Azure Private DNS provider.
|
||||||
//
|
//
|
||||||
// Returns the provider or an error if a provider could not be created.
|
// Returns the provider or an error if a provider could not be created.
|
||||||
func NewAzurePrivateDNSProvider(configFile string, domainFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, subscriptionID string, resourceGroup string, userAssignedIdentityClientID string, activeDirectoryAuthorityHost string, dryRun bool) (*AzurePrivateDNSProvider, error) {
|
func NewAzurePrivateDNSProvider(configFile string, domainFilter endpoint.DomainFilter, zoneNameFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, subscriptionID string, resourceGroup string, userAssignedIdentityClientID string, activeDirectoryAuthorityHost string, dryRun bool) (*AzurePrivateDNSProvider, error) {
|
||||||
cfg, err := getConfig(configFile, subscriptionID, resourceGroup, userAssignedIdentityClientID, activeDirectoryAuthorityHost)
|
cfg, err := getConfig(configFile, subscriptionID, resourceGroup, userAssignedIdentityClientID, activeDirectoryAuthorityHost)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to read Azure config file '%s': %v", configFile, err)
|
return nil, fmt.Errorf("failed to read Azure config file '%s': %v", configFile, err)
|
||||||
@ -80,6 +81,7 @@ func NewAzurePrivateDNSProvider(configFile string, domainFilter endpoint.DomainF
|
|||||||
}
|
}
|
||||||
return &AzurePrivateDNSProvider{
|
return &AzurePrivateDNSProvider{
|
||||||
domainFilter: domainFilter,
|
domainFilter: domainFilter,
|
||||||
|
zoneNameFilter: zoneNameFilter,
|
||||||
zoneIDFilter: zoneIDFilter,
|
zoneIDFilter: zoneIDFilter,
|
||||||
dryRun: dryRun,
|
dryRun: dryRun,
|
||||||
resourceGroup: cfg.ResourceGroup,
|
resourceGroup: cfg.ResourceGroup,
|
||||||
@ -124,6 +126,10 @@ func (p *AzurePrivateDNSProvider) Records(ctx context.Context) (endpoints []*end
|
|||||||
}
|
}
|
||||||
name = formatAzureDNSName(*recordSet.Name, *zone.Name)
|
name = formatAzureDNSName(*recordSet.Name, *zone.Name)
|
||||||
|
|
||||||
|
if len(p.zoneNameFilter.Filters) > 0 && !p.domainFilter.Match(name) {
|
||||||
|
log.Debugf("Skipping return of record %s because it was filtered out by the specified --domain-filter", name)
|
||||||
|
continue
|
||||||
|
}
|
||||||
targets := extractAzurePrivateDNSTargets(recordSet)
|
targets := extractAzurePrivateDNSTargets(recordSet)
|
||||||
if len(targets) == 0 {
|
if len(targets) == 0 {
|
||||||
log.Debugf("Failed to extract targets for '%s' with type '%s'.", name, recordType)
|
log.Debugf("Failed to extract targets for '%s' with type '%s'.", name, recordType)
|
||||||
@ -185,6 +191,9 @@ func (p *AzurePrivateDNSProvider) zones(ctx context.Context) ([]privatedns.Priva
|
|||||||
|
|
||||||
if zone.Name != nil && p.domainFilter.Match(*zone.Name) && p.zoneIDFilter.Match(*zone.ID) {
|
if zone.Name != nil && p.domainFilter.Match(*zone.Name) && p.zoneIDFilter.Match(*zone.ID) {
|
||||||
zones = append(zones, *zone)
|
zones = append(zones, *zone)
|
||||||
|
} else if zone.Name != nil && len(p.zoneNameFilter.Filters) > 0 && p.zoneNameFilter.Match(*zone.Name) {
|
||||||
|
// Handle zoneNameFilter
|
||||||
|
zones = append(zones, *zone)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -238,6 +247,10 @@ func (p *AzurePrivateDNSProvider) deleteRecords(ctx context.Context, deleted azu
|
|||||||
for zone, endpoints := range deleted {
|
for zone, endpoints := range deleted {
|
||||||
for _, ep := range endpoints {
|
for _, ep := range endpoints {
|
||||||
name := p.recordSetNameForZone(zone, ep)
|
name := p.recordSetNameForZone(zone, ep)
|
||||||
|
if !p.domainFilter.Match(ep.DNSName) {
|
||||||
|
log.Debugf("Skipping deletion of record %s because it was filtered out by the specified --domain-filter", ep.DNSName)
|
||||||
|
continue
|
||||||
|
}
|
||||||
if p.dryRun {
|
if p.dryRun {
|
||||||
log.Infof("Would delete %s record named '%s' for Azure Private DNS zone '%s'.", ep.RecordType, name, zone)
|
log.Infof("Would delete %s record named '%s' for Azure Private DNS zone '%s'.", ep.RecordType, name, zone)
|
||||||
} else {
|
} else {
|
||||||
@ -261,6 +274,10 @@ func (p *AzurePrivateDNSProvider) updateRecords(ctx context.Context, updated azu
|
|||||||
for zone, endpoints := range updated {
|
for zone, endpoints := range updated {
|
||||||
for _, ep := range endpoints {
|
for _, ep := range endpoints {
|
||||||
name := p.recordSetNameForZone(zone, ep)
|
name := p.recordSetNameForZone(zone, ep)
|
||||||
|
if !p.domainFilter.Match(ep.DNSName) {
|
||||||
|
log.Debugf("Skipping update of record %s because it was filtered out by the specified --domain-filter", ep.DNSName)
|
||||||
|
continue
|
||||||
|
}
|
||||||
if p.dryRun {
|
if p.dryRun {
|
||||||
log.Infof(
|
log.Infof(
|
||||||
"Would update %s record named '%s' to '%s' for Azure Private DNS zone '%s'.",
|
"Would update %s record named '%s' to '%s' for Azure Private DNS zone '%s'.",
|
||||||
|
@ -224,15 +224,16 @@ func createPrivateMockRecordSetMultiWithTTL(name, recordType string, ttl int64,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// newMockedAzurePrivateDNSProvider creates an AzureProvider comprising the mocked clients for zones and recordsets
|
// newMockedAzurePrivateDNSProvider creates an AzureProvider comprising the mocked clients for zones and recordsets
|
||||||
func newMockedAzurePrivateDNSProvider(domainFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, dryRun bool, resourceGroup string, zones []*privatedns.PrivateZone, recordSets []*privatedns.RecordSet) (*AzurePrivateDNSProvider, error) {
|
func newMockedAzurePrivateDNSProvider(domainFilter endpoint.DomainFilter, zoneNameFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, dryRun bool, resourceGroup string, zones []*privatedns.PrivateZone, recordSets []*privatedns.RecordSet) (*AzurePrivateDNSProvider, error) {
|
||||||
zonesClient := newMockPrivateZonesClient(zones)
|
zonesClient := newMockPrivateZonesClient(zones)
|
||||||
recordSetsClient := newMockPrivateRecordSectsClient(recordSets)
|
recordSetsClient := newMockPrivateRecordSectsClient(recordSets)
|
||||||
return newAzurePrivateDNSProvider(domainFilter, zoneIDFilter, dryRun, resourceGroup, &zonesClient, &recordSetsClient), nil
|
return newAzurePrivateDNSProvider(domainFilter, zoneNameFilter, zoneIDFilter, dryRun, resourceGroup, &zonesClient, &recordSetsClient), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func newAzurePrivateDNSProvider(domainFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, dryRun bool, resourceGroup string, privateZonesClient PrivateZonesClient, privateRecordsClient PrivateRecordSetsClient) *AzurePrivateDNSProvider {
|
func newAzurePrivateDNSProvider(domainFilter endpoint.DomainFilter, zoneNameFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, dryRun bool, resourceGroup string, privateZonesClient PrivateZonesClient, privateRecordsClient PrivateRecordSetsClient) *AzurePrivateDNSProvider {
|
||||||
return &AzurePrivateDNSProvider{
|
return &AzurePrivateDNSProvider{
|
||||||
domainFilter: domainFilter,
|
domainFilter: domainFilter,
|
||||||
|
zoneNameFilter: zoneNameFilter,
|
||||||
zoneIDFilter: zoneIDFilter,
|
zoneIDFilter: zoneIDFilter,
|
||||||
dryRun: dryRun,
|
dryRun: dryRun,
|
||||||
resourceGroup: resourceGroup,
|
resourceGroup: resourceGroup,
|
||||||
@ -242,7 +243,7 @@ func newAzurePrivateDNSProvider(domainFilter endpoint.DomainFilter, zoneIDFilter
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestAzurePrivateDNSRecord(t *testing.T) {
|
func TestAzurePrivateDNSRecord(t *testing.T) {
|
||||||
provider, err := newMockedAzurePrivateDNSProvider(endpoint.NewDomainFilter([]string{"example.com"}), provider.NewZoneIDFilter([]string{""}), true, "k8s",
|
provider, err := newMockedAzurePrivateDNSProvider(endpoint.NewDomainFilter([]string{"example.com"}), endpoint.NewDomainFilter([]string{}), provider.NewZoneIDFilter([]string{""}), true, "k8s",
|
||||||
[]*privatedns.PrivateZone{
|
[]*privatedns.PrivateZone{
|
||||||
createMockPrivateZone("example.com", "/privateDnsZones/example.com"),
|
createMockPrivateZone("example.com", "/privateDnsZones/example.com"),
|
||||||
},
|
},
|
||||||
@ -281,7 +282,7 @@ func TestAzurePrivateDNSRecord(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestAzurePrivateDNSMultiRecord(t *testing.T) {
|
func TestAzurePrivateDNSMultiRecord(t *testing.T) {
|
||||||
provider, err := newMockedAzurePrivateDNSProvider(endpoint.NewDomainFilter([]string{"example.com"}), provider.NewZoneIDFilter([]string{""}), true, "k8s",
|
provider, err := newMockedAzurePrivateDNSProvider(endpoint.NewDomainFilter([]string{"example.com"}), endpoint.NewDomainFilter([]string{}), provider.NewZoneIDFilter([]string{""}), true, "k8s",
|
||||||
[]*privatedns.PrivateZone{
|
[]*privatedns.PrivateZone{
|
||||||
createMockPrivateZone("example.com", "/privateDnsZones/example.com"),
|
createMockPrivateZone("example.com", "/privateDnsZones/example.com"),
|
||||||
},
|
},
|
||||||
@ -369,6 +370,7 @@ func testAzurePrivateDNSApplyChangesInternal(t *testing.T, dryRun bool, client P
|
|||||||
zonesClient := newMockPrivateZonesClient(zones)
|
zonesClient := newMockPrivateZonesClient(zones)
|
||||||
|
|
||||||
provider := newAzurePrivateDNSProvider(
|
provider := newAzurePrivateDNSProvider(
|
||||||
|
endpoint.NewDomainFilter([]string{""}),
|
||||||
endpoint.NewDomainFilter([]string{""}),
|
endpoint.NewDomainFilter([]string{""}),
|
||||||
provider.NewZoneIDFilter([]string{""}),
|
provider.NewZoneIDFilter([]string{""}),
|
||||||
dryRun,
|
dryRun,
|
||||||
@ -430,3 +432,123 @@ func testAzurePrivateDNSApplyChangesInternal(t *testing.T, dryRun bool, client P
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAzurePrivateDNSNameFilter(t *testing.T) {
|
||||||
|
provider, err := newMockedAzurePrivateDNSProvider(endpoint.NewDomainFilter([]string{"nginx.example.com"}), endpoint.NewDomainFilter([]string{"example.com"}), provider.NewZoneIDFilter([]string{""}), true, "k8s",
|
||||||
|
[]*privatedns.PrivateZone{
|
||||||
|
createMockPrivateZone("example.com", "/privateDnsZones/example.com"),
|
||||||
|
},
|
||||||
|
|
||||||
|
[]*privatedns.RecordSet{
|
||||||
|
createPrivateMockRecordSet("@", "NS", "ns1-03.azure-dns.com."),
|
||||||
|
createPrivateMockRecordSet("@", "SOA", "Email: azuredns-hostmaster.microsoft.com"),
|
||||||
|
createPrivateMockRecordSet("@", endpoint.RecordTypeA, "123.123.123.122"),
|
||||||
|
createPrivateMockRecordSet("@", endpoint.RecordTypeTXT, "heritage=external-dns,external-dns/owner=default"),
|
||||||
|
createPrivateMockRecordSetWithTTL("test.nginx", endpoint.RecordTypeA, "123.123.123.123", 3600),
|
||||||
|
createPrivateMockRecordSetWithTTL("nginx", endpoint.RecordTypeA, "123.123.123.123", 3600),
|
||||||
|
createPrivateMockRecordSetWithTTL("nginx", endpoint.RecordTypeTXT, "heritage=external-dns,external-dns/owner=default", recordTTL),
|
||||||
|
createPrivateMockRecordSetWithTTL("mail.nginx", endpoint.RecordTypeMX, "20 example.com", recordTTL),
|
||||||
|
createPrivateMockRecordSetWithTTL("hack", endpoint.RecordTypeCNAME, "hack.azurewebsites.net", 10),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
actual, err := provider.Records(ctx)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
expected := []*endpoint.Endpoint{
|
||||||
|
endpoint.NewEndpointWithTTL("test.nginx.example.com", endpoint.RecordTypeA, 3600, "123.123.123.123"),
|
||||||
|
endpoint.NewEndpointWithTTL("nginx.example.com", endpoint.RecordTypeA, 3600, "123.123.123.123"),
|
||||||
|
endpoint.NewEndpointWithTTL("nginx.example.com", endpoint.RecordTypeTXT, recordTTL, "heritage=external-dns,external-dns/owner=default"),
|
||||||
|
endpoint.NewEndpointWithTTL("mail.nginx.example.com", endpoint.RecordTypeMX, recordTTL, "20 example.com"),
|
||||||
|
}
|
||||||
|
|
||||||
|
validateAzureEndpoints(t, actual, expected)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAzurePrivateDNSApplyChangesZoneName(t *testing.T) {
|
||||||
|
recordsClient := mockRecordSetsClient{}
|
||||||
|
|
||||||
|
testAzureApplyChangesInternalZoneName(t, false, &recordsClient)
|
||||||
|
|
||||||
|
validateAzureEndpoints(t, recordsClient.deletedEndpoints, []*endpoint.Endpoint{
|
||||||
|
endpoint.NewEndpoint("deleted.foo.example.com", endpoint.RecordTypeA, ""),
|
||||||
|
endpoint.NewEndpoint("deletedaaaa.foo.example.com", endpoint.RecordTypeAAAA, ""),
|
||||||
|
endpoint.NewEndpoint("deletedcname.foo.example.com", endpoint.RecordTypeCNAME, ""),
|
||||||
|
})
|
||||||
|
|
||||||
|
validateAzureEndpoints(t, recordsClient.updatedEndpoints, []*endpoint.Endpoint{
|
||||||
|
endpoint.NewEndpointWithTTL("foo.example.com", endpoint.RecordTypeA, endpoint.TTL(recordTTL), "1.2.3.4", "1.2.3.5"),
|
||||||
|
endpoint.NewEndpointWithTTL("foo.example.com", endpoint.RecordTypeAAAA, endpoint.TTL(recordTTL), "2001::1:2:3:4", "2001::1:2:3:5"),
|
||||||
|
endpoint.NewEndpointWithTTL("foo.example.com", endpoint.RecordTypeTXT, endpoint.TTL(recordTTL), "tag"),
|
||||||
|
endpoint.NewEndpointWithTTL("new.foo.example.com", endpoint.RecordTypeA, 3600, "111.222.111.222"),
|
||||||
|
endpoint.NewEndpointWithTTL("new.foo.example.com", endpoint.RecordTypeAAAA, 3600, "2001::111:222:111:222"),
|
||||||
|
endpoint.NewEndpointWithTTL("newcname.foo.example.com", endpoint.RecordTypeCNAME, 10, "other.com"),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAzurePrivateDNSApplyChangesInternalZoneName(t *testing.T, dryRun bool, client PrivateRecordSetsClient) {
|
||||||
|
zones := []*privatedns.PrivateZone{
|
||||||
|
createMockPrivateZone("example.com", "/privateDnsZones/example.com"),
|
||||||
|
}
|
||||||
|
zonesClient := newMockPrivateZonesClient(zones)
|
||||||
|
|
||||||
|
provider := newAzurePrivateDNSProvider(
|
||||||
|
endpoint.NewDomainFilter([]string{"foo.example.com"}),
|
||||||
|
endpoint.NewDomainFilter([]string{"example.com"}),
|
||||||
|
provider.NewZoneIDFilter([]string{""}),
|
||||||
|
dryRun,
|
||||||
|
"group",
|
||||||
|
&zonesClient,
|
||||||
|
client,
|
||||||
|
)
|
||||||
|
|
||||||
|
createRecords := []*endpoint.Endpoint{
|
||||||
|
endpoint.NewEndpoint("example.com", endpoint.RecordTypeA, "1.2.3.4"),
|
||||||
|
endpoint.NewEndpoint("example.com", endpoint.RecordTypeAAAA, "2001::1:2:3:4"),
|
||||||
|
endpoint.NewEndpoint("example.com", endpoint.RecordTypeTXT, "tag"),
|
||||||
|
endpoint.NewEndpoint("foo.example.com", endpoint.RecordTypeA, "1.2.3.5", "1.2.3.4"),
|
||||||
|
endpoint.NewEndpoint("foo.example.com", endpoint.RecordTypeAAAA, "2001::1:2:3:5", "2001::1:2:3:4"),
|
||||||
|
endpoint.NewEndpoint("foo.example.com", endpoint.RecordTypeTXT, "tag"),
|
||||||
|
endpoint.NewEndpoint("bar.example.com", endpoint.RecordTypeCNAME, "other.com"),
|
||||||
|
endpoint.NewEndpoint("bar.example.com", endpoint.RecordTypeTXT, "tag"),
|
||||||
|
endpoint.NewEndpoint("other.com", endpoint.RecordTypeA, "5.6.7.8"),
|
||||||
|
endpoint.NewEndpoint("other.com", endpoint.RecordTypeTXT, "tag"),
|
||||||
|
endpoint.NewEndpoint("nope.com", endpoint.RecordTypeA, "4.4.4.4"),
|
||||||
|
endpoint.NewEndpoint("nope.com", endpoint.RecordTypeTXT, "tag"),
|
||||||
|
}
|
||||||
|
|
||||||
|
currentRecords := []*endpoint.Endpoint{
|
||||||
|
endpoint.NewEndpoint("old.foo.example.com", endpoint.RecordTypeA, "121.212.121.212"),
|
||||||
|
endpoint.NewEndpoint("oldcname.foo.example.com", endpoint.RecordTypeCNAME, "other.com"),
|
||||||
|
endpoint.NewEndpoint("old.nope.example.com", endpoint.RecordTypeA, "121.212.121.212"),
|
||||||
|
}
|
||||||
|
updatedRecords := []*endpoint.Endpoint{
|
||||||
|
endpoint.NewEndpointWithTTL("new.foo.example.com", endpoint.RecordTypeA, 3600, "111.222.111.222"),
|
||||||
|
endpoint.NewEndpointWithTTL("new.foo.example.com", endpoint.RecordTypeAAAA, 3600, "2001::111:222:111:222"),
|
||||||
|
endpoint.NewEndpointWithTTL("newcname.foo.example.com", endpoint.RecordTypeCNAME, 10, "other.com"),
|
||||||
|
endpoint.NewEndpoint("new.nope.example.com", endpoint.RecordTypeA, "222.111.222.111"),
|
||||||
|
endpoint.NewEndpoint("new.nope.example.com", endpoint.RecordTypeAAAA, "2001::222:111:222:111"),
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteRecords := []*endpoint.Endpoint{
|
||||||
|
endpoint.NewEndpoint("deleted.foo.example.com", endpoint.RecordTypeA, "111.222.111.222"),
|
||||||
|
endpoint.NewEndpoint("deletedaaaa.foo.example.com", endpoint.RecordTypeAAAA, "2001::111:222:111:222"),
|
||||||
|
endpoint.NewEndpoint("deletedcname.foo.example.com", endpoint.RecordTypeCNAME, "other.com"),
|
||||||
|
endpoint.NewEndpoint("deleted.nope.example.com", endpoint.RecordTypeA, "222.111.222.111"),
|
||||||
|
}
|
||||||
|
|
||||||
|
changes := &plan.Changes{
|
||||||
|
Create: createRecords,
|
||||||
|
UpdateNew: updatedRecords,
|
||||||
|
UpdateOld: currentRecords,
|
||||||
|
Delete: deleteRecords,
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := provider.ApplyChanges(context.Background(), changes); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user