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

fix: Return backward compatibility #1399

Merged
merged 2 commits into from
Dec 16, 2022
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
13 changes: 1 addition & 12 deletions pkg/registry/common/authorize/ns_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import (

"github.com/networkservicemesh/sdk/pkg/registry/common/grpcmetadata"
"github.com/networkservicemesh/sdk/pkg/registry/core/next"
"github.com/networkservicemesh/sdk/pkg/tools/opa"
"github.com/networkservicemesh/sdk/pkg/tools/postpone"
)

Expand All @@ -51,18 +50,8 @@ func NewNetworkServiceRegistryClient(opts ...Option) registry.NetworkServiceRegi
opt(o)
}

policies, err := opa.PoliciesByFileMask(o.policyPaths...)
if err != nil {
panic(errors.Wrap(err, "failed to read policies in NetworkServiceRegistry authorize client").Error())
}

var policyList policiesList
for _, p := range policies {
policyList = append(policyList, p)
}

return &authorizeNSClient{
policies: policyList,
policies: o.policies,
nsPathIdsMap: o.resourcePathIdsMap,
}
}
Expand Down
14 changes: 1 addition & 13 deletions pkg/registry/common/authorize/ns_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,11 @@ import (
"context"

"github.com/golang/protobuf/ptypes/empty"
"github.com/pkg/errors"

"github.com/networkservicemesh/api/pkg/api/registry"

"github.com/networkservicemesh/sdk/pkg/registry/common/grpcmetadata"
"github.com/networkservicemesh/sdk/pkg/registry/core/next"
"github.com/networkservicemesh/sdk/pkg/tools/opa"
)

type authorizeNSServer struct {
Expand All @@ -46,18 +44,8 @@ func NewNetworkServiceRegistryServer(opts ...Option) registry.NetworkServiceRegi
opt(o)
}

policies, err := opa.PoliciesByFileMask(o.policyPaths...)
if err != nil {
panic(errors.Wrap(err, "failed to read policies in NetworkServiceRegistry authorize client").Error())
}

var policyList policiesList
for _, p := range policies {
policyList = append(policyList, p)
}

return &authorizeNSServer{
policies: policyList,
policies: o.policies,
nsPathIdsMap: o.resourcePathIdsMap,
}
}
Expand Down
13 changes: 1 addition & 12 deletions pkg/registry/common/authorize/nse_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import (

"github.com/networkservicemesh/sdk/pkg/registry/common/grpcmetadata"
"github.com/networkservicemesh/sdk/pkg/registry/core/next"
"github.com/networkservicemesh/sdk/pkg/tools/opa"
"github.com/networkservicemesh/sdk/pkg/tools/postpone"
)

Expand All @@ -51,18 +50,8 @@ func NewNetworkServiceEndpointRegistryClient(opts ...Option) registry.NetworkSer
opt(o)
}

policies, err := opa.PoliciesByFileMask(o.policyPaths...)
if err != nil {
panic(errors.Wrap(err, "failed to read policies in NetworkServiceRegistry authorize client").Error())
}

var policyList policiesList
for _, p := range policies {
policyList = append(policyList, p)
}

return &authorizeNSEClient{
policies: policyList,
policies: o.policies,
nsePathIdsMap: o.resourcePathIdsMap,
}
}
Expand Down
14 changes: 1 addition & 13 deletions pkg/registry/common/authorize/nse_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,11 @@ import (
"context"

"github.com/golang/protobuf/ptypes/empty"
"github.com/pkg/errors"

"github.com/networkservicemesh/api/pkg/api/registry"

"github.com/networkservicemesh/sdk/pkg/registry/common/grpcmetadata"
"github.com/networkservicemesh/sdk/pkg/registry/core/next"
"github.com/networkservicemesh/sdk/pkg/tools/opa"
)

type authorizeNSEServer struct {
Expand All @@ -46,18 +44,8 @@ func NewNetworkServiceEndpointRegistryServer(opts ...Option) registry.NetworkSer
opt(o)
}

