Skip to content

Commit 7804b09

Browse files
Modify daemon and config to only manage listed resource names
1 parent 6d5ad59 commit 7804b09

File tree

3 files changed

+44
-9
lines changed

3 files changed

+44
-9
lines changed

deployment/ib-kubernetes-configmap.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ data:
1111
# DEFAULT_LIMITED_PARTITION: "0x0001" # optional
1212
ENABLE_IP_OVER_IB: "false" # default false
1313
ENABLE_INDEX0_FOR_PRIMARY_PKEY: "true" # default true
14+
MANAGED_RESOURCE_NAMES: "" # required to be non-empty

pkg/config/config.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package config
22

33
import (
44
"fmt"
5+
"strings"
56

67
"github.com/caarlos0/env/v11"
78
"github.com/rs/zerolog/log"
@@ -21,6 +22,9 @@ type DaemonConfig struct {
2122
EnableIPOverIB bool `env:"ENABLE_IP_OVER_IB" envDefault:"false"`
2223
// Enable index0 for primary pkey GUID additions
2324
EnableIndex0ForPrimaryPkey bool `env:"ENABLE_INDEX0_FOR_PRIMARY_PKEY" envDefault:"true"`
25+
// Managed resource names
26+
ManagedResourcesString string `env:"MANAGED_RESOURCE_NAMES"`
27+
ManagedResources map[string]bool
2428
}
2529

2630
type GUIDPoolConfig struct {
@@ -55,6 +59,17 @@ func (dc *DaemonConfig) ReadConfig() error {
5559
log.Info().Msg("Default limited partition is not set.")
5660
}
5761

62+
// If managed resource names is set - log at startup
63+
log.Info().Msgf("ib-kubernetes will manage the following resources: %s.", dc.ManagedResourcesString)
64+
// Parse the managed resource names string into a set
65+
dc.ManagedResources = make(map[string]bool)
66+
for _, resource := range strings.Split(dc.ManagedResourcesString, ",") {
67+
if resource == "" {
68+
continue
69+
}
70+
dc.ManagedResources[resource] = true // TODO(Nik) either bool or empty interface{}
71+
}
72+
5873
return err
5974
}
6075

@@ -67,5 +82,14 @@ func (dc *DaemonConfig) ValidateConfig() error {
6782
if dc.Plugin == "" {
6883
return fmt.Errorf("no plugin selected")
6984
}
85+
86+
if len(dc.ManagedResources) == 0 {
87+
return fmt.Errorf("no managed resources names were provided")
88+
}
7089
return nil
7190
}
91+
92+
func (dc *DaemonConfig) IsManagedResource(resourceName string) bool {
93+
_, ok := dc.ManagedResources[resourceName]
94+
return ok
95+
}

pkg/daemon/daemon.go

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,9 @@ func NewDaemon() (Daemon, error) {
112112

113113
// Pass configuration from daemon to the plugin
114114
pluginConfig := map[string]interface{}{
115-
"ENABLE_IP_OVER_IB": daemonConfig.EnableIPOverIB,
116-
"DEFAULT_LIMITED_PARTITION": daemonConfig.DefaultLimitedPartition,
117-
"ENABLE_INDEX0_FOR_PRIMARY_PKEY": daemonConfig.EnableIndex0ForPrimaryPkey,
115+
"ENABLE_IP_OVER_IB": daemonConfig.EnableIPOverIB,
116+
"DEFAULT_LIMITED_PARTITION": daemonConfig.DefaultLimitedPartition,
117+
"ENABLE_INDEX0_FOR_PRIMARY_PKEY": daemonConfig.EnableIndex0ForPrimaryPkey,
118118
}
119119
if err := smClient.SetConfig(pluginConfig); err != nil {
120120
log.Warn().Msgf("Failed to set configuration on subnet manager plugin: %v", err)
@@ -206,6 +206,14 @@ func (d *daemon) getIbSriovNetwork(networkID string) (string, *utils.IbSriovCniS
206206
}
207207
log.Debug().Msgf("networkName attachment %v", netAttInfo)
208208

209+
// Check if this network's resource is managed by this daemon
210+
resourceName := netAttInfo.Annotations["k8s.v1.cni.cncf.io/resourceName"]
211+
if resourceName == "" || !d.config.IsManagedResource(resourceName) {
212+
// TODO(Nik) dev qol, check if someone else manages this resource or if it is orphan
213+
// checkResourceOwner(networkNamespace, networkName)
214+
return "", nil, fmt.Errorf("network %s uses resource %s which is not managed by this daemon", networkName, resourceName)
215+
}
216+
209217
networkSpec := make(map[string]interface{})
210218
err = json.Unmarshal([]byte(netAttInfo.Spec.Config), &networkSpec)
211219
if err != nil {
@@ -245,9 +253,10 @@ func getPodNetworkInfo(netName string, pod *kapi.Pod, netMap networksMap) (*podN
245253
}
246254

247255
// addPodFinalizer adds the GUID cleanup finalizer to a pod
248-
func (d *daemon) addPodFinalizer(pod *kapi.Pod) error {
256+
func (d *daemon) addPodFinalizer(pod *kapi.Pod, networkName string) error {
249257
return wait.ExponentialBackoff(backoffValues, func() (bool, error) {
250-
if err := d.kubeClient.AddFinalizerToPod(pod, PodGUIDFinalizer); err != nil {
258+
podFinalizer := fmt.Sprintf("%s-%s", PodGUIDFinalizer, networkName)
259+
if err := d.kubeClient.AddFinalizerToPod(pod, podFinalizer); err != nil {
251260
log.Warn().Msgf("failed to add finalizer to pod %s/%s: %v",
252261
pod.Namespace, pod.Name, err)
253262
return false, nil
@@ -257,9 +266,10 @@ func (d *daemon) addPodFinalizer(pod *kapi.Pod) error {
257266
}
258267

259268
// removePodFinalizer removes the GUID cleanup finalizer from a pod
260-
func (d *daemon) removePodFinalizer(pod *kapi.Pod) error {
269+
func (d *daemon) removePodFinalizer(pod *kapi.Pod, networkName string) error {
261270
return wait.ExponentialBackoff(backoffValues, func() (bool, error) {
262-
if err := d.kubeClient.RemoveFinalizerFromPod(pod, PodGUIDFinalizer); err != nil {
271+
podFinalizer := fmt.Sprintf("%s-%s", PodGUIDFinalizer, networkName)
272+
if err := d.kubeClient.RemoveFinalizerFromPod(pod, podFinalizer); err != nil {
263273
log.Warn().Msgf("failed to remove finalizer from pod %s/%s: %v",
264274
pod.Namespace, pod.Name, err)
265275
return false, nil
@@ -557,7 +567,7 @@ func (d *daemon) AddPeriodicUpdate() {
557567
}
558568

559569
// Add finalizer to pod since it now has a GUID that needs cleanup
560-
if err = d.addPodFinalizer(pi.pod); err != nil {
570+
if err = d.addPodFinalizer(pi.pod, networkName); err != nil {
561571
log.Error().Msgf("failed to add finalizer to pod %s/%s: %v", pi.pod.Namespace, pi.pod.Name, err)
562572
continue
563573
} else {
@@ -728,7 +738,7 @@ func (d *daemon) DeletePeriodicUpdate() {
728738

729739
// Remove finalizer from pod after successfully cleaning up GUID
730740
if pod, exists := podGUIDMap[guidAddr.String()]; exists {
731-
if err = d.removePodFinalizer(pod); err != nil {
741+
if err = d.removePodFinalizer(pod, networkName); err != nil {
732742
log.Error().Msgf("failed to remove finalizer from pod %s/%s: %v", pod.Namespace, pod.Name, err)
733743
} else {
734744
log.Info().Msgf("removed finalizer %s from pod %s/%s",

0 commit comments

Comments
 (0)