Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

csireverseproxy - improve UT coverage #451

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion csireverseproxy/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ require (
github.com/fsnotify/fsnotify v1.4.9
github.com/gorilla/mux v1.7.3
github.com/kubernetes-csi/csi-lib-utils v0.9.1
github.com/pkg/errors v0.9.1
github.com/sirupsen/logrus v1.9.3
github.com/spf13/viper v1.7.0
github.com/stretchr/testify v1.7.0
gopkg.in/yaml.v2 v2.3.0
k8s.io/api v0.20.0
k8s.io/apimachinery v0.20.0
Expand All @@ -34,7 +36,7 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/pelletier/go-toml v1.2.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/spf13/afero v1.2.2 // indirect
github.com/spf13/cast v1.3.0 // indirect
github.com/spf13/jwalterweatherman v1.0.0 // indirect
Expand All @@ -51,6 +53,7 @@ require (
google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.51.0 // indirect
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect
k8s.io/klog/v2 v2.4.0 // indirect
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd // indirect
k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect
Expand Down
95 changes: 60 additions & 35 deletions csireverseproxy/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,20 @@ type ServerOpts struct {
InCluster bool
}

// Server represents the proxy server
type Server struct {
HTTPServer *http.Server
Port string
CertFile string
KeyFile string
config *config.ProxyConfig
Proxy *proxy.Proxy
SigChan chan os.Signal
WaitGroup sync.WaitGroup
Mutex sync.Mutex
Opts ServerOpts
}

func getEnv(envName, defaultValue string) string {
envVal, found := os.LookupEnv(envName)
if !found {
Expand Down Expand Up @@ -91,20 +105,6 @@ func getServerOpts() ServerOpts {
}
}

// Server represents the proxy server
type Server struct {
HTTPServer *http.Server
Port string
CertFile string
KeyFile string
config *config.ProxyConfig
Proxy *proxy.Proxy
SigChan chan os.Signal
WaitGroup sync.WaitGroup
Mutex sync.Mutex
Opts ServerOpts
}

// SetConfig - sets config for the server
func (s *Server) SetConfig(c *config.ProxyConfig) {
s.Mutex.Lock()
Expand Down Expand Up @@ -186,7 +186,7 @@ func (s *Server) SignalHandler(k8sUtils k8sutils.UtilsInterface) {
// gracefully shutdown http server
err := s.HTTPServer.Shutdown(context.Background())
if err != nil {
log.Fatalf("Error during graceful shutdown of the server: %v", err)
log.Errorf("Error during graceful shutdown of the server: %v", err)
} else {
log.Info("Server shutdown gracefully on signal")
}
Expand Down Expand Up @@ -249,6 +249,7 @@ func (s *Server) SetupConfigMapWatcher(k8sUtils k8sutils.UtilsInterface) {
if err != nil || proxyConfig == nil {
log.Errorf("Error parsing the config: %v", err)
} else {
log.Info("Successfully parsed the updated config")
s.SetConfig(proxyConfig)
err = s.GetRevProxy().UpdateConfig(*proxyConfig)
if err != nil {
Expand Down Expand Up @@ -308,16 +309,12 @@ func startServer(k8sUtils k8sutils.UtilsInterface, opts ServerOpts) (*Server, er

err := server.Setup(k8sUtils)
if err != nil {
log.Fatalf("Failed to setup server. (%s)", err.Error())
log.Errorf("Failed to setup server. (%s)", err.Error())
return nil, err
}

// Start the Secrets informer
err = k8sUtils.StartInformer(server.EventHandler)
if err != nil {
log.Fatalf("Failed to start informer. (%s)", err.Error())
return nil, err
}
k8sUtils.StartInformer(server.EventHandler)

// Start the lock request handler
utils.InitializeLock()
Expand All @@ -334,45 +331,73 @@ func startServer(k8sUtils k8sutils.UtilsInterface, opts ServerOpts) (*Server, er
return server, nil
}

func run(ctx context.Context) {
func run(ctx context.Context) error {

signal.Ignore()

// Get the server opts
opts := getServerOpts()

// Create an informer
k8sUtils, err := k8sutils.Init(opts.NameSpace, opts.CertDir, opts.InCluster, time.Second*30, &k8sutils.KubernetesClient{})
k8sUtils, err := k8sInitFunc(opts.NameSpace, opts.CertDir, opts.InCluster, time.Second*30, &k8sutils.KubernetesClient{})
if err != nil {
log.Fatal(err.Error())
log.Errorf("run failed - %s", err.Error())
return err
}

server, err := startServer(k8sUtils, opts)
server, err := startServerFunc(k8sUtils, opts)
if err != nil {
log.Fatalln("Server start failed")
log.Errorf("Server start failed - %s", err.Error())
return err
}

// Wait for the server to exit gracefully
server.WaitGroup.Wait()

// Sleep for sometime to allow all goroutines to finish logging
time.Sleep(100 * time.Millisecond)

return nil
}

func main() {

if isLEEnabled := getEnv(common.EnvIsLeaderElectionEnabled, "false"); isLEEnabled == "true" {
isInCluster := getEnv(common.EnvInClusterConfig, "false")
kubeClient, err := k8sutils.Init(common.DefaultNameSpace, common.DefaultCertDirName, isInCluster == "true", time.Second*30, &k8sutils.KubernetesClient{})
kubeClient, err := k8sInitFunc(common.DefaultNameSpace, common.DefaultCertDirName, isInCluster == "true", time.Second*30, &k8sutils.KubernetesClient{})
if err != nil {
log.Fatalf("Failed to create kube client: [%s]", err.Error())
log.Errorf("failed to create kube client: [%s]", err.Error())
return
}
le := leaderelection.NewLeaderElection(kubeClient.KubernetesClient.Clientset, "csi-powermax-reverse-proxy-dellemc-com", run)
defaultNamespace := getEnv(common.EnvWatchNameSpace, common.DefaultNameSpace)
le.WithNamespace(defaultNamespace)
if err := le.Run(); err != nil {
log.Fatalf("Failed to initialize leader election: [%s]", err.Error())
err = runWithLeaderElectionFunc(&kubeClient.KubernetesClient)
if err != nil {
log.Errorf("failed to initialize leader election: [%s]", err.Error())
}
} else {
run(context.TODO())
runFunc(context.TODO())
}
}

var runWithLeaderElectionFunc = func(kubeClient *k8sutils.KubernetesClient) (err error) {
//var err error
lei := leaderelection.NewLeaderElection(kubeClient.Clientset, "csi-powermax-reverse-proxy-dellemc-com", runFunc)
lei.WithNamespace(getEnv(common.EnvWatchNameSpace, common.DefaultNameSpace))
if err = lei.Run(); err != nil {
log.Errorf("leader election failed reason: [%s]", err.Error())
}
return err
}

var k8sInitFunc = func(namespace string, certDir string, isInCluster bool, resyncPeriod time.Duration, kubeClient *k8sutils.KubernetesClient) (*k8sutils.K8sUtils, error) {
return k8sutils.Init(namespace, certDir, isInCluster, resyncPeriod, kubeClient)
}

var runFunc = func(ctx context.Context) {
err := run(ctx)
if err != nil {
log.Errorf("Failed to run server: %s ", err.Error())
}
}

var startServerFunc = func(k8sUtils k8sutils.UtilsInterface, opts ServerOpts) (*Server, error) {
return startServer(k8sUtils, opts)
}
Loading