mirror of
https://github.com/kubernetes-sigs/external-dns.git
synced 2025-08-06 09:36:58 +02:00
avoid unnecessary updating for CRD resource
with test updated
This commit is contained in:
parent
e2b47aaf16
commit
fc245c088d
@ -118,6 +118,11 @@ func (cs *crdSource) Endpoints() ([]*endpoint.Endpoint, error) {
|
|||||||
|
|
||||||
for _, dnsEndpoint := range result.Items {
|
for _, dnsEndpoint := range result.Items {
|
||||||
endpoints = append(endpoints, dnsEndpoint.Spec.Endpoints...)
|
endpoints = append(endpoints, dnsEndpoint.Spec.Endpoints...)
|
||||||
|
|
||||||
|
if dnsEndpoint.Status.ObservedGeneration == dnsEndpoint.Generation {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
dnsEndpoint.Status.ObservedGeneration = dnsEndpoint.Generation
|
dnsEndpoint.Status.ObservedGeneration = dnsEndpoint.Generation
|
||||||
// Update the ObservedGeneration
|
// Update the ObservedGeneration
|
||||||
_, err = cs.UpdateStatus(&dnsEndpoint)
|
_, err = cs.UpdateStatus(&dnsEndpoint)
|
||||||
|
@ -18,6 +18,7 @@ package source
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
@ -54,20 +55,21 @@ func objBody(codec runtime.Codec, obj runtime.Object) io.ReadCloser {
|
|||||||
return ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(codec, obj))))
|
return ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(codec, obj))))
|
||||||
}
|
}
|
||||||
|
|
||||||
func startCRDServerToServeTargets(endpoints []*endpoint.Endpoint, apiVersion, kind, namespace, name string) rest.Interface {
|
func startCRDServerToServeTargets(endpoints []*endpoint.Endpoint, apiVersion, kind, namespace, name string, t *testing.T) rest.Interface {
|
||||||
groupVersion, _ := schema.ParseGroupVersion(apiVersion)
|
groupVersion, _ := schema.ParseGroupVersion(apiVersion)
|
||||||
scheme := runtime.NewScheme()
|
scheme := runtime.NewScheme()
|
||||||
addKnownTypes(scheme, groupVersion)
|
addKnownTypes(scheme, groupVersion)
|
||||||
|
|
||||||
dnsEndpointList := endpoint.DNSEndpointList{}
|
dnsEndpointList := endpoint.DNSEndpointList{}
|
||||||
dnsEndpoint := endpoint.DNSEndpoint{
|
dnsEndpoint := &endpoint.DNSEndpoint{
|
||||||
TypeMeta: metav1.TypeMeta{
|
TypeMeta: metav1.TypeMeta{
|
||||||
APIVersion: apiVersion,
|
APIVersion: apiVersion,
|
||||||
Kind: kind,
|
Kind: kind,
|
||||||
},
|
},
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: name,
|
Name: name,
|
||||||
Namespace: namespace,
|
Namespace: namespace,
|
||||||
|
Generation: 1,
|
||||||
},
|
},
|
||||||
Spec: endpoint.DNSEndpointSpec{
|
Spec: endpoint.DNSEndpointSpec{
|
||||||
Endpoints: endpoints,
|
Endpoints: endpoints,
|
||||||
@ -88,10 +90,18 @@ func startCRDServerToServeTargets(endpoints []*endpoint.Endpoint, apiVersion, ki
|
|||||||
case p == "/apis/"+apiVersion+"/"+strings.ToLower(kind)+"s" && m == http.MethodGet:
|
case p == "/apis/"+apiVersion+"/"+strings.ToLower(kind)+"s" && m == http.MethodGet:
|
||||||
fallthrough
|
fallthrough
|
||||||
case p == "/apis/"+apiVersion+"/namespaces/"+namespace+"/"+strings.ToLower(kind)+"s" && m == http.MethodGet:
|
case p == "/apis/"+apiVersion+"/namespaces/"+namespace+"/"+strings.ToLower(kind)+"s" && m == http.MethodGet:
|
||||||
dnsEndpointList.Items = append(dnsEndpointList.Items, dnsEndpoint)
|
dnsEndpointList.Items = dnsEndpointList.Items[:0]
|
||||||
|
dnsEndpointList.Items = append(dnsEndpointList.Items, *dnsEndpoint)
|
||||||
return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, &dnsEndpointList)}, nil
|
return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, &dnsEndpointList)}, nil
|
||||||
case strings.HasPrefix(p, "/apis/"+apiVersion+"/namespaces/") && strings.HasSuffix(p, strings.ToLower(kind)+"s") && m == http.MethodGet:
|
case strings.HasPrefix(p, "/apis/"+apiVersion+"/namespaces/") && strings.HasSuffix(p, strings.ToLower(kind)+"s") && m == http.MethodGet:
|
||||||
return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, &dnsEndpointList)}, nil
|
return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, &dnsEndpointList)}, nil
|
||||||
|
case p == "/apis/"+apiVersion+"/namespaces/"+namespace+"/"+strings.ToLower(kind)+"s/"+name+"/status" && m == http.MethodPut:
|
||||||
|
decoder := json.NewDecoder(req.Body)
|
||||||
|
|
||||||
|
var body endpoint.DNSEndpoint
|
||||||
|
decoder.Decode(&body)
|
||||||
|
dnsEndpoint.Status.ObservedGeneration = body.Status.ObservedGeneration
|
||||||
|
return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, dnsEndpoint)}, nil
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("unexpected request: %#v\n%#v", req.URL, req)
|
return nil, fmt.Errorf("unexpected request: %#v\n%#v", req.URL, req)
|
||||||
}
|
}
|
||||||
@ -200,6 +210,8 @@ func testCRDSourceEndpoints(t *testing.T) {
|
|||||||
apiVersion: "test.k8s.io/v1alpha1",
|
apiVersion: "test.k8s.io/v1alpha1",
|
||||||
registeredKind: "DNSEndpoint",
|
registeredKind: "DNSEndpoint",
|
||||||
kind: "DNSEndpoint",
|
kind: "DNSEndpoint",
|
||||||
|
namespace: "foo",
|
||||||
|
registeredNamespace: "foo",
|
||||||
endpoints: []*endpoint.Endpoint{
|
endpoints: []*endpoint.Endpoint{
|
||||||
{DNSName: "abc.example.org",
|
{DNSName: "abc.example.org",
|
||||||
Targets: endpoint.Targets{"1.2.3.4"},
|
Targets: endpoint.Targets{"1.2.3.4"},
|
||||||
@ -216,6 +228,8 @@ func testCRDSourceEndpoints(t *testing.T) {
|
|||||||
apiVersion: "test.k8s.io/v1alpha1",
|
apiVersion: "test.k8s.io/v1alpha1",
|
||||||
registeredKind: "DNSEndpoint",
|
registeredKind: "DNSEndpoint",
|
||||||
kind: "DNSEndpoint",
|
kind: "DNSEndpoint",
|
||||||
|
namespace: "foo",
|
||||||
|
registeredNamespace: "foo",
|
||||||
endpoints: []*endpoint.Endpoint{
|
endpoints: []*endpoint.Endpoint{
|
||||||
{DNSName: "abc.example.org",
|
{DNSName: "abc.example.org",
|
||||||
Targets: endpoint.Targets{"1.2.3.4"},
|
Targets: endpoint.Targets{"1.2.3.4"},
|
||||||
@ -233,7 +247,7 @@ func testCRDSourceEndpoints(t *testing.T) {
|
|||||||
},
|
},
|
||||||
} {
|
} {
|
||||||
t.Run(ti.title, func(t *testing.T) {
|
t.Run(ti.title, func(t *testing.T) {
|
||||||
restClient := startCRDServerToServeTargets(ti.endpoints, ti.registeredAPIVersion, ti.registeredKind, ti.registeredNamespace, "")
|
restClient := startCRDServerToServeTargets(ti.endpoints, ti.registeredAPIVersion, ti.registeredKind, ti.registeredNamespace, "test", t)
|
||||||
groupVersion, err := schema.ParseGroupVersion(ti.apiVersion)
|
groupVersion, err := schema.ParseGroupVersion(ti.apiVersion)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
@ -253,8 +267,28 @@ func testCRDSourceEndpoints(t *testing.T) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
validateCRDResource(t, cs, ti.expectError)
|
||||||
|
}
|
||||||
|
|
||||||
// Validate received endpoints against expected endpoints.
|
// Validate received endpoints against expected endpoints.
|
||||||
validateEndpoints(t, receivedEndpoints, ti.endpoints)
|
validateEndpoints(t, receivedEndpoints, ti.endpoints)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func validateCRDResource(t *testing.T, src Source, expectError bool) {
|
||||||
|
cs := src.(*crdSource)
|
||||||
|
result, err := cs.List(&metav1.ListOptions{})
|
||||||
|
if expectError {
|
||||||
|
require.Errorf(t, err, "Received err %v", err)
|
||||||
|
} else {
|
||||||
|
require.NoErrorf(t, err, "Received err %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, dnsEndpoint := range result.Items {
|
||||||
|
if dnsEndpoint.Status.ObservedGeneration != dnsEndpoint.Generation {
|
||||||
|
require.Errorf(t, err, "Unexpected CRD resource result: ObservedGenerations <%v> is not equal to Generation<%v>", dnsEndpoint.Status.ObservedGeneration, dnsEndpoint.Generation)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user