Skip to content
Snippets Groups Projects
Commit 2ffd42f0 authored by Fabian Seidl's avatar Fabian Seidl
Browse files

fugly godot commit

parent 02352b3b
No related branches found
No related tags found
1 merge request!363Resolve "Improve security by enabling and enforcing more linting rules"
Pipeline #110847 passed
Showing
with 56 additions and 56 deletions
...@@ -10,7 +10,7 @@ import ( ...@@ -10,7 +10,7 @@ import (
"github.com/google/uuid" "github.com/google/uuid"
) )
// CreateUsers creates users with provided data // CreateUsers creates users with provided data.
func CreateUsers(ctx context.Context, addr string, users []*apb.User) (*apb.CreateUsersResponse, error) { func CreateUsers(ctx context.Context, addr string, users []*apb.User) (*apb.CreateUsersResponse, error) {
userClient, err := nbi.UserClient(addr, dialOptions...) userClient, err := nbi.UserClient(addr, dialOptions...)
if err != nil { if err != nil {
...@@ -25,7 +25,7 @@ func CreateUsers(ctx context.Context, addr string, users []*apb.User) (*apb.Crea ...@@ -25,7 +25,7 @@ func CreateUsers(ctx context.Context, addr string, users []*apb.User) (*apb.Crea
return userClient.CreateUsers(ctx, r) return userClient.CreateUsers(ctx, r)
} }
//GetUser returns one requested user found by name //GetUser returns one requested user found by name.
func GetUser(ctx context.Context, addr, name string, uuid uuid.UUID) (*apb.GetUserResponse, error) { func GetUser(ctx context.Context, addr, name string, uuid uuid.UUID) (*apb.GetUserResponse, error) {
userClient, err := nbi.UserClient(addr, dialOptions...) userClient, err := nbi.UserClient(addr, dialOptions...)
if err != nil { if err != nil {
...@@ -41,7 +41,7 @@ func GetUser(ctx context.Context, addr, name string, uuid uuid.UUID) (*apb.GetUs ...@@ -41,7 +41,7 @@ func GetUser(ctx context.Context, addr, name string, uuid uuid.UUID) (*apb.GetUs
return userClient.GetUser(ctx, r) return userClient.GetUser(ctx, r)
} }
// GetAllUsers return all the available users // GetAllUsers return all the available users.
func GetAllUsers(ctx context.Context, addr string) (*apb.GetUsersResponse, error) { func GetAllUsers(ctx context.Context, addr string) (*apb.GetUsersResponse, error) {
userClient, err := nbi.UserClient(addr, dialOptions...) userClient, err := nbi.UserClient(addr, dialOptions...)
if err != nil { if err != nil {
...@@ -55,7 +55,7 @@ func GetAllUsers(ctx context.Context, addr string) (*apb.GetUsersResponse, error ...@@ -55,7 +55,7 @@ func GetAllUsers(ctx context.Context, addr string) (*apb.GetUsersResponse, error
return userClient.GetUsers(ctx, r) return userClient.GetUsers(ctx, r)
} }
// UpdateUsers updates all provided users // UpdateUsers updates all provided users.
func UpdateUsers(ctx context.Context, addr string, users []*apb.User) (*apb.UpdateUsersResponse, error) { func UpdateUsers(ctx context.Context, addr string, users []*apb.User) (*apb.UpdateUsersResponse, error) {
userClient, err := nbi.UserClient(addr, dialOptions...) userClient, err := nbi.UserClient(addr, dialOptions...)
if err != nil { if err != nil {
...@@ -70,7 +70,7 @@ func UpdateUsers(ctx context.Context, addr string, users []*apb.User) (*apb.Upda ...@@ -70,7 +70,7 @@ func UpdateUsers(ctx context.Context, addr string, users []*apb.User) (*apb.Upda
return userClient.UpdateUsers(ctx, r) return userClient.UpdateUsers(ctx, r)
} }
// DeleteUsers deletes all provided users // DeleteUsers deletes all provided users.
func DeleteUsers(ctx context.Context, addr string, userNames []string) (*apb.DeleteUsersResponse, error) { func DeleteUsers(ctx context.Context, addr string, userNames []string) (*apb.DeleteUsersResponse, error) {
userClient, err := nbi.UserClient(addr, dialOptions...) userClient, err := nbi.UserClient(addr, dialOptions...)
if err != nil { if err != nil {
......
...@@ -52,7 +52,7 @@ var csbiOrchestrator string ...@@ -52,7 +52,7 @@ var csbiOrchestrator string
var pluginFolder string var pluginFolder string
var security string var security string
// rootCmd represents the base command when called without any subcommands // rootCmd represents the base command when called without any subcommands.
var rootCmd = &cobra.Command{ var rootCmd = &cobra.Command{
Use: "gosdn", Use: "gosdn",
Short: "starts the gosdn controller", Short: "starts the gosdn controller",
......
...@@ -23,7 +23,7 @@ const ( ...@@ -23,7 +23,7 @@ const (
jwtSecretKey = "jwtSecret" jwtSecretKey = "jwtSecret"
gNMISubscriptionsFilePathKey = "gNMISubscriptionsPath" gNMISubscriptionsFilePathKey = "gNMISubscriptionsPath"
// RabbitMQ Broker // RabbitMQ Broker.
amqpPrefixKey = "amqpPrefix" amqpPrefixKey = "amqpPrefix"
amqpUserKey = "amqpUser" amqpUserKey = "amqpUser"
amqpPasswordKey = "amqpPassword" amqpPasswordKey = "amqpPassword"
...@@ -31,52 +31,52 @@ const ( ...@@ -31,52 +31,52 @@ const (
amqpPortKey = "amqpPort" amqpPortKey = "amqpPort"
) )
// BasePndUUID is an uuid for the base PND // BasePndUUID is an uuid for the base PND.
var BasePndUUID uuid.UUID var BasePndUUID uuid.UUID
// BaseSouthBoundType is the type of the base SBI // BaseSouthBoundType is the type of the base SBI.
var BaseSouthBoundType int32 var BaseSouthBoundType int32
// BaseSouthBoundUUID is an uuid for the base SBI // BaseSouthBoundUUID is an uuid for the base SBI.
var BaseSouthBoundUUID uuid.UUID var BaseSouthBoundUUID uuid.UUID
// ChangeTimeout is the default timeout for a change // ChangeTimeout is the default timeout for a change.
var ChangeTimeout time.Duration var ChangeTimeout time.Duration
// LogLevel ist the default log level // LogLevel ist the default log level.
var LogLevel logrus.Level var LogLevel logrus.Level
// DatabaseConnection holds the credentials and address of the used database // DatabaseConnection holds the credentials and address of the used database.
var DatabaseConnection string var DatabaseConnection string
// FilesystemPathToStores determines in which folder the stores should be saved // FilesystemPathToStores determines in which folder the stores should be saved.
var FilesystemPathToStores = "stores_testing" var FilesystemPathToStores = "stores_testing"
// JWTDuration determines how long a jwt is valid // JWTDuration determines how long a jwt is valid.
var JWTDuration time.Duration var JWTDuration time.Duration
// JWTSecret determines the scret that is used to sign tokens // JWTSecret determines the scret that is used to sign tokens.
var JWTSecret string var JWTSecret string
// AMQPPrefix is the amqp prefix // AMQPPrefix is the amqp prefix.
var AMQPPrefix string var AMQPPrefix string
// AMQPUser is the amqp user // AMQPUser is the amqp user.
var AMQPUser string var AMQPUser string
// AMQPPassword is the amqp user password // AMQPPassword is the amqp user password.
var AMQPPassword string var AMQPPassword string
// AMQPHost is the amqp host // AMQPHost is the amqp host.
var AMQPHost string var AMQPHost string
// AMQPPort is the amqp port // AMQPPort is the amqp port.
var AMQPPort string var AMQPPort string
// GNMISubscriptionsFilePath is the path to the file used for automated subscriptions // GNMISubscriptionsFilePath is the path to the file used for automated subscriptions.
var GNMISubscriptionsFilePath string var GNMISubscriptionsFilePath string
// Init gets called on module import // Init gets called on module import.
func Init() { func Init() {
err := InitializeConfig() err := InitializeConfig()
if err != nil { if err != nil {
...@@ -84,7 +84,7 @@ func Init() { ...@@ -84,7 +84,7 @@ func Init() {
} }
} }
// InitializeConfig loads the configuration // InitializeConfig loads the configuration.
func InitializeConfig() error { func InitializeConfig() error {
var err error var err error
......
...@@ -9,11 +9,11 @@ import ( ...@@ -9,11 +9,11 @@ import (
type Environment int64 type Environment int64
const ( const (
// Development is used for local development // Development is used for local development.
Development Environment = iota Development Environment = iota
// Production is used for production deployments // Production is used for production deployments.
Production Production
// Testing is used for tests // Testing is used for tests.
Testing Testing
) )
......
...@@ -47,7 +47,7 @@ import ( ...@@ -47,7 +47,7 @@ import (
var coreLock sync.RWMutex var coreLock sync.RWMutex
var coreOnce sync.Once var coreOnce sync.Once
// Core is the representation of the controller's core // Core is the representation of the controller's core.
type Core struct { type Core struct {
pndStore networkdomain.PndStore pndStore networkdomain.PndStore
userService rbac.UserService userService rbac.UserService
...@@ -67,7 +67,7 @@ type Core struct { ...@@ -67,7 +67,7 @@ type Core struct {
var c *Core var c *Core
// initialize does start-up housekeeping like reading controller config files // initialize does start-up housekeeping like reading controller config files.
func initialize() error { func initialize() error {
err := config.InitializeConfig() err := config.InitializeConfig()
if err != nil { if err != nil {
...@@ -187,7 +187,7 @@ func startGrpc() error { ...@@ -187,7 +187,7 @@ func startGrpc() error {
return nil return nil
} }
// createPrincipalNetworkDomain initializes the controller with an initial PND // createPrincipalNetworkDomain initializes the controller with an initial PND.
func createPrincipalNetworkDomain() error { func createPrincipalNetworkDomain() error {
basePnd, err := c.pndStore.Get(store.Query{ID: config.BasePndUUID}) basePnd, err := c.pndStore.Get(store.Query{ID: config.BasePndUUID})
if err != nil { if err != nil {
...@@ -295,7 +295,7 @@ func ensureDefaultUserExists() error { ...@@ -295,7 +295,7 @@ func ensureDefaultUserExists() error {
return nil return nil
} }
// Run calls initialize to start the controller // Run calls initialize to start the controller.
func Run(ctx context.Context) error { func Run(ctx context.Context) error {
var initError error var initError error
coreOnce.Do(func() { coreOnce.Do(func() {
......
...@@ -12,7 +12,7 @@ import ( ...@@ -12,7 +12,7 @@ import (
const apiEndpoint = "http://localhost:8080" const apiEndpoint = "http://localhost:8080"
// UUIDs for test cases // UUIDs for test cases.
var mdid uuid.UUID var mdid uuid.UUID
var defaultPndID uuid.UUID var defaultPndID uuid.UUID
var cuid uuid.UUID var cuid uuid.UUID
......
...@@ -11,7 +11,7 @@ import ( ...@@ -11,7 +11,7 @@ import (
// Change is an intended change to an OND. It is unique and immutable. // Change is an intended change to an OND. It is unique and immutable.
// It has a cuid, a timestamp, and holds both the previous and the new // It has a cuid, a timestamp, and holds both the previous and the new
// state. It keeps track if the state is committed and confirmed. A callback // state. It keeps track if the state is committed and confirmed. A callback
// exists to acess the proper transport for the changed OND // exists to acess the proper transport for the changed OND.
type Change interface { type Change interface {
ID() uuid.UUID ID() uuid.UUID
Commit() error Commit() error
......
...@@ -11,7 +11,7 @@ import ( ...@@ -11,7 +11,7 @@ import (
) )
// Device represents an Orchestrated Network Device (OND) which is managed by // Device represents an Orchestrated Network Device (OND) which is managed by
// nucleus // nucleus.
type Device interface { type Device interface {
ID() uuid.UUID ID() uuid.UUID
GetModel() ygot.GoStruct GetModel() ygot.GoStruct
...@@ -24,7 +24,7 @@ type Device interface { ...@@ -24,7 +24,7 @@ type Device interface {
GetModelAsString() (string, error) GetModelAsString() (string, error)
} }
// Details contains details of a device used by the cSBI mechanism // Details contains details of a device used by the cSBI mechanism.
type Details struct { type Details struct {
ID string ID string
Address string Address string
...@@ -62,7 +62,7 @@ func (ld *LoadedDevice) SetConvertFunction(cf func(LoadedDevice) (Device, error) ...@@ -62,7 +62,7 @@ func (ld *LoadedDevice) SetConvertFunction(cf func(LoadedDevice) (Device, error)
} }
// ConvertToDevice calls the LoadedDevice's convert function and converts the // ConvertToDevice calls the LoadedDevice's convert function and converts the
// LoadedDevice into a Device // LoadedDevice into a Device.
func (ld LoadedDevice) ConvertToDevice() (Device, error) { func (ld LoadedDevice) ConvertToDevice() (Device, error) {
return ld.convertFunc(ld) return ld.convertFunc(ld)
} }
...@@ -2,7 +2,7 @@ package event ...@@ -2,7 +2,7 @@ package event
import "code.fbi.h-da.de/danet/gosdn/controller/event" import "code.fbi.h-da.de/danet/gosdn/controller/event"
// Service is the event service // Service is the event service.
type Service interface { type Service interface {
PublishEvent(topic string, event event.Event) error PublishEvent(topic string, event event.Event) error
CloseConnection() CloseConnection()
......
...@@ -13,7 +13,7 @@ type UserService interface { ...@@ -13,7 +13,7 @@ type UserService interface {
GetAll() ([]User, error) GetAll() ([]User, error)
} }
// LoadedUser represents a User that was loaded // LoadedUser represents a User that was loaded.
type LoadedUser struct { type LoadedUser struct {
ID string `json:"_id" bson:"_id"` ID string `json:"_id" bson:"_id"`
UserName string `json:"username"` UserName string `json:"username"`
...@@ -32,7 +32,7 @@ type RoleService interface { ...@@ -32,7 +32,7 @@ type RoleService interface {
GetAll() ([]Role, error) GetAll() ([]Role, error)
} }
// LoadedRole represents a Role that was loaded // LoadedRole represents a Role that was loaded.
type LoadedRole struct { type LoadedRole struct {
ID string `json:"_id" bson:"_id"` ID string `json:"_id" bson:"_id"`
RoleName string `json:"rolename"` RoleName string `json:"rolename"`
......
...@@ -2,7 +2,7 @@ package rbac ...@@ -2,7 +2,7 @@ package rbac
import "github.com/google/uuid" import "github.com/google/uuid"
// Role represents a role with permissions // Role represents a role with permissions.
type Role interface { type Role interface {
ID() uuid.UUID ID() uuid.UUID
Name() string Name() string
......
...@@ -2,7 +2,7 @@ package rbac ...@@ -2,7 +2,7 @@ package rbac
import "github.com/google/uuid" import "github.com/google/uuid"
// User represents an User which is managed by rbac // User represents an User which is managed by rbac.
type User interface { type User interface {
ID() uuid.UUID ID() uuid.UUID
Name() string Name() string
......
...@@ -11,7 +11,7 @@ import ( ...@@ -11,7 +11,7 @@ import (
) )
// SouthboundInterface provides an // SouthboundInterface provides an
// interface for SBI implementations // interface for SBI implementations.
type SouthboundInterface interface { // nolint type SouthboundInterface interface { // nolint
// SetNode injects SBI specific model // SetNode injects SBI specific model
// representation to the transport. // representation to the transport.
......
...@@ -10,7 +10,7 @@ import ( ...@@ -10,7 +10,7 @@ import (
) )
// Transport provides an interface for Transport implementations // Transport provides an interface for Transport implementations
// like RESTCONF or gnmi // like RESTCONF or gnmi.
type Transport interface { type Transport interface {
Get(ctx context.Context, params ...string) (interface{}, error) Get(ctx context.Context, params ...string) (interface{}, error)
Set(ctx context.Context, payload change.Payload, path string, schema *ytypes.Schema) error Set(ctx context.Context, payload change.Payload, path string, schema *ytypes.Schema) error
...@@ -24,13 +24,13 @@ type Transport interface { ...@@ -24,13 +24,13 @@ type Transport interface {
} }
type ( type (
// HandleSubscribeResponse is the callback function to handle subcription responses // HandleSubscribeResponse is the callback function to handle subcription responses.
HandleSubscribeResponse func(*gpb.SubscribeResponse, *SubscriptionInformation) HandleSubscribeResponse func(*gpb.SubscribeResponse, *SubscriptionInformation)
) )
// SubscriptionInformation contains additional information used for internal subscriptions // SubscriptionInformation contains additional information used for internal subscriptions
// for distinguishing from which device the information is from, to stop subscriptions and // for distinguishing from which device the information is from, to stop subscriptions and
// error handling // error handling.
type SubscriptionInformation struct { type SubscriptionInformation struct {
PndID string PndID string
DeviceID string DeviceID string
......
...@@ -7,7 +7,7 @@ import ( ...@@ -7,7 +7,7 @@ import (
// CoreClient returns a client for the gRPC Core service. It takes // CoreClient returns a client for the gRPC Core service. It takes
// the address of the gRPC endpoint and optional grpc.DialOption // the address of the gRPC endpoint and optional grpc.DialOption
// as argument // as argument.
func CoreClient(addr string, opts ...grpc.DialOption) (pb.CoreServiceClient, error) { func CoreClient(addr string, opts ...grpc.DialOption) (pb.CoreServiceClient, error) {
conn, err := grpc.Dial(addr, opts...) conn, err := grpc.Dial(addr, opts...)
if err != nil { if err != nil {
......
...@@ -7,7 +7,7 @@ import ( ...@@ -7,7 +7,7 @@ import (
// PndClient returns a client for the gRPC PND service. It takes // PndClient returns a client for the gRPC PND service. It takes
// the address of the gRPC endpoint and optional grpc.DialOption // the address of the gRPC endpoint and optional grpc.DialOption
// as argument // as argument.
func PndClient(addr string, opts ...grpc.DialOption) (ppb.PndServiceClient, error) { func PndClient(addr string, opts ...grpc.DialOption) (ppb.PndServiceClient, error) {
conn, err := grpc.Dial(addr, opts...) conn, err := grpc.Dial(addr, opts...)
if err != nil { if err != nil {
......
...@@ -7,7 +7,7 @@ import ( ...@@ -7,7 +7,7 @@ import (
// AuthClient returns a client for the gRPC Auth service. It takes // AuthClient returns a client for the gRPC Auth service. It takes
// the address of the gRPC endpoint and optional grpc.DialOption // the address of the gRPC endpoint and optional grpc.DialOption
// as argument // as argument.
func AuthClient(addr string, opts ...grpc.DialOption) (apb.AuthServiceClient, error) { func AuthClient(addr string, opts ...grpc.DialOption) (apb.AuthServiceClient, error) {
conn, err := grpc.Dial(addr, opts...) conn, err := grpc.Dial(addr, opts...)
if err != nil { if err != nil {
...@@ -18,7 +18,7 @@ func AuthClient(addr string, opts ...grpc.DialOption) (apb.AuthServiceClient, er ...@@ -18,7 +18,7 @@ func AuthClient(addr string, opts ...grpc.DialOption) (apb.AuthServiceClient, er
// UserClient returns a client for the gRPC User service. It takes // UserClient returns a client for the gRPC User service. It takes
// the address of the gRPC endpoint and optional grpc.DialOption // the address of the gRPC endpoint and optional grpc.DialOption
// as argument // as argument.
func UserClient(addr string, opts ...grpc.DialOption) (apb.UserServiceClient, error) { func UserClient(addr string, opts ...grpc.DialOption) (apb.UserServiceClient, error) {
conn, err := grpc.Dial(addr, opts...) conn, err := grpc.Dial(addr, opts...)
if err != nil { if err != nil {
...@@ -29,7 +29,7 @@ func UserClient(addr string, opts ...grpc.DialOption) (apb.UserServiceClient, er ...@@ -29,7 +29,7 @@ func UserClient(addr string, opts ...grpc.DialOption) (apb.UserServiceClient, er
// RoleClient returns a client for the gRPC Role service. It takes // RoleClient returns a client for the gRPC Role service. It takes
// the address of the gRPC endpoint and optional grpc.DialOption // the address of the gRPC endpoint and optional grpc.DialOption
// as argument // as argument.
func RoleClient(addr string, opts ...grpc.DialOption) (apb.RoleServiceClient, error) { func RoleClient(addr string, opts ...grpc.DialOption) (apb.RoleServiceClient, error) {
conn, err := grpc.Dial(addr, opts...) conn, err := grpc.Dial(addr, opts...)
if err != nil { if err != nil {
......
...@@ -7,7 +7,7 @@ import ( ...@@ -7,7 +7,7 @@ import (
// SbiClient returns a client for the gRPC SBI service. It takes // SbiClient returns a client for the gRPC SBI service. It takes
// the address of the gRPC endpoint and optional grpc.DialOption // the address of the gRPC endpoint and optional grpc.DialOption
// as argument // as argument.
func SbiClient(addr string, opts ...grpc.DialOption) (spb.SbiServiceClient, error) { func SbiClient(addr string, opts ...grpc.DialOption) (spb.SbiServiceClient, error) {
conn, err := grpc.Dial(addr, opts...) conn, err := grpc.Dial(addr, opts...)
if err != nil { if err != nil {
......
...@@ -32,7 +32,7 @@ func NewAuthServer(jwtManager *rbac.JWTManager, userService rbacInterfaces.UserS ...@@ -32,7 +32,7 @@ func NewAuthServer(jwtManager *rbac.JWTManager, userService rbacInterfaces.UserS
} }
} }
// Login logs a user in // Login logs a user in.
func (s AuthServer) Login(ctx context.Context, request *apb.LoginRequest) (*apb.LoginResponse, error) { func (s AuthServer) Login(ctx context.Context, request *apb.LoginRequest) (*apb.LoginResponse, error) {
labels := prometheus.Labels{"service": "auth", "rpc": "post"} labels := prometheus.Labels{"service": "auth", "rpc": "post"}
start := metrics.StartHook(labels, grpcRequestsTotal) start := metrics.StartHook(labels, grpcRequestsTotal)
...@@ -74,7 +74,7 @@ func (s AuthServer) Login(ctx context.Context, request *apb.LoginRequest) (*apb. ...@@ -74,7 +74,7 @@ func (s AuthServer) Login(ctx context.Context, request *apb.LoginRequest) (*apb.
}, nil }, nil
} }
// Logout logs a user out // Logout logs a user out.
func (s AuthServer) Logout(ctx context.Context, request *apb.LogoutRequest) (*apb.LogoutResponse, error) { func (s AuthServer) Logout(ctx context.Context, request *apb.LogoutRequest) (*apb.LogoutResponse, error) {
labels := prometheus.Labels{"service": "auth", "rpc": "post"} labels := prometheus.Labels{"service": "auth", "rpc": "post"}
start := metrics.StartHook(labels, grpcRequestsTotal) start := metrics.StartHook(labels, grpcRequestsTotal)
......
...@@ -16,7 +16,7 @@ import ( ...@@ -16,7 +16,7 @@ import (
"google.golang.org/grpc/status" "google.golang.org/grpc/status"
) )
// AuthInterceptor provides an AuthInterceptor // AuthInterceptor provides an AuthInterceptor.
type AuthInterceptor struct { type AuthInterceptor struct {
jwtManager *rbac.JWTManager jwtManager *rbac.JWTManager
userService rbacInterfaces.UserService userService rbacInterfaces.UserService
...@@ -36,7 +36,7 @@ func NewAuthInterceptor( ...@@ -36,7 +36,7 @@ func NewAuthInterceptor(
} }
} }
// Unary returns a unary interceptor function to authenticate and authorize unary RPC calls // Unary returns a unary interceptor function to authenticate and authorize unary RPC calls.
func (auth *AuthInterceptor) Unary() grpc.UnaryServerInterceptor { func (auth *AuthInterceptor) Unary() grpc.UnaryServerInterceptor {
return func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) { return func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) {
switch req.(type) { switch req.(type) {
...@@ -57,7 +57,7 @@ func (auth *AuthInterceptor) Unary() grpc.UnaryServerInterceptor { ...@@ -57,7 +57,7 @@ func (auth *AuthInterceptor) Unary() grpc.UnaryServerInterceptor {
} }
} }
// Stream returns a server interceptor function to authorize stream RPC calls // Stream returns a server interceptor function to authorize stream RPC calls.
func (auth *AuthInterceptor) Stream() grpc.StreamServerInterceptor { func (auth *AuthInterceptor) Stream() grpc.StreamServerInterceptor {
return func( return func(
srv interface{}, srv interface{},
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment