Add http server
diff --git a/core/kg/cmd/commands/root.go b/core/kg/cmd/commands/root.go
index b5c92e2..70a4d23 100644
--- a/core/kg/cmd/commands/root.go
+++ b/core/kg/cmd/commands/root.go
@@ -2,6 +2,7 @@
import (
"github.com/giolekva/pcloud/core/kg/log"
+ "github.com/giolekva/pcloud/core/kg/model"
"github.com/giolekva/pcloud/core/kg/server"
"github.com/spf13/cobra"
)
@@ -23,7 +24,7 @@
}
func serverCmdF(command *cobra.Command, args []string) error {
- config := &log.LoggerConfiguration{
+ logger := log.NewLogger(&log.LoggerConfiguration{
EnableConsole: true,
ConsoleJSON: true,
ConsoleLevel: "debug",
@@ -31,11 +32,15 @@
FileJSON: true,
FileLevel: "debug",
FileLocation: "server.log",
- }
- logger := log.NewLogger(config)
- grpcServer := server.NewGRPCServer(logger)
+ })
+ config := model.NewConfig()
+
+ grpcServer := server.NewGRPCServer(logger, config, nil)
+ httpServer := server.NewHTTPServer(logger, config, nil)
+
servers := server.New(logger)
servers.AddServers(grpcServer)
+ servers.AddServers(httpServer)
servers.Run()
return nil
diff --git a/core/kg/go.mod b/core/kg/go.mod
index 5b1e996..ebc81e8 100644
--- a/core/kg/go.mod
+++ b/core/kg/go.mod
@@ -4,6 +4,7 @@
require (
github.com/Masterminds/squirrel v1.5.0
+ github.com/gorilla/mux v1.8.0
github.com/jmoiron/sqlx v1.3.1
github.com/pkg/errors v0.9.1
github.com/spf13/cobra v1.1.3
diff --git a/core/kg/go.sum b/core/kg/go.sum
index 04cc7b0..60b5893 100644
--- a/core/kg/go.sum
+++ b/core/kg/go.sum
@@ -94,6 +94,8 @@
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
+github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
diff --git a/core/kg/model/config.go b/core/kg/model/config.go
index 021fb74..04cc39b 100644
--- a/core/kg/model/config.go
+++ b/core/kg/model/config.go
@@ -3,10 +3,20 @@
const (
databaseDriverPostgres = "postgres"
defaultDataSource = "postgres://user:test@localhost/pcloud_test?sslmode=disable&connect_timeout=10"
+
+ defaultHTTPHost = "0.0.0.0"
+ defaultHTTPPort = 9086
+ defaultHTTPReadTimeout = 5
+ defaultHTTPWriteTimeout = 10
+ defaultHTTPIdleTimeout = 120
+
+ defaultGRPCPort = 9087
)
type Config struct {
- SqlSettings SqlSettings
+ SQLSettings SQLSettings
+ HTTPSettings HTTPSettings
+ GRPCSettings GRPCSettings
}
func NewConfig() *Config {
@@ -16,15 +26,17 @@
}
func (c *Config) SetDefaults() {
- c.SqlSettings.SetDefaults()
+ c.SQLSettings.SetDefaults()
+ c.HTTPSettings.SetDefaults()
+ c.GRPCSettings.SetDefaults()
}
-type SqlSettings struct {
- DriverName string `access:"environment,write_restrictable,cloud_restrictable"`
- DataSource string `access:"environment,write_restrictable,cloud_restrictable"`
+type SQLSettings struct {
+ DriverName string
+ DataSource string
}
-func (s *SqlSettings) SetDefaults() {
+func (s *SQLSettings) SetDefaults() {
if s.DriverName == "" {
s.DriverName = databaseDriverPostgres
}
@@ -33,3 +45,43 @@
s.DataSource = defaultDataSource
}
}
+
+type HTTPSettings struct {
+ Host string
+ Port int
+ ReadTimeout int
+ WriteTimeout int
+ IdleTimeout int
+}
+
+func (s *HTTPSettings) SetDefaults() {
+ if s.Host == "" {
+ s.Host = defaultHTTPHost
+ }
+
+ if s.Port == 0 {
+ s.Port = defaultHTTPPort
+ }
+
+ if s.ReadTimeout == 0 {
+ s.ReadTimeout = defaultHTTPReadTimeout
+ }
+
+ if s.WriteTimeout == 0 {
+ s.WriteTimeout = defaultHTTPWriteTimeout
+ }
+
+ if s.IdleTimeout == 0 {
+ s.IdleTimeout = defaultHTTPIdleTimeout
+ }
+}
+
+type GRPCSettings struct {
+ Port int
+}
+
+func (s *GRPCSettings) SetDefaults() {
+ if s.Port == 0 {
+ s.Port = defaultGRPCPort
+ }
+}
diff --git a/core/kg/server/grpc_server.go b/core/kg/server/grpc_server.go
index c36c7d2..bc3b05f 100644
--- a/core/kg/server/grpc_server.go
+++ b/core/kg/server/grpc_server.go
@@ -1,29 +1,32 @@
package server
import (
+ "fmt"
"net"
"os"
"github.com/giolekva/pcloud/core/kg/log"
+ "github.com/giolekva/pcloud/core/kg/model"
"github.com/giolekva/pcloud/core/kg/store"
"google.golang.org/grpc"
)
-const listenerPort = ":9081"
-
// GRPCServerImpl grpc server implementation
type GRPCServerImpl struct {
- Log *log.Logger
- srv *grpc.Server
- store store.Store
+ Log *log.Logger
+ srv *grpc.Server
+ config *model.Config
+ store store.Store
}
var _ Server = &GRPCServerImpl{}
// NewGRPCServer creates new GRPC Server
-func NewGRPCServer(logger *log.Logger) Server {
+func NewGRPCServer(logger *log.Logger, config *model.Config, store store.Store) Server {
a := &GRPCServerImpl{
- Log: logger,
+ Log: logger,
+ config: config,
+ store: store,
}
pwd, _ := os.Getwd()
@@ -31,14 +34,14 @@
return a
}
-// Start method starts an app
+// Start method starts a grpc server
func (a *GRPCServerImpl) Start() error {
a.Log.Info("Starting GRPC Server...")
// settings := model.NewConfig().SqlSettings
// a.store = sqlstore.New(settings)
- lis, err := net.Listen("tcp", listenerPort)
+ lis, err := net.Listen("tcp", fmt.Sprintf(":%d", a.config.GRPCSettings.Port))
if err != nil {
a.Log.Error("failed to listen: %v", log.Err(err))
return err
@@ -46,17 +49,18 @@
a.srv = grpc.NewServer()
- a.Log.Info("GRPC Server is listening on", log.String("port", listenerPort))
+ a.Log.Info("GRPC Server is listening on", log.Int("port", a.config.GRPCSettings.Port))
if err := a.srv.Serve(lis); err != nil {
- a.Log.Error("failed to serve: %v", log.Err(err))
+ a.Log.Error("failed to serve rpc: %v", log.Err(err))
return err
}
return nil
}
-// Shutdown method shuts server down
+// Shutdown method shuts grpc server down
func (a *GRPCServerImpl) Shutdown() error {
a.Log.Info("Stopping GRPC Server...")
a.srv.GracefulStop()
+ a.Log.Info("GRPC Server stopped")
return nil
}
diff --git a/core/kg/server/http_server.go b/core/kg/server/http_server.go
new file mode 100644
index 0000000..e4a7688
--- /dev/null
+++ b/core/kg/server/http_server.go
@@ -0,0 +1,79 @@
+package server
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ "net/http"
+ "os"
+ "time"
+
+ "github.com/giolekva/pcloud/core/kg/log"
+ "github.com/giolekva/pcloud/core/kg/model"
+ "github.com/giolekva/pcloud/core/kg/store"
+ "github.com/gorilla/mux"
+)
+
+// HTTPServerImpl http server implementation
+type HTTPServerImpl struct {
+ Log *log.Logger
+ srv *http.Server
+ root *mux.Router
+ config *model.Config
+ store store.Store
+}
+
+var _ Server = &HTTPServerImpl{}
+
+// NewHTTPServer creates new HTTP Server
+func NewHTTPServer(logger *log.Logger, config *model.Config, store store.Store) Server {
+ a := &HTTPServerImpl{
+ Log: logger,
+ root: mux.NewRouter(),
+ config: config,
+ store: store,
+ }
+
+ pwd, _ := os.Getwd()
+ a.Log.Info("HTTP server current working", log.String("directory", pwd))
+ return a
+}
+
+// Start method starts a http server
+func (a *HTTPServerImpl) Start() error {
+ a.Log.Info("Starting HTTP Server...")
+
+ a.srv = &http.Server{
+ Addr: fmt.Sprintf("%s:%d", a.config.HTTPSettings.Host, a.config.HTTPSettings.Port),
+ Handler: a.root,
+ ReadTimeout: time.Duration(a.config.HTTPSettings.ReadTimeout) * time.Second,
+ WriteTimeout: time.Duration(a.config.HTTPSettings.WriteTimeout) * time.Second,
+ IdleTimeout: time.Duration(a.config.HTTPSettings.IdleTimeout) * time.Second,
+ }
+
+ a.Log.Info("HTTP Server is listening on", log.Int("port", a.config.HTTPSettings.Port))
+ if err := a.srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
+ a.Log.Error("failed to listen and serve: %v", log.Err(err))
+ return err
+ }
+ return nil
+}
+
+// Shutdown method shuts http server down
+func (a *HTTPServerImpl) Shutdown() error {
+ a.Log.Info("Stopping HTTP Server...")
+ if a.srv == nil {
+ return errors.New("no http server present")
+ }
+
+ ctx, cancel := context.WithTimeout(context.Background(), time.Second)
+ defer cancel()
+ if err := a.srv.Shutdown(ctx); err != nil {
+ a.Log.Error("Unable to shutdown server", log.Err(err))
+ }
+
+ // a.srv.Close()
+ // a.srv = nil
+ a.Log.Info("HTTP Server stopped")
+ return nil
+}
diff --git a/core/kg/store/sqlstore/store.go b/core/kg/store/sqlstore/store.go
index f5577f0..2fbe0c7 100644
--- a/core/kg/store/sqlstore/store.go
+++ b/core/kg/store/sqlstore/store.go
@@ -10,7 +10,7 @@
type SqlStore struct {
db *sqlx.DB
stores SqlStoreStores
- settings *model.SqlSettings
+ settings *model.SQLSettings
}
var _ store.Store = &SqlStore{}
@@ -19,7 +19,7 @@
user store.UserStore
}
-func New(settings model.SqlSettings) *SqlStore {
+func New(settings model.SQLSettings) *SqlStore {
store := &SqlStore{
settings: &settings,
}