Skip to content

Commit

Permalink
Bug 1898417 - GCP: the dns targets in Google Cloud DNS is not updated…
Browse files Browse the repository at this point in the history
… after recreating loadbalancer service
  • Loading branch information
miheer committed Jan 12, 2021
1 parent b554813 commit db0d237
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 14 deletions.
4 changes: 4 additions & 0 deletions pkg/dns/aws/dns.go
Expand Up @@ -361,6 +361,10 @@ func (m *Provider) Delete(record *iov1.DNSRecord, zone configv1.DNSZone) error {
return m.change(record, zone, deleteAction)
}

func (m *Provider) Replace(record *iov1.DNSRecord, zone configv1.DNSZone) error {
return m.change(record, zone, upsertAction)
}

// change will perform an action on a record. The target must correspond to the
// hostname of an ELB which will be automatically discovered.
func (m *Provider) change(record *iov1.DNSRecord, zone configv1.DNSZone, action action) error {
Expand Down
4 changes: 4 additions & 0 deletions pkg/dns/azure/dns.go
Expand Up @@ -125,6 +125,10 @@ func (m *provider) Delete(record *iov1.DNSRecord, zone configv1.DNSZone) error {
return err
}

func (m *provider) Replace(record *iov1.DNSRecord, zone configv1.DNSZone) error {
return m.Ensure(record, zone)
}

// getARecordName extracts the ARecord subdomain name from the full domain string.
// azure defines the ARecord Name as the subdomain name only.
func getARecordName(recordDomain string, zoneName string) (string, error) {
Expand Down
8 changes: 6 additions & 2 deletions pkg/dns/dns.go
Expand Up @@ -13,11 +13,15 @@ type Provider interface {

// Delete will delete record.
Delete(record *iov1.DNSRecord, zone configv1.DNSZone) error

// Replace will replace the record
Replace(record *iov1.DNSRecord, zone configv1.DNSZone) error
}

var _ Provider = &FakeProvider{}

type FakeProvider struct{}

func (_ *FakeProvider) Ensure(record *iov1.DNSRecord, zone configv1.DNSZone) error { return nil }
func (_ *FakeProvider) Delete(record *iov1.DNSRecord, zone configv1.DNSZone) error { return nil }
func (_ *FakeProvider) Ensure(record *iov1.DNSRecord, zone configv1.DNSZone) error { return nil }
func (_ *FakeProvider) Delete(record *iov1.DNSRecord, zone configv1.DNSZone) error { return nil }
func (_ *FakeProvider) Replace(record *iov1.DNSRecord, zone configv1.DNSZone) error { return nil }
28 changes: 27 additions & 1 deletion pkg/dns/gcp/provider.go
Expand Up @@ -10,13 +10,15 @@ import (

iov1 "github.com/openshift/api/operatoringress/v1"
"github.com/openshift/cluster-ingress-operator/pkg/dns"
logf "github.com/openshift/cluster-ingress-operator/pkg/log"

gdnsv1 "google.golang.org/api/dns/v1"
"google.golang.org/api/option"
)

var (
_ dns.Provider = &Provider{}
_ dns.Provider = &Provider{}
log = logf.Logger.WithName("dns")
)

type Provider struct {
Expand Down Expand Up @@ -57,6 +59,30 @@ func (p *Provider) Ensure(record *iov1.DNSRecord, zone configv1.DNSZone) error {
return err
}

func (p *Provider) Replace(record *iov1.DNSRecord, zone configv1.DNSZone) error {
ctx := context.Background()
oldRecord := p.dnsService.ResourceRecordSets.List(p.config.Project, zone.ID).Name(record.Spec.DNSName)
if err := oldRecord.Pages(ctx, func(page *gdnsv1.ResourceRecordSetsListResponse) error {
for _, resourceRecordSet := range page.Rrsets {
log.Info("found old DNS resource record set", "resourceRecordSet", resourceRecordSet)
change := &gdnsv1.Change{Deletions: []*gdnsv1.ResourceRecordSet{resourceRecordSet}}
call := p.dnsService.Changes.Create(p.config.Project, zone.ID, change)
_, err := call.Do()
if ae, ok := err.(*googleapi.Error); ok && ae.Code == http.StatusNotFound {
return nil
}
return err
}
return nil
}); err != nil {
return err
}
if err := p.Ensure(record, zone); err != nil {
return err
}
return nil
}

func (p *Provider) Delete(record *iov1.DNSRecord, zone configv1.DNSZone) error {
change := &gdnsv1.Change{Deletions: []*gdnsv1.ResourceRecordSet{resourceRecordSet(record)}}
call := p.dnsService.Changes.Create(p.config.Project, zone.ID, change)
Expand Down
38 changes: 27 additions & 11 deletions pkg/operator/controller/dns/controller.go
Expand Up @@ -17,7 +17,6 @@ import (
awsdns "github.com/openshift/cluster-ingress-operator/pkg/dns/aws"
azuredns "github.com/openshift/cluster-ingress-operator/pkg/dns/azure"
gcpdns "github.com/openshift/cluster-ingress-operator/pkg/dns/gcp"
logf "github.com/openshift/cluster-ingress-operator/pkg/log"
"github.com/openshift/cluster-ingress-operator/pkg/manifests"
operatorutil "github.com/openshift/cluster-ingress-operator/pkg/util"
oputil "github.com/openshift/cluster-ingress-operator/pkg/util"
Expand Down Expand Up @@ -262,17 +261,34 @@ func (r *reconciler) publishRecordToZones(zones []configv1.DNSZone, record *iov1
LastTransitionTime: metav1.Now(),
}

if err := r.dnsProvider.Ensure(record, zone); err != nil {
log.Error(err, "failed to publish DNS record to zone", "record", record.Spec, "dnszone", zone)
condition.Status = string(operatorv1.ConditionTrue)
condition.Reason = "ProviderError"
condition.Message = fmt.Sprintf("The DNS provider failed to ensure the record: %v", err)
result.RequeueAfter = 30 * time.Second
if recordIsAlreadyPublishedToZone(record, &zone) {
log.Info("replacing DNS record", "record", record.Spec, "dnszone", zone)

if err := r.dnsProvider.Replace(record, zone); err != nil {
log.Error(err, "failed to replace DNS record in zone", "record", record.Spec, "dnszone", zone)
condition.Status = string(operatorv1.ConditionTrue)
condition.Reason = "ProviderError"
condition.Message = fmt.Sprintf("The DNS provider failed to replace the record: %v", err)
result.RequeueAfter = 30 * time.Second
} else {
log.Info("replaced DNS record in zone", "record", record.Spec, "dnszone", zone)
condition.Status = string(operatorv1.ConditionFalse)
condition.Reason = "ProviderSuccess"
condition.Message = "The DNS provider succeeded in replacing the record"
}
} else {
log.Info("published DNS record to zone", "record", record.Spec, "dnszone", zone)
condition.Status = string(operatorv1.ConditionFalse)
condition.Reason = "ProviderSuccess"
condition.Message = "The DNS provider succeeded in ensuring the record"
if err := r.dnsProvider.Ensure(record, zone); err != nil {
log.Error(err, "failed to publish DNS record to zone", "record", record.Spec, "dnszone", zone)
condition.Status = string(operatorv1.ConditionTrue)
condition.Reason = "ProviderError"
condition.Message = fmt.Sprintf("The DNS provider failed to ensure the record: %v", err)
result.RequeueAfter = 30 * time.Second
} else {
log.Info("published DNS record to zone", "record", record.Spec, "dnszone", zone)
condition.Status = string(operatorv1.ConditionFalse)
condition.Reason = "ProviderSuccess"
condition.Message = "The DNS provider succeeded in ensuring the record"
}
}
statuses = append(statuses, iov1.DNSZoneStatus{
DNSZone: zone,
Expand Down

0 comments on commit db0d237

Please sign in to comment.