@@ -3,13 +3,12 @@ package plugin
3
3
import (
4
4
"fmt"
5
5
"net"
6
- "strings "
6
+ "syscall "
7
7
"time"
8
8
9
9
"github.com/golang/glog"
10
10
11
11
osapi "github.com/openshift/origin/pkg/sdn/apis/network"
12
- "github.com/openshift/origin/pkg/util/ipcmd"
13
12
"github.com/openshift/origin/pkg/util/netutils"
14
13
15
14
kapierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -20,6 +19,8 @@ import (
20
19
kexec "k8s.io/kubernetes/pkg/util/exec"
21
20
"k8s.io/kubernetes/pkg/util/iptables"
22
21
"k8s.io/kubernetes/pkg/util/sysctl"
22
+
23
+ "github.com/vishvananda/netlink"
23
24
)
24
25
25
26
func (plugin * OsdnNode ) getLocalSubnet () (string , error ) {
@@ -61,16 +62,18 @@ func (plugin *OsdnNode) getLocalSubnet() (string, error) {
61
62
func (plugin * OsdnNode ) alreadySetUp (localSubnetGatewayCIDR , clusterNetworkCIDR string ) bool {
62
63
var found bool
63
64
64
- exec := kexec .New ()
65
- itx := ipcmd .NewTransaction (exec , Tun0 )
66
- addrs , err := itx .GetAddresses ()
67
- itx .EndTransaction ()
65
+ l , err := netlink .LinkByName (Tun0 )
66
+ if err != nil {
67
+ return false
68
+ }
69
+
70
+ addrs , err := netlink .AddrList (l , syscall .AF_INET )
68
71
if err != nil {
69
72
return false
70
73
}
71
74
found = false
72
75
for _ , addr := range addrs {
73
- if strings . Contains ( addr , localSubnetGatewayCIDR ) {
76
+ if addr . IPNet . String () == localSubnetGatewayCIDR {
74
77
found = true
75
78
break
76
79
}
@@ -79,15 +82,13 @@ func (plugin *OsdnNode) alreadySetUp(localSubnetGatewayCIDR, clusterNetworkCIDR
79
82
return false
80
83
}
81
84
82
- itx = ipcmd .NewTransaction (exec , Tun0 )
83
- routes , err := itx .GetRoutes ()
84
- itx .EndTransaction ()
85
+ routes , err := netlink .RouteList (l , syscall .AF_INET )
85
86
if err != nil {
86
87
return false
87
88
}
88
89
found = false
89
90
for _ , route := range routes {
90
- if strings . Contains ( route , clusterNetworkCIDR + " " ) {
91
+ if route . Dst != nil && route . Dst . String () == clusterNetworkCIDR {
91
92
found = true
92
93
break
93
94
}
@@ -110,15 +111,17 @@ func deleteLocalSubnetRoute(device, localSubnetCIDR string) {
110
111
Steps : 6 ,
111
112
}
112
113
err := utilwait .ExponentialBackoff (backoff , func () (bool , error ) {
113
- itx := ipcmd .NewTransaction (kexec .New (), device )
114
- routes , err := itx .GetRoutes ()
114
+ l , err := netlink .LinkByName (device )
115
+ if err != nil {
116
+ return false , fmt .Errorf ("could not get interface %s: %v" , device , err )
117
+ }
118
+ routes , err := netlink .RouteList (l , syscall .AF_INET )
115
119
if err != nil {
116
120
return false , fmt .Errorf ("could not get routes: %v" , err )
117
121
}
118
122
for _ , route := range routes {
119
- if strings .Contains (route , localSubnetCIDR ) {
120
- itx .DeleteRoute (localSubnetCIDR )
121
- err = itx .EndTransaction ()
123
+ if route .Dst != nil && route .Dst .String () == localSubnetCIDR {
124
+ err = netlink .RouteDel (& route )
122
125
if err != nil {
123
126
return false , fmt .Errorf ("could not delete route: %v" , err )
124
127
}
@@ -166,14 +169,35 @@ func (plugin *OsdnNode) SetupSDN() (bool, error) {
166
169
return false , err
167
170
}
168
171
169
- itx := ipcmd .NewTransaction (exec , Tun0 )
170
- itx .AddAddress (gwCIDR )
171
- defer deleteLocalSubnetRoute (Tun0 , localSubnetCIDR )
172
- itx .SetLink ("mtu" , fmt .Sprint (plugin .mtu ))
173
- itx .SetLink ("up" )
174
- itx .AddRoute (clusterNetworkCIDR , "proto" , "kernel" , "scope" , "link" )
175
- itx .AddRoute (serviceNetworkCIDR )
176
- err = itx .EndTransaction ()
172
+ l , err := netlink .LinkByName (Tun0 )
173
+ if err == nil {
174
+ gwIP , _ := netlink .ParseIPNet (gwCIDR )
175
+ err = netlink .AddrAdd (l , & netlink.Addr {IPNet : gwIP })
176
+ if err == nil {
177
+ defer deleteLocalSubnetRoute (Tun0 , localSubnetCIDR )
178
+ }
179
+ }
180
+ if err == nil {
181
+ err = netlink .LinkSetMTU (l , int (plugin .mtu ))
182
+ }
183
+ if err == nil {
184
+ err = netlink .LinkSetUp (l )
185
+ }
186
+ if err == nil {
187
+ route := & netlink.Route {
188
+ LinkIndex : l .Attrs ().Index ,
189
+ Scope : netlink .SCOPE_LINK ,
190
+ Dst : plugin .networkInfo .ClusterNetwork ,
191
+ }
192
+ err = netlink .RouteAdd (route )
193
+ }
194
+ if err == nil {
195
+ route := & netlink.Route {
196
+ LinkIndex : l .Attrs ().Index ,
197
+ Dst : plugin .networkInfo .ServiceNetwork ,
198
+ }
199
+ err = netlink .RouteAdd (route )
200
+ }
177
201
if err != nil {
178
202
return false , err
179
203
}
0 commit comments