From 18a5609b68de1ce7049b8cfc5561e43c47d15efa Mon Sep 17 00:00:00 2001 From: NikitaSkrynnik Date: Tue, 27 Feb 2024 14:43:59 +0700 Subject: [PATCH 01/12] add strict ipam for vl3 networks Signed-off-by: NikitaSkrynnik --- pkg/ipam/strictipam/server.go | 83 +++++++++++++++++++++ pkg/networkservice/chains/nsmgr/vl3_test.go | 68 +++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 pkg/ipam/strictipam/server.go diff --git a/pkg/ipam/strictipam/server.go b/pkg/ipam/strictipam/server.go new file mode 100644 index 000000000..ac795c5a7 --- /dev/null +++ b/pkg/ipam/strictipam/server.go @@ -0,0 +1,83 @@ +// Copyright (c) 2024 Cisco and its affiliates. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package strictipam provides a networkservice.NetworkService Server chain element for building an IPAM server that prevents IP context configuration out of the settings scope +package strictipam + +import ( + "context" + "net" + "strings" + "sync" + + "github.com/golang/protobuf/ptypes/empty" + "github.com/networkservicemesh/api/pkg/api/ipam" + "github.com/networkservicemesh/api/pkg/api/networkservice" + + "github.com/networkservicemesh/sdk/pkg/networkservice/core/next" + "github.com/networkservicemesh/sdk/pkg/tools/ippool" + "github.com/networkservicemesh/sdk/pkg/tools/log" +) + +type strictIPAMServer struct { + ipPool *ippool.IPPool + m sync.Mutex +} + +// NewServer - returns a new ipam networkservice.NetworkServiceServer that validates the incoming IP context parameters and resets them based on the validation result. +func NewServer(ctx context.Context, prefixCh <-chan *ipam.PrefixResponse) networkservice.NetworkServiceServer { + var ipPool = ippool.New(net.IPv4len) + + s := &strictIPAMServer{ipPool: ipPool} + go func() { + for prefix := range prefixCh { + s.m.Lock() + s.ipPool = ippool.NewWithNetString(prefix.Prefix) + s.m.Unlock() + } + }() + + return s +} + +func (n *strictIPAMServer) areAddressesValid(addresses []string) bool { + n.m.Lock() + defer n.m.Unlock() + + for _, addr := range addresses { + if !n.ipPool.ContainsNetString(addr) { + return false + } + } + return true +} + +func (n *strictIPAMServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { + if strings.HasPrefix(request.Connection.Path.PathSegments[0].Name, "nse") { + log.FromContext(ctx).Infof("THIS IS NOT A REGULAR CLIENT. SKIPPING...") + return next.Server(ctx).Request(ctx, request) + } + dstAddrs := request.GetConnection().GetContext().GetIpContext().GetDstIpAddrs() + srcAddrs := request.GetConnection().GetContext().GetIpContext().GetSrcIpAddrs() + if !n.areAddressesValid(srcAddrs) || !n.areAddressesValid(dstAddrs) { + request.Connection.Context.IpContext = &networkservice.IPContext{} + } + return next.Server(ctx).Request(ctx, request) +} + +func (n *strictIPAMServer) Close(ctx context.Context, conn *networkservice.Connection) (*empty.Empty, error) { + return next.Server(ctx).Close(ctx, conn) +} diff --git a/pkg/networkservice/chains/nsmgr/vl3_test.go b/pkg/networkservice/chains/nsmgr/vl3_test.go index 813e60e74..f18347302 100644 --- a/pkg/networkservice/chains/nsmgr/vl3_test.go +++ b/pkg/networkservice/chains/nsmgr/vl3_test.go @@ -37,6 +37,7 @@ import ( "github.com/networkservicemesh/api/pkg/api/networkservice/mechanisms/kernel" "github.com/networkservicemesh/api/pkg/api/registry" + "github.com/networkservicemesh/sdk/pkg/ipam/strictipam" "github.com/networkservicemesh/sdk/pkg/networkservice/chains/client" "github.com/networkservicemesh/sdk/pkg/networkservice/connectioncontext/dnscontext/vl3dns" "github.com/networkservicemesh/sdk/pkg/networkservice/connectioncontext/ipcontext/vl3" @@ -45,6 +46,7 @@ import ( "github.com/networkservicemesh/sdk/pkg/tools/dnsutils" "github.com/networkservicemesh/sdk/pkg/tools/dnsutils/memory" "github.com/networkservicemesh/sdk/pkg/tools/interdomain" + "github.com/networkservicemesh/sdk/pkg/tools/ippool" "github.com/networkservicemesh/sdk/pkg/tools/sandbox" ) @@ -509,3 +511,69 @@ func Test_FloatingInterdomain_vl3_dns(t *testing.T) { _, err = resolver.LookupIP(ctx, "ip4", fmt.Sprintf("%s.%s", nscName, searchDomain)) require.Error(t, err) } + +func Test_NSC_ConnectsTo_vl3NSE_With_Invalid_IpContext(t *testing.T) { + t.Cleanup(func() { goleak.VerifyNone(t) }) + + ctx, cancel := context.WithTimeout(context.Background(), time.Second*150) + defer cancel() + + domain := sandbox.NewBuilder(ctx, t). + SetNodesCount(1). + SetNSMgrProxySupplier(nil). + SetRegistryProxySupplier(nil). + Build() + + nsRegistryClient := domain.NewNSRegistryClient(ctx, sandbox.GenerateTestToken) + + nsReg, err := nsRegistryClient.Register(ctx, defaultRegistryService("vl3")) + require.NoError(t, err) + + nseReg := defaultRegistryEndpoint(nsReg.Name) + + var serverPrefixCh = make(chan *ipam.PrefixResponse, 1) + var strictIpamPrefixCh = make(chan *ipam.PrefixResponse, 1) + defer close(serverPrefixCh) + defer close(strictIpamPrefixCh) + + prefix1 := "10.0.0.1/24" + prefix2 := "10.10.0.1/24" + + serverPrefixCh <- &ipam.PrefixResponse{Prefix: prefix1} + strictIpamPrefixCh <- &ipam.PrefixResponse{Prefix: prefix1} + + _ = domain.Nodes[0].NewEndpoint( + ctx, + nseReg, + sandbox.GenerateTestToken, + strictipam.NewServer(ctx, strictIpamPrefixCh), + vl3.NewServer(ctx, serverPrefixCh), + ) + + nsc := domain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken) + + req := defaultRequest(nsReg.Name) + conn, err := nsc.Request(ctx, req) + require.NoError(t, err) + + require.True(t, checkIPContext(conn.Context.IpContext, prefix1)) + + serverPrefixCh <- &ipam.PrefixResponse{Prefix: prefix2} + strictIpamPrefixCh <- &ipam.PrefixResponse{Prefix: prefix2} + + conn, err = nsc.Request(ctx, req) + require.NoError(t, err) + + require.False(t, checkIPContext(conn.Context.IpContext, prefix1)) + require.True(t, checkIPContext(conn.Context.IpContext, prefix2)) +} + +func checkIPContext(ipContext *networkservice.IPContext, prefix string) bool { + pool := ippool.NewWithNetString(prefix) + for _, addr := range ipContext.SrcIpAddrs { + if !pool.ContainsNetString(addr) { + return false + } + } + return true +} From 8421f752ab138b045eb062d0af41d50dc2e1bb3d Mon Sep 17 00:00:00 2001 From: NikitaSkrynnik Date: Tue, 27 Feb 2024 21:21:38 +0700 Subject: [PATCH 02/12] fix chain element Signed-off-by: NikitaSkrynnik --- pkg/ipam/strictipam/server.go | 11 +++-------- pkg/networkservice/chains/nsmgr/vl3_test.go | 10 ++++++++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/pkg/ipam/strictipam/server.go b/pkg/ipam/strictipam/server.go index ac795c5a7..b0dcaab74 100644 --- a/pkg/ipam/strictipam/server.go +++ b/pkg/ipam/strictipam/server.go @@ -20,7 +20,6 @@ package strictipam import ( "context" "net" - "strings" "sync" "github.com/golang/protobuf/ptypes/empty" @@ -29,7 +28,6 @@ import ( "github.com/networkservicemesh/sdk/pkg/networkservice/core/next" "github.com/networkservicemesh/sdk/pkg/tools/ippool" - "github.com/networkservicemesh/sdk/pkg/tools/log" ) type strictIPAMServer struct { @@ -66,13 +64,10 @@ func (n *strictIPAMServer) areAddressesValid(addresses []string) bool { } func (n *strictIPAMServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { - if strings.HasPrefix(request.Connection.Path.PathSegments[0].Name, "nse") { - log.FromContext(ctx).Infof("THIS IS NOT A REGULAR CLIENT. SKIPPING...") - return next.Server(ctx).Request(ctx, request) - } - dstAddrs := request.GetConnection().GetContext().GetIpContext().GetDstIpAddrs() srcAddrs := request.GetConnection().GetContext().GetIpContext().GetSrcIpAddrs() - if !n.areAddressesValid(srcAddrs) || !n.areAddressesValid(dstAddrs) { + dstAddrs := request.GetConnection().GetContext().GetIpContext().GetDstIpAddrs() + + if !n.areAddressesValid(srcAddrs) && !n.areAddressesValid(dstAddrs) { request.Connection.Context.IpContext = &networkservice.IPContext{} } return next.Server(ctx).Request(ctx, request) diff --git a/pkg/networkservice/chains/nsmgr/vl3_test.go b/pkg/networkservice/chains/nsmgr/vl3_test.go index f18347302..2454cfe7f 100644 --- a/pkg/networkservice/chains/nsmgr/vl3_test.go +++ b/pkg/networkservice/chains/nsmgr/vl3_test.go @@ -536,8 +536,8 @@ func Test_NSC_ConnectsTo_vl3NSE_With_Invalid_IpContext(t *testing.T) { defer close(serverPrefixCh) defer close(strictIpamPrefixCh) - prefix1 := "10.0.0.1/24" - prefix2 := "10.10.0.1/24" + prefix1 := "10.0.0.0/24" + prefix2 := "10.10.0.0/24" serverPrefixCh <- &ipam.PrefixResponse{Prefix: prefix1} strictIpamPrefixCh <- &ipam.PrefixResponse{Prefix: prefix1} @@ -561,6 +561,7 @@ func Test_NSC_ConnectsTo_vl3NSE_With_Invalid_IpContext(t *testing.T) { serverPrefixCh <- &ipam.PrefixResponse{Prefix: prefix2} strictIpamPrefixCh <- &ipam.PrefixResponse{Prefix: prefix2} + req.Connection = conn conn, err = nsc.Request(ctx, req) require.NoError(t, err) @@ -575,5 +576,10 @@ func checkIPContext(ipContext *networkservice.IPContext, prefix string) bool { return false } } + for _, addr := range ipContext.DstIpAddrs { + if !pool.ContainsNetString(addr) { + return false + } + } return true } From e45381a58b5f1d25c660cab6b6c51da3938e7391 Mon Sep 17 00:00:00 2001 From: NikitaSkrynnik Date: Tue, 27 Feb 2024 21:36:24 +0700 Subject: [PATCH 03/12] rename chain element Signed-off-by: NikitaSkrynnik --- pkg/ipam/{strictipam => strictvl3ipam}/server.go | 14 +++++++------- pkg/networkservice/chains/nsmgr/vl3_test.go | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) rename pkg/ipam/{strictipam => strictvl3ipam}/server.go (77%) diff --git a/pkg/ipam/strictipam/server.go b/pkg/ipam/strictvl3ipam/server.go similarity index 77% rename from pkg/ipam/strictipam/server.go rename to pkg/ipam/strictvl3ipam/server.go index b0dcaab74..89cf73022 100644 --- a/pkg/ipam/strictipam/server.go +++ b/pkg/ipam/strictvl3ipam/server.go @@ -14,8 +14,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package strictipam provides a networkservice.NetworkService Server chain element for building an IPAM server that prevents IP context configuration out of the settings scope -package strictipam +// Package strictvl3ipam provides a networkservice.NetworkService Server chain element that resets IP context configuration out of the settings scope +package strictvl3ipam import ( "context" @@ -30,7 +30,7 @@ import ( "github.com/networkservicemesh/sdk/pkg/tools/ippool" ) -type strictIPAMServer struct { +type strictVl3IPAMServer struct { ipPool *ippool.IPPool m sync.Mutex } @@ -39,7 +39,7 @@ type strictIPAMServer struct { func NewServer(ctx context.Context, prefixCh <-chan *ipam.PrefixResponse) networkservice.NetworkServiceServer { var ipPool = ippool.New(net.IPv4len) - s := &strictIPAMServer{ipPool: ipPool} + s := &strictVl3IPAMServer{ipPool: ipPool} go func() { for prefix := range prefixCh { s.m.Lock() @@ -51,7 +51,7 @@ func NewServer(ctx context.Context, prefixCh <-chan *ipam.PrefixResponse) networ return s } -func (n *strictIPAMServer) areAddressesValid(addresses []string) bool { +func (n *strictVl3IPAMServer) areAddressesValid(addresses []string) bool { n.m.Lock() defer n.m.Unlock() @@ -63,7 +63,7 @@ func (n *strictIPAMServer) areAddressesValid(addresses []string) bool { return true } -func (n *strictIPAMServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { +func (n *strictVl3IPAMServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { srcAddrs := request.GetConnection().GetContext().GetIpContext().GetSrcIpAddrs() dstAddrs := request.GetConnection().GetContext().GetIpContext().GetDstIpAddrs() @@ -73,6 +73,6 @@ func (n *strictIPAMServer) Request(ctx context.Context, request *networkservice. return next.Server(ctx).Request(ctx, request) } -func (n *strictIPAMServer) Close(ctx context.Context, conn *networkservice.Connection) (*empty.Empty, error) { +func (n *strictVl3IPAMServer) Close(ctx context.Context, conn *networkservice.Connection) (*empty.Empty, error) { return next.Server(ctx).Close(ctx, conn) } diff --git a/pkg/networkservice/chains/nsmgr/vl3_test.go b/pkg/networkservice/chains/nsmgr/vl3_test.go index 2454cfe7f..2b9023df1 100644 --- a/pkg/networkservice/chains/nsmgr/vl3_test.go +++ b/pkg/networkservice/chains/nsmgr/vl3_test.go @@ -37,7 +37,7 @@ import ( "github.com/networkservicemesh/api/pkg/api/networkservice/mechanisms/kernel" "github.com/networkservicemesh/api/pkg/api/registry" - "github.com/networkservicemesh/sdk/pkg/ipam/strictipam" + "github.com/networkservicemesh/sdk/pkg/ipam/strictvl3ipam" "github.com/networkservicemesh/sdk/pkg/networkservice/chains/client" "github.com/networkservicemesh/sdk/pkg/networkservice/connectioncontext/dnscontext/vl3dns" "github.com/networkservicemesh/sdk/pkg/networkservice/connectioncontext/ipcontext/vl3" @@ -546,7 +546,7 @@ func Test_NSC_ConnectsTo_vl3NSE_With_Invalid_IpContext(t *testing.T) { ctx, nseReg, sandbox.GenerateTestToken, - strictipam.NewServer(ctx, strictIpamPrefixCh), + strictvl3ipam.NewServer(ctx, strictIpamPrefixCh), vl3.NewServer(ctx, serverPrefixCh), ) From 316c9d9c9fef2b57f7aae04a806fb00163cd6987 Mon Sep 17 00:00:00 2001 From: NikitaSkrynnik Date: Tue, 27 Feb 2024 21:47:57 +0700 Subject: [PATCH 04/12] fix go linter issues Signed-off-by: NikitaSkrynnik --- pkg/networkservice/chains/nsmgr/vl3_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/networkservice/chains/nsmgr/vl3_test.go b/pkg/networkservice/chains/nsmgr/vl3_test.go index 2b9023df1..1b52efd14 100644 --- a/pkg/networkservice/chains/nsmgr/vl3_test.go +++ b/pkg/networkservice/chains/nsmgr/vl3_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2022-2023 Cisco and/or its affiliates. +// Copyright (c) 2022-2024 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // From beb9fc2a9e01ab4ec449b9aa32cf6f3fd635c1d2 Mon Sep 17 00:00:00 2001 From: NikitaSkrynnik Date: Mon, 11 Mar 2024 21:54:59 +0700 Subject: [PATCH 05/12] apply review comments Signed-off-by: NikitaSkrynnik --- pkg/ipam/strictvl3ipam/server.go | 42 ++++++++++++------- pkg/networkservice/chains/nsmgr/vl3_test.go | 9 +--- .../ipcontext/vl3/{metdata.go => metadata.go} | 2 +- 3 files changed, 29 insertions(+), 24 deletions(-) rename pkg/networkservice/connectioncontext/ipcontext/vl3/{metdata.go => metadata.go} (96%) diff --git a/pkg/ipam/strictvl3ipam/server.go b/pkg/ipam/strictvl3ipam/server.go index 89cf73022..00d686776 100644 --- a/pkg/ipam/strictvl3ipam/server.go +++ b/pkg/ipam/strictvl3ipam/server.go @@ -36,43 +36,53 @@ type strictVl3IPAMServer struct { } // NewServer - returns a new ipam networkservice.NetworkServiceServer that validates the incoming IP context parameters and resets them based on the validation result. -func NewServer(ctx context.Context, prefixCh <-chan *ipam.PrefixResponse) networkservice.NetworkServiceServer { - var ipPool = ippool.New(net.IPv4len) +func NewServer(ctx context.Context, newVl3IPAMServer func(ctx context.Context, prefixCh <-chan *ipam.PrefixResponse) networkservice.NetworkServiceServer, prefixCh <-chan *ipam.PrefixResponse) networkservice.NetworkServiceServer { + var ipPool = ippool.New(net.IPv6len) - s := &strictVl3IPAMServer{ipPool: ipPool} + vl3IPAMPrefixCh := make(chan *ipam.PrefixResponse, 1) + server := &strictVl3IPAMServer{ipPool: ipPool} go func() { + defer close(vl3IPAMPrefixCh) for prefix := range prefixCh { - s.m.Lock() - s.ipPool = ippool.NewWithNetString(prefix.Prefix) - s.m.Unlock() + vl3IPAMPrefixCh <- prefix + server.m.Lock() + server.ipPool.Clear() + server.ipPool.AddNetString(prefix.Prefix) + server.m.Unlock() } }() - return s + return next.NewNetworkServiceServer( + server, + newVl3IPAMServer(ctx, vl3IPAMPrefixCh)) } -func (n *strictVl3IPAMServer) areAddressesValid(addresses []string) bool { - n.m.Lock() - defer n.m.Unlock() +func (s *strictVl3IPAMServer) areAddressesValid(addresses []string) bool { + s.m.Lock() + defer s.m.Unlock() + + if len(addresses) == 0 { + return true + } for _, addr := range addresses { - if !n.ipPool.ContainsNetString(addr) { - return false + if s.ipPool.ContainsNetString(addr) { + return true } } - return true + return false } -func (n *strictVl3IPAMServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { +func (s *strictVl3IPAMServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { srcAddrs := request.GetConnection().GetContext().GetIpContext().GetSrcIpAddrs() dstAddrs := request.GetConnection().GetContext().GetIpContext().GetDstIpAddrs() - if !n.areAddressesValid(srcAddrs) && !n.areAddressesValid(dstAddrs) { + if !s.areAddressesValid(srcAddrs) || !s.areAddressesValid(dstAddrs) { request.Connection.Context.IpContext = &networkservice.IPContext{} } return next.Server(ctx).Request(ctx, request) } -func (n *strictVl3IPAMServer) Close(ctx context.Context, conn *networkservice.Connection) (*empty.Empty, error) { +func (s *strictVl3IPAMServer) Close(ctx context.Context, conn *networkservice.Connection) (*empty.Empty, error) { return next.Server(ctx).Close(ctx, conn) } diff --git a/pkg/networkservice/chains/nsmgr/vl3_test.go b/pkg/networkservice/chains/nsmgr/vl3_test.go index 1b52efd14..9d3d26a58 100644 --- a/pkg/networkservice/chains/nsmgr/vl3_test.go +++ b/pkg/networkservice/chains/nsmgr/vl3_test.go @@ -515,7 +515,7 @@ func Test_FloatingInterdomain_vl3_dns(t *testing.T) { func Test_NSC_ConnectsTo_vl3NSE_With_Invalid_IpContext(t *testing.T) { t.Cleanup(func() { goleak.VerifyNone(t) }) - ctx, cancel := context.WithTimeout(context.Background(), time.Second*150) + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() domain := sandbox.NewBuilder(ctx, t). @@ -532,22 +532,18 @@ func Test_NSC_ConnectsTo_vl3NSE_With_Invalid_IpContext(t *testing.T) { nseReg := defaultRegistryEndpoint(nsReg.Name) var serverPrefixCh = make(chan *ipam.PrefixResponse, 1) - var strictIpamPrefixCh = make(chan *ipam.PrefixResponse, 1) defer close(serverPrefixCh) - defer close(strictIpamPrefixCh) prefix1 := "10.0.0.0/24" prefix2 := "10.10.0.0/24" serverPrefixCh <- &ipam.PrefixResponse{Prefix: prefix1} - strictIpamPrefixCh <- &ipam.PrefixResponse{Prefix: prefix1} _ = domain.Nodes[0].NewEndpoint( ctx, nseReg, sandbox.GenerateTestToken, - strictvl3ipam.NewServer(ctx, strictIpamPrefixCh), - vl3.NewServer(ctx, serverPrefixCh), + strictvl3ipam.NewServer(ctx, vl3.NewServer, serverPrefixCh), ) nsc := domain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken) @@ -559,7 +555,6 @@ func Test_NSC_ConnectsTo_vl3NSE_With_Invalid_IpContext(t *testing.T) { require.True(t, checkIPContext(conn.Context.IpContext, prefix1)) serverPrefixCh <- &ipam.PrefixResponse{Prefix: prefix2} - strictIpamPrefixCh <- &ipam.PrefixResponse{Prefix: prefix2} req.Connection = conn conn, err = nsc.Request(ctx, req) diff --git a/pkg/networkservice/connectioncontext/ipcontext/vl3/metdata.go b/pkg/networkservice/connectioncontext/ipcontext/vl3/metadata.go similarity index 96% rename from pkg/networkservice/connectioncontext/ipcontext/vl3/metdata.go rename to pkg/networkservice/connectioncontext/ipcontext/vl3/metadata.go index c227ab8db..aa320ecea 100644 --- a/pkg/networkservice/connectioncontext/ipcontext/vl3/metdata.go +++ b/pkg/networkservice/connectioncontext/ipcontext/vl3/metadata.go @@ -1,4 +1,4 @@ -// Copyright (c) 2022 Cisco and/or its affiliates. +// Copyright (c) 2022-2024 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // From 42c291f5cfccd6761bb653a61a9ee08d1462544f Mon Sep 17 00:00:00 2001 From: NikitaSkrynnik Date: Tue, 12 Mar 2024 21:24:50 +0700 Subject: [PATCH 06/12] remove all channels, use ipPools only Signed-off-by: NikitaSkrynnik --- pkg/ipam/strictvl3ipam/server.go | 30 ++++------------- pkg/networkservice/chains/nsmgr/vl3_test.go | 5 ++- pkg/tools/ippool/ippool.go | 36 ++++++++++----------- 3 files changed, 28 insertions(+), 43 deletions(-) diff --git a/pkg/ipam/strictvl3ipam/server.go b/pkg/ipam/strictvl3ipam/server.go index 00d686776..027af3c02 100644 --- a/pkg/ipam/strictvl3ipam/server.go +++ b/pkg/ipam/strictvl3ipam/server.go @@ -19,11 +19,8 @@ package strictvl3ipam import ( "context" - "net" - "sync" "github.com/golang/protobuf/ptypes/empty" - "github.com/networkservicemesh/api/pkg/api/ipam" "github.com/networkservicemesh/api/pkg/api/networkservice" "github.com/networkservicemesh/sdk/pkg/networkservice/core/next" @@ -32,34 +29,19 @@ import ( type strictVl3IPAMServer struct { ipPool *ippool.IPPool - m sync.Mutex } // NewServer - returns a new ipam networkservice.NetworkServiceServer that validates the incoming IP context parameters and resets them based on the validation result. -func NewServer(ctx context.Context, newVl3IPAMServer func(ctx context.Context, prefixCh <-chan *ipam.PrefixResponse) networkservice.NetworkServiceServer, prefixCh <-chan *ipam.PrefixResponse) networkservice.NetworkServiceServer { - var ipPool = ippool.New(net.IPv6len) - - vl3IPAMPrefixCh := make(chan *ipam.PrefixResponse, 1) - server := &strictVl3IPAMServer{ipPool: ipPool} - go func() { - defer close(vl3IPAMPrefixCh) - for prefix := range prefixCh { - vl3IPAMPrefixCh <- prefix - server.m.Lock() - server.ipPool.Clear() - server.ipPool.AddNetString(prefix.Prefix) - server.m.Unlock() - } - }() - +func NewServer(ctx context.Context, vl3IPAMServer networkservice.NetworkServiceServer, ipPool *ippool.IPPool) networkservice.NetworkServiceServer { return next.NewNetworkServiceServer( - server, - newVl3IPAMServer(ctx, vl3IPAMPrefixCh)) + &strictVl3IPAMServer{ipPool: ipPool}, + vl3IPAMServer, + ) } func (s *strictVl3IPAMServer) areAddressesValid(addresses []string) bool { - s.m.Lock() - defer s.m.Unlock() + s.ipPool.Lock() + defer s.ipPool.Unlock() if len(addresses) == 0 { return true diff --git a/pkg/networkservice/chains/nsmgr/vl3_test.go b/pkg/networkservice/chains/nsmgr/vl3_test.go index 9d3d26a58..b4912ed77 100644 --- a/pkg/networkservice/chains/nsmgr/vl3_test.go +++ b/pkg/networkservice/chains/nsmgr/vl3_test.go @@ -538,12 +538,13 @@ func Test_NSC_ConnectsTo_vl3NSE_With_Invalid_IpContext(t *testing.T) { prefix2 := "10.10.0.0/24" serverPrefixCh <- &ipam.PrefixResponse{Prefix: prefix1} + strictIPPool := ippool.NewWithNetString(prefix1) _ = domain.Nodes[0].NewEndpoint( ctx, nseReg, sandbox.GenerateTestToken, - strictvl3ipam.NewServer(ctx, vl3.NewServer, serverPrefixCh), + strictvl3ipam.NewServer(ctx, vl3.NewServer(ctx, serverPrefixCh), strictIPPool), ) nsc := domain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken) @@ -555,6 +556,8 @@ func Test_NSC_ConnectsTo_vl3NSE_With_Invalid_IpContext(t *testing.T) { require.True(t, checkIPContext(conn.Context.IpContext, prefix1)) serverPrefixCh <- &ipam.PrefixResponse{Prefix: prefix2} + strictIPPool.Clear() + strictIPPool.AddNetString(prefix2) req.Connection = conn conn, err = nsc.Request(ctx, req) diff --git a/pkg/tools/ippool/ippool.go b/pkg/tools/ippool/ippool.go index 144dd4f38..dbed7d7d8 100644 --- a/pkg/tools/ippool/ippool.go +++ b/pkg/tools/ippool/ippool.go @@ -1,6 +1,6 @@ // Copyright (c) 2021-2022 Doc.ai and/or its affiliates. // -// Copyright (c) 2022-2023 Cisco and/or its affiliates. +// Copyright (c) 2022-2024 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -36,8 +36,8 @@ const ( // IPPool holds available ip addresses in the structure of red-black tree type IPPool struct { + sync.Mutex root *treeNode - lock sync.Mutex size uint64 ipLength int } @@ -83,8 +83,8 @@ func NewWithNetString(ipNetString string) *IPPool { // Clone - make a clone of the pool func (tree *IPPool) Clone() *IPPool { - tree.lock.Lock() - defer tree.lock.Unlock() + tree.Lock() + defer tree.Unlock() return tree.clone() } @@ -111,8 +111,8 @@ func (tree *IPPool) Add(ip net.IP) { return } - tree.lock.Lock() - defer tree.lock.Unlock() + tree.Lock() + defer tree.Unlock() tree.add(ipAddressFromIP(ip)) } @@ -132,8 +132,8 @@ func (tree *IPPool) AddNet(ipNet *net.IPNet) { return } - tree.lock.Lock() - defer tree.lock.Unlock() + tree.Lock() + defer tree.Unlock() tree.addRange(ipRangeFromIPNet(ipNet)) } @@ -203,8 +203,8 @@ func (tree *IPPool) Exclude(ipNet *net.IPNet) { return } - tree.lock.Lock() - defer tree.lock.Unlock() + tree.Lock() + defer tree.Unlock() tree.deleteRange(ipRangeFromIPNet(ipNet)) } @@ -221,8 +221,8 @@ func (tree *IPPool) ExcludeString(ipNetString string) { // Pull - returns next IP address from pool func (tree *IPPool) Pull() (net.IP, error) { - tree.lock.Lock() - defer tree.lock.Unlock() + tree.Lock() + defer tree.Unlock() ip := tree.pull() if ip == nil { @@ -243,8 +243,8 @@ func (tree *IPPool) PullIPString(ipString string, exclude ...*IPPool) (*net.IPNe // PullIP - returns requested IP address from the pool func (tree *IPPool) PullIP(ip net.IP, exclude ...*IPPool) (*net.IPNet, error) { - tree.lock.Lock() - defer tree.lock.Unlock() + tree.Lock() + defer tree.Unlock() clone := tree.clone() for _, pool := range exclude { @@ -268,8 +268,8 @@ func (tree *IPPool) PullIP(ip net.IP, exclude ...*IPPool) (*net.IPNet, error) { // PullP2PAddrs - returns next IP addresses pair from pool for peer-to-peer connection func (tree *IPPool) PullP2PAddrs(exclude ...*IPPool) (srcNet, dstNet *net.IPNet, err error) { - tree.lock.Lock() - defer tree.lock.Unlock() + tree.Lock() + defer tree.Unlock() clone := tree.clone() @@ -311,9 +311,9 @@ func (tree *IPPool) PullP2PAddrs(exclude ...*IPPool) (srcNet, dstNet *net.IPNet, // GetPrefixes returns the list of saved prefixes func (tree *IPPool) GetPrefixes() []string { - tree.lock.Lock() + tree.Lock() clone := tree.clone() - tree.lock.Unlock() + tree.Unlock() if clone.root == nil { return nil From 4663826aa9aed4f1e8d78afdccf490a23cc820ce Mon Sep 17 00:00:00 2001 From: NikitaSkrynnik Date: Tue, 12 Mar 2024 21:48:40 +0700 Subject: [PATCH 07/12] rerun CI Signed-off-by: NikitaSkrynnik From 2bf1a15215d920f4ebce82696342ac886442e497 Mon Sep 17 00:00:00 2001 From: NikitaSkrynnik Date: Fri, 15 Mar 2024 15:40:12 +0700 Subject: [PATCH 08/12] fix review comments Signed-off-by: NikitaSkrynnik --- pkg/ipam/strictvl3ipam/server.go | 13 ++++--------- pkg/networkservice/chains/nsmgr/vl3_test.go | 2 +- pkg/tools/ippool/ippool.go | 3 +++ 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/pkg/ipam/strictvl3ipam/server.go b/pkg/ipam/strictvl3ipam/server.go index 027af3c02..1875a61eb 100644 --- a/pkg/ipam/strictvl3ipam/server.go +++ b/pkg/ipam/strictvl3ipam/server.go @@ -21,6 +21,7 @@ import ( "context" "github.com/golang/protobuf/ptypes/empty" + "github.com/networkservicemesh/api/pkg/api/ipam" "github.com/networkservicemesh/api/pkg/api/networkservice" "github.com/networkservicemesh/sdk/pkg/networkservice/core/next" @@ -32,17 +33,14 @@ type strictVl3IPAMServer struct { } // NewServer - returns a new ipam networkservice.NetworkServiceServer that validates the incoming IP context parameters and resets them based on the validation result. -func NewServer(ctx context.Context, vl3IPAMServer networkservice.NetworkServiceServer, ipPool *ippool.IPPool) networkservice.NetworkServiceServer { +func NewServer(ctx context.Context, newVl3IPAMServer func(context.Context, <-chan *ipam.PrefixResponse) networkservice.NetworkServiceServer, prefixCh <-chan *ipam.PrefixResponse, ipPool *ippool.IPPool) networkservice.NetworkServiceServer { return next.NewNetworkServiceServer( &strictVl3IPAMServer{ipPool: ipPool}, - vl3IPAMServer, + newVl3IPAMServer(ctx, prefixCh), ) } func (s *strictVl3IPAMServer) areAddressesValid(addresses []string) bool { - s.ipPool.Lock() - defer s.ipPool.Unlock() - if len(addresses) == 0 { return true } @@ -56,10 +54,7 @@ func (s *strictVl3IPAMServer) areAddressesValid(addresses []string) bool { } func (s *strictVl3IPAMServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { - srcAddrs := request.GetConnection().GetContext().GetIpContext().GetSrcIpAddrs() - dstAddrs := request.GetConnection().GetContext().GetIpContext().GetDstIpAddrs() - - if !s.areAddressesValid(srcAddrs) || !s.areAddressesValid(dstAddrs) { + if !s.areAddressesValid(request.GetConnection().GetContext().GetIpContext().GetDstIpAddrs()) { request.Connection.Context.IpContext = &networkservice.IPContext{} } return next.Server(ctx).Request(ctx, request) diff --git a/pkg/networkservice/chains/nsmgr/vl3_test.go b/pkg/networkservice/chains/nsmgr/vl3_test.go index b4912ed77..e9ebc6d9e 100644 --- a/pkg/networkservice/chains/nsmgr/vl3_test.go +++ b/pkg/networkservice/chains/nsmgr/vl3_test.go @@ -544,7 +544,7 @@ func Test_NSC_ConnectsTo_vl3NSE_With_Invalid_IpContext(t *testing.T) { ctx, nseReg, sandbox.GenerateTestToken, - strictvl3ipam.NewServer(ctx, vl3.NewServer(ctx, serverPrefixCh), strictIPPool), + strictvl3ipam.NewServer(ctx, vl3.NewServer, serverPrefixCh, strictIPPool), ) nsc := domain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken) diff --git a/pkg/tools/ippool/ippool.go b/pkg/tools/ippool/ippool.go index dbed7d7d8..8b50af371 100644 --- a/pkg/tools/ippool/ippool.go +++ b/pkg/tools/ippool/ippool.go @@ -150,6 +150,9 @@ func (tree *IPPool) AddNetString(ipNetString string) { // ContainsNetString parses ipNetRaw string and checks that pool contains whole ipNet func (tree *IPPool) ContainsNetString(ipNetRaw string) bool { + tree.Lock() + defer tree.Unlock() + _, ipNet, err := net.ParseCIDR(ipNetRaw) if err != nil { return false From fb2020e32a9be3f0121c2999f08441458a597852 Mon Sep 17 00:00:00 2001 From: NikitaSkrynnik Date: Mon, 18 Mar 2024 21:48:09 +0700 Subject: [PATCH 09/12] fix review comments Signed-off-by: NikitaSkrynnik --- pkg/ipam/strictvl3ipam/server.go | 22 ++--- pkg/networkservice/chains/nsmgr/vl3_test.go | 80 +++++++------------ .../connectioncontext/ipcontext/vl3/client.go | 22 ++--- .../ipcontext/vl3/client_test.go | 71 ++++++---------- .../connectioncontext/ipcontext/vl3/ipam.go | 22 ++--- .../connectioncontext/ipcontext/vl3/server.go | 15 +--- .../ipcontext/vl3/server_test.go | 36 +++------ 7 files changed, 97 insertions(+), 171 deletions(-) diff --git a/pkg/ipam/strictvl3ipam/server.go b/pkg/ipam/strictvl3ipam/server.go index 1875a61eb..fda372248 100644 --- a/pkg/ipam/strictvl3ipam/server.go +++ b/pkg/ipam/strictvl3ipam/server.go @@ -21,23 +21,23 @@ import ( "context" "github.com/golang/protobuf/ptypes/empty" - "github.com/networkservicemesh/api/pkg/api/ipam" "github.com/networkservicemesh/api/pkg/api/networkservice" + "github.com/networkservicemesh/sdk/pkg/networkservice/connectioncontext/ipcontext/vl3" "github.com/networkservicemesh/sdk/pkg/networkservice/core/next" - "github.com/networkservicemesh/sdk/pkg/tools/ippool" ) type strictVl3IPAMServer struct { - ipPool *ippool.IPPool + vl3IPAMs []*vl3.IPAM } // NewServer - returns a new ipam networkservice.NetworkServiceServer that validates the incoming IP context parameters and resets them based on the validation result. -func NewServer(ctx context.Context, newVl3IPAMServer func(context.Context, <-chan *ipam.PrefixResponse) networkservice.NetworkServiceServer, prefixCh <-chan *ipam.PrefixResponse, ipPool *ippool.IPPool) networkservice.NetworkServiceServer { - return next.NewNetworkServiceServer( - &strictVl3IPAMServer{ipPool: ipPool}, - newVl3IPAMServer(ctx, prefixCh), - ) +func NewServer(ctx context.Context, newVl3IPAMServer func(context.Context, *vl3.IPAM) networkservice.NetworkServiceServer, vl3IPAMs ...*vl3.IPAM) networkservice.NetworkServiceServer { + elements := []networkservice.NetworkServiceServer{&strictVl3IPAMServer{vl3IPAMs: vl3IPAMs}} + for _, ipam := range vl3IPAMs { + elements = append(elements, newVl3IPAMServer(ctx, ipam)) + } + return next.NewNetworkServiceServer(elements...) } func (s *strictVl3IPAMServer) areAddressesValid(addresses []string) bool { @@ -46,8 +46,10 @@ func (s *strictVl3IPAMServer) areAddressesValid(addresses []string) bool { } for _, addr := range addresses { - if s.ipPool.ContainsNetString(addr) { - return true + for _, ipam := range s.vl3IPAMs { + if ipam.ContainsNetString(addr) { + return true + } } } return false diff --git a/pkg/networkservice/chains/nsmgr/vl3_test.go b/pkg/networkservice/chains/nsmgr/vl3_test.go index e9ebc6d9e..ab53172c5 100644 --- a/pkg/networkservice/chains/nsmgr/vl3_test.go +++ b/pkg/networkservice/chains/nsmgr/vl3_test.go @@ -31,7 +31,6 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/goleak" - "github.com/networkservicemesh/api/pkg/api/ipam" "github.com/networkservicemesh/api/pkg/api/networkservice" "github.com/networkservicemesh/api/pkg/api/networkservice/mechanisms/cls" "github.com/networkservicemesh/api/pkg/api/networkservice/mechanisms/kernel" @@ -73,13 +72,12 @@ func Test_NSC_ConnectsTo_vl3NSE(t *testing.T) { nseReg := defaultRegistryEndpoint(nsReg.Name) - var serverPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(serverPrefixCh) - - serverPrefixCh <- &ipam.PrefixResponse{Prefix: "10.0.0.1/24"} dnsServerIPCh := make(chan net.IP, 1) dnsServerIPCh <- net.ParseIP("127.0.0.1") + var ipam vl3.IPAM + ipam.Reset(ctx, "10.0.0.1/24", []string{}) + _ = domain.Nodes[0].NewEndpoint( ctx, nseReg, @@ -88,7 +86,7 @@ func Test_NSC_ConnectsTo_vl3NSE(t *testing.T) { dnsServerIPCh, vl3dns.WithDomainSchemes("{{ index .Labels \"podName\" }}.{{ .NetworkService }}."), vl3dns.WithDNSPort(40053)), - vl3.NewServer(ctx, serverPrefixCh), + vl3.NewServer(ctx, &ipam), ) resolver := net.Resolver{ @@ -157,16 +155,13 @@ func Test_vl3NSE_ConnectsTo_vl3NSE(t *testing.T) { require.NoError(t, err) nseReg := defaultRegistryEndpoint(nsReg.Name) - - var serverPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(serverPrefixCh) - - serverPrefixCh <- &ipam.PrefixResponse{Prefix: "10.0.0.1/24"} - var dnsConfigs = new(genericsync.Map[string, []*networkservice.DNSConfig]) dnsServerIPCh := make(chan net.IP, 1) dnsServerIPCh <- net.ParseIP("0.0.0.0") + var serverIpam vl3.IPAM + serverIpam.Reset(ctx, "10.0.0.1/24", []string{}) + _ = domain.Nodes[0].NewEndpoint( ctx, nseReg, @@ -180,7 +175,7 @@ func Test_vl3NSE_ConnectsTo_vl3NSE(t *testing.T) { vl3dns.WithConfigs(dnsConfigs), vl3dns.WithDNSPort(40053), ), - vl3.NewServer(ctx, serverPrefixCh), + vl3.NewServer(ctx, &serverIpam), ) resolver := net.Resolver{ @@ -191,11 +186,9 @@ func Test_vl3NSE_ConnectsTo_vl3NSE(t *testing.T) { }, } - var clientPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(clientPrefixCh) - - clientPrefixCh <- &ipam.PrefixResponse{Prefix: "127.0.0.1/32"} - nsc := domain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken, client.WithAdditionalFunctionality(vl3dns.NewClient(net.ParseIP("127.0.0.1"), dnsConfigs), vl3.NewClient(ctx, clientPrefixCh))) + var clientIpam vl3.IPAM + clientIpam.Reset(ctx, "127.0.0.1/32", []string{}) + nsc := domain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken, client.WithAdditionalFunctionality(vl3dns.NewClient(net.ParseIP("127.0.0.1"), dnsConfigs), vl3.NewClient(ctx, &clientIpam))) req := defaultRequest(nsReg.Name) req.Connection.Id = uuid.New().String() @@ -249,13 +242,11 @@ func Test_NSC_GetsVl3DnsAddressDelay(t *testing.T) { require.NoError(t, err) nseReg := defaultRegistryEndpoint(nsReg.Name) - - var serverPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(serverPrefixCh) - - serverPrefixCh <- &ipam.PrefixResponse{Prefix: "10.0.0.1/24"} dnsServerIPCh := make(chan net.IP, 1) + var ipam vl3.IPAM + ipam.Reset(ctx, "10.0.0.1/24", []string{}) + _ = domain.Nodes[0].NewEndpoint( ctx, nseReg, @@ -264,7 +255,7 @@ func Test_NSC_GetsVl3DnsAddressDelay(t *testing.T) { dnsServerIPCh, vl3dns.WithDomainSchemes("{{ index .Labels \"podName\" }}.{{ .NetworkService }}."), vl3dns.WithDNSPort(40053)), - vl3.NewServer(ctx, serverPrefixCh)) + vl3.NewServer(ctx, &ipam)) nsc := domain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken) @@ -297,13 +288,11 @@ func Test_vl3NSE_ConnectsTo_Itself(t *testing.T) { require.NoError(t, err) nseReg := defaultRegistryEndpoint(nsReg.Name) - - var serverPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(serverPrefixCh) - - serverPrefixCh <- &ipam.PrefixResponse{Prefix: "10.0.0.1/24"} dnsServerIPCh := make(chan net.IP, 1) + var ipam vl3.IPAM + ipam.Reset(ctx, "10.0.0.1/24", []string{}) + _ = domain.Nodes[0].NewEndpoint( ctx, nseReg, @@ -311,7 +300,7 @@ func Test_vl3NSE_ConnectsTo_Itself(t *testing.T) { vl3dns.NewServer(ctx, dnsServerIPCh, vl3dns.WithDNSPort(40053)), - vl3.NewServer(ctx, serverPrefixCh)) + vl3.NewServer(ctx, &ipam)) // Connection to itself. This allows us to assign a dns address to ourselves. nsc := domain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken, client.WithName(nseReg.Name)) @@ -351,15 +340,14 @@ func Test_Interdomain_vl3_dns(t *testing.T) { NetworkServiceNames: []string{nsReg.Name}, } - var serverPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(serverPrefixCh) - - serverPrefixCh <- &ipam.PrefixResponse{Prefix: "10.0.0.1/24"} dnsServerIPCh := make(chan net.IP, 1) dnsServerIPCh <- net.ParseIP("127.0.0.1") + var ipam vl3.IPAM + ipam.Reset(ctx, "10.0.0.1/24", []string{}) + cluster2.Nodes[0].NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, - vl3.NewServer(ctx, serverPrefixCh), + vl3.NewServer(ctx, &ipam), vl3dns.NewServer(ctx, dnsServerIPCh, vl3dns.WithDNSPort(40053), @@ -452,15 +440,14 @@ func Test_FloatingInterdomain_vl3_dns(t *testing.T) { NetworkServiceNames: []string{"vl3"}, } - var serverPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(serverPrefixCh) - - serverPrefixCh <- &ipam.PrefixResponse{Prefix: "10.0.0.1/24"} dnsServerIPCh := make(chan net.IP, 1) dnsServerIPCh <- net.ParseIP("127.0.0.1") + var ipam vl3.IPAM + ipam.Reset(ctx, "10.0.0.1/24", []string{}) + cluster2.Nodes[0].NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, - vl3.NewServer(ctx, serverPrefixCh), + vl3.NewServer(ctx, &ipam), vl3dns.NewServer(ctx, dnsServerIPCh, vl3dns.WithDNSPort(40053), @@ -531,20 +518,17 @@ func Test_NSC_ConnectsTo_vl3NSE_With_Invalid_IpContext(t *testing.T) { nseReg := defaultRegistryEndpoint(nsReg.Name) - var serverPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(serverPrefixCh) - prefix1 := "10.0.0.0/24" prefix2 := "10.10.0.0/24" - serverPrefixCh <- &ipam.PrefixResponse{Prefix: prefix1} - strictIPPool := ippool.NewWithNetString(prefix1) + var serverIpam vl3.IPAM + serverIpam.Reset(ctx, prefix1, []string{}) _ = domain.Nodes[0].NewEndpoint( ctx, nseReg, sandbox.GenerateTestToken, - strictvl3ipam.NewServer(ctx, vl3.NewServer, serverPrefixCh, strictIPPool), + strictvl3ipam.NewServer(ctx, vl3.NewServer, &serverIpam), ) nsc := domain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken) @@ -555,9 +539,7 @@ func Test_NSC_ConnectsTo_vl3NSE_With_Invalid_IpContext(t *testing.T) { require.True(t, checkIPContext(conn.Context.IpContext, prefix1)) - serverPrefixCh <- &ipam.PrefixResponse{Prefix: prefix2} - strictIPPool.Clear() - strictIPPool.AddNetString(prefix2) + serverIpam.Reset(ctx, prefix2, []string{}) req.Connection = conn conn, err = nsc.Request(ctx, req) diff --git a/pkg/networkservice/connectioncontext/ipcontext/vl3/client.go b/pkg/networkservice/connectioncontext/ipcontext/vl3/client.go index 592e271ee..0b18b7b00 100644 --- a/pkg/networkservice/connectioncontext/ipcontext/vl3/client.go +++ b/pkg/networkservice/connectioncontext/ipcontext/vl3/client.go @@ -25,7 +25,6 @@ import ( "github.com/edwarnicke/serialize" "github.com/golang/protobuf/ptypes/empty" - "github.com/networkservicemesh/api/pkg/api/ipam" "github.com/networkservicemesh/api/pkg/api/networkservice" "google.golang.org/grpc" @@ -34,7 +33,7 @@ import ( ) type vl3Client struct { - pool vl3IPAM + pool *IPAM chainContext context.Context executor serialize.Executor subscriptions []chan struct{} @@ -44,29 +43,18 @@ type vl3Client struct { // // Produces refresh on prefix update. // Requires begin and metdata chain elements. -func NewClient(chainContext context.Context, prefixCh <-chan *ipam.PrefixResponse) networkservice.NetworkServiceClient { +func NewClient(chainContext context.Context, pool *IPAM) networkservice.NetworkServiceClient { if chainContext == nil { panic("chainContext can not be nil") } - if prefixCh == nil { - panic("prefixCh can not be nil") + if pool == nil { + panic("vl3IPAM pool can not be nil") } var r = &vl3Client{ chainContext: chainContext, + pool: pool, } - go func() { - for update := range prefixCh { - prefixResp := update - r.executor.AsyncExec(func() { - r.pool.reset(chainContext, prefixResp.GetPrefix(), prefixResp.GetExcludePrefixes()) - for _, sub := range r.subscriptions { - sub <- struct{}{} - } - }) - } - }() - return r } diff --git a/pkg/networkservice/connectioncontext/ipcontext/vl3/client_test.go b/pkg/networkservice/connectioncontext/ipcontext/vl3/client_test.go index d78d43b66..a86cef65d 100644 --- a/pkg/networkservice/connectioncontext/ipcontext/vl3/client_test.go +++ b/pkg/networkservice/connectioncontext/ipcontext/vl3/client_test.go @@ -22,7 +22,6 @@ import ( "time" "github.com/google/uuid" - "github.com/networkservicemesh/api/pkg/api/ipam" "github.com/networkservicemesh/api/pkg/api/networkservice" "github.com/stretchr/testify/require" "go.uber.org/goleak" @@ -43,13 +42,8 @@ func Test_Client_ConnectsToVl3NSE(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - var serverPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(serverPrefixCh) - - serverPrefixCh <- &ipam.PrefixResponse{Prefix: "10.0.0.1/24"} - - var clientPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(clientPrefixCh) + var ipamPool vl3.IPAM + ipamPool.Reset(ctx, "10.0.0.1/24", []string{}) var server = next.NewNetworkServiceServer( adapters.NewClientToServer( @@ -60,11 +54,9 @@ func Test_Client_ConnectsToVl3NSE(t *testing.T) { ), ), metadata.NewServer(), - vl3.NewServer(ctx, serverPrefixCh), + vl3.NewServer(ctx, &ipamPool), ) - require.Eventually(t, func() bool { return len(serverPrefixCh) == 0 && len(clientPrefixCh) == 0 }, time.Second, time.Millisecond*100) - resp, err := server.Request(ctx, &networkservice.NetworkServiceRequest{Connection: &networkservice.Connection{Id: t.Name()}}) require.NoError(t, err) @@ -99,30 +91,24 @@ func Test_VL3NSE_ConnectsToVl3NSE(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - var serverPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(serverPrefixCh) + var clientIpamPool vl3.IPAM + var serverIpamPool vl3.IPAM - serverPrefixCh <- &ipam.PrefixResponse{Prefix: "10.0.0.1/24"} - - var clientPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(clientPrefixCh) - - clientPrefixCh <- &ipam.PrefixResponse{Prefix: "10.0.1.0/24"} + clientIpamPool.Reset(ctx, "10.0.1.0/24", []string{}) + serverIpamPool.Reset(ctx, "10.0.0.1/24", []string{}) var server = next.NewNetworkServiceServer( adapters.NewClientToServer( next.NewNetworkServiceClient( begin.NewClient(), metadata.NewClient(), - vl3.NewClient(ctx, clientPrefixCh), + vl3.NewClient(ctx, &clientIpamPool), ), ), metadata.NewServer(), - vl3.NewServer(ctx, serverPrefixCh), + vl3.NewServer(ctx, &serverIpamPool), ) - require.Eventually(t, func() bool { return len(serverPrefixCh) == 0 && len(clientPrefixCh) == 0 }, time.Second, time.Millisecond*100) - resp, err := server.Request(ctx, &networkservice.NetworkServiceRequest{Connection: &networkservice.Connection{Id: t.Name()}}) require.NoError(t, err) @@ -159,30 +145,24 @@ func Test_VL3NSE_ConnectsToVl3NSE_ChangePrefix(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - var serverPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(serverPrefixCh) + var clientIpamPool vl3.IPAM + var serverIpamPool vl3.IPAM - serverPrefixCh <- &ipam.PrefixResponse{Prefix: "10.0.0.1/24"} - - var clientPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(clientPrefixCh) - - clientPrefixCh <- &ipam.PrefixResponse{Prefix: "10.0.1.0/24"} + clientIpamPool.Reset(ctx, "10.0.1.0/24", []string{}) + serverIpamPool.Reset(ctx, "10.0.0.1/24", []string{}) var server = next.NewNetworkServiceServer( adapters.NewClientToServer( next.NewNetworkServiceClient( begin.NewClient(), metadata.NewClient(), - vl3.NewClient(ctx, clientPrefixCh), + vl3.NewClient(ctx, &clientIpamPool), ), ), metadata.NewServer(), - vl3.NewServer(ctx, serverPrefixCh), + vl3.NewServer(ctx, &serverIpamPool), ) - require.Eventually(t, func() bool { return len(serverPrefixCh) == 0 && len(clientPrefixCh) == 0 }, time.Second, time.Millisecond*100) - resp, err := server.Request(ctx, &networkservice.NetworkServiceRequest{Connection: &networkservice.Connection{Id: t.Name()}}) require.NoError(t, err) @@ -196,8 +176,7 @@ func Test_VL3NSE_ConnectsToVl3NSE_ChangePrefix(t *testing.T) { require.Equal(t, "10.0.1.0/32", resp.GetContext().GetIpContext().GetDstRoutes()[0].GetPrefix()) require.Equal(t, "10.0.1.0/24", resp.GetContext().GetIpContext().GetDstRoutes()[1].GetPrefix()) - clientPrefixCh <- &ipam.PrefixResponse{Prefix: "10.0.5.0/24"} - require.Eventually(t, func() bool { return len(serverPrefixCh) == 0 && len(clientPrefixCh) == 0 }, time.Second, time.Millisecond*100) + clientIpamPool.Reset(ctx, "10.0.5.0/24", []string{}) // refresh for i := 0; i < 10; i++ { @@ -224,29 +203,25 @@ func Test_VL3NSE_ConnectsToVl3NSE_Close(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - var serverPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(serverPrefixCh) - - serverPrefixCh <- &ipam.PrefixResponse{Prefix: "10.0.0.1/24"} - - var clientPrefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(clientPrefixCh) + var clientIpamPool vl3.IPAM + var serverIpamPool vl3.IPAM - clientPrefixCh <- &ipam.PrefixResponse{Prefix: "10.0.1.0/24"} + clientIpamPool.Reset(ctx, "10.0.1.0/24", []string{}) + serverIpamPool.Reset(ctx, "10.0.0.1/24", []string{}) var server = next.NewNetworkServiceServer( adapters.NewClientToServer( next.NewNetworkServiceClient( begin.NewClient(), metadata.NewClient(), - vl3.NewClient(ctx, clientPrefixCh), + vl3.NewClient(ctx, &clientIpamPool), ), ), metadata.NewServer(), - vl3.NewServer(ctx, serverPrefixCh), + vl3.NewServer(ctx, &serverIpamPool), ) - require.Eventually(t, func() bool { return len(serverPrefixCh) == 0 && len(clientPrefixCh) == 0 }, time.Second, time.Millisecond*100) + //require.Eventually(t, func() bool { return len(serverPrefixCh) == 0 && len(clientPrefixCh) == 0 }, time.Second, time.Millisecond*100) resp, err := server.Request(ctx, &networkservice.NetworkServiceRequest{Connection: &networkservice.Connection{Id: uuid.New().String()}}) diff --git a/pkg/networkservice/connectioncontext/ipcontext/vl3/ipam.go b/pkg/networkservice/connectioncontext/ipcontext/vl3/ipam.go index 85f6823a3..3a9b6fe8c 100644 --- a/pkg/networkservice/connectioncontext/ipcontext/vl3/ipam.go +++ b/pkg/networkservice/connectioncontext/ipcontext/vl3/ipam.go @@ -25,7 +25,7 @@ import ( "github.com/networkservicemesh/sdk/pkg/tools/log" ) -type vl3IPAM struct { +type IPAM struct { sync.Mutex self net.IPNet ipPool *ippool.IPPool @@ -33,14 +33,14 @@ type vl3IPAM struct { clientMask uint8 } -func (p *vl3IPAM) isInitialized() bool { +func (p *IPAM) isInitialized() bool { p.Lock() defer p.Unlock() return p.ipPool != nil } -func (p *vl3IPAM) selfAddress() *net.IPNet { +func (p *IPAM) selfAddress() *net.IPNet { p.Lock() defer p.Unlock() return &net.IPNet{ @@ -52,13 +52,13 @@ func (p *vl3IPAM) selfAddress() *net.IPNet { } } -func (p *vl3IPAM) selfPrefix() *net.IPNet { +func (p *IPAM) selfPrefix() *net.IPNet { p.Lock() defer p.Unlock() r := p.self return &r } -func (p *vl3IPAM) globalIPNet() *net.IPNet { +func (p *IPAM) globalIPNet() *net.IPNet { p.Lock() defer p.Unlock() return &net.IPNet{ @@ -70,7 +70,7 @@ func (p *vl3IPAM) globalIPNet() *net.IPNet { } } -func (p *vl3IPAM) allocate() (*net.IPNet, error) { +func (p *IPAM) allocate() (*net.IPNet, error) { p.Lock() defer p.Unlock() @@ -91,7 +91,7 @@ func (p *vl3IPAM) allocate() (*net.IPNet, error) { return r, nil } -func (p *vl3IPAM) freeIfAllocated(ipNet string) { +func (p *IPAM) freeIfAllocated(ipNet string) { p.Lock() defer p.Unlock() @@ -101,7 +101,7 @@ func (p *vl3IPAM) freeIfAllocated(ipNet string) { } } -func (p *vl3IPAM) isExcluded(ipNet string) bool { +func (p *IPAM) isExcluded(ipNet string) bool { p.Lock() defer p.Unlock() @@ -109,7 +109,7 @@ func (p *vl3IPAM) isExcluded(ipNet string) bool { return r } -func (p *vl3IPAM) reset(ctx context.Context, prefix string, excludePrefies []string) { +func (p *IPAM) Reset(ctx context.Context, prefix string, excludePrefies []string) { p.Lock() defer p.Unlock() @@ -141,3 +141,7 @@ func (p *vl3IPAM) reset(ctx context.Context, prefix string, excludePrefies []str p.excludedPrefixes[excludePrefix] = struct{}{} } } + +func (p *IPAM) ContainsNetString(net string) bool { + return p.ipPool.ContainsNetString(net) +} diff --git a/pkg/networkservice/connectioncontext/ipcontext/vl3/server.go b/pkg/networkservice/connectioncontext/ipcontext/vl3/server.go index c5b22e1d4..61bc70f36 100644 --- a/pkg/networkservice/connectioncontext/ipcontext/vl3/server.go +++ b/pkg/networkservice/connectioncontext/ipcontext/vl3/server.go @@ -22,30 +22,21 @@ import ( "github.com/pkg/errors" "github.com/golang/protobuf/ptypes/empty" - "github.com/networkservicemesh/api/pkg/api/ipam" "github.com/networkservicemesh/api/pkg/api/networkservice" "github.com/networkservicemesh/sdk/pkg/networkservice/core/next" ) type vl3Server struct { - pool vl3IPAM + pool *IPAM } // NewServer - returns a new vL3 server instance that manages connection.context.ipcontext for vL3 scenario. // // Produces refresh on prefix update. // Requires begin and metdata chain elements. -func NewServer(ctx context.Context, prefixCh <-chan *ipam.PrefixResponse) networkservice.NetworkServiceServer { - var result = new(vl3Server) - - go func() { - for resp := range prefixCh { - result.pool.reset(ctx, resp.GetPrefix(), resp.GetExcludePrefixes()) - } - }() - - return result +func NewServer(ctx context.Context, pool *IPAM) networkservice.NetworkServiceServer { + return &vl3Server{pool: pool} } func (v *vl3Server) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { diff --git a/pkg/networkservice/connectioncontext/ipcontext/vl3/server_test.go b/pkg/networkservice/connectioncontext/ipcontext/vl3/server_test.go index d0f17119c..c1d2a74de 100644 --- a/pkg/networkservice/connectioncontext/ipcontext/vl3/server_test.go +++ b/pkg/networkservice/connectioncontext/ipcontext/vl3/server_test.go @@ -19,9 +19,7 @@ package vl3_test import ( "context" "testing" - "time" - "github.com/networkservicemesh/api/pkg/api/ipam" "github.com/networkservicemesh/api/pkg/api/networkservice" "github.com/networkservicemesh/sdk/pkg/networkservice/connectioncontext/ipcontext/vl3" @@ -37,19 +35,14 @@ func Test_NSC_ConnectsToVl3NSE(t *testing.T) { t.Cleanup(func() { goleak.VerifyNone(t) }) - - var prefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(prefixCh) - - prefixCh <- &ipam.PrefixResponse{Prefix: "10.0.0.1/24"} + var ipam vl3.IPAM + ipam.Reset(context.Background(), "10.0.0.1/24", []string{}) var server = next.NewNetworkServiceServer( metadata.NewServer(), - vl3.NewServer(context.Background(), prefixCh), + vl3.NewServer(context.Background(), &ipam), ) - require.Eventually(t, func() bool { return len(prefixCh) == 0 }, time.Second, time.Millisecond*100) - resp, err := server.Request(context.Background(), new(networkservice.NetworkServiceRequest)) require.NoError(t, err) @@ -82,18 +75,14 @@ func Test_NSC_ConnectsToVl3NSE_PrefixHasChanged(t *testing.T) { goleak.VerifyNone(t) }) - var prefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(prefixCh) - - prefixCh <- &ipam.PrefixResponse{Prefix: "12.0.0.1/24"} + var ipam vl3.IPAM + ipam.Reset(context.Background(), "12.0.0.1/24", []string{}) var server = next.NewNetworkServiceServer( metadata.NewServer(), - vl3.NewServer(context.Background(), prefixCh), + vl3.NewServer(context.Background(), &ipam), ) - require.Eventually(t, func() bool { return len(prefixCh) == 0 }, time.Second, time.Millisecond*120) - resp, err := server.Request(context.Background(), new(networkservice.NetworkServiceRequest)) require.NoError(t, err) @@ -106,8 +95,7 @@ func Test_NSC_ConnectsToVl3NSE_PrefixHasChanged(t *testing.T) { require.Equal(t, "12.0.0.0/16", resp.GetContext().GetIpContext().GetSrcRoutes()[2].GetPrefix()) require.Equal(t, "12.0.0.1/32", resp.GetContext().GetIpContext().GetDstRoutes()[0].GetPrefix()) - prefixCh <- &ipam.PrefixResponse{Prefix: "11.0.0.1/24"} - require.Eventually(t, func() bool { return len(prefixCh) == 0 }, time.Second, time.Millisecond*100) + ipam.Reset(context.Background(), "11.0.0.1/24", []string{}) // refresh for i := 0; i < 10; i++ { @@ -130,18 +118,14 @@ func Test_NSC_ConnectsToVl3NSE_Close(t *testing.T) { goleak.VerifyNone(t) }) - var prefixCh = make(chan *ipam.PrefixResponse, 1) - defer close(prefixCh) - - prefixCh <- &ipam.PrefixResponse{Prefix: "10.0.0.1/24"} + var ipam vl3.IPAM + ipam.Reset(context.Background(), "10.0.0.1/24", []string{}) var server = next.NewNetworkServiceServer( metadata.NewServer(), - vl3.NewServer(context.Background(), prefixCh), + vl3.NewServer(context.Background(), &ipam), ) - require.Eventually(t, func() bool { return len(prefixCh) == 0 }, time.Second, time.Millisecond*100) - for i := 0; i < 10; i++ { resp, err := server.Request(context.Background(), new(networkservice.NetworkServiceRequest)) From bb1e5ee784d9e8085892876b07a10e85a1b242b5 Mon Sep 17 00:00:00 2001 From: NikitaSkrynnik Date: Mon, 18 Mar 2024 22:05:14 +0700 Subject: [PATCH 10/12] fix go linter issues Signed-off-by: NikitaSkrynnik --- .../connectioncontext/ipcontext/vl3/client.go | 2 +- .../connectioncontext/ipcontext/vl3/client_test.go | 4 +--- .../connectioncontext/ipcontext/vl3/ipam.go | 9 ++++++--- .../connectioncontext/ipcontext/vl3/server.go | 2 +- .../connectioncontext/ipcontext/vl3/server_test.go | 2 +- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pkg/networkservice/connectioncontext/ipcontext/vl3/client.go b/pkg/networkservice/connectioncontext/ipcontext/vl3/client.go index 0b18b7b00..3a252978a 100644 --- a/pkg/networkservice/connectioncontext/ipcontext/vl3/client.go +++ b/pkg/networkservice/connectioncontext/ipcontext/vl3/client.go @@ -1,4 +1,4 @@ -// Copyright (c) 2022-2023 Cisco and/or its affiliates. +// Copyright (c) 2022-2024 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // diff --git a/pkg/networkservice/connectioncontext/ipcontext/vl3/client_test.go b/pkg/networkservice/connectioncontext/ipcontext/vl3/client_test.go index a86cef65d..0ea0a6393 100644 --- a/pkg/networkservice/connectioncontext/ipcontext/vl3/client_test.go +++ b/pkg/networkservice/connectioncontext/ipcontext/vl3/client_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2022 Cisco and/or its affiliates. +// Copyright (c) 2022-2024 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -221,8 +221,6 @@ func Test_VL3NSE_ConnectsToVl3NSE_Close(t *testing.T) { vl3.NewServer(ctx, &serverIpamPool), ) - //require.Eventually(t, func() bool { return len(serverPrefixCh) == 0 && len(clientPrefixCh) == 0 }, time.Second, time.Millisecond*100) - resp, err := server.Request(ctx, &networkservice.NetworkServiceRequest{Connection: &networkservice.Connection{Id: uuid.New().String()}}) require.NoError(t, err) diff --git a/pkg/networkservice/connectioncontext/ipcontext/vl3/ipam.go b/pkg/networkservice/connectioncontext/ipcontext/vl3/ipam.go index 3a9b6fe8c..f2861915f 100644 --- a/pkg/networkservice/connectioncontext/ipcontext/vl3/ipam.go +++ b/pkg/networkservice/connectioncontext/ipcontext/vl3/ipam.go @@ -1,4 +1,4 @@ -// Copyright (c) 2022 Cisco and/or its affiliates. +// Copyright (c) 2022-2024 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -25,6 +25,7 @@ import ( "github.com/networkservicemesh/sdk/pkg/tools/log" ) +// IPAM manages vl3 prefixes type IPAM struct { sync.Mutex self net.IPNet @@ -109,6 +110,7 @@ func (p *IPAM) isExcluded(ipNet string) bool { return r } +// Reset resets IPAM's ippol by setting new prefix func (p *IPAM) Reset(ctx context.Context, prefix string, excludePrefies []string) { p.Lock() defer p.Unlock() @@ -142,6 +144,7 @@ func (p *IPAM) Reset(ctx context.Context, prefix string, excludePrefies []string } } -func (p *IPAM) ContainsNetString(net string) bool { - return p.ipPool.ContainsNetString(net) +// ContainsNetString checks if ippool contains net +func (p *IPAM) ContainsNetString(ipNet string) bool { + return p.ipPool.ContainsNetString(ipNet) } diff --git a/pkg/networkservice/connectioncontext/ipcontext/vl3/server.go b/pkg/networkservice/connectioncontext/ipcontext/vl3/server.go index 61bc70f36..80c2cde12 100644 --- a/pkg/networkservice/connectioncontext/ipcontext/vl3/server.go +++ b/pkg/networkservice/connectioncontext/ipcontext/vl3/server.go @@ -1,4 +1,4 @@ -// Copyright (c) 2022-2023 Cisco and/or its affiliates. +// Copyright (c) 2022-2024 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // diff --git a/pkg/networkservice/connectioncontext/ipcontext/vl3/server_test.go b/pkg/networkservice/connectioncontext/ipcontext/vl3/server_test.go index c1d2a74de..a6b2444b9 100644 --- a/pkg/networkservice/connectioncontext/ipcontext/vl3/server_test.go +++ b/pkg/networkservice/connectioncontext/ipcontext/vl3/server_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2022 Cisco and/or its affiliates. +// Copyright (c) 2022-2024 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // From 6169841a8dc30f726782e60b26e469e08e6abfc3 Mon Sep 17 00:00:00 2001 From: NikitaSkrynnik Date: Tue, 19 Mar 2024 12:11:09 +0700 Subject: [PATCH 11/12] revert changes Signed-off-by: NikitaSkrynnik --- pkg/tools/ippool/ippool.go | 39 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/pkg/tools/ippool/ippool.go b/pkg/tools/ippool/ippool.go index 8b50af371..144dd4f38 100644 --- a/pkg/tools/ippool/ippool.go +++ b/pkg/tools/ippool/ippool.go @@ -1,6 +1,6 @@ // Copyright (c) 2021-2022 Doc.ai and/or its affiliates. // -// Copyright (c) 2022-2024 Cisco and/or its affiliates. +// Copyright (c) 2022-2023 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -36,8 +36,8 @@ const ( // IPPool holds available ip addresses in the structure of red-black tree type IPPool struct { - sync.Mutex root *treeNode + lock sync.Mutex size uint64 ipLength int } @@ -83,8 +83,8 @@ func NewWithNetString(ipNetString string) *IPPool { // Clone - make a clone of the pool func (tree *IPPool) Clone() *IPPool { - tree.Lock() - defer tree.Unlock() + tree.lock.Lock() + defer tree.lock.Unlock() return tree.clone() } @@ -111,8 +111,8 @@ func (tree *IPPool) Add(ip net.IP) { return } - tree.Lock() - defer tree.Unlock() + tree.lock.Lock() + defer tree.lock.Unlock() tree.add(ipAddressFromIP(ip)) } @@ -132,8 +132,8 @@ func (tree *IPPool) AddNet(ipNet *net.IPNet) { return } - tree.Lock() - defer tree.Unlock() + tree.lock.Lock() + defer tree.lock.Unlock() tree.addRange(ipRangeFromIPNet(ipNet)) } @@ -150,9 +150,6 @@ func (tree *IPPool) AddNetString(ipNetString string) { // ContainsNetString parses ipNetRaw string and checks that pool contains whole ipNet func (tree *IPPool) ContainsNetString(ipNetRaw string) bool { - tree.Lock() - defer tree.Unlock() - _, ipNet, err := net.ParseCIDR(ipNetRaw) if err != nil { return false @@ -206,8 +203,8 @@ func (tree *IPPool) Exclude(ipNet *net.IPNet) { return } - tree.Lock() - defer tree.Unlock() + tree.lock.Lock() + defer tree.lock.Unlock() tree.deleteRange(ipRangeFromIPNet(ipNet)) } @@ -224,8 +221,8 @@ func (tree *IPPool) ExcludeString(ipNetString string) { // Pull - returns next IP address from pool func (tree *IPPool) Pull() (net.IP, error) { - tree.Lock() - defer tree.Unlock() + tree.lock.Lock() + defer tree.lock.Unlock() ip := tree.pull() if ip == nil { @@ -246,8 +243,8 @@ func (tree *IPPool) PullIPString(ipString string, exclude ...*IPPool) (*net.IPNe // PullIP - returns requested IP address from the pool func (tree *IPPool) PullIP(ip net.IP, exclude ...*IPPool) (*net.IPNet, error) { - tree.Lock() - defer tree.Unlock() + tree.lock.Lock() + defer tree.lock.Unlock() clone := tree.clone() for _, pool := range exclude { @@ -271,8 +268,8 @@ func (tree *IPPool) PullIP(ip net.IP, exclude ...*IPPool) (*net.IPNet, error) { // PullP2PAddrs - returns next IP addresses pair from pool for peer-to-peer connection func (tree *IPPool) PullP2PAddrs(exclude ...*IPPool) (srcNet, dstNet *net.IPNet, err error) { - tree.Lock() - defer tree.Unlock() + tree.lock.Lock() + defer tree.lock.Unlock() clone := tree.clone() @@ -314,9 +311,9 @@ func (tree *IPPool) PullP2PAddrs(exclude ...*IPPool) (srcNet, dstNet *net.IPNet, // GetPrefixes returns the list of saved prefixes func (tree *IPPool) GetPrefixes() []string { - tree.Lock() + tree.lock.Lock() clone := tree.clone() - tree.Unlock() + tree.lock.Unlock() if clone.root == nil { return nil From 33195c094d1b50ef7c8853a4449f03184aca6219 Mon Sep 17 00:00:00 2001 From: NikitaSkrynnik Date: Tue, 19 Mar 2024 12:14:27 +0700 Subject: [PATCH 12/12] revert some changes + add mutex to ContainsNetString Signed-off-by: NikitaSkrynnik --- pkg/networkservice/connectioncontext/ipcontext/vl3/ipam.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/networkservice/connectioncontext/ipcontext/vl3/ipam.go b/pkg/networkservice/connectioncontext/ipcontext/vl3/ipam.go index f2861915f..e31129403 100644 --- a/pkg/networkservice/connectioncontext/ipcontext/vl3/ipam.go +++ b/pkg/networkservice/connectioncontext/ipcontext/vl3/ipam.go @@ -146,5 +146,7 @@ func (p *IPAM) Reset(ctx context.Context, prefix string, excludePrefies []string // ContainsNetString checks if ippool contains net func (p *IPAM) ContainsNetString(ipNet string) bool { + p.Lock() + defer p.Unlock() return p.ipPool.ContainsNetString(ipNet) }