policies, err := opa.PoliciesByFileMask(o.policyPaths...)
if err != nil {
panic(errors.Wrap(err, "failed to read policies in NetworkServiceRegistry authorize client").Error())
}

var policyList policiesList
for _, p := range policies {
policyList = append(policyList, p)
}

return &authorizeNSEServer{
policies: policyList,
policies: o.policies,
nsePathIdsMap: o.resourcePathIdsMap,
}
}
Expand Down
19 changes: 16 additions & 3 deletions pkg/registry/common/authorize/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,14 @@

package authorize

import (
"github.com/pkg/errors"

"github.com/networkservicemesh/sdk/pkg/tools/opa"
)

type options struct {
policyPaths []string
policies policiesList
resourcePathIdsMap *PathIdsMap
}

Expand All @@ -27,15 +33,22 @@ type Option func(*options)
// Any authorizes any call of request/close
func Any() Option {
return func(o *options) {
o.policyPaths = nil
o.policies = nil
}
}

// WithPolicies sets custom policies for registry.
// policyPaths can be combination of both policy files and dirs with policies
func WithPolicies(policyPaths ...string) Option {
return func(o *options) {
o.policyPaths = policyPaths
policies, err := opa.PoliciesByFileMask(policyPaths...)
if err != nil {
panic(errors.Wrap(err, "failed to read policies in NetworkServiceRegistry authorize client").Error())
}

for _, p := range policies {
o.policies = append(o.policies, Policy(p))
}
}
}

Expand Down
35 changes: 30 additions & 5 deletions pkg/registry/common/grpcmetadata/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"encoding/json"
"errors"

"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
)

Expand All @@ -44,21 +45,35 @@ func PathWithContext(ctx context.Context, path *Path) context.Context {
return context.WithValue(ctx, pathContextKey, path)
}

