Skip to content

Commit dbe0dae

Browse files
committed
Remove IPAM clientset references from ipam and oob plugins
1 parent 649982e commit dbe0dae

File tree

4 files changed

+116
-230
lines changed

4 files changed

+116
-230
lines changed

plugins/ipam/k8s.go

Lines changed: 20 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ import (
1212
"os"
1313
"reflect"
1414
"strings"
15+
"time"
16+
17+
"k8s.io/apimachinery/pkg/util/wait"
1518

1619
"github.com/ironcore-dev/fedhcp/internal/kubernetes"
1720
ipamv1alpha1 "github.com/ironcore-dev/ipam/api/ipam/v1alpha1"
18-
ipam "github.com/ironcore-dev/ipam/clientgo/ipam"
19-
"github.com/pkg/errors"
2021
corev1 "k8s.io/api/core/v1"
2122
apierrors "k8s.io/apimachinery/pkg/api/errors"
2223
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
23-
"k8s.io/apimachinery/pkg/watch"
2424
"k8s.io/client-go/kubernetes/scheme"
2525
corev1client "k8s.io/client-go/kubernetes/typed/core/v1"
2626
"k8s.io/client-go/tools/record"
@@ -33,22 +33,15 @@ const (
3333

3434
type K8sClient struct {
3535
Client client.Client
36-
Clientset ipam.Clientset
3736
Namespace string
3837
SubnetNames []string
39-
Ctx context.Context
4038
EventRecorder record.EventRecorder
4139
}
4240

4341
func NewK8sClient(namespace string, subnetNames []string) (*K8sClient, error) {
4442
cfg := kubernetes.GetConfig()
4543
cl := kubernetes.GetClient()
4644

47-
clientset, err := ipam.NewForConfig(cfg)
48-
if err != nil {
49-
return nil, fmt.Errorf("failed to create IPAM clientset: %w", err)
50-
}
51-
5245
corev1Client, err := corev1client.NewForConfig(cfg)
5346
if err != nil {
5447
return nil, fmt.Errorf("failed to create core client: %w", err)
@@ -66,20 +59,18 @@ func NewK8sClient(namespace string, subnetNames []string) (*K8sClient, error) {
6659

6760
k8sClient := K8sClient{
6861
Client: cl,
69-
Clientset: *clientset,
7062
Namespace: namespace,
7163
SubnetNames: subnetNames,
72-
Ctx: context.Background(),
7364
EventRecorder: recorder,
7465
}
7566
return &k8sClient, nil
7667
}
7768

78-
func (k K8sClient) createIpamIP(ipaddr net.IP, mac net.HardwareAddr) error {
69+
func (k K8sClient) createIpamIP(ctx context.Context, ipaddr net.IP, mac net.HardwareAddr) error {
7970
// select the subnet matching the CIDR of the request
8071
subnetMatch := false
8172
for _, subnetName := range k.SubnetNames {
82-
subnet, err := k.getMatchingSubnet(subnetName, ipaddr)
73+
subnet, err := k.getMatchingSubnet(ctx, subnetName, ipaddr)
8374
if err != nil {
8475
return err
8576
}
@@ -90,12 +81,12 @@ func (k K8sClient) createIpamIP(ipaddr net.IP, mac net.HardwareAddr) error {
9081
subnetMatch = true
9182

9283
var ipamIP *ipamv1alpha1.IP
93-
ipamIP, err = k.prepareCreateIpamIP(subnetName, ipaddr, mac)
84+
ipamIP, err = k.prepareCreateIpamIP(ctx, subnetName, ipaddr, mac)
9485
if err != nil {
9586
return err
9687
}
9788
if ipamIP != nil {
98-
err = k.doCreateIpamIP(ipamIP)
89+
err = k.doCreateIpamIP(ctx, ipamIP)
9990
if err != nil {
10091
return err
10192
}
@@ -111,15 +102,15 @@ func (k K8sClient) createIpamIP(ipaddr net.IP, mac net.HardwareAddr) error {
111102
return nil
112103
}
113104

114-
func (k K8sClient) getMatchingSubnet(subnetName string, ipaddr net.IP) (*ipamv1alpha1.Subnet, error) {
105+
func (k K8sClient) getMatchingSubnet(ctx context.Context, subnetName string, ipaddr net.IP) (*ipamv1alpha1.Subnet, error) {
115106
subnet := &ipamv1alpha1.Subnet{
116107
ObjectMeta: metav1.ObjectMeta{
117108
Name: subnetName,
118109
Namespace: k.Namespace,
119110
},
120111
}
121112
existingSubnet := subnet.DeepCopy()
122-
err := k.Client.Get(k.Ctx, client.ObjectKeyFromObject(subnet), existingSubnet)
113+
err := k.Client.Get(ctx, client.ObjectKeyFromObject(subnet), existingSubnet)
123114
if err != nil && !apierrors.IsNotFound(err) {
124115
return nil, fmt.Errorf("failed to get subnet %s/%s: %w", k.Namespace, subnetName, err)
125116
}
@@ -135,10 +126,7 @@ func (k K8sClient) getMatchingSubnet(subnetName string, ipaddr net.IP) (*ipamv1a
135126
return subnet, nil
136127
}
137128

138-
func (k K8sClient) prepareCreateIpamIP(
139-
subnetName string,
140-
ipaddr net.IP,
141-
mac net.HardwareAddr) (*ipamv1alpha1.IP, error) {
129+
func (k K8sClient) prepareCreateIpamIP(ctx context.Context, subnetName string, ipaddr net.IP, mac net.HardwareAddr) (*ipamv1alpha1.IP, error) {
142130
ip, err := ipamv1alpha1.IPAddrFromString(ipaddr.String())
143131
if err != nil {
144132
return nil, fmt.Errorf("failed to parse IP %s: %w", ipaddr, err)
@@ -169,7 +157,7 @@ func (k K8sClient) prepareCreateIpamIP(
169157
}
170158

171159
existingIpamIP := ipamIP.DeepCopy()
172-
err = k.Client.Get(k.Ctx, client.ObjectKeyFromObject(ipamIP), existingIpamIP)
160+
err = k.Client.Get(ctx, client.ObjectKeyFromObject(ipamIP), existingIpamIP)
173161
if err != nil && !apierrors.IsNotFound(err) {
174162
return nil, fmt.Errorf("failed to get IP %s/%s: %w", existingIpamIP.Namespace, existingIpamIP.Name, err)
175163
}
@@ -183,14 +171,18 @@ func (k K8sClient) prepareCreateIpamIP(
183171
prettyFormat(ipamIP.Spec))
184172
log.Infof("Deleting old IP %s/%s", existingIpamIP.Namespace, existingIpamIP.Name)
185173
// delete old IP object
186-
err = k.Client.Delete(k.Ctx, existingIpamIP)
174+
err = k.Client.Delete(ctx, existingIpamIP)
187175
if err != nil {
188176
return nil, fmt.Errorf("failed to delete IP %s/%s: %w", existingIpamIP.Namespace,
189177
existingIpamIP.Name, err)
190178
}
191179

192-
err = k.waitForDeletion(existingIpamIP)
193-
if err != nil {
180+
if err := wait.PollUntilContextTimeout(ctx, 1*time.Second, 30*time.Second, true, func(ctx context.Context) (bool, error) {
181+
if err := k.Client.Get(ctx, client.ObjectKeyFromObject(existingIpamIP), existingIpamIP); !apierrors.IsNotFound(err) {
182+
return false, err
183+
}
184+
return true, nil
185+
}); err != nil {
194186
return nil, fmt.Errorf("failed to delete IP %s/%s: %w", existingIpamIP.Namespace,
195187
existingIpamIP.Name, err)
196188
}
@@ -208,37 +200,8 @@ func (k K8sClient) prepareCreateIpamIP(
208200
return ipamIP, nil
209201
}
210202

211-
func (k K8sClient) waitForDeletion(ipamIP *ipamv1alpha1.IP) error {
212-
// Define the namespace and resource name (if you want to watch a specific resource)
213-
namespace := ipamIP.Namespace
214-
resourceName := ipamIP.Name
215-
fieldSelector := "metadata.name=" + resourceName + ",metadata.namespace=" + namespace
216-
timeout := int64(5)
217-
218-
// watch for deletion finished event
219-
watcher, err := k.Clientset.IpamV1alpha1().IPs(namespace).Watch(context.TODO(), metav1.ListOptions{
220-
FieldSelector: fieldSelector,
221-
TimeoutSeconds: &timeout,
222-
})
223-
if err != nil {
224-
log.Errorf("Error watching for IP: %v", err)
225-
}
226-
227-
log.Debugf("Watching for changes to IP %s/%s...", namespace, resourceName)
228-
229-
for event := range watcher.ResultChan() {
230-
log.Debugf("Type: %s, Object: %v\n", event.Type, event.Object)
231-
foundIpamIP := event.Object.(*ipamv1alpha1.IP)
232-
if event.Type == watch.Deleted && reflect.DeepEqual(ipamIP.Spec, foundIpamIP.Spec) {
233-
log.Infof("IP %s/%s deleted", foundIpamIP.Namespace, foundIpamIP.Name)
234-
return nil
235-
}
236-
}
237-
return errors.New("timeout reached, IP not deleted")
238-
}
239-
240-
func (k K8sClient) doCreateIpamIP(ipamIP *ipamv1alpha1.IP) error {
241-
err := k.Client.Create(k.Ctx, ipamIP)
203+
func (k K8sClient) doCreateIpamIP(ctx context.Context, ipamIP *ipamv1alpha1.IP) error {
204+
err := k.Client.Create(ctx, ipamIP)
242205
if err != nil && !apierrors.IsAlreadyExists(err) {
243206
return fmt.Errorf("failed to create IP %s/%s: %w", ipamIP.Namespace, ipamIP.Name, err)
244207
}

plugins/ipam/plugin.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package ipam
55

66
import (
7+
"context"
78
"fmt"
89

910
"github.com/coredhcp/coredhcp/handler"
@@ -94,8 +95,10 @@ func handler6(req, resp dhcpv6.DHCPv6) (dhcpv6.DHCPv6, bool) {
9495
copy(ipaddr, relayMsg.LinkAddr)
9596
ipaddr[len(ipaddr)-1] += 1
9697

98+
ctx, cancel := context.WithCancel(context.Background())
99+
defer cancel()
97100
log.Infof("Generated IP address %s for mac %s", ipaddr.String(), mac.String())
98-
err = k8sClient.createIpamIP(ipaddr, mac)
101+
err = k8sClient.createIpamIP(ctx, ipaddr, mac)
99102
if err != nil {
100103
log.Errorf("Could not create IPAM IP: %s", err)
101104
return nil, true

0 commit comments

Comments
 (0)