diff --git a/pkg/controller/webhook/validate.go b/pkg/controller/webhook/validate.go index 596c2661f..619da6669 100644 --- a/pkg/controller/webhook/validate.go +++ b/pkg/controller/webhook/validate.go @@ -17,7 +17,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook/admission" "github.com/spidernet-io/egressgateway/pkg/config" - "github.com/spidernet-io/egressgateway/pkg/constant" "github.com/spidernet-io/egressgateway/pkg/egressgateway" egressv1 "github.com/spidernet-io/egressgateway/pkg/k8s/apis/v1beta1" "github.com/spidernet-io/egressgateway/pkg/utils/ip" @@ -336,42 +335,6 @@ func checkEIPIncluded(client client.Client, ctx context.Context, ipv4, ipv6, egw return true, nil } -func countGatewayAvailableIP(egw *egressv1.EgressGateway) (int, int, error) { - // check has free egress ip - ipv4Ranges, err := ip.MergeIPRanges(constant.IPv4, egw.Spec.Ippools.IPv4) - if err != nil { - return 0, 0, err - } - ipv6Ranges, err := ip.MergeIPRanges(constant.IPv6, egw.Spec.Ippools.IPv6) - if err != nil { - return 0, 0, err - } - useIpv4s := make([]net.IP, 0) - useIpv6s := make([]net.IP, 0) - for _, node := range egw.Status.NodeList { - for _, eip := range node.Eips { - if len(eip.IPv4) != 0 { - useIpv4s = append(useIpv4s, net.ParseIP(eip.IPv4)) - } - if len(eip.IPv6) != 0 { - useIpv6s = append(useIpv6s, net.ParseIP(eip.IPv6)) - } - } - } - ipv4s, err := ip.ParseIPRanges(constant.IPv4, ipv4Ranges) - if err != nil { - return 0, 0, err - } - ipv6s, err := ip.ParseIPRanges(constant.IPv6, ipv6Ranges) - if err != nil { - return 0, 0, err - } - freeIpv4s := ip.IPsDiffSet(ipv4s, useIpv4s, false) - freeIpv6s := ip.IPsDiffSet(ipv6s, useIpv6s, false) - - return len(freeIpv4s), len(freeIpv6s), nil -} - func validateSubnet(subnet []string) webhook.AdmissionResponse { invalidList := make([]string, 0) for _, subnet := range subnet { diff --git a/pkg/controller/webhook/validate_test.go b/pkg/controller/webhook/validate_test.go index abc75e547..6d812f7dc 100644 --- a/pkg/controller/webhook/validate_test.go +++ b/pkg/controller/webhook/validate_test.go @@ -18,7 +18,6 @@ import ( "github.com/spidernet-io/egressgateway/pkg/config" "github.com/spidernet-io/egressgateway/pkg/k8s/apis/v1beta1" - egressv1 "github.com/spidernet-io/egressgateway/pkg/k8s/apis/v1beta1" "github.com/spidernet-io/egressgateway/pkg/schema" ) @@ -983,76 +982,3 @@ func TestUpdateEgressClusterPolicy(t *testing.T) { }) } } - -func TestCountAvailableIP(t *testing.T) { - tests := []struct { - name string - args *egressv1.EgressGateway - want4 int - want6 int - }{ - { - name: "case1-ipv4", - args: &egressv1.EgressGateway{ - Spec: egressv1.EgressGatewaySpec{ - Ippools: egressv1.Ippools{ - IPv4: []string{ - "10.6.1.21-10.6.1.30", - }, - IPv6: []string{}, - }, - }, - Status: v1beta1.EgressGatewayStatus{ - NodeList: []egressv1.EgressIPStatus{ - { - Name: "node1", - Eips: []egressv1.Eips{{IPv4: "10.6.1.21"}}, - }, - }, - }, - }, - want4: 9, - want6: 0, - }, - { - name: "case2-dual", - args: &egressv1.EgressGateway{ - Spec: egressv1.EgressGatewaySpec{ - Ippools: egressv1.Ippools{ - IPv4: []string{ - "10.6.1.21", - "10.6.1.22", - }, - IPv6: []string{ - "fd00::1-fd00::2", - }, - }, - }, - Status: v1beta1.EgressGatewayStatus{ - NodeList: []egressv1.EgressIPStatus{ - { - Name: "node1", - Eips: []egressv1.Eips{{IPv4: "10.6.1.21", IPv6: "fd00::1"}}, - }, - }, - }, - }, - want4: 1, - want6: 1, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got4, got6, err := countGatewayAvailableIP(tt.args) - if err != nil { - t.Fatal(err) - } - if got4 != tt.want4 { - t.Fatalf("got4 %d, want4 %d", got4, tt.want4) - } - if got6 != tt.want6 { - t.Fatalf("got6 %d, want6 %d", got6, tt.want6) - } - }) - } -} diff --git a/pkg/egressgateway/egress_gateway.go b/pkg/egressgateway/egress_gateway.go index 4e1aef2a8..a48327c7f 100644 --- a/pkg/egressgateway/egress_gateway.go +++ b/pkg/egressgateway/egress_gateway.go @@ -585,6 +585,12 @@ func (r *egnReconciler) reconcileGateway(ctx context.Context, req reconcile.Requ } } + // first create egw update usage + if (egw.Status.IPUsage.IPv4Total == 0 && len(egw.Spec.Ippools.IPv4) != 0) || + (egw.Status.IPUsage.IPv6Total == 0 || len(egw.Spec.Ippools.IPv6) != 0) { + needUpdate = true + } + if needUpdate { // update err := updateGatewayStatusWithUsage(ctx, r.client, egw) diff --git a/pkg/utils/ip/ip.go b/pkg/utils/ip/ip.go index d2f6f9f12..06e9cc644 100644 --- a/pkg/utils/ip/ip.go +++ b/pkg/utils/ip/ip.go @@ -256,7 +256,7 @@ func IPsDiffSet(ips1, ips2 []net.IP, sorted bool) []net.IP { // to [172.18.40.1-172.18.40.5]. The overlapping part of two IP ranges will // be ignored. func MergeIPRanges(version constant.IPVersion, ipRanges []string) ([]string, error) { - ips, err := ParseIPRanges(version, ipRanges) + ips, err := ConvertCidrOrIPrangeToIPs(ipRanges, version) if err != nil { return nil, err }