Skip to content

Commit 91e7f94

Browse files
zongzwgitee-org
authored andcommitted
!8 Add flannel/calico support.
Merge pull request !8 from zongzw/zong-nets-support
2 parents 3676926 + 80a9dc3 commit 91e7f94

File tree

5 files changed

+117
-44
lines changed

5 files changed

+117
-44
lines changed

.vscode/launch.json

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,10 @@
1919
"mode": "auto",
2020
"program": "${workspaceFolder}",
2121
"args": [
22-
"--bigip-url",
23-
"https://10.250.15.180",
24-
"--bigip-username",
25-
"admin",
26-
"--bigip-password",
27-
"P@ssw0rd123"
22+
// "--bigip-url", "https://10.250.15.180",
23+
"--bigip-url", "https://10.250.18.105:8443",
24+
"--bigip-username", "admin",
25+
"--bigip-password", "P@ssw0rd123"
2826
]
2927
}
3028
]

controllers/v1_controller.go

Lines changed: 58 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@ package controllers
1818

1919
import (
2020
"context"
21-
"encoding/json"
2221
"fmt"
22+
"reflect"
2323

2424
"gitee.com/zongzw/bigip-kubernetes-gateway/k8s"
2525
"gitee.com/zongzw/bigip-kubernetes-gateway/pkg"
2626
"k8s.io/apimachinery/pkg/runtime"
2727
ctrl "sigs.k8s.io/controller-runtime"
2828
"sigs.k8s.io/controller-runtime/pkg/client"
29+
"sigs.k8s.io/controller-runtime/pkg/log"
2930

3031
v1 "k8s.io/api/core/v1"
3132

@@ -51,46 +52,78 @@ func (r *EndpointsReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
5152

5253
var obj v1.Endpoints
5354
// zlog := log.FromContext(ctx)
54-
// zlog.V(1).Info("resource event: " + req.NamespacedName.String())
55+
// // too many logs.
56+
// zlog.V(1).Info("endpoint event: " + req.NamespacedName.String())
5557
if err := r.Get(ctx, req.NamespacedName, &obj); err != nil {
5658
if client.IgnoreNotFound(err) == nil {
5759
svc := pkg.ActiveSIGs.GetService(req.NamespacedName.String())
60+
ocfgs, err := pkg.ParseRelated([]*gatewayv1beta1.Gateway{}, []*gatewayv1beta1.HTTPRoute{}, []*v1.Service{svc})
61+
if err != nil {
62+
return ctrl.Result{}, err
63+
}
5864
hrs := pkg.ActiveSIGs.HTTPRoutesRefsOf(svc)
5965
pkg.ActiveSIGs.UnsetEndpoints(req.NamespacedName.String())
60-
61-
return reapply(hrs)
66+
ncfgs, err := pkg.ParseRelated([]*gatewayv1beta1.Gateway{}, hrs, []*v1.Service{})
67+
if err != nil {
68+
return ctrl.Result{}, err
69+
}
70+
applyCfgs(ocfgs, ncfgs)
71+
return ctrl.Result{}, nil
6272
} else {
6373
return ctrl.Result{}, err
6474
}
6575
} else {
66-
cpObj := obj.DeepCopy()
67-
pkg.ActiveSIGs.SetEndpoints(cpObj)
6876
svc := pkg.ActiveSIGs.GetService(req.NamespacedName.String())
69-
hrs := pkg.ActiveSIGs.HTTPRoutesRefsOf(svc)
70-
return reapply(hrs)
77+
ocfgs, err := pkg.ParseRelated([]*gatewayv1beta1.Gateway{}, []*gatewayv1beta1.HTTPRoute{}, []*v1.Service{svc})
78+
if err != nil {
79+
return ctrl.Result{}, err
80+
}
81+
pkg.ActiveSIGs.SetEndpoints(obj.DeepCopy())
82+
ncfgs, err := pkg.ParseRelated([]*gatewayv1beta1.Gateway{}, []*gatewayv1beta1.HTTPRoute{}, []*v1.Service{svc})
83+
if err != nil {
84+
return ctrl.Result{}, err
85+
}
86+
applyCfgs(ocfgs, ncfgs)
87+
return ctrl.Result{}, nil
7188
}
7289
}
7390

7491
func (r *ServiceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
7592

7693
var obj v1.Service
77-
// zlog := log.FromContext(ctx)
78-
// zlog.V(1).Info("resource event: " + req.NamespacedName.String())
94+
zlog := log.FromContext(ctx)
95+
zlog.V(1).Info("Service event: " + req.NamespacedName.String())
7996
if err := r.Get(ctx, req.NamespacedName, &obj); err != nil {
8097
if client.IgnoreNotFound(err) == nil {
8198
svc := pkg.ActiveSIGs.GetService(req.NamespacedName.String())
99+
ocfgs, err := pkg.ParseRelated([]*gatewayv1beta1.Gateway{}, []*gatewayv1beta1.HTTPRoute{}, []*v1.Service{svc})
100+
if err != nil {
101+
return ctrl.Result{}, err
102+
}
82103
hrs := pkg.ActiveSIGs.HTTPRoutesRefsOf(svc)
83104
pkg.ActiveSIGs.UnsetService(req.NamespacedName.String())
84-
return reapply(hrs)
105+
ncfgs, err := pkg.ParseRelated([]*gatewayv1beta1.Gateway{}, hrs, []*v1.Service{})
106+
if err != nil {
107+
return ctrl.Result{}, err
108+
}
109+
applyCfgs(ocfgs, ncfgs)
110+
return ctrl.Result{}, nil
85111
} else {
86112
return ctrl.Result{}, err
87113
}
88114
} else {
89-
cpObj := obj.DeepCopy()
90-
pkg.ActiveSIGs.SetService(cpObj)
91115
svc := pkg.ActiveSIGs.GetService(req.NamespacedName.String())
92-
hrs := pkg.ActiveSIGs.HTTPRoutesRefsOf(svc)
93-
return reapply(hrs)
116+
ocfgs, err := pkg.ParseRelated([]*gatewayv1beta1.Gateway{}, []*gatewayv1beta1.HTTPRoute{}, []*v1.Service{svc})
117+
if err != nil {
118+
return ctrl.Result{}, err
119+
}
120+
pkg.ActiveSIGs.SetService(obj.DeepCopy())
121+
ncfgs, err := pkg.ParseRelated([]*gatewayv1beta1.Gateway{}, []*gatewayv1beta1.HTTPRoute{}, []*v1.Service{svc})
122+
if err != nil {
123+
return ctrl.Result{}, err
124+
}
125+
applyCfgs(ocfgs, ncfgs)
126+
return ctrl.Result{}, nil
94127
}
95128
}
96129

@@ -136,24 +169,16 @@ func SetupReconcilerForCoreV1WithManager(mgr ctrl.Manager) error {
136169
}
137170
}
138171

