diff --git a/VERSION b/VERSION index 13c0078..26aaba0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.2-dev +1.2.0 diff --git a/cmd/pfcpsim/main.go b/cmd/pfcpsim/main.go index e8c4775..4b6a8d4 100644 --- a/cmd/pfcpsim/main.go +++ b/cmd/pfcpsim/main.go @@ -13,8 +13,8 @@ import ( pb "github.com/omec-project/pfcpsim/api" "github.com/omec-project/pfcpsim/internal/pfcpsim" + "github.com/omec-project/pfcpsim/logger" "github.com/pborman/getopt/v2" - log "github.com/sirupsen/logrus" "google.golang.org/grpc" ) @@ -25,7 +25,7 @@ const ( func startServer(apiDoneChannel chan bool, iFace string, port string, group *sync.WaitGroup) { lis, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%v", port)) if err != nil { - log.Fatalf("API gRPC Server failed to listen: %v", err) + logger.PfcpsimLog.Fatalf("api gRPC Server failed to listen: %v", err) } grpcServer := grpc.NewServer() @@ -34,17 +34,17 @@ func startServer(apiDoneChannel chan bool, iFace string, port string, group *syn go func() { if err := grpcServer.Serve(lis); err != nil { - log.Fatalf("Failed to listed: %v", err) + logger.PfcpsimLog.Fatalf("failed to listed: %v", err) } }() - log.Infof("Server listening on port %v", port) + logger.PfcpsimLog.Infoln("server listening on port", port) x := <-apiDoneChannel if x { // if the API channel is closed, stop the gRPC pfcpsim grpcServer.Stop() - log.Warnf("Stopping API gRPC pfcpsim") + logger.PfcpsimLog.Warnln("stopping API gRPC pfcpsim") } group.Done() @@ -80,11 +80,11 @@ func main() { wg.Add(1) go startServer(doneChannel, *iFaceName, *port, &wg) - log.Debugf("Started API gRPC Service") + logger.PfcpsimLog.Debugln("started API gRPC Service") wg.Wait() defer func() { - log.Info("PFCP Simulator shutting down") + logger.PfcpsimLog.Infoln("pfcp Simulator shutting down") }() } diff --git a/go.mod b/go.mod index 9de023f..33d4ce7 100644 --- a/go.mod +++ b/go.mod @@ -7,9 +7,9 @@ require ( github.com/golang/protobuf v1.5.4 github.com/jessevdk/go-flags v1.6.1 github.com/pborman/getopt/v2 v2.1.0 - github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.9.0 github.com/wmnsk/go-pfcp v0.0.24 + go.uber.org/zap v1.27.0 google.golang.org/grpc v1.67.0 google.golang.org/protobuf v1.34.2 ) @@ -17,6 +17,7 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + go.uber.org/multierr v1.10.0 // indirect golang.org/x/net v0.28.0 // indirect golang.org/x/sys v0.24.0 // indirect golang.org/x/text v0.17.0 // indirect diff --git a/go.sum b/go.sum index ce31539..5836a8c 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,5 @@ github.com/c-robinson/iplib v1.0.8 h1:exDRViDyL9UBLcfmlxxkY5odWX5092nPsQIykHXhIn4= github.com/c-robinson/iplib v1.0.8/go.mod h1:i3LuuFL1hRT5gFpBRnEydzw8R6yhGkF4szNDIbF8pgo= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= @@ -13,17 +12,18 @@ github.com/pborman/getopt/v2 v2.1.0 h1:eNfR+r+dWLdWmV8g5OlpyrTYHkhVNxHBdN2cCrJmO github.com/pborman/getopt/v2 v2.1.0/go.mod h1:4NtW75ny4eBw9fO1bhtNdYTlZKYX5/tBLtsOpwKIKd0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/wmnsk/go-pfcp v0.0.24 h1:sv4F3U/IphsPUMXMkTJW877CRvXZ1sF5onWHGBvxx/A= github.com/wmnsk/go-pfcp v0.0.24/go.mod h1:8EUVvOzlz25wkUs9D8STNAs5zGyIo5xEUpHQOUZ/iSg= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= @@ -36,6 +36,5 @@ google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6h google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/pfcpctl/commands/helpers.go b/internal/pfcpctl/commands/helpers.go index a3a365e..e1c1ddb 100644 --- a/internal/pfcpctl/commands/helpers.go +++ b/internal/pfcpctl/commands/helpers.go @@ -6,7 +6,7 @@ package commands import ( pb "github.com/omec-project/pfcpsim/api" "github.com/omec-project/pfcpsim/internal/pfcpctl/config" - log "github.com/sirupsen/logrus" + "github.com/omec-project/pfcpsim/logger" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) @@ -17,7 +17,7 @@ func connect() pb.PFCPSimClient { // Create an insecure gRPC Channel connection, err := grpc.NewClient(config.GlobalConfig.Server, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { - log.Fatalf("Error dialing %v: %v", config.GlobalConfig.Server, err) + logger.PfcpsimLog.Fatalf("error dialing %v: %v", config.GlobalConfig.Server, err) } return pb.NewPFCPSimClient(connection) @@ -27,7 +27,7 @@ func disconnect() { if conn != nil { err := conn.Close() if err != nil { - log.Warnln(err) + logger.PfcpsimLog.Warnln(err) } } } diff --git a/internal/pfcpctl/commands/services.go b/internal/pfcpctl/commands/services.go index a9bc3cd..06e3d6a 100644 --- a/internal/pfcpctl/commands/services.go +++ b/internal/pfcpctl/commands/services.go @@ -8,7 +8,7 @@ import ( "github.com/jessevdk/go-flags" pb "github.com/omec-project/pfcpsim/api" - log "github.com/sirupsen/logrus" + "github.com/omec-project/pfcpsim/logger" ) type ( @@ -29,7 +29,7 @@ type serviceOptions struct { func RegisterServiceCommands(parser *flags.Parser) { _, err := parser.AddCommand("service", "configure pfcpsim", "Command to configure pfcpsim", &serviceOptions{}) if err != nil { - log.Warnln(err) + logger.PfcpsimLog.Warnln(err) } } @@ -43,10 +43,10 @@ func (c *configureRemoteAddresses) Execute(args []string) error { RemotePeerAddress: c.RemotePeerAddress, }) if err != nil { - log.Fatalf("Error while configuring remote addresses: %v", err) + logger.PfcpsimLog.Fatalf("error while configuring remote addresses: %v", err) } - log.Info(res.Message) + logger.PfcpsimLog.Infoln(res.Message) return nil } @@ -58,10 +58,10 @@ func (c *associate) Execute(args []string) error { res, err := client.Associate(context.Background(), &pb.EmptyRequest{}) if err != nil { - log.Fatalf("Error while associating: %v", err) + logger.PfcpsimLog.Fatalf("error while associating: %v", err) } - log.Infof("%s", res.Message) + logger.PfcpsimLog.Infoln(res.Message) return nil } @@ -73,10 +73,10 @@ func (c *disassociate) Execute(args []string) error { res, err := client.Disassociate(context.Background(), &pb.EmptyRequest{}) if err != nil { - log.Fatalf("Error while disassociating: %v", err) + logger.PfcpsimLog.Fatalf("error while disassociating: %v", err) } - log.Infof("%s", res.Message) + logger.PfcpsimLog.Infoln(res.Message) return nil } diff --git a/internal/pfcpctl/commands/sessions.go b/internal/pfcpctl/commands/sessions.go index 8b302ca..20069b0 100644 --- a/internal/pfcpctl/commands/sessions.go +++ b/internal/pfcpctl/commands/sessions.go @@ -8,7 +8,7 @@ import ( "github.com/jessevdk/go-flags" pb "github.com/omec-project/pfcpsim/api" - log "github.com/sirupsen/logrus" + "github.com/omec-project/pfcpsim/logger" ) type commonArgs struct { @@ -22,11 +22,11 @@ type commonArgs struct { func (a *commonArgs) validate() { if a.BaseID <= 0 { - log.Fatalf("BaseID cannot be 0 or a negative number.") + logger.PfcpsimLog.Fatalln("baseID cannot be 0 or a negative number") } if a.Count <= 0 { - log.Fatalf("Count cannot be 0 or a negative number.") + logger.PfcpsimLog.Fatalln("count cannot be 0 or a negative number") } } @@ -64,13 +64,13 @@ func RegisterSessionCommands(parser *flags.Parser) { &SessionOptions{}, ) if err != nil { - log.Warnln(err) + logger.PfcpsimLog.Warnln(err) } } func (s *sessionCreate) Execute(args []string) error { if s.Args.QFI > 64 { - log.Fatalf("QFI cannot be greater than 64. Provided QFI: %v", s.Args.QFI) + logger.PfcpsimLog.Fatalf("qfi cannot be greater than 64. Provided qfi: %v", s.Args.QFI) } client := connect() @@ -88,10 +88,10 @@ func (s *sessionCreate) Execute(args []string) error { Qfi: int32(s.Args.QFI), }) if err != nil { - log.Fatalf("Error while creating sessions: %v", err) + logger.PfcpsimLog.Fatalf("error while creating sessions: %v", err) } - log.Infof("%s", res.Message) + logger.PfcpsimLog.Infoln(res.Message) return nil } @@ -113,10 +113,10 @@ func (s *sessionModify) Execute(args []string) error { AppFilters: s.Args.AppFilterString, }) if err != nil { - log.Fatalf("Error while modifying sessions: %v", err) + logger.PfcpsimLog.Fatalf("error while modifying sessions: %v", err) } - log.Infof("%s", res.Message) + logger.PfcpsimLog.Infof(res.Message) return nil } @@ -133,10 +133,10 @@ func (s *sessionDelete) Execute(args []string) error { BaseID: int32(s.Args.BaseID), }) if err != nil { - log.Fatalf("Error while deleting sessions: %v", err) + logger.PfcpsimLog.Fatalf("error while deleting sessions: %v", err) } - log.Infof("%s", res.Message) + logger.PfcpsimLog.Infoln(res.Message) return nil } diff --git a/internal/pfcpctl/config/config.go b/internal/pfcpctl/config/config.go index 8ffb115..c2a4f84 100644 --- a/internal/pfcpctl/config/config.go +++ b/internal/pfcpctl/config/config.go @@ -7,7 +7,7 @@ import ( "net" "os" - log "github.com/sirupsen/logrus" + "github.com/omec-project/pfcpsim/logger" ) const ( @@ -40,7 +40,7 @@ func ProcessGlobalOptions() { // Generate error messages for required settings if GlobalConfig.Server == "" { - log.Fatal("Server is not set. Please use the -s option") + logger.PfcpsimLog.Fatalln("server is not set. Please use the -s option") } // Try to resolve hostname if provided for the server @@ -50,5 +50,5 @@ func ProcessGlobalOptions() { } } - log.Debugf("ServerAddress: %v", GlobalOptions.Server) + logger.PfcpsimLog.Debugf("serverAddress: %v", GlobalOptions.Server) } diff --git a/internal/pfcpsim/export/export.go b/internal/pfcpsim/export/export.go index 1301417..48a7b5e 100644 --- a/internal/pfcpsim/export/export.go +++ b/internal/pfcpsim/export/export.go @@ -11,9 +11,9 @@ import ( "github.com/c-robinson/iplib" "github.com/omec-project/pfcpsim/internal/pfcpsim" + "github.com/omec-project/pfcpsim/logger" sim "github.com/omec-project/pfcpsim/pkg/pfcpsim" "github.com/omec-project/pfcpsim/pkg/pfcpsim/session" - log "github.com/sirupsen/logrus" ieLib "github.com/wmnsk/go-pfcp/ie" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -120,8 +120,8 @@ func (c *PfcpSimCfg) CreateSession(baseID int, lastUEAddr, _, err := net.ParseCIDR(uePool) if err != nil { - errMsg := fmt.Sprintf(" Could not parse Address Pool: %v", err) - log.Error(errMsg) + errMsg := fmt.Sprintf("Could not parse Address Pool: %v", err) + logger.PfcpsimLog.Errorln(errMsg) return status.Error(codes.Aborted, errMsg) } @@ -159,7 +159,7 @@ func (c *PfcpSimCfg) CreateSession(baseID int, return status.Error(codes.Aborted, err.Error()) } - log.Infof("Successfully parsed application filter. SDF Filter: %v", SDFFilter) + logger.PfcpsimLog.Infof("successfully parsed application filter. SDF Filter: %v", SDFFilter) uplinkPdrID := ID downlinkPdrID := ID + 1 @@ -283,8 +283,7 @@ func (c *PfcpSimCfg) CreateSession(baseID int, sim.InsertSession(i, sess) } - infoMsg := fmt.Sprintf("%v sessions were established using %v as baseID ", count, baseID) - log.Info(infoMsg) + logger.PfcpsimLog.Infof("%d sessions were established using %d as baseID", count, baseID) return nil } @@ -337,7 +336,7 @@ func (c *PfcpSimCfg) ModifySession(baseID int, sess, ok := sim.GetSession(i) if !ok { errMsg := fmt.Sprintf("Could not retrieve session with index %v", i) - log.Error(errMsg) + logger.PfcpsimLog.Errorln(errMsg) return status.Error(codes.Internal, errMsg) } @@ -348,8 +347,7 @@ func (c *PfcpSimCfg) ModifySession(baseID int, } } - infoMsg := fmt.Sprintf("%v sessions were modified", count) - log.Info(infoMsg) + logger.PfcpsimLog.Infof("%v sessions were modified", count) return nil } @@ -359,7 +357,7 @@ func (c *PfcpSimCfg) DeleteSession(baseID int) error { if sim.GetActiveSessionNum() < count { err := sim.NewNotEnoughSessionsError() - log.Error(err) + logger.PfcpsimLog.Error(err) return status.Error(codes.Aborted, err.Error()) } @@ -368,22 +366,21 @@ func (c *PfcpSimCfg) DeleteSession(baseID int) error { sess, ok := sim.GetSession(i) if !ok { errMsg := "Session was nil. Check baseID" - log.Error(errMsg) + logger.PfcpsimLog.Errorln(errMsg) return status.Error(codes.Aborted, errMsg) } err := c.sim.DeleteSession(sess) if err != nil { - log.Error(err.Error()) + logger.PfcpsimLog.Errorln(err.Error()) return status.Error(codes.Aborted, err.Error()) } // remove from activeSessions sim.RemoveSession(i) } - infoMsg := fmt.Sprintf("%v sessions deleted; activeSessions: %v", count, sim.GetActiveSessionNum()) - log.Info(infoMsg) + logger.PfcpsimLog.Infof("%v sessions deleted; activeSessions: %v", count, sim.GetActiveSessionNum()) return nil } diff --git a/internal/pfcpsim/helpers.go b/internal/pfcpsim/helpers.go index 325af71..6a01ace 100644 --- a/internal/pfcpsim/helpers.go +++ b/internal/pfcpsim/helpers.go @@ -10,8 +10,8 @@ import ( "strconv" "strings" + "github.com/omec-project/pfcpsim/logger" "github.com/omec-project/pfcpsim/pkg/pfcpsim" - log "github.com/sirupsen/logrus" "github.com/wmnsk/go-pfcp/ie" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -72,7 +72,7 @@ func isRemotePeerConnected() bool { // exceed the max number of supported application filters. func isNumOfAppFiltersCorrect(filters []string) error { if len(filters) > SessionStep/2 { - log.Errorf("Too many application filters: %v", filters) + logger.PfcpsimLog.Errorf("too many application filters: %v", filters) return status.Error(codes.Aborted, "Too many application filters") } diff --git a/internal/pfcpsim/server.go b/internal/pfcpsim/server.go index 5c3f37d..69473ec 100644 --- a/internal/pfcpsim/server.go +++ b/internal/pfcpsim/server.go @@ -11,9 +11,9 @@ import ( "github.com/c-robinson/iplib" pb "github.com/omec-project/pfcpsim/api" + "github.com/omec-project/pfcpsim/logger" "github.com/omec-project/pfcpsim/pkg/pfcpsim" "github.com/omec-project/pfcpsim/pkg/pfcpsim/session" - log "github.com/sirupsen/logrus" ieLib "github.com/wmnsk/go-pfcp/ie" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -56,8 +56,8 @@ func SetUpfN3(addr string) { func (P pfcpSimService) Configure(ctx context.Context, request *pb.ConfigureRequest) (*pb.Response, error) { if net.ParseIP(request.UpfN3Address) == nil { - errMsg := fmt.Sprintf("Error while parsing UPF N3 address: %v", request.UpfN3Address) - log.Error(errMsg) + errMsg := fmt.Sprintf("error while parsing UPF N3 address: %v", request.UpfN3Address) + logger.PfcpsimLog.Errorln(errMsg) return &pb.Response{}, status.Error(codes.Aborted, errMsg) } @@ -79,26 +79,26 @@ func (P pfcpSimService) Configure(ctx context.Context, request *pb.ConfigureRequ func (P pfcpSimService) Associate(ctx context.Context, empty *pb.EmptyRequest) (*pb.Response, error) { if !isConfigured() { - log.Error("Server is not configured") + logger.PfcpsimLog.Errorln("server is not configured") return &pb.Response{}, status.Error(codes.Aborted, "Server is not configured") } if !isRemotePeerConnected() { if err := ConnectPFCPSim(); err != nil { - errMsg := fmt.Sprintf("Could not connect to remote peer :%v", err) - log.Error(errMsg) + errMsg := fmt.Sprintf("Could not connect to remote peer: %v", err) + logger.PfcpsimLog.Error(errMsg) return &pb.Response{}, status.Error(codes.Aborted, errMsg) } } if err := sim.SetupAssociation(); err != nil { - log.Error(err.Error()) + logger.PfcpsimLog.Errorln(err) return &pb.Response{}, status.Error(codes.Aborted, err.Error()) } infoMsg := "Association established" - log.Info(infoMsg) + logger.PfcpsimLog.Infoln(infoMsg) return &pb.Response{ StatusCode: int32(codes.OK), @@ -112,7 +112,7 @@ func (P pfcpSimService) Disassociate(ctx context.Context, empty *pb.EmptyRequest } if err := sim.TeardownAssociation(); err != nil { - log.Error(err.Error()) + logger.PfcpsimLog.Errorln(err.Error()) return &pb.Response{}, status.Error(codes.Aborted, err.Error()) } @@ -121,7 +121,7 @@ func (P pfcpSimService) Disassociate(ctx context.Context, empty *pb.EmptyRequest remotePeerConnected = false infoMsg := "Association teardown completed and connection to remote peer closed" - log.Info(infoMsg) + logger.PfcpsimLog.Infoln(infoMsg) return &pb.Response{ StatusCode: int32(codes.OK), @@ -139,8 +139,8 @@ func (P pfcpSimService) CreateSession(ctx context.Context, request *pb.CreateSes lastUEAddr, _, err := net.ParseCIDR(request.UeAddressPool) if err != nil { - errMsg := fmt.Sprintf(" Could not parse Address Pool: %v", err) - log.Error(errMsg) + errMsg := fmt.Sprintf("Could not parse Address Pool: %v", err) + logger.PfcpsimLog.Errorln(errMsg) return &pb.Response{}, status.Error(codes.Aborted, errMsg) } @@ -185,7 +185,7 @@ func (P pfcpSimService) CreateSession(ctx context.Context, request *pb.CreateSes return &pb.Response{}, status.Error(codes.Aborted, err.Error()) } - log.Infof("Successfully parsed application filter. SDF Filter: %v", SDFFilter) + logger.PfcpsimLog.Infof("successfully parsed application filter. SDF Filter: %v", SDFFilter) uplinkPdrID := ID downlinkPdrID := ID + 1 @@ -301,8 +301,8 @@ func (P pfcpSimService) CreateSession(ctx context.Context, request *pb.CreateSes pfcpsim.InsertSession(i, sess) } - infoMsg := fmt.Sprintf("%v sessions were established using %v as baseID ", count, baseID) - log.Info(infoMsg) + infoMsg := fmt.Sprintf("%v sessions were established using %v as baseID", count, baseID) + logger.PfcpsimLog.Infoln(infoMsg) return &pb.Response{ StatusCode: int32(codes.OK), @@ -322,7 +322,7 @@ func (P pfcpSimService) ModifySession(ctx context.Context, request *pb.ModifySes if pfcpsim.GetActiveSessionNum() < count { err := pfcpsim.NewNotEnoughSessionsError() - log.Error(err) + logger.PfcpsimLog.Errorln(err.Error()) return &pb.Response{}, status.Error(codes.Aborted, err.Error()) } @@ -381,7 +381,7 @@ func (P pfcpSimService) ModifySession(ctx context.Context, request *pb.ModifySes sess, ok := pfcpsim.GetSession(i) if !ok { errMsg := fmt.Sprintf("Could not retrieve session with index %v", i) - log.Error(errMsg) + logger.PfcpsimLog.Errorln(errMsg) return &pb.Response{}, status.Error(codes.Internal, errMsg) } @@ -393,7 +393,7 @@ func (P pfcpSimService) ModifySession(ctx context.Context, request *pb.ModifySes } infoMsg := fmt.Sprintf("%v sessions were modified", count) - log.Info(infoMsg) + logger.PfcpsimLog.Infoln(infoMsg) return &pb.Response{ StatusCode: int32(codes.OK), @@ -411,7 +411,7 @@ func (P pfcpSimService) DeleteSession(ctx context.Context, request *pb.DeleteSes if pfcpsim.GetActiveSessionNum() < count { err := pfcpsim.NewNotEnoughSessionsError() - log.Error(err) + logger.PfcpsimLog.Error(err.Error()) return &pb.Response{}, status.Error(codes.Aborted, err.Error()) } @@ -420,14 +420,14 @@ func (P pfcpSimService) DeleteSession(ctx context.Context, request *pb.DeleteSes sess, ok := pfcpsim.GetSession(i) if !ok { errMsg := "Session was nil. Check baseID" - log.Error(errMsg) + logger.PfcpsimLog.Errorln(errMsg) return &pb.Response{}, status.Error(codes.Aborted, errMsg) } err := sim.DeleteSession(sess) if err != nil { - log.Error(err.Error()) + logger.PfcpsimLog.Errorln(err.Error()) return &pb.Response{}, status.Error(codes.Aborted, err.Error()) } // remove from activeSessions @@ -435,7 +435,7 @@ func (P pfcpSimService) DeleteSession(ctx context.Context, request *pb.DeleteSes } infoMsg := fmt.Sprintf("%v sessions deleted; activeSessions: %v", count, pfcpsim.GetActiveSessionNum()) - log.Info(infoMsg) + logger.PfcpsimLog.Infoln(infoMsg) return &pb.Response{ StatusCode: int32(codes.OK), diff --git a/logger/logger.go b/logger/logger.go new file mode 100644 index 0000000..7492455 --- /dev/null +++ b/logger/logger.go @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: 2024 Intel Corporation +// +// SPDX-License-Identifier: Apache-2.0 + +package logger + +import ( + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +var ( + log *zap.Logger + PfcpsimLog *zap.SugaredLogger + atomicLevel zap.AtomicLevel +) + +func init() { + atomicLevel = zap.NewAtomicLevelAt(zap.InfoLevel) + config := zap.Config{ + Level: atomicLevel, + Development: false, + Encoding: "console", + EncoderConfig: zap.NewProductionEncoderConfig(), + OutputPaths: []string{"stdout"}, + ErrorOutputPaths: []string{"stderr"}, + } + + config.EncoderConfig.TimeKey = "timestamp" + config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder + config.EncoderConfig.LevelKey = "level" + config.EncoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder + config.EncoderConfig.CallerKey = "caller" + config.EncoderConfig.EncodeCaller = zapcore.ShortCallerEncoder + config.EncoderConfig.MessageKey = "message" + config.EncoderConfig.StacktraceKey = "" + + var err error + log, err = config.Build() + if err != nil { + panic(err) + } + + PfcpsimLog = log.Sugar().With("component", "LIB", "category", "Pfcpsim") +} + +func GetLogger() *zap.Logger { + return log +} + +// SetLogLevel: set the log level (panic|fatal|error|warn|info|debug) +func SetLogLevel(level zapcore.Level) { + PfcpsimLog.Infoln("set log level:", level) + atomicLevel.SetLevel(level) +} diff --git a/pkg/pfcpsim/pfcpsim.go b/pkg/pfcpsim/pfcpsim.go index 23968ac..f5ad2d4 100644 --- a/pkg/pfcpsim/pfcpsim.go +++ b/pkg/pfcpsim/pfcpsim.go @@ -11,6 +11,7 @@ import ( "sync" "time" + "github.com/omec-project/pfcpsim/logger" ieLib "github.com/wmnsk/go-pfcp/ie" "github.com/wmnsk/go-pfcp/message" ) @@ -237,7 +238,7 @@ func (c *PFCPClient) DisconnectN4() { err := c.conn.Close() if err != nil { - fmt.Println(err) + logger.PfcpsimLog.Errorln(err) } } @@ -278,12 +279,12 @@ func (c *PFCPClient) PeekNextResponse() (message.Message, error) { // a reply to the Session Report Request. func (c *PFCPClient) handleSessionReportRequest(msg *message.SessionReportRequest) bool { if msg.MessageType() == message.MsgTypeSessionReportRequest { - fmt.Println("Session Report Request received") + logger.PfcpsimLog.Infoln("Session Report Request received") err := c.sendSessionReportResponse(msg.Sequence(), msg.Header.SEID) if err != nil { - fmt.Println("Error sending Session Report Response") + logger.PfcpsimLog.Errorln("Error sending Session Report Response") } return true diff --git a/pkg/pfcpsim/session/far_builder.go b/pkg/pfcpsim/session/far_builder.go index 88d959f..cb2e5a6 100644 --- a/pkg/pfcpsim/session/far_builder.go +++ b/pkg/pfcpsim/session/far_builder.go @@ -4,8 +4,7 @@ package session import ( - "log" - + "github.com/omec-project/pfcpsim/logger" "github.com/wmnsk/go-pfcp/ie" ) @@ -38,13 +37,13 @@ func NewFARBuilder() *farBuilder { func (b *farBuilder) FuzzIE(ieType int, arg uint) *farBuilder { switch ieType { case FarWithAction: - log.Println("FarWithAction") + logger.PfcpsimLog.Infoln("FarWithAction") return b.WithAction(uint8(arg)) case FarWithTEID: - log.Println("FarWithTEID") + logger.PfcpsimLog.Infoln("FarWithTEID") return b.WithTEID(uint32(arg)) case FarWithDstInterface: - log.Println("FarWithDstInterface") + logger.PfcpsimLog.Infoln("FarWithDstInterface") return b.WithDstInterface(uint8(arg)) default: } @@ -93,19 +92,19 @@ func (b *farBuilder) WithDownlinkIP(downlinkIP string) *farBuilder { func (b *farBuilder) validate() { if b.farID == 0 { - panic("Tried building FAR without setting FAR ID") + logger.PfcpsimLog.Panicln("tried building FAR without setting FAR ID") } if !b.isInterfaceSet { - panic("Tried building FAR without setting a destination interface") + logger.PfcpsimLog.Panicln("tried building FAR without setting a destination interface") } if b.applyAction == ActionDrop|ActionForward { - panic("Tried building FAR with actions' ActionDrop and ActionForward flags") + logger.PfcpsimLog.Panicln("tried building FAR with actions' ActionDrop and ActionForward flags") } if !b.isActionSet { - panic("Tried building FAR without setting an action") + logger.PfcpsimLog.Panicln("tried building FAR without setting an action") } } diff --git a/pkg/pfcpsim/session/pdr_builder.go b/pkg/pfcpsim/session/pdr_builder.go index 6d5024c..ec078c5 100644 --- a/pkg/pfcpsim/session/pdr_builder.go +++ b/pkg/pfcpsim/session/pdr_builder.go @@ -4,9 +4,9 @@ package session import ( - "log" "net" + "github.com/omec-project/pfcpsim/logger" "github.com/wmnsk/go-pfcp/ie" ) @@ -49,16 +49,16 @@ func NewPDRBuilder() *pdrBuilder { func (b *pdrBuilder) FuzzIE(ieType int, arg uint) *pdrBuilder { switch ieType { case PdrWithPrecedence: - log.Println("PdrWithPrecedence") + logger.PfcpsimLog.Infoln("PdrWithPrecedence") return b.WithPrecedence(uint32(arg)) case PdrWithTEID: - log.Println("PdrWithTEID") + logger.PfcpsimLog.Infoln("PdrWithTEID") return b.WithTEID(uint32(arg)) case PdrAddQERID: - log.Println("PdrAddQERID") + logger.PfcpsimLog.Infoln("PdrAddQERID") return b.AddQERID(uint32(arg)) case PdrWithFARID: - log.Println("PdrWithFARID") + logger.PfcpsimLog.Infoln("PdrWithFARID") return b.WithFARID(uint32(arg)) default: } @@ -123,30 +123,30 @@ func (b *pdrBuilder) MarkAsUplink() *pdrBuilder { func (b *pdrBuilder) validate() { if b.direction == notSet { - panic("Tried building a PDR without marking it as uplink or downlink") + logger.PfcpsimLog.Panicln("tried building a PDR without marking it as uplink or downlink") } if len(b.qerIDs) == 0 { - panic("Tried building PDR without providing QER IDs") + logger.PfcpsimLog.Panicln("tried building PDR without providing QER IDs") } if b.farID == 0 { - panic("Tried building PDR without providing FAR ID") + logger.PfcpsimLog.Panicln("tried building PDR without providing FAR ID") } if b.direction == downlink { if b.ueAddress == "" { - panic("Tried building downlink PDR without setting the UE IP address") + logger.PfcpsimLog.Panicln("tried building downlink PDR without setting the UE IP address") } } if b.direction == uplink { if b.n3Address == "" { - panic("Tried building uplink PDR without setting the N3Address") + logger.PfcpsimLog.Panicln("tried building uplink PDR without setting the N3Address") } if b.teid == 0 { - panic("Tried building uplink PDR without setting the TEID") + logger.PfcpsimLog.Panicln("tried building uplink PDR without setting the TEID") } } } diff --git a/pkg/pfcpsim/session/qer_builder.go b/pkg/pfcpsim/session/qer_builder.go index ff2da9c..9a7dfc4 100644 --- a/pkg/pfcpsim/session/qer_builder.go +++ b/pkg/pfcpsim/session/qer_builder.go @@ -4,8 +4,7 @@ package session import ( - "log" - + "github.com/omec-project/pfcpsim/logger" "github.com/wmnsk/go-pfcp/ie" ) @@ -42,22 +41,22 @@ func NewQERBuilder() *qerBuilder { func (b *qerBuilder) FuzzIE(ieType int, arg uint) *qerBuilder { switch ieType { case QerWithQFI: - log.Println("QerWithQFI") + logger.PfcpsimLog.Infoln("QerWithQFI") return b.WithQFI(uint8(arg)) case QerWithUplinkMBR: - log.Println("QerWithUplinkMBR") + logger.PfcpsimLog.Infoln("QerWithUplinkMBR") return b.WithUplinkMBR(uint64(arg)) case QerWithUplinkGBR: - log.Println("QerWithUplinkGBR") + logger.PfcpsimLog.Infoln("QerWithUplinkGBR") return b.WithUplinkGBR(uint64(arg)) case QerWithDownlinkMBR: - log.Println("QerWithDownlinkMBR") + logger.PfcpsimLog.Infoln("QerWithDownlinkMBR") return b.WithDownlinkMBR(uint64(arg)) case QerWithDownlinkGBR: - log.Println("QerWithDownlinkGBR") + logger.PfcpsimLog.Infoln("QerWithDownlinkGBR") return b.WithDownlinkGBR(uint64(arg)) case QerWithGateStatus: - log.Println("QerWithGateStatus") + logger.PfcpsimLog.Infoln("QerWithGateStatus") return b.WithGateStatus(uint8(arg)) default: } @@ -114,7 +113,7 @@ func (b *qerBuilder) WithGateStatus(status uint8) *qerBuilder { func (b *qerBuilder) validate() { if !b.isIDSet { - panic("Tried to build a QER without setting the QER ID") + logger.PfcpsimLog.Panicln("tried to build a QER without setting the QER ID") } } diff --git a/pkg/pfcpsim/session/urr_builder.go b/pkg/pfcpsim/session/urr_builder.go index 9d90238..1b8d781 100644 --- a/pkg/pfcpsim/session/urr_builder.go +++ b/pkg/pfcpsim/session/urr_builder.go @@ -4,9 +4,9 @@ package session import ( - "log" "time" + "github.com/omec-project/pfcpsim/logger" "github.com/wmnsk/go-pfcp/ie" ) @@ -43,10 +43,10 @@ func NewURRBuilder() *urrBuilder { func (b *urrBuilder) FuzzIE(ieType int, arg uint) *urrBuilder { switch ieType { case UrrWithMeasurementInfo: - log.Println("Fuzz: UrrWithMeasurementInfo") + logger.PfcpsimLog.Infoln("Fuzz: UrrWithMeasurementInfo") return b.WithMeasurementInfo(uint8(arg)) case UrrWithMeasurementMethod: - log.Println("Fuzz: UrrWithMeasurementMethod") + logger.PfcpsimLog.Infoln("Fuzz: UrrWithMeasurementMethod") args := []int{0, 1, 0} i := arg % 3 @@ -54,7 +54,7 @@ func (b *urrBuilder) FuzzIE(ieType int, arg uint) *urrBuilder { return b.WithMeasurementMethod(args[0], args[1], args[2]) case UrrWithMeasurementPeriod: - log.Println("Fuzz: UrrWithMeasurementPeriod") + logger.PfcpsimLog.Infoln("Fuzz: UrrWithMeasurementPeriod") return b.WithMeasurementPeriod(time.Duration(arg)) default: } @@ -124,11 +124,11 @@ func (b *urrBuilder) WithReportingTrigger(rptTrig ReportingTrigger) *urrBuilder func (b *urrBuilder) validate() { if b.urrID == 0 { - panic("URR ID is not set") + logger.PfcpsimLog.Panicln("URR ID is not set") } if b.measurementInfo > 0 && b.measurementInfo > MNOP { - panic("Measurement Information is not valid") + logger.PfcpsimLog.Panicln("Measurement Information is not valid") } }