DNS: Apply should be a no-op when empty

Document the contract a bit more, change the signature by adding a
context arg and following through to make sure we honor the contract
everywhere.
This commit is contained in:
Justin Santa Barbara 2020-04-09 10:10:45 -04:00 committed by Justin SB
parent 520474468d
commit 7e710e85d9
14 changed files with 150 additions and 80 deletions

View File

@ -17,6 +17,7 @@ limitations under the License.
package dns
import (
"context"
"fmt"
"time"
@ -189,6 +190,8 @@ type recordKey struct {
}
func (c *DNSController) runOnce() error {
ctx := context.TODO()
snapshot := c.snapshotIfChangedAndReady()
if snapshot == nil {
// Unchanged / not ready
@ -307,7 +310,7 @@ func (c *DNSController) runOnce() error {
}
klog.V(2).Infof("applying DNS changeset for zone %s", key)
if err := changeset.Apply(); err != nil {
if err := changeset.Apply(ctx); err != nil {
klog.Warningf("error applying DNS changeset for zone %s: %v", key, err)
errors = append(errors, fmt.Errorf("error applying DNS changeset for zone %s: %v", key, err))
}
@ -325,6 +328,8 @@ func (c *DNSController) runOnce() error {
}
func (c *DNSController) RemoveRecordsImmediate(records []Record) error {
ctx := context.TODO()
op, err := newDNSOp(c.zoneRules, c.dnsCache)
if err != nil {
return err
@ -348,7 +353,7 @@ func (c *DNSController) RemoveRecordsImmediate(records []Record) error {
for key, changeset := range op.changesets {
klog.V(2).Infof("applying DNS changeset for zone %s", key)
if err := changeset.Apply(); err != nil {
if err := changeset.Apply(ctx); err != nil {
klog.Warningf("error applying DNS changeset for zone %s: %v", key, err)
errors = append(errors, fmt.Errorf("error applying DNS changeset for zone %s: %v", key, err))
}

View File

@ -17,6 +17,7 @@ limitations under the License.
package dnsprovider
import (
"context"
"reflect"
"k8s.io/kops/dnsprovider/pkg/dnsprovider/rrstype"
@ -79,7 +80,8 @@ type ResourceRecordChangeset interface {
// If you have the pre-image, it will likely be more efficient to call Remove and Add.
Upsert(ResourceRecordSet) ResourceRecordChangeset
// Apply applies the accumulated operations to the Zone.
Apply() error
// Implementations should tolerate an empty changeset, and be a relatively quick no-op.
Apply(ctx context.Context) error
// IsEmpty returns true if there are no accumulated operations.
IsEmpty() bool
// ResourceRecordSets returns the parent ResourceRecordSets

View File

@ -17,6 +17,7 @@ limitations under the License.
package route53
import (
"context"
"flag"
"fmt"
"os"
@ -128,8 +129,8 @@ func getExampleRrs(zone dnsprovider.Zone) dnsprovider.ResourceRecordSet {
return rrsets.New("www11."+zone.Name(), []string{"10.10.10.10", "169.20.20.20"}, 180, rrstype.A)
}
func addRrsetOrFail(t *testing.T, rrsets dnsprovider.ResourceRecordSets, rrset dnsprovider.ResourceRecordSet) {
err := rrsets.StartChangeset().Add(rrset).Apply()
func addRrsetOrFail(ctx context.Context, t *testing.T, rrsets dnsprovider.ResourceRecordSets, rrset dnsprovider.ResourceRecordSet) {
err := rrsets.StartChangeset().Add(rrset).Apply(ctx)
if err != nil {
t.Fatalf("Failed to add recordsets: %v", err)
}
@ -180,21 +181,25 @@ func TestResourceRecordSetsList(t *testing.T) {
/* TestResourceRecordSetsAddSuccess verifies that addition of a valid RRS succeeds */
func TestResourceRecordSetsAddSuccess(t *testing.T) {
ctx := context.Background()
zone := firstZone(t)
sets := rrs(t, zone)
set := getExampleRrs(zone)
addRrsetOrFail(t, sets, set)
defer sets.StartChangeset().Remove(set).Apply()
addRrsetOrFail(ctx, t, sets, set)
defer sets.StartChangeset().Remove(set).Apply(ctx)
t.Logf("Successfully added resource record set: %v", set)
}
/* TestResourceRecordSetsAdditionVisible verifies that added RRS is visible after addition */
func TestResourceRecordSetsAdditionVisible(t *testing.T) {
ctx := context.Background()
zone := firstZone(t)
sets := rrs(t, zone)
rrset := getExampleRrs(zone)
addRrsetOrFail(t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply()
addRrsetOrFail(ctx, t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
t.Logf("Successfully added resource record set: %v", rrset)
found := false
for _, record := range listRrsOrFail(t, sets) {
@ -208,18 +213,20 @@ func TestResourceRecordSetsAdditionVisible(t *testing.T) {
}
}
/* TestResourceRecordSetsAddDuplicateFail verifies that addition of a duplicate RRS fails */
/* TestResourceRecordSetsAddDuplicateFailure verifies that addition of a duplicate RRS fails */
func TestResourceRecordSetsAddDuplicateFailure(t *testing.T) {
ctx := context.Background()
zone := firstZone(t)
sets := rrs(t, zone)
rrset := getExampleRrs(zone)
addRrsetOrFail(t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply()
addRrsetOrFail(ctx, t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
t.Logf("Successfully added resource record set: %v", rrset)
// Try to add it again, and verify that the call fails.
err := sets.StartChangeset().Add(rrset).Apply()
err := sets.StartChangeset().Add(rrset).Apply(ctx)
if err == nil {
defer sets.StartChangeset().Remove(rrset).Apply()
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
t.Errorf("Should have failed to add duplicate resource record %v, but succeeded instead.", rrset)
} else {
t.Logf("Correctly failed to add duplicate resource record %v: %v", rrset, err)
@ -228,14 +235,16 @@ func TestResourceRecordSetsAddDuplicateFailure(t *testing.T) {
/* TestResourceRecordSetsRemove verifies that the removal of an existing RRS succeeds */
func TestResourceRecordSetsRemove(t *testing.T) {
ctx := context.Background()
zone := firstZone(t)
sets := rrs(t, zone)
rrset := getExampleRrs(zone)
addRrsetOrFail(t, sets, rrset)
err := sets.StartChangeset().Remove(rrset).Apply()
addRrsetOrFail(ctx, t, sets, rrset)
err := sets.StartChangeset().Remove(rrset).Apply(ctx)
if err != nil {
// Try again to clean up.
defer sets.StartChangeset().Remove(rrset).Apply()
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
t.Errorf("Failed to remove resource record set %v after adding", rrset)
} else {
t.Logf("Successfully removed resource set %v after adding", rrset)
@ -244,14 +253,16 @@ func TestResourceRecordSetsRemove(t *testing.T) {
/* TestResourceRecordSetsRemoveGone verifies that a removed RRS no longer exists */
func TestResourceRecordSetsRemoveGone(t *testing.T) {
ctx := context.Background()
zone := firstZone(t)
sets := rrs(t, zone)
rrset := getExampleRrs(zone)
addRrsetOrFail(t, sets, rrset)
err := sets.StartChangeset().Remove(rrset).Apply()
addRrsetOrFail(ctx, t, sets, rrset)
err := sets.StartChangeset().Remove(rrset).Apply(ctx)
if err != nil {
// Try again to clean up.
defer sets.StartChangeset().Remove(rrset).Apply()
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
t.Errorf("Failed to remove resource record set %v after adding", rrset)
} else {
t.Logf("Successfully removed resource set %v after adding", rrset)

View File

@ -18,6 +18,7 @@ package route53
import (
"bytes"
"context"
"fmt"
"github.com/aws/aws-sdk-go/aws"
@ -73,7 +74,12 @@ func buildChange(action string, rrs dnsprovider.ResourceRecordSet) *route53.Chan
return change
}
func (c *ResourceRecordChangeset) Apply() error {
func (c *ResourceRecordChangeset) Apply(ctx context.Context) error {
// Empty changesets should be a relatively quick no-op
if c.IsEmpty() {
return nil
}
hostedZoneID := c.zone.impl.Id
removals := make(map[string]*route53.Change)

View File

@ -17,6 +17,7 @@ limitations under the License.
package coredns
import (
"context"
"flag"
"fmt"
"os"
@ -125,8 +126,8 @@ func getExampleRrs(zone dnsprovider.Zone) dnsprovider.ResourceRecordSet {
return rrsets.New("www11."+zone.Name(), []string{"10.10.10.10", "169.20.20.20"}, 180, rrstype.A)
}
func addRrsetOrFail(t *testing.T, rrsets dnsprovider.ResourceRecordSets, rrset dnsprovider.ResourceRecordSet) {
err := rrsets.StartChangeset().Add(rrset).Apply()
func addRrsetOrFail(ctx context.Context, t *testing.T, rrsets dnsprovider.ResourceRecordSets, rrset dnsprovider.ResourceRecordSet) {
err := rrsets.StartChangeset().Add(rrset).Apply(ctx)
if err != nil {
t.Fatalf("Failed to add recordsets: %v", err)
}
@ -154,11 +155,13 @@ func TestResourceRecordSetsGet(t *testing.T) {
/* TestResourceRecordSetsAddSuccess verifies that addition of a valid RRS succeeds */
func TestResourceRecordSetsAddSuccess(t *testing.T) {
ctx := context.Background()
zone := firstZone(t)
sets := rrs(t, zone)
set := getExampleRrs(zone)
addRrsetOrFail(t, sets, set)
defer sets.StartChangeset().Remove(set).Apply()
addRrsetOrFail(ctx, t, sets, set)
defer sets.StartChangeset().Remove(set).Apply(ctx)
t.Logf("Successfully added resource record set: %v", set)
if sets.Zone().ID() != zone.ID() {
t.Errorf("Zone for rrset does not match expected")
@ -167,11 +170,13 @@ func TestResourceRecordSetsAddSuccess(t *testing.T) {
/* TestResourceRecordSetsAdditionVisible verifies that added RRS is visible after addition */
func TestResourceRecordSetsAdditionVisible(t *testing.T) {
ctx := context.Background()
zone := firstZone(t)
sets := rrs(t, zone)
rrset := getExampleRrs(zone)
addRrsetOrFail(t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply()
addRrsetOrFail(ctx, t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
t.Logf("Successfully added resource record set: %v", rrset)
record := getRrOrFail(t, sets, rrset.Name())
@ -180,18 +185,20 @@ func TestResourceRecordSetsAdditionVisible(t *testing.T) {
}
}
/* TestResourceRecordSetsAddDuplicateFail verifies that addition of a duplicate RRS fails */
/* TestResourceRecordSetsAddDuplicateFailure verifies that addition of a duplicate RRS fails */
func TestResourceRecordSetsAddDuplicateFailure(t *testing.T) {
ctx := context.Background()
zone := firstZone(t)
sets := rrs(t, zone)
rrset := getExampleRrs(zone)
addRrsetOrFail(t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply()
addRrsetOrFail(ctx, t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
t.Logf("Successfully added resource record set: %v", rrset)
// Try to add it again, and verify that the call fails.
err := sets.StartChangeset().Add(rrset).Apply()
err := sets.StartChangeset().Add(rrset).Apply(ctx)
if err == nil {
defer sets.StartChangeset().Remove(rrset).Apply()
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
t.Errorf("Should have failed to add duplicate resource record %v, but succeeded instead.", rrset)
} else {
t.Logf("Correctly failed to add duplicate resource record %v: %v", rrset, err)
@ -200,14 +207,16 @@ func TestResourceRecordSetsAddDuplicateFailure(t *testing.T) {
/* TestResourceRecordSetsRemove verifies that the removal of an existing RRS succeeds */
func TestResourceRecordSetsRemove(t *testing.T) {
ctx := context.Background()
zone := firstZone(t)
sets := rrs(t, zone)
rrset := getExampleRrs(zone)
addRrsetOrFail(t, sets, rrset)
err := sets.StartChangeset().Remove(rrset).Apply()
addRrsetOrFail(ctx, t, sets, rrset)
err := sets.StartChangeset().Remove(rrset).Apply(ctx)
if err != nil {
// Try again to clean up.
defer sets.StartChangeset().Remove(rrset).Apply()
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
t.Errorf("Failed to remove resource record set %v after adding", rrset)
} else {
t.Logf("Successfully removed resource set %v after adding", rrset)
@ -216,14 +225,16 @@ func TestResourceRecordSetsRemove(t *testing.T) {
/* TestResourceRecordSetsRemoveGone verifies that a removed RRS no longer exists */
func TestResourceRecordSetsRemoveGone(t *testing.T) {
ctx := context.Background()
zone := firstZone(t)
sets := rrs(t, zone)
rrset := getExampleRrs(zone)
addRrsetOrFail(t, sets, rrset)
err := sets.StartChangeset().Remove(rrset).Apply()
addRrsetOrFail(ctx, t, sets, rrset)
err := sets.StartChangeset().Remove(rrset).Apply(ctx)
if err != nil {
// Try again to clean up.
defer sets.StartChangeset().Remove(rrset).Apply()
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
t.Errorf("Failed to remove resource record set %v after adding", rrset)
} else {
t.Logf("Successfully removed resource set %v after adding", rrset)

View File

@ -69,8 +69,12 @@ func (c *ResourceRecordChangeset) Upsert(rrset dnsprovider.ResourceRecordSet) dn
return c
}
func (c *ResourceRecordChangeset) Apply() error {
ctx := context.Background()
func (c *ResourceRecordChangeset) Apply(ctx context.Context) error {
// Empty changesets should be a relatively quick no-op
if c.IsEmpty() {
return nil
}
etcdPathPrefix := c.zone.zones.intf.etcdPathPrefix
getOpts := &etcdc.GetOptions{}
setOpts := &etcdc.SetOptions{}

View File

@ -17,6 +17,7 @@ limitations under the License.
package clouddns
import (
"context"
"flag"
"fmt"
"os"
@ -106,8 +107,8 @@ func getExampleRrs(zone dnsprovider.Zone) dnsprovider.ResourceRecordSet {
return rrsets.New("www11."+zone.Name(), []string{"10.10.10.10", "169.20.20.20"}, 180, rrstype.A)
}
func addRrsetOrFail(t *testing.T, rrsets dnsprovider.ResourceRecordSets, rrset dnsprovider.ResourceRecordSet) {
err := rrsets.StartChangeset().Add(rrset).Apply()
func addRrsetOrFail(ctx context.Context, t *testing.T, rrsets dnsprovider.ResourceRecordSets, rrset dnsprovider.ResourceRecordSet) {
err := rrsets.StartChangeset().Add(rrset).Apply(ctx)
if err != nil {
t.Fatalf("Failed to add recordsets: %v", err)
}
@ -159,21 +160,23 @@ func TestResourceRecordSetsList(t *testing.T) {
/* TestResourceRecordSetsAddSuccess verifies that addition of a valid RRS succeeds */
func TestResourceRecordSetsAddSuccess(t *testing.T) {
ctx := context.Background()
zone := firstZone(t)
sets := rrs(t, zone)
set := getExampleRrs(zone)
addRrsetOrFail(t, sets, set)
defer sets.StartChangeset().Remove(set).Apply()
addRrsetOrFail(ctx, t, sets, set)
defer sets.StartChangeset().Remove(set).Apply(ctx)
t.Logf("Successfully added resource record set: %v", set)
}
/* TestResourceRecordSetsAdditionVisible verifies that added RRS is visible after addition */
func TestResourceRecordSetsAdditionVisible(t *testing.T) {
ctx := context.Background()
zone := firstZone(t)
sets := rrs(t, zone)
rrset := getExampleRrs(zone)
addRrsetOrFail(t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply()
addRrsetOrFail(ctx, t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
t.Logf("Successfully added resource record set: %v", rrset)
found := false
for _, record := range listRrsOrFail(t, sets) {
@ -187,18 +190,20 @@ func TestResourceRecordSetsAdditionVisible(t *testing.T) {
}
}
/* TestResourceRecordSetsAddDuplicateFail verifies that addition of a duplicate RRS fails */
/* TestResourceRecordSetsAddDuplicateFailure verifies that addition of a duplicate RRS fails */
func TestResourceRecordSetsAddDuplicateFailure(t *testing.T) {
ctx := context.Background()
zone := firstZone(t)
sets := rrs(t, zone)
rrset := getExampleRrs(zone)
addRrsetOrFail(t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply()
addRrsetOrFail(ctx, t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
t.Logf("Successfully added resource record set: %v", rrset)
// Try to add it again, and verify that the call fails.
err := sets.StartChangeset().Add(rrset).Apply()
err := sets.StartChangeset().Add(rrset).Apply(ctx)
if err == nil {
defer sets.StartChangeset().Remove(rrset).Apply()
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
t.Errorf("Should have failed to add duplicate resource record %v, but succeeded instead.", rrset)
} else {
t.Logf("Correctly failed to add duplicate resource record %v: %v", rrset, err)
@ -207,14 +212,16 @@ func TestResourceRecordSetsAddDuplicateFailure(t *testing.T) {
/* TestResourceRecordSetsRemove verifies that the removal of an existing RRS succeeds */
func TestResourceRecordSetsRemove(t *testing.T) {
ctx := context.Background()
zone := firstZone(t)
sets := rrs(t, zone)
rrset := getExampleRrs(zone)
addRrsetOrFail(t, sets, rrset)
err := sets.StartChangeset().Remove(rrset).Apply()
addRrsetOrFail(ctx, t, sets, rrset)
err := sets.StartChangeset().Remove(rrset).Apply(ctx)
if err != nil {
// Try again to clean up.
defer sets.StartChangeset().Remove(rrset).Apply()
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
t.Errorf("Failed to remove resource record set %v after adding: %v", rrset, err)
} else {
t.Logf("Successfully removed resource set %v after adding", rrset)
@ -223,14 +230,16 @@ func TestResourceRecordSetsRemove(t *testing.T) {
/* TestResourceRecordSetsRemoveGone verifies that a removed RRS no longer exists */
func TestResourceRecordSetsRemoveGone(t *testing.T) {
ctx := context.Background()
zone := firstZone(t)
sets := rrs(t, zone)
rrset := getExampleRrs(zone)
addRrsetOrFail(t, sets, rrset)
err := sets.StartChangeset().Remove(rrset).Apply()
addRrsetOrFail(ctx, t, sets, rrset)
err := sets.StartChangeset().Remove(rrset).Apply(ctx)
if err != nil {
// Try again to clean up.
defer sets.StartChangeset().Remove(rrset).Apply()
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
t.Errorf("Failed to remove resource record set %v after adding: %v", rrset, err)
} else {
t.Logf("Successfully removed resource set %v after adding", rrset)

View File

@ -17,6 +17,7 @@ limitations under the License.
package clouddns
import (
"context"
"fmt"
"k8s.io/kops/dnsprovider/pkg/dnsprovider"
@ -49,7 +50,8 @@ func (c *ResourceRecordChangeset) Upsert(rrset dnsprovider.ResourceRecordSet) dn
return c
}
func (c *ResourceRecordChangeset) Apply() error {
func (c *ResourceRecordChangeset) Apply(ctx context.Context) error {
// Empty changesets should be a relatively quick no-op
if c.IsEmpty() {
return nil
}

View File

@ -17,6 +17,7 @@ limitations under the License.
package designate
import (
"context"
"fmt"
"github.com/gophercloud/gophercloud/openstack/dns/v2/recordsets"
@ -50,7 +51,12 @@ func (c *ResourceRecordChangeset) Upsert(rrset dnsprovider.ResourceRecordSet) dn
return c
}
func (c *ResourceRecordChangeset) Apply() error {
func (c *ResourceRecordChangeset) Apply(ctx context.Context) error {
// Empty changesets should be a relatively quick no-op
if c.IsEmpty() {
return nil
}
zoneID := c.zone.impl.ID
for _, removal := range c.removals {

View File

@ -17,6 +17,7 @@ limitations under the License.
package tests
import (
"context"
"reflect"
"testing"
@ -26,20 +27,21 @@ import (
/* CommonTestResourceRecordSetsReplace verifies that replacing an RRS works */
func CommonTestResourceRecordSetsReplace(t *testing.T, zone dnsprovider.Zone) {
ctx := context.Background()
rrsets, _ := zone.ResourceRecordSets()
sets := rrs(t, zone)
rrset := rrsets.New("alpha.test.com", []string{"8.8.4.4"}, 40, rrstype.A)
addRrsetOrFail(t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply()
addRrsetOrFail(ctx, t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
// Replace the record (change ttl and rrdatas)
newRrset := rrsets.New("alpha.test.com", []string{"8.8.8.8"}, 80, rrstype.A)
err := sets.StartChangeset().Add(newRrset).Remove(rrset).Apply()
err := sets.StartChangeset().Add(newRrset).Remove(rrset).Apply(ctx)
if err != nil {
t.Errorf("Failed to replace resource record set %v -> %v: %v", rrset, newRrset, err)
} else {
defer sets.StartChangeset().Remove(newRrset).Apply()
defer sets.StartChangeset().Remove(newRrset).Apply(ctx)
t.Logf("Correctly replaced resource record %v -> %v", rrset, newRrset)
}
@ -49,21 +51,22 @@ func CommonTestResourceRecordSetsReplace(t *testing.T, zone dnsprovider.Zone) {
/* CommonTestResourceRecordSetsReplaceAll verifies that we can remove an RRS and create one with a different name*/
func CommonTestResourceRecordSetsReplaceAll(t *testing.T, zone dnsprovider.Zone) {
ctx := context.Background()
rrsets, _ := zone.ResourceRecordSets()
sets := rrs(t, zone)
rrset := rrsets.New("alpha.test.com", []string{"8.8.4.4"}, 40, rrstype.A)
addRrsetOrFail(t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply()
addRrsetOrFail(ctx, t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
newRrset := rrsets.New("beta.test.com", []string{"8.8.8.8"}, 80, rrstype.A)
// Try to add it again, and verify that the call fails.
err := sets.StartChangeset().Add(newRrset).Remove(rrset).Apply()
err := sets.StartChangeset().Add(newRrset).Remove(rrset).Apply(ctx)
if err != nil {
t.Errorf("Failed to replace resource record set %v -> %v: %v", rrset, newRrset, err)
} else {
defer sets.StartChangeset().Remove(newRrset).Apply()
defer sets.StartChangeset().Remove(newRrset).Apply(ctx)
t.Logf("Correctly replaced resource record %v -> %v", rrset, newRrset)
}
@ -74,21 +77,22 @@ func CommonTestResourceRecordSetsReplaceAll(t *testing.T, zone dnsprovider.Zone)
/* CommonTestResourceRecordSetsDifferentType verifies that we can add records of the same name but different types */
func CommonTestResourceRecordSetsDifferentTypes(t *testing.T, zone dnsprovider.Zone) {
ctx := context.Background()
rrsets, _ := zone.ResourceRecordSets()
sets := rrs(t, zone)
rrset := rrsets.New("alpha.test.com", []string{"8.8.4.4"}, 40, rrstype.A)
addRrsetOrFail(t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply()
addRrsetOrFail(ctx, t, sets, rrset)
defer sets.StartChangeset().Remove(rrset).Apply(ctx)
aaaaRrset := rrsets.New("alpha.test.com", []string{"2001:4860:4860::8888"}, 80, rrstype.AAAA)
// Add the resource with the same name but different type
err := sets.StartChangeset().Add(aaaaRrset).Apply()
err := sets.StartChangeset().Add(aaaaRrset).Apply(ctx)
if err != nil {
t.Errorf("Failed to add resource record set %v: %v", aaaaRrset, err)
}
defer sets.StartChangeset().Remove(aaaaRrset).Apply()
defer sets.StartChangeset().Remove(aaaaRrset).Apply(ctx)
// Check that both records exist
assertHasRecord(t, sets, aaaaRrset)
@ -184,8 +188,8 @@ func assertEquivalent(t *testing.T, l, r dnsprovider.ResourceRecordSet) {
}
}
func addRrsetOrFail(t *testing.T, rrsets dnsprovider.ResourceRecordSets, rrset dnsprovider.ResourceRecordSet) {
err := rrsets.StartChangeset().Add(rrset).Apply()
func addRrsetOrFail(ctx context.Context, t *testing.T, rrsets dnsprovider.ResourceRecordSets, rrset dnsprovider.ResourceRecordSet) {
err := rrsets.StartChangeset().Add(rrset).Apply(ctx)
if err != nil {
t.Fatalf("Failed to add recordset %v: %v", rrset, err)
} else {

View File

@ -313,13 +313,15 @@ func (r *resourceRecordChangeset) Upsert(rrset dnsprovider.ResourceRecordSet) dn
// Apply adds new records stored in r.additions, updates records stored
// in r.upserts and deletes records stored in r.removals
func (r *resourceRecordChangeset) Apply() error {
klog.V(2).Info("applying changes in record change set")
func (r *resourceRecordChangeset) Apply(ctx context.Context) error {
// Empty changesets should be a relatively quick no-op
if r.IsEmpty() {
klog.V(2).Info("record change set is empty")
klog.V(4).Info("record change set is empty")
return nil
}
klog.V(2).Info("applying changes in record change set")
if len(r.additions) > 0 {
for _, rrset := range r.additions {
err := r.applyResourceRecordSet(rrset)

View File

@ -17,6 +17,8 @@ limitations under the License.
package provider
import (
"context"
"k8s.io/kops/dnsprovider/pkg/dnsprovider"
)
@ -52,7 +54,12 @@ func (c *resourceRecordChangeset) Upsert(rrs dnsprovider.ResourceRecordSet) dnsp
}
// Apply applies the accumulated operations to the Zone.
func (c *resourceRecordChangeset) Apply() error {
func (c *resourceRecordChangeset) Apply(ctx context.Context) error {
// Empty changesets should be a relatively quick no-op
if c.IsEmpty() {
return nil
}
return c.zone.applyChangeset(c)
}

View File

@ -960,7 +960,7 @@ func (c *ApplyClusterCmd) Run(ctx context.Context) error {
}
if shouldPrecreateDNS {
if err := precreateDNS(cluster, cloud); err != nil {
if err := precreateDNS(ctx, cluster, cloud); err != nil {
klog.Warningf("unable to pre-create DNS records - cluster startup may be slower: %v", err)
}
}

View File

@ -17,6 +17,7 @@ limitations under the License.
package cloudup
import (
"context"
"fmt"
"net"
"os"
@ -124,7 +125,7 @@ func validateDNS(cluster *kops.Cluster, cloud fi.Cloud) error {
return nil
}
func precreateDNS(cluster *kops.Cluster, cloud fi.Cloud) error {
func precreateDNS(ctx context.Context, cluster *kops.Cluster, cloud fi.Cloud) error {
// TODO: Move to update
if !featureflag.DNSPreCreate.Enabled() {
klog.V(4).Infof("Skipping DNS record pre-creation because feature flag not enabled")
@ -240,7 +241,7 @@ func precreateDNS(cluster *kops.Cluster, cloud fi.Cloud) error {
}
if len(created) != 0 {
err := changeset.Apply()
err := changeset.Apply(ctx)
if err != nil {
return fmt.Errorf("error pre-creating DNS records: %v", err)
}