Merge pull request #4065 from mrueg/provider-public

feat: make webhook httpapi reusable
This commit is contained in:
Kubernetes Prow Robot 2023-11-26 11:23:18 +01:00 committed by GitHub
commit a60480f414
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 31 deletions

View File

@ -31,13 +31,13 @@ import (
) )
type WebhookServer struct { type WebhookServer struct {
provider provider.Provider Provider provider.Provider
} }
func (p *WebhookServer) recordsHandler(w http.ResponseWriter, req *http.Request) { func (p *WebhookServer) RecordsHandler(w http.ResponseWriter, req *http.Request) {
switch req.Method { switch req.Method {
case http.MethodGet: case http.MethodGet:
records, err := p.provider.Records(context.Background()) records, err := p.Provider.Records(context.Background())
if err != nil { if err != nil {
log.Errorf("Failed to get Records: %v", err) log.Errorf("Failed to get Records: %v", err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
@ -56,7 +56,7 @@ func (p *WebhookServer) recordsHandler(w http.ResponseWriter, req *http.Request)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
err := p.provider.ApplyChanges(context.Background(), &changes) err := p.Provider.ApplyChanges(context.Background(), &changes)
if err != nil { if err != nil {
log.Errorf("Failed to Apply Changes: %v", err) log.Errorf("Failed to Apply Changes: %v", err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
@ -70,7 +70,7 @@ func (p *WebhookServer) recordsHandler(w http.ResponseWriter, req *http.Request)
} }
} }
func (p *WebhookServer) adjustEndpointsHandler(w http.ResponseWriter, req *http.Request) { func (p *WebhookServer) AdjustEndpointsHandler(w http.ResponseWriter, req *http.Request) {
if req.Method != http.MethodPost { if req.Method != http.MethodPost {
log.Errorf("Unsupported method %s", req.Method) log.Errorf("Unsupported method %s", req.Method)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
@ -84,7 +84,7 @@ func (p *WebhookServer) adjustEndpointsHandler(w http.ResponseWriter, req *http.
return return
} }
w.Header().Set(contentTypeHeader, mediaTypeFormatAndVersion) w.Header().Set(contentTypeHeader, mediaTypeFormatAndVersion)
pve, err := p.provider.AdjustEndpoints(pve) pve, err := p.Provider.AdjustEndpoints(pve)
if err != nil { if err != nil {
log.Errorf("Failed to call adjust endpoints: %v", err) log.Errorf("Failed to call adjust endpoints: %v", err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
@ -96,9 +96,9 @@ func (p *WebhookServer) adjustEndpointsHandler(w http.ResponseWriter, req *http.
} }
} }
func (p *WebhookServer) negotiateHandler(w http.ResponseWriter, req *http.Request) { func (p *WebhookServer) NegotiateHandler(w http.ResponseWriter, req *http.Request) {
w.Header().Set(contentTypeHeader, mediaTypeFormatAndVersion) w.Header().Set(contentTypeHeader, mediaTypeFormatAndVersion)
json.NewEncoder(w).Encode(p.provider.GetDomainFilter()) json.NewEncoder(w).Encode(p.Provider.GetDomainFilter())
} }
// StartHTTPApi starts a HTTP server given any provider. // StartHTTPApi starts a HTTP server given any provider.
@ -111,13 +111,13 @@ func (p *WebhookServer) negotiateHandler(w http.ResponseWriter, req *http.Reques
// - /adjustendpoints (POST): executes the AdjustEndpoints method // - /adjustendpoints (POST): executes the AdjustEndpoints method
func StartHTTPApi(provider provider.Provider, startedChan chan struct{}, readTimeout, writeTimeout time.Duration, providerPort string) { func StartHTTPApi(provider provider.Provider, startedChan chan struct{}, readTimeout, writeTimeout time.Duration, providerPort string) {
p := WebhookServer{ p := WebhookServer{
provider: provider, Provider: provider,
} }
m := http.NewServeMux() m := http.NewServeMux()
m.HandleFunc("/", p.negotiateHandler) m.HandleFunc("/", p.NegotiateHandler)
m.HandleFunc("/records", p.recordsHandler) m.HandleFunc("/records", p.RecordsHandler)
m.HandleFunc("/adjustendpoints", p.adjustEndpointsHandler) m.HandleFunc("/adjustendpoints", p.AdjustEndpointsHandler)
s := &http.Server{ s := &http.Server{
Addr: providerPort, Addr: providerPort,

View File

@ -81,11 +81,11 @@ func TestRecordsHandlerRecords(t *testing.T) {
w := httptest.NewRecorder() w := httptest.NewRecorder()
providerAPIServer := &WebhookServer{ providerAPIServer := &WebhookServer{
provider: &FakeWebhookProvider{ Provider: &FakeWebhookProvider{
domainFilter: endpoint.NewDomainFilter([]string{"foo.bar.com"}), domainFilter: endpoint.NewDomainFilter([]string{"foo.bar.com"}),
}, },
} }
providerAPIServer.recordsHandler(w, req) providerAPIServer.RecordsHandler(w, req)
res := w.Result() res := w.Result()
require.Equal(t, http.StatusOK, res.StatusCode) require.Equal(t, http.StatusOK, res.StatusCode)
// require that the res has the same endpoints as the records slice // require that the res has the same endpoints as the records slice
@ -103,11 +103,11 @@ func TestRecordsHandlerRecordsWithErrors(t *testing.T) {
w := httptest.NewRecorder() w := httptest.NewRecorder()
providerAPIServer := &WebhookServer{ providerAPIServer := &WebhookServer{
provider: &FakeWebhookProvider{ Provider: &FakeWebhookProvider{
err: fmt.Errorf("error"), err: fmt.Errorf("error"),
}, },
} }
providerAPIServer.recordsHandler(w, req) providerAPIServer.RecordsHandler(w, req)
res := w.Result() res := w.Result()
require.Equal(t, http.StatusInternalServerError, res.StatusCode) require.Equal(t, http.StatusInternalServerError, res.StatusCode)
} }
@ -117,9 +117,9 @@ func TestRecordsHandlerApplyChangesWithBadRequest(t *testing.T) {
w := httptest.NewRecorder() w := httptest.NewRecorder()
providerAPIServer := &WebhookServer{ providerAPIServer := &WebhookServer{
provider: &FakeWebhookProvider{}, Provider: &FakeWebhookProvider{},
} }
providerAPIServer.recordsHandler(w, req) providerAPIServer.RecordsHandler(w, req)
res := w.Result() res := w.Result()
require.Equal(t, http.StatusBadRequest, res.StatusCode) require.Equal(t, http.StatusBadRequest, res.StatusCode)
} }
@ -143,9 +143,9 @@ func TestRecordsHandlerApplyChangesWithValidRequest(t *testing.T) {
w := httptest.NewRecorder() w := httptest.NewRecorder()
providerAPIServer := &WebhookServer{ providerAPIServer := &WebhookServer{
provider: &FakeWebhookProvider{}, Provider: &FakeWebhookProvider{},
} }
providerAPIServer.recordsHandler(w, req) providerAPIServer.RecordsHandler(w, req)
res := w.Result() res := w.Result()
require.Equal(t, http.StatusNoContent, res.StatusCode) require.Equal(t, http.StatusNoContent, res.StatusCode)
} }
@ -169,11 +169,11 @@ func TestRecordsHandlerApplyChangesWithErrors(t *testing.T) {
w := httptest.NewRecorder() w := httptest.NewRecorder()
providerAPIServer := &WebhookServer{ providerAPIServer := &WebhookServer{
provider: &FakeWebhookProvider{ Provider: &FakeWebhookProvider{
err: fmt.Errorf("error"), err: fmt.Errorf("error"),
}, },
} }
providerAPIServer.recordsHandler(w, req) providerAPIServer.RecordsHandler(w, req)
res := w.Result() res := w.Result()
require.Equal(t, http.StatusInternalServerError, res.StatusCode) require.Equal(t, http.StatusInternalServerError, res.StatusCode)
} }
@ -183,9 +183,9 @@ func TestRecordsHandlerWithWrongHTTPMethod(t *testing.T) {
w := httptest.NewRecorder() w := httptest.NewRecorder()
providerAPIServer := &WebhookServer{ providerAPIServer := &WebhookServer{
provider: &FakeWebhookProvider{}, Provider: &FakeWebhookProvider{},
} }
providerAPIServer.recordsHandler(w, req) providerAPIServer.RecordsHandler(w, req)
res := w.Result() res := w.Result()
require.Equal(t, http.StatusBadRequest, res.StatusCode) require.Equal(t, http.StatusBadRequest, res.StatusCode)
} }
@ -195,15 +195,15 @@ func TestAdjustEndpointsHandlerWithInvalidRequest(t *testing.T) {
w := httptest.NewRecorder() w := httptest.NewRecorder()
providerAPIServer := &WebhookServer{ providerAPIServer := &WebhookServer{
provider: &FakeWebhookProvider{}, Provider: &FakeWebhookProvider{},
} }
providerAPIServer.adjustEndpointsHandler(w, req) providerAPIServer.AdjustEndpointsHandler(w, req)
res := w.Result() res := w.Result()
require.Equal(t, http.StatusBadRequest, res.StatusCode) require.Equal(t, http.StatusBadRequest, res.StatusCode)
req = httptest.NewRequest(http.MethodGet, "/adjustendpoints", nil) req = httptest.NewRequest(http.MethodGet, "/adjustendpoints", nil)
providerAPIServer.adjustEndpointsHandler(w, req) providerAPIServer.AdjustEndpointsHandler(w, req)
res = w.Result() res = w.Result()
require.Equal(t, http.StatusBadRequest, res.StatusCode) require.Equal(t, http.StatusBadRequest, res.StatusCode)
} }
@ -226,9 +226,9 @@ func TestAdjustEndpointsHandlerWithValidRequest(t *testing.T) {
w := httptest.NewRecorder() w := httptest.NewRecorder()
providerAPIServer := &WebhookServer{ providerAPIServer := &WebhookServer{
provider: &FakeWebhookProvider{}, Provider: &FakeWebhookProvider{},
} }
providerAPIServer.adjustEndpointsHandler(w, req) providerAPIServer.AdjustEndpointsHandler(w, req)
res := w.Result() res := w.Result()
require.Equal(t, http.StatusOK, res.StatusCode) require.Equal(t, http.StatusOK, res.StatusCode)
require.NotNil(t, res.Body) require.NotNil(t, res.Body)
@ -252,11 +252,11 @@ func TestAdjustEndpointsHandlerWithError(t *testing.T) {
w := httptest.NewRecorder() w := httptest.NewRecorder()
providerAPIServer := &WebhookServer{ providerAPIServer := &WebhookServer{
provider: &FakeWebhookProvider{ Provider: &FakeWebhookProvider{
err: fmt.Errorf("error"), err: fmt.Errorf("error"),
}, },
} }
providerAPIServer.adjustEndpointsHandler(w, req) providerAPIServer.AdjustEndpointsHandler(w, req)
res := w.Result() res := w.Result()
require.Equal(t, http.StatusInternalServerError, res.StatusCode) require.Equal(t, http.StatusInternalServerError, res.StatusCode)
require.NotNil(t, res.Body) require.NotNil(t, res.Body)