139-
func reapply(hrs []*gatewayv1beta1.HTTPRoute) (ctrl.Result, error) {
140-
141-
if len(hrs) == 0 {
142-
return ctrl.Result{}, nil
172+
func applyCfgs(ocfgs, ncfgs map[string]interface{}) {
173+
if reflect.DeepEqual(ocfgs, ncfgs) {
174+
return
143175
}
144-
if ncfgs, err := pkg.ParseRelated([]*gatewayv1beta1.Gateway{}, hrs, []*v1.Service{}); err != nil {
145-
return ctrl.Result{}, err
146-
} else {
147-
bcfgs, _ := json.Marshal(ncfgs)
148-
ctrl.Log.V(1).Info(fmt.Sprintf("sending deploy configs: %s", bcfgs))
149-
pkg.PendingDeploys <- pkg.DeployRequest{
150-
Meta: "upserting svc/eps related by httproutes",
151-
From: nil,
152-
To: &ncfgs,
153-
StatusFunc: func() {
154-
// do something
155-
},
156-
}
157-
return ctrl.Result{}, nil
176+
pkg.PendingDeploys <- pkg.DeployRequest{
177+
Meta: "upserting svc/eps",
178+
From: &ocfgs,
179+
To: &ncfgs,
180+
StatusFunc: func() {
181+
// do something
182+
},
158183
}
159184
}

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ module gitee.com/zongzw/bigip-kubernetes-gateway
33
go 1.19
44

55
require (
6-
gitee.com/zongzw/f5-bigip-rest v0.0.0-20221021025818-8d1eff4845a2
6+
gitee.com/zongzw/f5-bigip-rest v0.0.0-20221114103341-7b7131e0b2f0
77
github.com/onsi/ginkgo/v2 v2.3.1
88
github.com/onsi/gomega v1.22.1
99
github.com/prometheus/client_golang v1.13.0
10+
k8s.io/api v0.25.3
1011
k8s.io/apimachinery v0.25.3
1112
k8s.io/client-go v0.25.3
1213
sigs.k8s.io/controller-runtime v0.13.0
@@ -71,7 +72,6 @@ require (
7172
gopkg.in/inf.v0 v0.9.1 // indirect
7273
gopkg.in/yaml.v2 v2.4.0 // indirect
7374
gopkg.in/yaml.v3 v3.0.1 // indirect
74-
k8s.io/api v0.25.3 // indirect
7575
k8s.io/apiextensions-apiserver v0.25.0 // indirect
7676
k8s.io/component-base v0.25.0 // indirect
7777
k8s.io/klog/v2 v2.70.1 // indirect

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
4444
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
4545
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
4646
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
47-
gitee.com/zongzw/f5-bigip-rest v0.0.0-20221021025818-8d1eff4845a2 h1:NX3ZBA3+CCAGHRpD1dYPC65XKtxSns16ev6QLWe/zdM=
48-
gitee.com/zongzw/f5-bigip-rest v0.0.0-20221021025818-8d1eff4845a2/go.mod h1:jx0Y6qhir/J/75V5tCYrLlmKPaZUEfbCg8fS6Xo6Syw=
47+
gitee.com/zongzw/f5-bigip-rest v0.0.0-20221114103341-7b7131e0b2f0 h1:6Y759KuZOLy1Cld3TT9nxZ542iYTGoApqbW8v+Jr17w=
48+
gitee.com/zongzw/f5-bigip-rest v0.0.0-20221114103341-7b7131e0b2f0/go.mod h1:jx0Y6qhir/J/75V5tCYrLlmKPaZUEfbCg8fS6Xo6Syw=
4949
github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
5050
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
5151
github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A=

pkg/parser.go

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,13 @@ func parsePoolsFrom(hr *gatewayv1beta1.HTTPRoute, rlt map[string]interface{}) er
159159
} else {
160160
rlt["ltm/pool/"+name].(map[string]interface{})["monitor"] = mon
161161
}
162+
163+
if err := parseArpsFrom(ns, n, rlt); err != nil {
164+
return err
165+
}
166+
if err := parseNodesFrom(ns, n, rlt); err != nil {
167+
return err
168+
}
162169
return nil
163170
}
164171

@@ -171,7 +178,6 @@ func parsePoolsFrom(hr *gatewayv1beta1.HTTPRoute, rlt map[string]interface{}) er
171178
if err := creatPool(ns, string(br.Name), rlt); err != nil {
172179
return err
173180
}
174-
// TODO: parse ARP resources for flannel type network.
175181
}
176182
}
177183

@@ -225,6 +231,50 @@ func parseMembersFrom(svcNamespace, svcName string) ([]interface{}, error) {
225231
}
226232
}
227233

