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  }