Add webhook server to tests (#2873)
* Add webhook server to tests * fix config for webhoook service * Fix logger in webhook manager * Use interface for webhook manager * single reference for router url * Cleanup token code --------- Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>
This commit is contained in:
@@ -3,9 +3,11 @@ package cli_test
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/util/wait"
|
||||
|
||||
v1 "github.com/fission/fission/pkg/apis/core/v1"
|
||||
"github.com/fission/fission/pkg/utils/manager"
|
||||
@@ -20,6 +22,7 @@ func TestFissionCLI(t *testing.T) {
|
||||
defer mgr.Wait()
|
||||
|
||||
f := framework.NewFramework()
|
||||
defer f.Logger().Sync()
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
err := f.Start(ctx)
|
||||
@@ -28,6 +31,14 @@ func TestFissionCLI(t *testing.T) {
|
||||
err = services.StartServices(ctx, f, mgr)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = wait.PollUntilContextTimeout(ctx, time.Second*5, time.Second*50, true, func(_ context.Context) (bool, error) {
|
||||
if err := f.CheckService("webhook"); err != nil {
|
||||
return false, nil
|
||||
}
|
||||
return true, nil
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
fissionClient, err := f.ClientGen().GetFissionClient()
|
||||
require.NoError(t, err)
|
||||
|
||||
|
||||
@@ -2,9 +2,13 @@ package framework
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"go.uber.org/zap"
|
||||
@@ -29,10 +33,34 @@ type Framework struct {
|
||||
env *envtest.Environment
|
||||
config *rest.Config
|
||||
logger *zap.Logger
|
||||
ServiceInfo map[string]ServiceInfo
|
||||
serviceInfo map[string]ServiceInfo
|
||||
}
|
||||
|
||||
func NewWebhookOptions() (*envtest.WebhookInstallOptions, error) {
|
||||
webhookPort, err := utils.FindFreePort()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error finding unused port: %v", err)
|
||||
}
|
||||
_, filename, _, _ := runtime.Caller(0) //nolint
|
||||
root := filepath.Dir(filename)
|
||||
|
||||
options := &envtest.WebhookInstallOptions{
|
||||
LocalServingHost: "localhost",
|
||||
LocalServingPort: webhookPort,
|
||||
Paths: []string{filepath.Join(root, "webhook-manifest.yaml")},
|
||||
}
|
||||
err = options.PrepWithoutInstalling()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error preparing webhook install options: %v", err)
|
||||
}
|
||||
return options, nil
|
||||
}
|
||||
|
||||
func NewFramework() *Framework {
|
||||
webhookOptions, err := NewWebhookOptions()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return &Framework{
|
||||
logger: loggerfactory.GetLogger(),
|
||||
env: &envtest.Environment{
|
||||
@@ -41,12 +69,17 @@ func NewFramework() *Framework {
|
||||
CRDInstallOptions: envtest.CRDInstallOptions{
|
||||
MaxTime: 60 * time.Second,
|
||||
},
|
||||
WebhookInstallOptions: *webhookOptions,
|
||||
BinaryAssetsDirectory: os.Getenv("KUBEBUILDER_ASSETS"),
|
||||
},
|
||||
ServiceInfo: make(map[string]ServiceInfo),
|
||||
serviceInfo: make(map[string]ServiceInfo),
|
||||
}
|
||||
}
|
||||
|
||||
func (f *Framework) GetEnv() *envtest.Environment {
|
||||
return f.env
|
||||
}
|
||||
|
||||
func (f *Framework) Start(ctx context.Context) error {
|
||||
var err error
|
||||
f.config, err = f.env.Start()
|
||||
@@ -84,3 +117,41 @@ func (f *Framework) Stop() error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *Framework) AddServiceInfo(name string, info ServiceInfo) {
|
||||
f.serviceInfo[name] = info
|
||||
f.logger.Info("Added service", zap.String("name", name), zap.Any("info", info))
|
||||
}
|
||||
|
||||
func (f *Framework) GetServiceURL(name string) (string, error) {
|
||||
info, ok := f.serviceInfo[name]
|
||||
if !ok {
|
||||
return "", fmt.Errorf("service %s not found", name)
|
||||
}
|
||||
if info.Port == 0 {
|
||||
return "", fmt.Errorf("service %s port not set", name)
|
||||
}
|
||||
return fmt.Sprintf("http://localhost:%d", info.Port), nil
|
||||
}
|
||||
|
||||
func (f *Framework) CheckService(name string) error {
|
||||
_, err := f.GetServiceURL(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
config := &tls.Config{
|
||||
InsecureSkipVerify: true, //nolint:gosec // config is used to connect to our own webhook port.
|
||||
}
|
||||
|
||||
d := &net.Dialer{Timeout: 10 * time.Second}
|
||||
conn, err := tls.DialWithDialer(d, "tcp", net.JoinHostPort("localhost", strconv.Itoa(f.serviceInfo[name].Port)), config)
|
||||
if err != nil {
|
||||
return fmt.Errorf("webhook server is not reachable: %w", err)
|
||||
}
|
||||
|
||||
if err := conn.Close(); err != nil {
|
||||
return fmt.Errorf("webhook server is not reachable: closing connection: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -5,6 +5,9 @@ import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"go.uber.org/zap"
|
||||
cnwebhook "sigs.k8s.io/controller-runtime/pkg/webhook"
|
||||
|
||||
"github.com/fission/fission/pkg/buildermgr"
|
||||
"github.com/fission/fission/pkg/executor"
|
||||
eclient "github.com/fission/fission/pkg/executor/client"
|
||||
@@ -15,10 +18,28 @@ import (
|
||||
"github.com/fission/fission/pkg/timer"
|
||||
"github.com/fission/fission/pkg/utils"
|
||||
"github.com/fission/fission/pkg/utils/manager"
|
||||
"github.com/fission/fission/pkg/webhook"
|
||||
"github.com/fission/fission/test/e2e/framework"
|
||||
)
|
||||
|
||||
func StartServices(ctx context.Context, f *framework.Framework, mgr manager.Interface) error {
|
||||
os.Setenv("DEBUG_ENV", "true")
|
||||
env := f.GetEnv()
|
||||
webhookPort := env.WebhookInstallOptions.LocalServingPort
|
||||
err := f.ToggleMetricAddr()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error toggling metric address: %v", err)
|
||||
}
|
||||
mgr.Add(ctx, func(ctx context.Context) {
|
||||
err = webhook.Start(ctx, f.ClientGen(), f.Logger(), cnwebhook.Options{
|
||||
Port: webhookPort,
|
||||
CertDir: env.WebhookInstallOptions.LocalServingCertDir,
|
||||
})
|
||||
if err != nil {
|
||||
f.Logger().Fatal("error starting webhook", zap.Error(err))
|
||||
}
|
||||
})
|
||||
f.AddServiceInfo("webhook", framework.ServiceInfo{Port: webhookPort})
|
||||
|
||||
executorPort, err := utils.FindFreePort()
|
||||
if err != nil {
|
||||
@@ -44,9 +65,7 @@ func StartServices(ctx context.Context, f *framework.Framework, mgr manager.Inte
|
||||
if err != nil {
|
||||
return fmt.Errorf("error starting executor: %v", err)
|
||||
}
|
||||
f.ServiceInfo["executor"] = framework.ServiceInfo{
|
||||
Port: executorPort,
|
||||
}
|
||||
f.AddServiceInfo("executor", framework.ServiceInfo{Port: executorPort})
|
||||
|
||||
os.Setenv("PRUNE_ENABLED", "true")
|
||||
os.Setenv("PRUNE_INTERVAL", "60")
|
||||
@@ -67,9 +86,7 @@ func StartServices(ctx context.Context, f *framework.Framework, mgr manager.Inte
|
||||
if err != nil {
|
||||
return fmt.Errorf("error starting storage service: %v", err)
|
||||
}
|
||||
f.ServiceInfo["storagesvc"] = framework.ServiceInfo{
|
||||
Port: storageSvcPort,
|
||||
}
|
||||
f.AddServiceInfo("storagesvc", framework.ServiceInfo{Port: storageSvcPort})
|
||||
err = f.ToggleMetricAddr()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error toggling metric address: %v", err)
|
||||
@@ -78,7 +95,7 @@ func StartServices(ctx context.Context, f *framework.Framework, mgr manager.Inte
|
||||
if err != nil {
|
||||
return fmt.Errorf("error starting builder manager: %v", err)
|
||||
}
|
||||
f.ServiceInfo["buildermgr"] = framework.ServiceInfo{}
|
||||
f.AddServiceInfo("buildermgr", framework.ServiceInfo{})
|
||||
|
||||
os.Setenv("ROUTER_ROUND_TRIP_TIMEOUT", "50ms")
|
||||
os.Setenv("ROUTER_ROUNDTRIP_TIMEOUT_EXPONENT", "2")
|
||||
@@ -89,8 +106,8 @@ func StartServices(ctx context.Context, f *framework.Framework, mgr manager.Inte
|
||||
os.Setenv("ROUTER_SVC_ADDRESS_UPDATE_TIMEOUT", "30s")
|
||||
os.Setenv("ROUTER_UNTAP_SERVICE_TIMEOUT", "3600s")
|
||||
os.Setenv("USE_ENCODED_PATH", "false")
|
||||
os.Setenv("DISPLAY_ACCESS_LOG", "false")
|
||||
os.Setenv("DEBUG_ENV", "false")
|
||||
os.Setenv("DISPLAY_ACCESS_LOG", "true")
|
||||
//os.Setenv("DEBUG_ENV", "false")
|
||||
routerPort, err := utils.FindFreePort()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error finding unused port: %v", err)
|
||||
@@ -104,9 +121,8 @@ func StartServices(ctx context.Context, f *framework.Framework, mgr manager.Inte
|
||||
if err != nil {
|
||||
return fmt.Errorf("error starting router: %v", err)
|
||||
}
|
||||
f.ServiceInfo["router"] = framework.ServiceInfo{
|
||||
Port: routerPort,
|
||||
}
|
||||
f.AddServiceInfo("router", framework.ServiceInfo{Port: routerPort})
|
||||
|
||||
routerURL := fmt.Sprintf("http://localhost:%d", routerPort)
|
||||
os.Setenv("FISSION_ROUTER_URL", routerURL)
|
||||
|
||||
@@ -114,18 +130,19 @@ func StartServices(ctx context.Context, f *framework.Framework, mgr manager.Inte
|
||||
if err != nil {
|
||||
return fmt.Errorf("error starting timer: %v", err)
|
||||
}
|
||||
f.ServiceInfo["timer"] = framework.ServiceInfo{}
|
||||
f.AddServiceInfo("timer", framework.ServiceInfo{})
|
||||
|
||||
err = mqtrigger.StartScalerManager(ctx, f.ClientGen(), f.Logger(), mgr, routerURL)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error starting mqt scaler manager: %v", err)
|
||||
}
|
||||
f.ServiceInfo["mqtrigger-keda"] = framework.ServiceInfo{}
|
||||
f.AddServiceInfo("mqtrigger-keda", framework.ServiceInfo{})
|
||||
|
||||
err = kubewatcher.Start(ctx, f.ClientGen(), f.Logger(), mgr, routerURL)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error starting kubewatcher: %v", err)
|
||||
}
|
||||
f.ServiceInfo["kubewatcher"] = framework.ServiceInfo{}
|
||||
f.AddServiceInfo("kubewatcher", framework.ServiceInfo{})
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -0,0 +1,170 @@
|
||||
---
|
||||
apiVersion: admissionregistration.k8s.io/v1
|
||||
kind: MutatingWebhookConfiguration
|
||||
metadata:
|
||||
name: mutating-webhook-configuration
|
||||
webhooks:
|
||||
- admissionReviewVersions:
|
||||
- v1
|
||||
clientConfig:
|
||||
service:
|
||||
name: webhook-service
|
||||
namespace: system
|
||||
path: /mutate-fission-io-v1-package
|
||||
failurePolicy: Fail
|
||||
name: mpackage.fission.io
|
||||
rules:
|
||||
- apiGroups:
|
||||
- fission.io
|
||||
apiVersions:
|
||||
- v1
|
||||
operations:
|
||||
- CREATE
|
||||
- UPDATE
|
||||
resources:
|
||||
- packages
|
||||
sideEffects: None
|
||||
---
|
||||
apiVersion: admissionregistration.k8s.io/v1
|
||||
kind: ValidatingWebhookConfiguration
|
||||
metadata:
|
||||
name: validating-webhook-configuration
|
||||
webhooks:
|
||||
- admissionReviewVersions:
|
||||
- v1
|
||||
clientConfig:
|
||||
service:
|
||||
name: webhook-service
|
||||
namespace: system
|
||||
path: /validate-fission-io-v1-environment
|
||||
failurePolicy: Fail
|
||||
name: venvironment.fission.io
|
||||
rules:
|
||||
- apiGroups:
|
||||
- fission.io
|
||||
apiVersions:
|
||||
- v1
|
||||
operations:
|
||||
- CREATE
|
||||
resources:
|
||||
- environments
|
||||
sideEffects: None
|
||||
- admissionReviewVersions:
|
||||
- v1
|
||||
clientConfig:
|
||||
service:
|
||||
name: webhook-service
|
||||
namespace: system
|
||||
path: /validate-fission-io-v1-function
|
||||
failurePolicy: Fail
|
||||
name: vfunction.fission.io
|
||||
rules:
|
||||
- apiGroups:
|
||||
- fission.io
|
||||
apiVersions:
|
||||
- v1
|
||||
operations:
|
||||
- CREATE
|
||||
- UPDATE
|
||||
resources:
|
||||
- functions
|
||||
sideEffects: None
|
||||
- admissionReviewVersions:
|
||||
- v1
|
||||
clientConfig:
|
||||
service:
|
||||
name: webhook-service
|
||||
namespace: system
|
||||
path: /validate-fission-io-v1-httptrigger
|
||||
failurePolicy: Fail
|
||||
name: vhttptrigger.fission.io
|
||||
rules:
|
||||
- apiGroups:
|
||||
- fission.io
|
||||
apiVersions:
|
||||
- v1
|
||||
operations:
|
||||
- CREATE
|
||||
- UPDATE
|
||||
resources:
|
||||
- httptriggers
|
||||
sideEffects: None
|
||||
- admissionReviewVersions:
|
||||
- v1
|
||||
clientConfig:
|
||||
service:
|
||||
name: webhook-service
|
||||
namespace: system
|
||||
path: /validate-fission-io-v1-kuberneteswatchtrigger
|
||||
failurePolicy: Fail
|
||||
name: vkuberneteswatchtrigger.fission.io
|
||||
rules:
|
||||
- apiGroups:
|
||||
- fission.io
|
||||
apiVersions:
|
||||
- v1
|
||||
operations:
|
||||
- CREATE
|
||||
resources:
|
||||
- kuberneteswatchtriggers
|
||||
sideEffects: None
|
||||
- admissionReviewVersions:
|
||||
- v1
|
||||
clientConfig:
|
||||
service:
|
||||
name: webhook-service
|
||||
namespace: system
|
||||
path: /validate-fission-io-v1-messagequeuetrigger
|
||||
failurePolicy: Fail
|
||||
name: vmessagequeuetrigger.fission.io
|
||||
rules:
|
||||
- apiGroups:
|
||||
- fission.io
|
||||
apiVersions:
|
||||
- v1
|
||||
operations:
|
||||
- CREATE
|
||||
- UPDATE
|
||||
resources:
|
||||
- messagequeuetriggers
|
||||
sideEffects: None
|
||||
- admissionReviewVersions:
|
||||
- v1
|
||||
clientConfig:
|
||||
service:
|
||||
name: webhook-service
|
||||
namespace: system
|
||||
path: /validate-fission-io-v1-package
|
||||
failurePolicy: Fail
|
||||
name: vpackage.fission.io
|
||||
rules:
|
||||
- apiGroups:
|
||||
- fission.io
|
||||
apiVersions:
|
||||
- v1
|
||||
operations:
|
||||
- CREATE
|
||||
- UPDATE
|
||||
resources:
|
||||
- packages
|
||||
sideEffects: None
|
||||
- admissionReviewVersions:
|
||||
- v1
|
||||
clientConfig:
|
||||
service:
|
||||
name: webhook-service
|
||||
namespace: system
|
||||
path: /validate-fission-io-v1-timetrigger
|
||||
failurePolicy: Fail
|
||||
name: vtimetrigger.fission.io
|
||||
rules:
|
||||
- apiGroups:
|
||||
- fission.io
|
||||
apiVersions:
|
||||
- v1
|
||||
operations:
|
||||
- CREATE
|
||||
- UPDATE
|
||||
resources:
|
||||
- timetriggers
|
||||
sideEffects: None
|
||||
Reference in New Issue
Block a user