Skip to content

Commit b4aad3c

Browse files
committed
Reworking interface post-processing to be entirely generic, for all interfaces.
This enables us to: - handle ALL activities, in one place, unconditionally - cleaner code - finally getting rid of all IPVLAN specific code - being able to apply post processing even for the dummy interfaces
1 parent fee0913 commit b4aad3c

File tree

4 files changed

+17
-47
lines changed

4 files changed

+17
-47
lines changed

pkg/cnidel/cnidel.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
"github.com/containernetworking/cni/pkg/types"
1414
"github.com/containernetworking/cni/pkg/types/current"
1515
"github.com/containernetworking/cni/pkg/version"
16-
"github.com/nokia/danm/pkg/danmep"
1716
"github.com/nokia/danm/pkg/datastructs"
1817
"github.com/nokia/danm/pkg/ipam"
1918
"github.com/nokia/danm/pkg/netcontrol"
@@ -58,27 +57,23 @@ func DelegateInterfaceSetup(netConf *datastructs.NetConf, danmClient danmclients
5857
//As netInfo is only copied to IPAM above, the IP allocation is not refreshed in the original copy.
5958
//Without re-reading the network body we risk leaking IPs if error happens later on within the same thread!
6059
netInfo,err = netcontrol.GetNetworkFromEp(danmClient, *ep)
61-
if err != nil {log.Println("lofasz:" + err.Error())}
60+
if err != nil {
61+
return nil, err
62+
}
6263
ipamOptions = getCniIpamConfig(netInfo, ep.Spec.Iface.Address, ep.Spec.Iface.AddressIPv6)
6364
}
6465
rawConfig, err := getCniPluginConfig(netConf, netInfo, ipamOptions, ep)
6566
if err != nil {
66-
FreeDelegatedIps(danmClient, netInfo, ep.Spec.Iface.Address, ep.Spec.Iface.AddressIPv6)
6767
return nil, err
6868
}
6969
cniType := netInfo.Spec.NetworkType
7070
cniResult,err := execCniPlugin(cniType, CniAddOp, netInfo, rawConfig, ep)
7171
if err != nil {
72-
FreeDelegatedIps(danmClient, netInfo, ep.Spec.Iface.Address, ep.Spec.Iface.AddressIPv6)
7372
return nil, errors.New("Error delegating ADD to CNI plugin:" + cniType + " because:" + err.Error())
7473
}
7574
if cniResult != nil {
7675
setEpIfaceAddress(cniResult, &ep.Spec.Iface)
7776
}
78-
err = danmep.PostProcessInterface(*ep, netInfo)
79-
if err != nil {
80-
return nil, errors.New("Post-processing failed for interface:" + ep.Spec.Iface.Name + " because:" + err.Error())
81-
}
8277
return cniResult, nil
8378
}
8479

pkg/danmep/danmep.go

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,6 @@ func DetermineHostDeviceName(dnet *danmtypes.DanmNet) string {
109109
}
110110

