Files
kubevpn/pkg/webhook/dhcp.go
2023-10-02 13:44:23 +08:00

68 lines
1.9 KiB
Go

package webhook
import (
"context"
"fmt"
"net"
"net/http"
log "github.com/sirupsen/logrus"
"k8s.io/client-go/kubernetes"
"k8s.io/kubectl/pkg/cmd/util"
"github.com/wencaiwulue/kubevpn/pkg/config"
"github.com/wencaiwulue/kubevpn/pkg/handler"
)
type dhcpServer struct {
f util.Factory
clientset *kubernetes.Clientset
}
func (d *dhcpServer) rentIP(w http.ResponseWriter, r *http.Request) {
podName := r.Header.Get(config.HeaderPodName)
namespace := r.Header.Get(config.HeaderPodNamespace)
ctx := context.Background()
log.Infof("handling rent ip request, pod name: %s, ns: %s", podName, namespace)
cmi := d.clientset.CoreV1().ConfigMaps(namespace)
dhcp := handler.NewDHCPManager(cmi, namespace)
v4, v6, err := dhcp.RentIPRandom(ctx)
if err != nil {
log.Errorf("rent ip failed, err: %v", err)
w.WriteHeader(http.StatusBadRequest)
return
}
w.WriteHeader(http.StatusOK)
// todo patch annotation
_, err = w.Write([]byte(fmt.Sprintf("%s,%s", v4.String(), v6.String())))
if err != nil {
log.Errorf("write response failed, err: %v", err)
}
}
func (d *dhcpServer) releaseIP(w http.ResponseWriter, r *http.Request) {
podName := r.Header.Get(config.HeaderPodName)
namespace := r.Header.Get(config.HeaderPodNamespace)
var ips []net.IP
for _, s := range []string{r.Header.Get(config.HeaderIPv4), r.Header.Get(config.HeaderIPv6)} {
ip, _, err := net.ParseCIDR(s)
if err != nil {
log.Errorf("ip is invailed, ip: %s, err: %v", ip.String(), err)
continue
}
ips = append(ips, ip)
}
log.Infof("handling release ip request, pod name: %s, ns: %s", podName, namespace)
cmi := d.clientset.CoreV1().ConfigMaps(namespace)
dhcp := handler.NewDHCPManager(cmi, namespace)
if err := dhcp.ReleaseIP(context.Background(), ips...); err != nil {
log.Errorf("release ip failed, err: %v", err)
w.WriteHeader(http.StatusBadRequest)
return
}
w.WriteHeader(http.StatusOK)
}