@@ -3,53 +3,81 @@ package stubs
33import (
44 "errors"
55 "net"
6+ "strings"
67 meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
78 types "k8s.io/apimachinery/pkg/types"
89 watch "k8s.io/apimachinery/pkg/watch"
910 danmtypes "github.com/nokia/danm/crd/apis/danm/v1"
1011 "github.com/nokia/danm/pkg/bitarray"
1112 "github.com/nokia/danm/pkg/netcontrol"
1213)
14+ const (
15+ magicVersion = "42"
16+ )
1317
1418type NetClientStub struct {
1519 testNets []danmtypes.DanmNet
1620 reservedIpsList []ReservedIpsList
1721}
1822
19- func newNetClientStub (nets []danmtypes.DanmNet , ips []ReservedIpsList ) NetClientStub {
20- return NetClientStub {testNets : nets , reservedIpsList : ips }
23+ func newNetClientStub (nets []danmtypes.DanmNet , ips []ReservedIpsList ) * NetClientStub {
24+ return & NetClientStub {testNets : nets , reservedIpsList : ips }
2125}
2226
23- func (netClient NetClientStub ) Create (obj * danmtypes.DanmNet ) (* danmtypes.DanmNet , error ) {
27+ func (netClient * NetClientStub ) Create (obj * danmtypes.DanmNet ) (* danmtypes.DanmNet , error ) {
2428 return nil , nil
2529}
2630
27- func (netClient NetClientStub ) Update (obj * danmtypes.DanmNet ) (* danmtypes.DanmNet , error ) {
28- for _ , reservation := range netClient .reservedIpsList {
29- if obj .Spec .NetworkID == reservation .NetworkId {
31+ func (netClient * NetClientStub ) Update (obj * danmtypes.DanmNet ) (* danmtypes.DanmNet , error ) {
32+ for _ , netReservation := range netClient .reservedIpsList {
33+ if obj .Spec .NetworkID == netReservation .NetworkId {
3034 ba := bitarray .NewBitArrayFromBase64 (obj .Spec .Options .Alloc )
3135 _ , ipnet , _ := net .ParseCIDR (obj .Spec .Options .Cidr )
3236 ipnetNum := netcontrol .Ip2int (ipnet .IP )
33- for _ , ipToBeChecked := range reservation .Ips {
34- ipInInt := netcontrol .Ip2int (net .ParseIP (ipToBeChecked )) - ipnetNum
35- if ! ba .Get (uint32 (ipInInt )) {
36- return nil , errors .New ("Reservation failure, IP:" + ipToBeChecked + " must be reserved in DanmNet:" + obj .Spec .NetworkID )
37+ for _ , reservation := range netReservation .Reservations {
38+ ip ,_ ,err := net .ParseCIDR (reservation .Ip )
39+ if err != nil {
40+ continue
41+ }
42+ ipInInt := netcontrol .Ip2int (ip ) - ipnetNum
43+ if ! ipnet .Contains (ip ) {
44+ continue
45+ }
46+ if ! ba .Get (uint32 (ipInInt )) && reservation .Set {
47+ return nil , errors .New ("Reservation failure, IP:" + reservation .Ip + " must be reserved in DanmNet:" + obj .Spec .NetworkID )
48+ }
49+ if ba .Get (uint32 (ipInInt )) && ! reservation .Set {
50+ return nil , errors .New ("Reservation failure, IP:" + reservation .Ip + " must be free in DanmNet:" + obj .Spec .NetworkID )
3751 }
3852 }
3953 }
4054 }
55+ if strings .Contains (obj .Spec .NetworkID , "conflict" ) && obj .ObjectMeta .ResourceVersion != magicVersion {
56+ for index , net := range netClient .testNets {
57+ if net .Spec .NetworkID == obj .Spec .NetworkID {
58+ netClient .testNets [index ].ObjectMeta .ResourceVersion = magicVersion
59+ }
60+ }
61+ return nil , errors .New (danmtypes .OptimisticLockErrorMsg )
62+ }
63+ if strings .Contains (obj .Spec .NetworkID , "error" ) {
64+ return nil , errors .New ("fatal error, don't retry" )
65+ }
4166 return obj , nil
4267}
4368
44- func (netClient NetClientStub ) Delete (name string , options * meta_v1.DeleteOptions ) error {
69+ func (netClient * NetClientStub ) Delete (name string , options * meta_v1.DeleteOptions ) error {
4570 return nil
4671}
4772
48- func (netClient NetClientStub ) DeleteCollection (options * meta_v1.DeleteOptions , listOptions meta_v1.ListOptions ) error {
73+ func (netClient * NetClientStub ) DeleteCollection (options * meta_v1.DeleteOptions , listOptions meta_v1.ListOptions ) error {
4974 return nil
5075}
5176
52- func (netClient NetClientStub ) Get (netName string , options meta_v1.GetOptions ) (* danmtypes.DanmNet , error ) {
77+ func (netClient * NetClientStub ) Get (netName string , options meta_v1.GetOptions ) (* danmtypes.DanmNet , error ) {
78+ if strings .Contains (netName , "error" ) {
79+ return nil , errors .New ("fatal error, don't retry" )
80+ }
5381 for _ , testNet := range netClient .testNets {
5482 if testNet .Spec .NetworkID == netName {
5583 return & testNet , nil
@@ -58,19 +86,19 @@ func (netClient NetClientStub) Get(netName string, options meta_v1.GetOptions) (
5886 return nil , errors .New ("let's test error case as well" )
5987}
6088
61- func (netClient NetClientStub ) Watch (opts meta_v1.ListOptions ) (watch.Interface , error ) {
89+ func (netClient * NetClientStub ) Watch (opts meta_v1.ListOptions ) (watch.Interface , error ) {
6290 watch := watch .NewEmptyWatch ()
6391 return watch , nil
6492}
6593
66- func (netClient NetClientStub ) List (opts meta_v1.ListOptions ) (* danmtypes.DanmNetList , error ) {
94+ func (netClient * NetClientStub ) List (opts meta_v1.ListOptions ) (* danmtypes.DanmNetList , error ) {
6795 return nil , nil
6896}
6997
70- func (netClient NetClientStub ) Patch (name string , pt types.PatchType , data []byte , subresources ... string ) (result * danmtypes.DanmNet , err error ) {
98+ func (netClient * NetClientStub ) Patch (name string , pt types.PatchType , data []byte , subresources ... string ) (result * danmtypes.DanmNet , err error ) {
7199 return nil , nil
72100}
73101
74- func (netClient NetClientStub ) AddReservedIpsList (reservedIps []ReservedIpsList ) {
102+ func (netClient * NetClientStub ) AddReservedIpsList (reservedIps []ReservedIpsList ) {
75103 netClient .reservedIpsList = reservedIps
76104}
0 commit comments