sigs.k8s.io/external-dns@v0.14.1/provider/webhook/webhook_test.go (about) 1 /* 2 Copyright 2023 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package webhook 18 19 import ( 20 "context" 21 "encoding/json" 22 "io" 23 "net/http" 24 "net/http/httptest" 25 "testing" 26 27 "github.com/stretchr/testify/require" 28 "sigs.k8s.io/external-dns/endpoint" 29 webhookapi "sigs.k8s.io/external-dns/provider/webhook/api" 30 ) 31 32 func TestInvalidDomainFilter(t *testing.T) { 33 svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 34 if r.URL.Path == "/" { 35 w.Header().Set(webhookapi.ContentTypeHeader, webhookapi.MediaTypeFormatAndVersion) 36 w.WriteHeader(200) 37 return 38 } 39 w.Write([]byte(`[{ 40 "dnsName" : "test.example.com" 41 }]`)) 42 })) 43 defer svr.Close() 44 45 _, err := NewWebhookProvider(svr.URL) 46 require.Error(t, err) 47 } 48 49 func TestValidDomainfilter(t *testing.T) { 50 // initialize domain filter 51 domainFilter := endpoint.NewDomainFilter([]string{"example.com"}) 52 svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 53 if r.URL.Path == "/" { 54 w.Header().Set(webhookapi.ContentTypeHeader, webhookapi.MediaTypeFormatAndVersion) 55 json.NewEncoder(w).Encode(domainFilter) 56 return 57 } 58 })) 59 defer svr.Close() 60 61 p, err := NewWebhookProvider(svr.URL) 62 require.NoError(t, err) 63 require.Equal(t, p.GetDomainFilter(), endpoint.NewDomainFilter([]string{"example.com"})) 64 } 65 66 func TestRecords(t *testing.T) { 67 svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 68 if r.URL.Path == "/" { 69 w.Header().Set(webhookapi.ContentTypeHeader, webhookapi.MediaTypeFormatAndVersion) 70 w.Write([]byte(`{}`)) 71 return 72 } 73 require.Equal(t, "/records", r.URL.Path) 74 w.Write([]byte(`[{ 75 "dnsName" : "test.example.com" 76 }]`)) 77 })) 78 defer svr.Close() 79 80 provider, err := NewWebhookProvider(svr.URL) 81 require.NoError(t, err) 82 endpoints, err := provider.Records(context.TODO()) 83 require.NoError(t, err) 84 require.NotNil(t, endpoints) 85 require.Equal(t, []*endpoint.Endpoint{{ 86 DNSName: "test.example.com", 87 }}, endpoints) 88 } 89 90 func TestRecordsWithErrors(t *testing.T) { 91 svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 92 if r.URL.Path == "/" { 93 w.Header().Set(webhookapi.ContentTypeHeader, webhookapi.MediaTypeFormatAndVersion) 94 w.Write([]byte(`{}`)) 95 return 96 } 97 require.Equal(t, "/records", r.URL.Path) 98 w.WriteHeader(http.StatusInternalServerError) 99 })) 100 defer svr.Close() 101 102 provider, err := NewWebhookProvider(svr.URL) 103 require.NoError(t, err) 104 _, err = provider.Records(context.Background()) 105 require.NotNil(t, err) 106 } 107 108 func TestApplyChanges(t *testing.T) { 109 successfulApplyChanges := true 110 svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 111 if r.URL.Path == "/" { 112 w.Header().Set(webhookapi.ContentTypeHeader, webhookapi.MediaTypeFormatAndVersion) 113 w.Write([]byte(`{}`)) 114 return 115 } 116 require.Equal(t, "/records", r.URL.Path) 117 if successfulApplyChanges { 118 w.WriteHeader(http.StatusNoContent) 119 } else { 120 w.WriteHeader(http.StatusInternalServerError) 121 } 122 })) 123 defer svr.Close() 124 125 provider, err := NewWebhookProvider(svr.URL) 126 require.NoError(t, err) 127 err = provider.ApplyChanges(context.TODO(), nil) 128 require.NoError(t, err) 129 130 successfulApplyChanges = false 131 132 err = provider.ApplyChanges(context.TODO(), nil) 133 require.NotNil(t, err) 134 } 135 136 func TestAdjustEndpoints(t *testing.T) { 137 svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 138 if r.URL.Path == "/" { 139 w.Header().Set(webhookapi.ContentTypeHeader, webhookapi.MediaTypeFormatAndVersion) 140 w.Write([]byte(`{}`)) 141 return 142 } 143 require.Equal(t, "/adjustendpoints", r.URL.Path) 144 145 var endpoints []*endpoint.Endpoint 146 defer r.Body.Close() 147 b, err := io.ReadAll(r.Body) 148 if err != nil { 149 t.Fatal(err) 150 } 151 err = json.Unmarshal(b, &endpoints) 152 if err != nil { 153 t.Fatal(err) 154 } 155 156 for _, e := range endpoints { 157 e.RecordTTL = 0 158 } 159 j, _ := json.Marshal(endpoints) 160 w.Write(j) 161 162 })) 163 defer svr.Close() 164 165 provider, err := NewWebhookProvider(svr.URL) 166 require.NoError(t, err) 167 endpoints := []*endpoint.Endpoint{ 168 { 169 DNSName: "test.example.com", 170 RecordTTL: 10, 171 RecordType: "A", 172 Targets: endpoint.Targets{ 173 "", 174 }, 175 }, 176 } 177 adjustedEndpoints, err := provider.AdjustEndpoints(endpoints) 178 require.NoError(t, err) 179 require.Equal(t, []*endpoint.Endpoint{{ 180 DNSName: "test.example.com", 181 RecordTTL: 0, 182 RecordType: "A", 183 Targets: endpoint.Targets{ 184 "", 185 }, 186 }}, adjustedEndpoints) 187 } 188 189 func TestAdjustendpointsWithError(t *testing.T) { 190 svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 191 if r.URL.Path == "/" { 192 w.Header().Set(webhookapi.ContentTypeHeader, webhookapi.MediaTypeFormatAndVersion) 193 w.Write([]byte(`{}`)) 194 return 195 } 196 require.Equal(t, "/adjustendpoints", r.URL.Path) 197 w.WriteHeader(http.StatusInternalServerError) 198 })) 199 defer svr.Close() 200 201 provider, err := NewWebhookProvider(svr.URL) 202 require.NoError(t, err) 203 endpoints := []*endpoint.Endpoint{ 204 { 205 DNSName: "test.example.com", 206 RecordTTL: 10, 207 RecordType: "A", 208 Targets: endpoint.Targets{ 209 "", 210 }, 211 }, 212 } 213 _, err = provider.AdjustEndpoints(endpoints) 214 require.Error(t, err) 215 }