111111
func PostProcessInterface(ep danmtypes.DanmEp, dnet *danmtypes.DanmNet) error {
112-
if ep.Spec.Iface.DeviceID == "" &&
113-
len(ep.Spec.Iface.Proutes) == 0 && len(ep.Spec.Iface.Proutes6) == 0 &&
114-
len(dnet.Spec.Options.Routes) == 0 && len(dnet.Spec.Options.Routes6) == 0 {
115-
return nil
116-
}
117112
runtime.LockOSThread()
118113
defer runtime.UnlockOSThread()
119114
origNs, err := ns.GetCurrentNS()
@@ -139,34 +134,18 @@ func PostProcessInterface(ep danmtypes.DanmEp, dnet *danmtypes.DanmNet) error {
139134
if isVfAttachedToDpdkDriver {
140135
err = createDummyInterface(ep)
141136
if err != nil {
142-
return err
137+
return errors.New("failed to create dummy kernel interface for " + ep.Spec.Iface.Name + " because:" + err.Error())
143138
}
144139
}
140+
err = setDanmEpSysctls(ep)
141+
if err != nil {
142+
return errors.New("failed to set kernel configs for interface" + ep.Spec.Iface.Name + " beause:" + err.Error())
143+
}
145144
return addIpRoutes(ep,dnet)
146145
}
147146

148-
func SetDanmEpSysctls(ep danmtypes.DanmEp) error {
149-
runtime.LockOSThread()
150-
defer runtime.UnlockOSThread()
151-
// save the current namespace
152-
origNs, err := ns.GetCurrentNS()
153-
if err != nil {
154-
return errors.New("failed to get current network namespace due to:" + err.Error())
155-
}
156-
// enter to the Pod's network namespace
157-
podNs, err := ns.GetNS(ep.Spec.Netns)
158-
if err != nil {
159-
return errors.New("failed to get Pod's network namespace due to:" + err.Error())
160-
}
161-
err = podNs.Set()
162-
if err != nil {
163-
return errors.New("failed to switch to Pod's network namespace due to:" + err.Error())
164-
}
165-
defer func() {
166-
podNs.Close()
167-
origNs.Set()
168-
}()
169-
// set sysctls
147+
func setDanmEpSysctls(ep danmtypes.DanmEp) error {
148+
var err error
170149
for _, s := range sysctls {
171150
if s.sysctlFunc(ep) {
172151
for _, ss := range s.sysctlData {
@@ -189,8 +168,7 @@ func isIPv6Needed(ep danmtypes.DanmEp) bool {
189168
}
190169

191170
func isIPv6NotNeeded(ep danmtypes.DanmEp) bool {
192-
isVfAttachedToDpdkDriver,_ := sriov_utils.HasDpdkDriver(ep.Spec.Iface.DeviceID)
193-
if !isVfAttachedToDpdkDriver && ep.Spec.Iface.AddressIPv6 == "" {
171+
if ep.Spec.Iface.AddressIPv6 == "" {
194172
return true
195173
}
196174
return false

pkg/danmep/ep.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,6 @@ func createContainerIface(ep danmtypes.DanmEp, dnet *danmtypes.DanmNet, device s
9393
log.Println("WARNING: sending gARP failed with error:" + err.Error(), ", but we will ignore that for now!")
9494
}
9595
}
96-
err = addIpRoutes(ep, dnet)
97-
if err != nil {
98-
return errors.New("IP routes could not be provisioned, because:" + err.Error())
99-
}
10096
return nil
10197
}
10298

pkg/metacni/metacni.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -369,19 +369,20 @@ func createDelegatedInterface(syncher *syncher.Syncher, danmClient danmclientset
369369
}
370370
delegatedResult,err := cnidel.DelegateInterfaceSetup(DanmConfig, danmClient, netInfo, &ep)
371371
if err != nil {
372+
cnidel.FreeDelegatedIps(danmClient, netInfo, ep.Spec.Iface.Address, ep.Spec.Iface.AddressIPv6)
372373
syncher.PushResult(netInfo.ObjectMeta.Name, errors.New("CNI delegation failed due to error:" + err.Error()), nil)
373374
return
374375
}
375-
err = danmep.PutDanmEp(danmClient, ep)
376+
err = danmep.PostProcessInterface(ep, netInfo)
376377
if err != nil {
377378
cnidel.FreeDelegatedIps(danmClient, netInfo, ep.Spec.Iface.Address, ep.Spec.Iface.AddressIPv6)
378-
syncher.PushResult(netInfo.ObjectMeta.Name, errors.New("DanmEp object could not be PUT to K8s due to error:" + err.Error()), nil)
379+
syncher.PushResult(netInfo.ObjectMeta.Name, errors.New("Post-processing failed for interface:" + ep.Spec.Iface.Name + " because:" + err.Error()), nil)
379380
return
380381
}
381-
err = danmep.SetDanmEpSysctls(ep)
382+
err = danmep.PutDanmEp(danmClient, ep)
382383
if err != nil {
383384
cnidel.FreeDelegatedIps(danmClient, netInfo, ep.Spec.Iface.Address, ep.Spec.Iface.AddressIPv6)
384-
syncher.PushResult(netInfo.ObjectMeta.Name, errors.New("Sysctls could not be set due to error:" + err.Error()), nil)
385+
syncher.PushResult(netInfo.ObjectMeta.Name, errors.New("DanmEp object could not be PUT to K8s due to error:" + err.Error()), nil)
385386
return
386387
}
387388
syncher.PushResult(netInfo.ObjectMeta.Name, nil, delegatedResult)
@@ -423,7 +424,7 @@ func createDanmInterface(syncher *syncher.Syncher, danmClient danmclientset.Inte
423424
syncher.PushResult(netInfo.ObjectMeta.Name, errors.New("IPVLAN interface could not be created due to error:" + err.Error()), nil)
424425
return
425426
}
426-
err = danmep.SetDanmEpSysctls(ep)
427+
err = danmep.PostProcessInterface(ep, netInfo)
427428
if err != nil {
428429
ipam.GarbageCollectIps(danmClient, netInfo, ip4, ip6)
429430
danmClient.DanmV1().DanmEps(ep.ObjectMeta.Namespace).Delete(ep.ObjectMeta.Name, &meta_v1.DeleteOptions{})

0 commit comments

Comments
 (0)