234+
func parseArpsFrom(svcNamespace, svcName string, rlt map[string]interface{}) error {
235+
svc := ActiveSIGs.GetService(utils.Keyname(svcNamespace, svcName))
236+
eps := ActiveSIGs.GetEndpoints(utils.Keyname(svcNamespace, svcName))
237+
if svc != nil && eps != nil {
238+
if mbs, err := k8s.FormatMembersFromServiceEndpoints(svc, eps); err != nil {
239+
return err
240+
} else {
241+
prefix := "k8s-"
242+
for _, mb := range mbs {
243+
if mb.MacAddr != "" {
244+
rlt["net/arp/"+prefix+mb.IpAddr] = map[string]interface{}{
245+
"name": prefix + mb.IpAddr,
246+
"ipAddress": mb.IpAddr,
247+
"macAddress": mb.MacAddr,
248+
}
249+
}
250+
}
251+
}
252+
}
253+
return nil
254+
}
255+
256+
func parseNodesFrom(svcNamespace, svcName string, rlt map[string]interface{}) error {
257+
svc := ActiveSIGs.GetService(utils.Keyname(svcNamespace, svcName))
258+
eps := ActiveSIGs.GetEndpoints(utils.Keyname(svcNamespace, svcName))
259+
if svc != nil && eps != nil {
260+
if mbs, err := k8s.FormatMembersFromServiceEndpoints(svc, eps); err != nil {
261+
return err
262+
} else {
263+
for _, mb := range mbs {
264+
if mb.MacAddr != "" {
265+
rlt["ltm/node/"+mb.IpAddr] = map[string]interface{}{
266+
"name": mb.IpAddr,
267+
"address": mb.IpAddr,
268+
"monitor": "default",
269+
"session": "user-enabled",
270+
}
271+
}
272+
}
273+
}
274+
}
275+
return nil
276+
}
277+
228278
func parseiRulesFrom(hr *gatewayv1beta1.HTTPRoute, rlt map[string]interface{}) error {
229279
// irules
230280
name := strings.Join([]string{hr.Namespace, hr.Name}, ".")

0 commit comments

Comments
 (0)