Skip to content

Commit 249890d

Browse files
AnnaYueshaofan-hs
authored andcommitted
feat: add resourcetopo package
1. support kubernetes or kubernetes likely resources topology management; 2. support add node event handler for node info changed; 3. support add relation event handler for relation existence changed;
1 parent c257ff6 commit 249890d

14 files changed

+3779
-18
lines changed

go.mod

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ module kusionstack.io/kube-utils
33
go 1.19
44

55
require (
6-
github.com/go-logr/logr v1.2.4
6+
github.com/go-logr/logr v1.4.1
7+
github.com/hashicorp/consul/sdk v0.16.0
78
github.com/onsi/ginkgo v1.16.5
8-
github.com/onsi/gomega v1.27.6
9+
github.com/onsi/gomega v1.30.0
910
github.com/prometheus/client_golang v1.16.0
1011
github.com/spf13/pflag v1.0.5
1112
github.com/stretchr/testify v1.8.4
13+
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6
1214
k8s.io/api v0.28.4
1315
k8s.io/apimachinery v0.28.4
1416
k8s.io/client-go v0.28.4
@@ -21,14 +23,14 @@ require (
2123
require (
2224
github.com/beorn7/perks v1.0.1 // indirect
2325
github.com/cespare/xxhash/v2 v2.2.0 // indirect
24-
github.com/davecgh/go-spew v1.1.1 // indirect
26+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
2527
github.com/evanphx/json-patch v4.12.0+incompatible // indirect
2628
github.com/fsnotify/fsnotify v1.6.0 // indirect
2729
github.com/go-logr/zapr v1.2.3 // indirect
2830
github.com/gogo/protobuf v1.3.2 // indirect
2931
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
3032
github.com/golang/protobuf v1.5.3 // indirect
31-
github.com/google/go-cmp v0.5.9 // indirect
33+
github.com/google/go-cmp v0.6.0 // indirect
3234
github.com/google/gofuzz v1.2.0 // indirect
3335
github.com/google/uuid v1.3.0 // indirect
3436
github.com/googleapis/gnostic v0.5.5 // indirect
@@ -39,17 +41,17 @@ require (
3941
github.com/modern-go/reflect2 v1.0.2 // indirect
4042
github.com/nxadm/tail v1.4.8 // indirect
4143
github.com/pkg/errors v0.9.1 // indirect
42-
github.com/pmezard/go-difflib v1.0.0 // indirect
44+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
4345
github.com/prometheus/client_model v0.4.0 // indirect
4446
github.com/prometheus/common v0.44.0 // indirect
4547
github.com/prometheus/procfs v0.10.1 // indirect
4648
go.uber.org/atomic v1.10.0 // indirect
4749
go.uber.org/multierr v1.11.0 // indirect
4850
go.uber.org/zap v1.24.0 // indirect
49-
golang.org/x/net v0.19.0 // indirect
51+
golang.org/x/net v0.20.0 // indirect
5052
golang.org/x/oauth2 v0.8.0 // indirect
51-
golang.org/x/sys v0.15.0 // indirect
52-
golang.org/x/term v0.15.0 // indirect
53+
golang.org/x/sys v0.16.0 // indirect
54+
golang.org/x/term v0.16.0 // indirect
5355
golang.org/x/text v0.14.0 // indirect
5456
golang.org/x/time v0.3.0 // indirect
5557
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect

go.sum

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,9 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsr
8888
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
8989
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
9090
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
91-
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
9291
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
92+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
93+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9394
github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE=
9495
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
9596
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
@@ -186,8 +187,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
186187
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
187188
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
188189
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
189-
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
190-
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
190+
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
191+
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
191192
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
192193
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
193194
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
@@ -216,6 +217,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t
216217
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
217218
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
218219
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
220+
github.com/hashicorp/consul/sdk v0.16.0 h1:SE9m0W6DEfgIVCJX7xU+iv/hUl4m/nxqMTnCdMxDpJ8=
221+
github.com/hashicorp/consul/sdk v0.16.0/go.mod h1:7pxqqhqoaPqnBnzXD1StKed62LqJeClzVsUEy85Zr0A=
219222
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
220223
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
221224
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
@@ -329,8 +332,9 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
329332
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
330333
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
331334
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
332-
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
333335
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
336+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
337+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
334338
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
335339
github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
336340
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
@@ -469,6 +473,7 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP
469473
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
470474
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
471475
golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g=
476+
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ=
472477
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE=
473478
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
474479
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@@ -529,8 +534,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
529534
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
530535
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
531536
golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ=
532-
golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
533-
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
537+
golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
538+
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
534539
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
535540
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
536541
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -603,8 +608,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
603608
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
604609
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
605610
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
606-
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
607-
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
611+
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
612+
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
608613
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
609614
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
610615
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -613,8 +618,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
613618
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
614619
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
615620
golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww=
616-
golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
617-
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
621+
golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE=
622+
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
618623
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
619624
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
620625
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=

hack/boilerplate.go.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/**
2+
* Copyright 2024 KusionStack Authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/

resourcetopo/event_queue.go

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
/**
2+
* Copyright 2024 KusionStack Authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package resourcetopo
18+
19+
import (
20+
"time"
21+
22+
"k8s.io/apimachinery/pkg/util/wait"
23+
"k8s.io/klog/v2"
24+
)
25+
26+
type eventType string
27+
28+
const (
29+
EventTypeAdd eventType = "add"
30+
EventTypeUpdate eventType = "update"
31+
EventTypeDelete eventType = "delete"
32+
EventTypeRelatedUpdate eventType = "relatedUpdate"
33+
)
34+
35+
const (
36+
defaultNodeEventQueueSize = 1000
37+
defaultRelationEventQueueSize = 1000
38+
defaultNodeEventHandlePeriod = time.Second
39+
defaultRelationEventHandlePeriod = time.Second
40+
)
41+
42+
type nodeEvent struct {
43+
eventType eventType
44+
node *nodeInfo
45+
}
46+
47+
type relationEvent struct {
48+
eventType eventType
49+
preNode *nodeInfo
50+
postNode *nodeInfo
51+
}
52+
53+
func (m *manager) startHandleEvent(stopCh <-chan struct{}) {
54+
go wait.Until(m.handleNodeEvent, defaultNodeEventHandlePeriod, stopCh)
55+
go wait.Until(m.handleRelationEvent, defaultRelationEventHandlePeriod, stopCh)
56+
}
57+
58+
func (m *manager) handleNodeEvent() {
59+
for {
60+
select {
61+
case e := <-m.nodeEventQueue:
62+
storage := e.node.storageRef
63+
if storage == nil {
64+
klog.Errorf("Unexpected nil nodeStorage for nodeEvent node %v", e.node)
65+
continue
66+
}
67+
68+
switch e.eventType {
69+
case EventTypeAdd:
70+
for _, h := range storage.nodeUpdateHandler {
71+
h.OnAdd(e.node)
72+
}
73+
case EventTypeUpdate:
74+
for _, h := range storage.nodeUpdateHandler {
75+
h.OnUpdate(e.node)
76+
}
77+
case EventTypeDelete:
78+
for _, h := range storage.nodeUpdateHandler {
79+
h.OnDelete(e.node)
80+
}
81+
case EventTypeRelatedUpdate:
82+
for _, h := range storage.nodeUpdateHandler {
83+
h.OnRelatedUpdate(e.node)
84+
}
85+
}
86+
default:
87+
break
88+
}
89+
}
90+
}
91+
92+
func (m *manager) handleRelationEvent() {
93+
for {
94+
select {
95+
case e := <-m.relationEventQueue:
96+
storage := e.preNode.storageRef
97+
if storage == nil {
98+
klog.Errorf("Unexpected nil nodeStorage for relaltion event preNode node %v", e.preNode)
99+
continue
100+
}
101+
handlers := storage.relationUpdateHandler[e.postNode.storageRef.metaKey]
102+
if handlers == nil {
103+
continue
104+
}
105+
106+
switch e.eventType {
107+
case EventTypeAdd:
108+
for _, handler := range handlers {
109+
handler.OnAdd(e.preNode, e.postNode)
110+
}
111+
case EventTypeDelete:
112+
for _, handler := range handlers {
113+
handler.OnDelete(e.preNode, e.postNode)
114+
}
115+
}
116+
default:
117+
break
118+
}
119+
}
120+
}
121+
122+
func (m *manager) newNodeEvent(info *nodeInfo, eType eventType) {
123+
m.nodeEventQueue <- nodeEvent{
124+
eventType: eType,
125+
node: info,
126+
}
127+
}
128+
129+
func (m *manager) newRelationEvent(preNode, postNode *nodeInfo, eType eventType) {
130+
m.relationEventQueue <- relationEvent{
131+
eventType: eType,
132+
preNode: preNode,
133+
postNode: postNode,
134+
}
135+
}

0 commit comments

Comments
 (0)