Skip to content
This repository has been archived by the owner on Dec 21, 2023. It is now read-only.

Commit

Permalink
pr review
Browse files Browse the repository at this point in the history
Signed-off-by: odubajDT <ondrej.dubaj@dynatrace.com>
  • Loading branch information
odubajDT committed May 1, 2022
1 parent 0226a4d commit e20366c
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 30 deletions.
6 changes: 3 additions & 3 deletions webhook-service/lib/denylist_provider.go
Expand Up @@ -13,21 +13,21 @@ type DenyListProvider interface {
Get() []string
}

type DenyListProviderStruct struct {
type denyListProvider struct {
GetDeniedURLs GetDeniedURLsFunc
KubeClient kubernetes.Interface
}

type GetDeniedURLsFunc func(env map[string]string) []string

func NewDenyListProvider(kubeClient kubernetes.Interface) DenyListProvider {
return DenyListProviderStruct{
return denyListProvider{
GetDeniedURLs: GetDeniedURLs,
KubeClient: kubeClient,
}
}

func (d DenyListProviderStruct) Get() []string {
func (d denyListProvider) Get() []string {
denyList := d.GetDeniedURLs(GetEnv())

configMap, err := d.KubeClient.CoreV1().ConfigMaps(GetNamespaceFromEnvVar()).Get(context.TODO(), WebhookConfigMap, metav1.GetOptions{})
Expand Down
13 changes: 6 additions & 7 deletions webhook-service/lib/denylist_provider_test.go
@@ -1,12 +1,11 @@
package lib_test
package lib

import (
"fmt"
"testing"

"k8s.io/apimachinery/pkg/runtime"

"github.com/keptn/keptn/webhook-service/lib"
"github.com/stretchr/testify/require"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand All @@ -16,7 +15,7 @@ import (

func TestDeniedURLS(t *testing.T) {
kubeEnvs := map[string]string{"KUBERNETES_SERVICE_HOST": "1.2.3.4", "KUBERNETES_SERVICE_PORT": "9876"}
urls := lib.GetDeniedURLs(kubeEnvs)
urls := GetDeniedURLs(kubeEnvs)

expected := []string{"1.2.3.4", "kubernetes:9876", "kubernetes.default:9876", "kubernetes.default.svc:9876", "kubernetes.default.svc.cluster.local:9876", "1.2.3.4:9876"}

Expand All @@ -29,7 +28,7 @@ func TestCannotGetConfigMap(t *testing.T) {
client.PrependReactor("get", "configmap", func(action k8stesting.Action) (handled bool, ret runtime.Object, err error) {
return true, nil, fmt.Errorf("cannot get configmap")
})
denyListProvider := lib.DenyListProviderStruct{
denyListProvider := denyListProvider{
GetDeniedURLs: func(env map[string]string) []string {
return []string{"1.2.3.4", "kubernetes:9876"}
},
Expand All @@ -45,12 +44,12 @@ func TestGetDenyList(t *testing.T) {
denyListString := "some\nurl\nip"
tests := []struct {
name string
denyListProvider lib.DenyListProvider
denyListProvider DenyListProvider
want []string
}{
{
name: "valid empty configmap",
denyListProvider: lib.DenyListProviderStruct{
denyListProvider: denyListProvider{
GetDeniedURLs: func(env map[string]string) []string {
return []string{"1.2.3.4", "kubernetes:9876"}
},
Expand All @@ -67,7 +66,7 @@ func TestGetDenyList(t *testing.T) {
},
{
name: "valid",
denyListProvider: lib.DenyListProviderStruct{
denyListProvider: denyListProvider{
KubeClient: fake.NewSimpleClientset(
&corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Expand Down
21 changes: 12 additions & 9 deletions webhook-service/lib/ip_resolver.go
Expand Up @@ -2,37 +2,40 @@ package lib

import (
"net"
"net/url"
neturl "net/url"

logger "github.com/sirupsen/logrus"
)

type IPResolver interface {
Resolve(curlURL string) []string
Resolve(url string) []string
}

type LookupFunc func(host string) ([]net.IP, error)
type ParseFunc func(rawURL string) (*neturl.URL, error)

type IpResolver struct {
type ipResolver struct {
LookupIP LookupFunc
Parse ParseFunc
}

func NewIPResolver(lookUpIPFunc ...LookupFunc) IPResolver {
return IpResolver{
func NewIPResolver() IPResolver {
return ipResolver{
LookupIP: net.LookupIP,
Parse: neturl.Parse,
}
}

func (i IpResolver) Resolve(curlURL string) []string {
func (i ipResolver) Resolve(url string) []string {
ipAddresses := make([]string, 0)
parsedURL, err := url.Parse(curlURL)
parsedURL, err := i.Parse(url)
if err != nil {
logger.Errorf("Unable to parse URL: %s", curlURL)
logger.Errorf("Unable to parse URL: %s", url)
return ipAddresses
}
ips, err := i.LookupIP(parsedURL.Hostname())
if err != nil {
logger.Errorf("Unable to look up IP for URL: %s", curlURL)
logger.Errorf("Unable to look up IP for URL: %s", url)
return ipAddresses
}
for _, ip := range ips {
Expand Down
28 changes: 19 additions & 9 deletions webhook-service/lib/ip_resolver_test.go
@@ -1,35 +1,40 @@
package lib_test
package lib

import (
"fmt"
"net"
"net/url"
"testing"

"github.com/keptn/keptn/webhook-service/lib"
"github.com/stretchr/testify/require"
)

func TestCurlValidator_ResolveIPAddresses(t *testing.T) {
tests := []struct {
name string
url string
ipResolver lib.IpResolver
ipResolver ipResolver
want []string
}{
{
name: "error output",
name: "unparsable address",
url: "http://some-url",
ipResolver: lib.IpResolver{
LookupIP: func(host string) ([]net.IP, error) {
return make([]net.IP, 0), fmt.Errorf("some error")
ipResolver: ipResolver{
Parse: func(rawURL string) (*url.URL, error) {
return nil, fmt.Errorf("some error")
},
},
want: make([]string, 0),
},
{
name: "no existing address",
url: "http://some-url",
ipResolver: lib.IpResolver{
ipResolver: ipResolver{
Parse: func(rawURL string) (*url.URL, error) {
return &url.URL{
Host: "some-url",
}, nil
},
LookupIP: func(host string) ([]net.IP, error) {
return make([]net.IP, 0), nil
},
Expand All @@ -39,7 +44,12 @@ func TestCurlValidator_ResolveIPAddresses(t *testing.T) {
{
name: "ip addresses list",
url: "http://some-url",
ipResolver: lib.IpResolver{
ipResolver: ipResolver{
Parse: func(rawURL string) (*url.URL, error) {
return &url.URL{
Host: "some-url",
}, nil
},
LookupIP: func(host string) ([]net.IP, error) {
return []net.IP{net.ParseIP("1.1.1.1"), net.ParseIP("2.2.2.2")}, nil
},
Expand Down
2 changes: 1 addition & 1 deletion webhook-service/lib/request_validator.go
Expand Up @@ -24,7 +24,7 @@ func NewRequestValidator(denyListProvider DenyListProvider, ipResolver IPResolve

func (c requestValidator) Validate(request Request) error {
if request.URL == "" {
return fmt.Errorf("invalid curl URL: '%s'", request.URL)
return fmt.Errorf("curl command contains empty URL")
}

denyList := c.denyListProvider.Get()
Expand Down
2 changes: 1 addition & 1 deletion webhook-service/lib/request_validator_test.go
Expand Up @@ -69,7 +69,7 @@ func TestRequestValidator_Validate(t *testing.T) {
return []string{"1.1.1.1"}
},
},
want: fmt.Errorf("invalid curl URL: ''"),
want: fmt.Errorf("curl command contains empty URL"),
wantErr: true,
},
{
Expand Down

0 comments on commit e20366c

Please sign in to comment.