func loadFromMetadata(md metadata.MD) (*Path, error) {
pathValue, loaded := md["path"]
func fromMD(md metadata.MD) (*Path, error) {
pathValue, loaded := md[pathKey]

if !loaded {
return nil, errors.New("failed to load path from grpc metadata")
}

path := &Path{}
err := json.Unmarshal([]byte(pathValue[0]), path)
if err != nil {
return nil, err

if len(pathValue) > 0 {
err := json.Unmarshal([]byte(pathValue[len(pathValue)-1]), path)
if err != nil {
return nil, err
}
}

return path, nil
}

func fromContext(ctx context.Context) (*Path, error) {
md, loaded := metadata.FromIncomingContext(ctx)

if !loaded {
return nil, errors.New("failed to load grpc metadata from context")
}

return fromMD(md)
}

func appendToMetadata(ctx context.Context, path *Path) (context.Context, error) {
bytes, err := json.Marshal(path)
if err != nil {
Expand All @@ -67,3 +82,13 @@ func appendToMetadata(ctx context.Context, path *Path) (context.Context, error)
ctx = metadata.AppendToOutgoingContext(ctx, pathKey, string(bytes))
return ctx, nil
}

func sendPath(ctx context.Context, path *Path) error {
bytes, err := json.Marshal(path)
if err != nil {
return err
}

header := metadata.Pairs(pathKey, string(bytes))
return grpc.SendHeader(ctx, header)
}
23 changes: 8 additions & 15 deletions pkg/registry/common/grpcmetadata/ns_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,26 +47,24 @@ func (c *grpcMetadataNSClient) Register(ctx context.Context, ns *registry.Networ

var header metadata.MD
opts = append(opts, grpc.Header(&header))

resp, err := next.NetworkServiceRegistryClient(ctx).Register(ctx, ns, opts...)
if err != nil {
return nil, err
}

newpath, err := loadFromMetadata(header)
if err != nil {
return nil, err
}
newpath, err := fromMD(header)

path.Index = newpath.Index
path.PathSegments = newpath.PathSegments
if err == nil {
path.Index = newpath.Index
path.PathSegments = newpath.PathSegments
}

return resp, nil
}

func (c *grpcMetadataNSClient) Find(ctx context.Context, query *registry.NetworkServiceQuery, opts ...grpc.CallOption) (registry.NetworkServiceRegistry_FindClient, error) {
resp, err := next.NetworkServiceRegistryClient(ctx).Find(ctx, query, opts...)

return resp, err
return next.NetworkServiceRegistryClient(ctx).Find(ctx, query, opts...)
}

func (c *grpcMetadataNSClient) Unregister(ctx context.Context, ns *registry.NetworkService, opts ...grpc.CallOption) (*empty.Empty, error) {
Expand All @@ -77,10 +75,5 @@ func (c *grpcMetadataNSClient) Unregister(ctx context.Context, ns *registry.Netw
return nil, err
}

resp, err := next.NetworkServiceRegistryClient(ctx).Unregister(ctx, ns, opts...)
if err != nil {
return nil, err
}

return resp, nil
return next.NetworkServiceRegistryClient(ctx).Unregister(ctx, ns, opts...)
}
51 changes: 15 additions & 36 deletions pkg/registry/common/grpcmetadata/ns_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,13 @@ package grpcmetadata

import (
"context"
"encoding/json"
"errors"

"github.com/golang/protobuf/ptypes/empty"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"

"github.com/networkservicemesh/api/pkg/api/registry"

"github.com/networkservicemesh/sdk/pkg/registry/core/next"
"github.com/networkservicemesh/sdk/pkg/tools/log"
)

const pathKey = "path"
Expand All @@ -41,63 +38,45 @@ func NewNetworkServiceRegistryServer() registry.NetworkServiceRegistryServer {
}

func (s *grpcMetadataNSServer) Register(ctx context.Context, ns *registry.NetworkService) (*registry.NetworkService, error) {
md, loaded := metadata.FromIncomingContext(ctx)
if !loaded {
return nil, errors.New("failed to load grpc metadata from context")
}
path, err := loadFromMetadata(md)
path, err := fromContext(ctx)

if err != nil {
return nil, err
log.FromContext(ctx).Warnf("Register: failed to load grpc metadata from context: %v", err.Error())
return next.NetworkServiceRegistryServer(ctx).Register(ctx, ns)
}

ctx = PathWithContext(ctx, path)

resp, err := next.NetworkServiceRegistryServer(ctx).Register(ctx, ns)
if err != nil {
return nil, err
}

bytes, err := json.Marshal(path)
if err != nil {
return nil, err
}
err = sendPath(ctx, path)

header := metadata.Pairs("path", string(bytes))
err = grpc.SendHeader(ctx, header)
if err != nil {
return nil, err
}
return resp, nil
return resp, err
}

func (s *grpcMetadataNSServer) Find(query *registry.NetworkServiceQuery, server registry.NetworkServiceRegistry_FindServer) error {
return next.NetworkServiceRegistryServer(server.Context()).Find(query, server)
}

func (s *grpcMetadataNSServer) Unregister(ctx context.Context, ns *registry.NetworkService) (*empty.Empty, error) {
md, loaded := metadata.FromIncomingContext(ctx)
if !loaded {
return nil, errors.New("failed to load grpc metadata from context")
}
path, err := loadFromMetadata(md)
path, err := fromContext(ctx)

if err != nil {
return nil, err
log.FromContext(ctx).Warnf("Unregister: failed to load grpc metadata from context: %v", err.Error())
return next.NetworkServiceRegistryServer(ctx).Unregister(ctx, ns)
}

ctx = PathWithContext(ctx, path)

resp, err := next.NetworkServiceRegistryServer(ctx).Unregister(ctx, ns)
if err != nil {
return nil, err
}

bytes, err := json.Marshal(path)
if err != nil {
return nil, err
}
err = sendPath(ctx, path)

header := metadata.Pairs("path", string(bytes))
err = grpc.SendHeader(ctx, header)
if err != nil {
return nil, err
}
return resp, nil
return resp, err
}
Loading