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

Initial commit for sonic-gnmi. #3

Closed
wants to merge 25 commits into from
Closed
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Replace testMode
ganglyu committed Jun 20, 2022
commit 8cabbed6c3700ebdc6ba0f0bbc578f8b13ab780f
9 changes: 3 additions & 6 deletions gnmi_server/gnoi.go
Original file line number Diff line number Diff line change
@@ -16,9 +16,9 @@ import (
jwt "github.com/dgrijalva/jwt-go"
)

func RebootSystem(fileName string, testMode bool) error {
func RebootSystem(fileName string) error {
log.V(2).Infof("Rebooting with %s...", fileName)
sc, err := ssc.NewDbusClient(testMode)
sc, err := ssc.NewDbusClient()
if err != nil {
return err
}
@@ -39,7 +39,7 @@ func (srv *Server) Reboot(ctx context.Context, req *gnoi_system_pb.RebootRequest
if errors.Is(err, os.ErrNotExist) {
fileName = ""
}
RebootSystem(fileName, srv.config.TestMode)
RebootSystem(fileName)
var resp gnoi_system_pb.RebootResponse
return &resp, nil
}
@@ -125,9 +125,6 @@ func (srv *Server) Authenticate(ctx context.Context, req *spb_jwt.AuthenticateRe
return nil, status.Errorf(codes.Unimplemented, "")
}
auth_success, _ := UserPwAuth(req.Username, req.Password)
if srv.config.TestMode == true {
auth_success = true
}
if auth_success {
usr, err := user.Lookup(req.Username)
if err == nil {
5 changes: 2 additions & 3 deletions gnmi_server/server.go
Original file line number Diff line number Diff line change
@@ -61,7 +61,6 @@ type Config struct {
// for this Server.
Port int64
UserAuth AuthTypes
TestMode bool
}

var AuthLock sync.Mutex
@@ -356,7 +355,7 @@ func (s *Server) Get(ctx context.Context, req *gnmipb.GetRequest) (*gnmipb.GetRe
var dc sdc.Client

if _, ok, _, _ := sdc.IsTargetDb(target); ok {
dc, err = sdc.NewDbClient(paths, prefix, target, origin, s.config.TestMode)
dc, err = sdc.NewDbClient(paths, prefix, target, origin)
} else {
common_utils.IncCounter("GNMI get fail")
return nil, status.Errorf(codes.Unimplemented, "Invalid target: %s", target)
@@ -441,7 +440,7 @@ func (s *Server) Set(ctx context.Context, req *gnmipb.SetRequest) (*gnmipb.SetRe
var dc sdc.Client

if _, ok, _, _ := sdc.IsTargetDb(target); ok {
dc, err = sdc.NewDbClient(nil, prefix, target, origin, s.config.TestMode)
dc, err = sdc.NewDbClient(nil, prefix, target, origin)
} else {
common_utils.IncCounter("GNMI set fail")
return nil, status.Errorf(codes.Unimplemented, "Invalid target: %s", target)
34 changes: 32 additions & 2 deletions gnmi_server/server_test.go
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@ import (
"os/exec"
"path/filepath"
"fmt"
"reflect"

testcert "github.com/sonic-net/sonic-gnmi/testdata/tls"

@@ -24,6 +25,9 @@ import (
"github.com/sonic-net/sonic-gnmi/common_utils"
// Register supported client types.
sdc "github.com/sonic-net/sonic-gnmi/sonic_data_client"

"github.com/agiledragon/gomonkey"
"github.com/godbus/dbus/v5"
)

func createServer(t *testing.T, port int64) *Server {
@@ -37,7 +41,7 @@ func createServer(t *testing.T, port int64) *Server {
}

opts := []grpc.ServerOption{grpc.Creds(credentials.NewTLS(tlsCfg))}
cfg := &Config{Port: port, TestMode: true}
cfg := &Config{Port: port}
s, err := NewServer(cfg, opts)
if err != nil {
t.Errorf("Failed to create gNMI server: %v", err)
@@ -74,7 +78,7 @@ func createAuthServer(t *testing.T, port int64) *Server {
}

opts := []grpc.ServerOption{grpc.Creds(credentials.NewTLS(tlsCfg))}
cfg := &Config{Port: port, TestMode: true, UserAuth: AuthTypes{"password": true, "cert": true, "jwt": true}}
cfg := &Config{Port: port, UserAuth: AuthTypes{"password": true, "cert": true, "jwt": true}}
s, err := NewServer(cfg, opts)
if err != nil {
t.Errorf("Failed to create gNMI server: %v", err)
@@ -92,6 +96,27 @@ func runServer(t *testing.T, s *Server) {
}

func TestAll(t *testing.T) {
mock1 := gomonkey.ApplyFunc(dbus.SystemBus, func() (conn *dbus.Conn, err error) {
return &dbus.Conn{}, nil
})
defer mock1.Reset()
mock2 := gomonkey.ApplyMethod(reflect.TypeOf(&dbus.Object{}), "Go", func(obj *dbus.Object, method string, flags dbus.Flags, ch chan *dbus.Call, args ...interface{}) *dbus.Call {
ret := &dbus.Call{}
ret.Err = nil
ret.Body = make([]interface{}, 2)
ret.Body[0] = int32(0)
ch <- ret
return &dbus.Call{}
})
defer mock2.Reset()
mockCode :=
`
print('No Yang validation for test mode...')
print('%s')
`
mock3 := gomonkey.ApplyGlobalVar(&sdc.PyCodeForYang, mockCode)
defer mock3.Reset()

s := createServer(t, 8080)
go runServer(t, s)
defer s.s.Stop()
@@ -128,6 +153,11 @@ func TestInvalidServer(t *testing.T) {
}

func TestAuth(t *testing.T) {
mock1 := gomonkey.ApplyFunc(UserPwAuth, func(username string, passwd string) (bool, error) {
return true, nil
})
defer mock1.Reset()

s := createAuthServer(t, 8080)
go runServer(t, s)
defer s.s.Stop()
1 change: 0 additions & 1 deletion gnxi/gnxi.go
Original file line number Diff line number Diff line change
@@ -131,7 +131,6 @@ func main() {
gnmi.GenerateJwtSecretKey()
}

cfg.TestMode = false
s, err := gnmi.NewServer(cfg, opts)
if err != nil {
log.Errorf("Failed to create gNMI server: %v", err)
41 changes: 16 additions & 25 deletions sonic_data_client/db_client.go
Original file line number Diff line number Diff line change
@@ -92,7 +92,6 @@ type DbClient struct {
target string
origin string
workPath string
testMode bool

synced sync.WaitGroup // Control when to send gNMI sync_response
w *sync.WaitGroup // wait for all sub go routines to finish
@@ -103,7 +102,7 @@ type DbClient struct {
errors int64
}

func NewDbClient(paths []*gnmipb.Path, prefix *gnmipb.Path, target string, origin string, testMode bool) (Client, error) {
func NewDbClient(paths []*gnmipb.Path, prefix *gnmipb.Path, target string, origin string) (Client, error) {
var client DbClient

// Testing program may ask to use redis local tcp connection
@@ -115,7 +114,6 @@ func NewDbClient(paths []*gnmipb.Path, prefix *gnmipb.Path, target string, origi
client.target = target
client.origin = origin
client.paths = paths
client.testMode = testMode
client.workPath = "/etc/sonic/gnmi"

return &client, nil
@@ -1150,7 +1148,7 @@ func (c *DbClient) SetIncrementalConfig(delete []*gnmipb.Path, replace []*gnmipb
}

var sc ssc.Service
sc, err = ssc.NewDbusClient(c.testMode)
sc, err = ssc.NewDbusClient()
if err != nil {
return err
}
@@ -1169,26 +1167,7 @@ func (c *DbClient) SetIncrementalConfig(delete []*gnmipb.Path, replace []*gnmipb
return err
}

func (c *DbClient) SetFullConfig(delete []*gnmipb.Path, replace []*gnmipb.Update, update []*gnmipb.Update) error {
val := update[0].GetVal()
ietf_json_val := val.GetJsonIetfVal()
if len(ietf_json_val) == 0 {
return fmt.Errorf("Value encoding is not IETF JSON")
}
content := []byte(ietf_json_val)
fileName := c.workPath + "/config_db.json.tmp"
err := ioutil.WriteFile(fileName, content, 0644)
if err != nil {
return err
}

PyCodeInGo :=
`
print('No Yang validation for test mode...')
print('%s')
`
if c.testMode != true {
PyCodeInGo =
var PyCodeForYang string =
`
import sonic_yang
import json
@@ -1204,9 +1183,21 @@ except sonic_yang.SonicYangException as e:
print("Yang validation error: {}".format(str(e)))
raise
`

func (c *DbClient) SetFullConfig(delete []*gnmipb.Path, replace []*gnmipb.Update, update []*gnmipb.Update) error {
val := update[0].GetVal()
ietf_json_val := val.GetJsonIetfVal()
if len(ietf_json_val) == 0 {
return fmt.Errorf("Value encoding is not IETF JSON")
}
content := []byte(ietf_json_val)
fileName := c.workPath + "/config_db.json.tmp"
err := ioutil.WriteFile(fileName, content, 0644)
if err != nil {
return err
}

PyCodeInGo = fmt.Sprintf(PyCodeInGo, ietf_json_val)
PyCodeInGo := fmt.Sprintf(PyCodeForYang, ietf_json_val)
err = RunPyCode(PyCodeInGo)
if err != nil {
return fmt.Errorf("Yang validation failed!")
22 changes: 1 addition & 21 deletions sonic_service_client/dbus_client.go
Original file line number Diff line number Diff line change
@@ -22,18 +22,16 @@ type DbusClient struct {
busNamePrefix string
busPathPrefix string
intNamePrefix string
testMode bool
channel chan struct{}
}

func NewDbusClient(testMode bool) (Service, error) {
func NewDbusClient() (Service, error) {
var client DbusClient
var err error

client.busNamePrefix = "org.SONiC.HostService."
client.busPathPrefix = "/org/SONiC/HostService/"
client.intNamePrefix = "org.SONiC.HostService."
client.testMode = testMode
err = nil

return &client, err
@@ -92,9 +90,6 @@ func DbusApi(busName string, busPath string, intName string, timeout int, args .

func (c *DbusClient) ConfigReload(fileName string) error {
common_utils.IncCounter("DBUS config reload")
if c.testMode == true {
return nil
}
modName := "config"
busName := c.busNamePrefix + modName
busPath := c.busPathPrefix + modName
@@ -105,9 +100,6 @@ func (c *DbusClient) ConfigReload(fileName string) error {

func (c *DbusClient) ConfigSave(fileName string) error {
common_utils.IncCounter("DBUS config save")
if c.testMode == true {
return nil
}
modName := "config"
busName := c.busNamePrefix + modName
busPath := c.busPathPrefix + modName
@@ -118,9 +110,6 @@ func (c *DbusClient) ConfigSave(fileName string) error {

func (c *DbusClient) ApplyPatchYang(fileName string) error {
common_utils.IncCounter("DBUS apply patch yang")
if c.testMode == true {
return nil
}
modName := "gcu"
busName := c.busNamePrefix + modName
busPath := c.busPathPrefix + modName
@@ -131,9 +120,6 @@ func (c *DbusClient) ApplyPatchYang(fileName string) error {

func (c *DbusClient) ApplyPatchDb(fileName string) error {
common_utils.IncCounter("DBUS apply patch db")
if c.testMode == true {
return nil
}
modName := "gcu"
busName := c.busNamePrefix + modName
busPath := c.busPathPrefix + modName
@@ -144,9 +130,6 @@ func (c *DbusClient) ApplyPatchDb(fileName string) error {

func (c *DbusClient) CreateCheckPoint(fileName string) error {
common_utils.IncCounter("DBUS create checkpoint")
if c.testMode == true {
return nil
}
modName := "gcu"
busName := c.busNamePrefix + modName
busPath := c.busPathPrefix + modName
@@ -157,9 +140,6 @@ func (c *DbusClient) CreateCheckPoint(fileName string) error {

func (c *DbusClient) DeleteCheckPoint(fileName string) error {
common_utils.IncCounter("DBUS delete checkpoint")
if c.testMode == true {
return nil
}
modName := "gcu"
busName := c.busNamePrefix + modName
busPath := c.busPathPrefix + modName
24 changes: 12 additions & 12 deletions sonic_service_client/dbus_client_test.go
Original file line number Diff line number Diff line change
@@ -26,7 +26,7 @@ func TestConfigReload(t *testing.T) {
})
defer mock2.Reset()

client, err := NewDbusClient(false)
client, err := NewDbusClient()
if err != nil {
t.Errorf("NewDbusClient failed: %v", err)
}
@@ -56,7 +56,7 @@ func TestConfigReloadNegative(t *testing.T) {
})
defer mock2.Reset()

client, err := NewDbusClient(false)
client, err := NewDbusClient()
if err != nil {
t.Errorf("NewDbusClient failed: %v", err)
}
@@ -87,7 +87,7 @@ func TestConfigSave(t *testing.T) {
})
defer mock2.Reset()

client, err := NewDbusClient(false)
client, err := NewDbusClient()
if err != nil {
t.Errorf("NewDbusClient failed: %v", err)
}
@@ -117,7 +117,7 @@ func TestConfigSaveNegative(t *testing.T) {
})
defer mock2.Reset()

client, err := NewDbusClient(false)
client, err := NewDbusClient()
if err != nil {
t.Errorf("NewDbusClient failed: %v", err)
}
@@ -148,7 +148,7 @@ func TestApplyPatchYang(t *testing.T) {
})
defer mock2.Reset()

client, err := NewDbusClient(false)
client, err := NewDbusClient()
if err != nil {
t.Errorf("NewDbusClient failed: %v", err)
}
@@ -178,7 +178,7 @@ func TestApplyPatchYangNegative(t *testing.T) {
})
defer mock2.Reset()

client, err := NewDbusClient(false)
client, err := NewDbusClient()
if err != nil {
t.Errorf("NewDbusClient failed: %v", err)
}
@@ -209,7 +209,7 @@ func TestApplyPatchDb(t *testing.T) {
})
defer mock2.Reset()

client, err := NewDbusClient(false)
client, err := NewDbusClient()
if err != nil {
t.Errorf("NewDbusClient failed: %v", err)
}
@@ -239,7 +239,7 @@ func TestApplyPatchDbNegative(t *testing.T) {
})
defer mock2.Reset()

client, err := NewDbusClient(false)
client, err := NewDbusClient()
if err != nil {
t.Errorf("NewDbusClient failed: %v", err)
}
@@ -270,7 +270,7 @@ func TestCreateCheckPoint(t *testing.T) {
})
defer mock2.Reset()

client, err := NewDbusClient(false)
client, err := NewDbusClient()
if err != nil {
t.Errorf("NewDbusClient failed: %v", err)
}
@@ -300,7 +300,7 @@ func TestCreateCheckPointNegative(t *testing.T) {
})
defer mock2.Reset()

client, err := NewDbusClient(false)
client, err := NewDbusClient()
if err != nil {
t.Errorf("NewDbusClient failed: %v", err)
}
@@ -331,7 +331,7 @@ func TestDeleteCheckPoint(t *testing.T) {
})
defer mock2.Reset()

client, err := NewDbusClient(false)
client, err := NewDbusClient()
if err != nil {
t.Errorf("NewDbusClient failed: %v", err)
}
@@ -361,7 +361,7 @@ func TestDeleteCheckPointNegative(t *testing.T) {
})
defer mock2.Reset()

client, err := NewDbusClient(false)
client, err := NewDbusClient()
if err != nil {
t.Errorf("NewDbusClient failed: %v", err)
}