Skip to content

Commit a25544c

Browse files
committed
feat: add available adaptive policy
1 parent ccb9747 commit a25544c

5 files changed

Lines changed: 213 additions & 47 deletions

File tree

go.mod

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,25 @@ go 1.19
44

55
require (
66
github.com/evanphx/json-patch v5.7.0+incompatible
7-
github.com/go-logr/logr v1.4.1
7+
github.com/go-logr/logr v1.4.2
88
github.com/google/uuid v1.4.0
99
github.com/onsi/ginkgo v1.16.5
1010
github.com/onsi/gomega v1.30.0
1111
github.com/pkg/errors v0.9.1
1212
github.com/prometheus/client_golang v1.17.0
1313
github.com/spf13/pflag v1.0.5
14-
github.com/stretchr/testify v1.8.4
15-
golang.org/x/net v0.25.0
16-
k8s.io/api v0.28.4
17-
k8s.io/apimachinery v0.28.4
14+
github.com/stretchr/testify v1.10.0
15+
golang.org/x/net v0.28.0
16+
k8s.io/api v0.33.2
17+
k8s.io/apimachinery v0.33.2
1818
k8s.io/client-go v0.28.4
1919
k8s.io/component-base v0.28.4
2020
k8s.io/component-helpers v0.22.6
2121
k8s.io/klog v1.0.0
22-
k8s.io/klog/v2 v2.100.1
22+
k8s.io/klog/v2 v2.130.1
2323
k8s.io/kubernetes v0.0.0-00010101000000-000000000000
24-
k8s.io/utils v0.0.0-20240102154912-e7106e64919e
25-
kusionstack.io/kube-api v0.6.6
24+
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738
25+
kusionstack.io/kube-api v0.7.4-0.20250728111735-11fa6b63ac0e
2626
kusionstack.io/kube-utils v0.1.19-0.20250206032419-01aec11b2bfa
2727
kusionstack.io/resourceconsist v0.0.1
2828
sigs.k8s.io/controller-runtime v0.17.3
@@ -81,11 +81,11 @@ require (
8181
github.com/tjfoc/gmsm v1.3.2 // indirect
8282
go.uber.org/multierr v1.11.0 // indirect
8383
go.uber.org/zap v1.26.0 // indirect
84-
golang.org/x/crypto v0.23.0 // indirect
84+
golang.org/x/crypto v0.26.0 // indirect
8585
golang.org/x/oauth2 v0.15.0 // indirect
86-
golang.org/x/sys v0.20.0 // indirect
87-
golang.org/x/term v0.20.0 // indirect
88-
golang.org/x/text v0.16.0 // indirect
86+
golang.org/x/sys v0.23.0 // indirect
87+
golang.org/x/term v0.23.0 // indirect
88+
golang.org/x/text v0.17.0 // indirect
8989
golang.org/x/time v0.5.0 // indirect
9090
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
9191
google.golang.org/appengine v1.6.8 // indirect
@@ -99,7 +99,7 @@ require (
9999
k8s.io/apiserver v0.22.6 // indirect
100100
k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect
101101
k8s.io/kubectl v0.29.0
102-
sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect
102+
sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect
103103
sigs.k8s.io/yaml v1.4.0 // indirect
104104
)
105105

go.sum

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,7 @@ github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzG
543543
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
544544
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
545545
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
546-
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
546+
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
547547
github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto=
548548
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
549549
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
@@ -585,15 +585,15 @@ github.com/storageos/go-api v2.2.0+incompatible/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwb
585585
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
586586
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
587587
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
588-
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
588+
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
589589
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
590590
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
591591
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
592592
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
593593
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
594594
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
595-
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
596-
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
595+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
596+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
597597
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
598598
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
599599
github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM=
@@ -673,8 +673,8 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh
673673
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
674674
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
675675
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
676-
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
677-
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
676+
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
677+
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
678678
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
679679
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
680680
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -766,8 +766,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
766766
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
767767
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
768768
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
769-
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
770-
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
769+
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
770+
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
771771
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
772772
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
773773
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -857,17 +857,17 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
857857
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
858858
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
859859
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
860-
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
861-
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
860+
golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
861+
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
862862
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
863863
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
864864
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
865865
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
866866
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
867867
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
868868
golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
869-
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
870-
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
869+
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
870+
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
871871
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
872872
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
873873
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -881,8 +881,8 @@ golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
881881
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
882882
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
883883
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
884-
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
885-
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
884+
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
885+
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
886886
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
887887
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
888888
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1144,10 +1144,10 @@ k8s.io/sample-apiserver v0.22.6/go.mod h1:wiamO3alvd/dicaP8PvTPCdqq31QKDbRxm1uqO
11441144
k8s.io/system-validators v1.5.0/go.mod h1:bPldcLgkIUK22ALflnsXk8pvkTEndYdNuaHH6gRrl0Q=
11451145
k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
11461146
k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
1147-
k8s.io/utils v0.0.0-20240102154912-e7106e64919e h1:eQ/4ljkx21sObifjzXwlPKpdGLrCfRziVtos3ofG/sQ=
1148-
k8s.io/utils v0.0.0-20240102154912-e7106e64919e/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
1149-
kusionstack.io/kube-api v0.6.6 h1:gMLUQL/eectQxkosnlv1m/R2xieY2crETliWRcxBICg=
1150-
kusionstack.io/kube-api v0.6.6/go.mod h1:J0+EHiroG/88X904Y9TV9iMRcoEuD5tXMTLMBDSwM+Y=
1147+
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
1148+
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
1149+
kusionstack.io/kube-api v0.7.4-0.20250728111735-11fa6b63ac0e h1:4+G3cHiUfDMh45xWGmZA+36UIZ8eBTSov4wxr3/gekE=
1150+
kusionstack.io/kube-api v0.7.4-0.20250728111735-11fa6b63ac0e/go.mod h1:e1jtrQH2LK5fD2nTyfIXG6nYrYbU8VXShRxTRwVPaLk=
11511151
kusionstack.io/kube-utils v0.1.19-0.20250206032419-01aec11b2bfa h1:2yZnTzVtgevpNixyE/oF29KIZ5LKiy9y1H8lxL+3BxU=
11521152
kusionstack.io/kube-utils v0.1.19-0.20250206032419-01aec11b2bfa/go.mod h1:dm0cZBYBOiz+7GsHYP6AH7PDoSqoplTEes7RlxEJMHo=
11531153
kusionstack.io/resourceconsist v0.0.1 h1:+k/jriq5Ld7fQUYfWSMGynz/FesHtl3Rk2fmQPjBe0g=
@@ -1168,10 +1168,12 @@ sigs.k8s.io/kustomize/api v0.8.11/go.mod h1:a77Ls36JdfCWojpUqR6m60pdGY1AYFix4AH8
11681168
sigs.k8s.io/kustomize/cmd/config v0.9.13/go.mod h1:7547FLF8W/lTaDf0BDqFTbZxM9zqwEJqCKN9sSR0xSs=
11691169
sigs.k8s.io/kustomize/kustomize/v4 v4.2.0/go.mod h1:MOkR6fmhwG7hEDRXBYELTi5GSFcLwfqwzTRHW3kv5go=
11701170
sigs.k8s.io/kustomize/kyaml v0.11.0/go.mod h1:GNMwjim4Ypgp/MueD3zXHLRJEjz7RvtPae0AwlvEMFM=
1171+
sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016 h1:kXv6kKdoEtedwuqMmkqhbkgvYKeycVbC8+iPCP9j5kQ=
1172+
sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
11711173
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
11721174
sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
1173-
sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk=
1174-
sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
1175+
sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI=
1176+
sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
11751177
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
11761178
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
11771179
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=

pkg/controllers/podtransitionrule/processor/rules/available.go

Lines changed: 77 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ package rules
1919
import (
2020
"context"
2121
"fmt"
22+
"math"
23+
"strconv"
2224
"time"
2325

2426
appsv1 "k8s.io/api/apps/v1"
@@ -30,17 +32,19 @@ import (
3032
"sigs.k8s.io/controller-runtime/pkg/client"
3133

3234
appsv1alpha1 "kusionstack.io/kube-api/apps/v1alpha1"
35+
3336
"kusionstack.io/kuperator/pkg/controllers/podtransitionrule/register"
3437
"kusionstack.io/kuperator/pkg/controllers/podtransitionrule/utils"
3538
)
3639

3740
type AvailableRuler struct {
38-
Name string
39-
40-
MinAvailableValue *intstr.IntOrString
41-
MaxUnavailableValue *intstr.IntOrString
42-
41+
Name string
4342
Client client.Client
43+
44+
MinAvailableValue *intstr.IntOrString
45+
MaxUnavailableValue *intstr.IntOrString
46+
MinAvailablePolicy *appsv1alpha1.AdaptivePolicy
47+
MaxUnavailablePolicy *appsv1alpha1.AdaptivePolicy
4448
}
4549

4650
// Filter unavailable pods and try approve available pods as much as possible
@@ -51,25 +55,47 @@ func (r *AvailableRuler) Filter(podTransitionRule *appsv1alpha1.PodTransitionRul
5155
for _, t := range targets {
5256
effectiveTargets.Insert(t.Name)
5357
}
54-
maxUnavailableQuota := len(effectiveTargets)
58+
totalCnt := len(effectiveTargets)
59+
maxUnavailableQuota := totalCnt
5560
allowUnavailable := maxUnavailableQuota
5661
minAvailableQuota := 0
5762
if r.MaxUnavailableValue != nil {
58-
quota, err := intstr.GetScaledValueFromIntOrPercent(r.MaxUnavailableValue, len(effectiveTargets), true)
63+
quota, err := intstr.GetScaledValueFromIntOrPercent(r.MaxUnavailableValue, totalCnt, true)
5964
if err != nil {
6065
return rejectAllWithErr(subjects, pass, rejects, "[%s] fail to get int value from raw max unavailable value(%s), error: %v", r.Name, r.MaxUnavailableValue.String(), err)
6166
}
6267
maxUnavailableQuota = quota
6368
allowUnavailable = quota
6469
}
6570

71+
if r.MaxUnavailablePolicy != nil {
72+
quota, coeff, pow, err := getValueFromExponentiation(r.MaxUnavailablePolicy.ExpFunc, totalCnt, true)
73+
if err != nil {
74+
return rejectAllWithErr(subjects, pass, rejects, "[%s] fail to get max unavailable value with ExpFunc(coeff: %f, pow: %f, total: %d), error: %s", r.Name, coeff, pow, totalCnt, err)
75+
}
76+
if quota < maxUnavailableQuota {
77+
maxUnavailableQuota = quota
78+
allowUnavailable = quota
79+
}
80+
}
81+
6682
if r.MinAvailableValue != nil {
67-
quota, err := intstr.GetScaledValueFromIntOrPercent(r.MinAvailableValue, len(effectiveTargets), false)
83+
quota, err := intstr.GetScaledValueFromIntOrPercent(r.MinAvailableValue, totalCnt, false)
6884
if err != nil {
6985
return rejectAllWithErr(subjects, pass, rejects, "[%s] fail to get int value from raw min available value(%s), error: %v", r.Name, r.MaxUnavailableValue.String(), err)
7086
}
7187
minAvailableQuota = quota
7288
}
89+
90+
if r.MinAvailablePolicy != nil {
91+
quota, coeff, pow, err := getValueFromExponentiation(r.MinAvailablePolicy.ExpFunc, totalCnt, false)
92+
if err != nil {
93+
return rejectAllWithErr(subjects, pass, rejects, "[%s] fail to get min unavailable value with ExpFunc(coeff: %f, pow: %f, total: %d), error: %s", r.Name, coeff, pow, totalCnt, err)
94+
}
95+
if quota > minAvailableQuota {
96+
minAvailableQuota = quota
97+
}
98+
}
7399
// TODO: UncreatedReplicas
74100
// allowUnavailable -= uncreatedReplicas
75101
allAvailableSize := 0
@@ -121,10 +147,10 @@ func (r *AvailableRuler) Filter(podTransitionRule *appsv1alpha1.PodTransitionRul
121147
}
122148

123149
for podName := range keepMinAvailablePods {
124-
rejects[podName] = fmt.Sprintf("blocked by min available policy: [min available]=%d/%d, [current keep available]=%d/%d", minAvailableQuota, len(effectiveTargets), allAvailableSize, len(effectiveTargets))
150+
rejects[podName] = fmt.Sprintf("blocked by min available policy: [min available]=%d/%d, [current keep available]=%d/%d", minAvailableQuota, totalCnt, allAvailableSize, totalCnt)
125151
}
126152
for podName := range rejectByMaxUnavailablePods {
127-
rejects[podName] = fmt.Sprintf("[%s] blocked by max unavailable policy: [max unavailable]=%d/%d, [current unavailable]=%d/%d", r.Name, maxUnavailableQuota, len(effectiveTargets), len(effectiveTargets)-allAvailableSize, len(effectiveTargets))
153+
rejects[podName] = fmt.Sprintf("[%s] blocked by max unavailable policy: [max unavailable]=%d/%d, [current unavailable]=%d/%d", r.Name, maxUnavailableQuota, totalCnt, totalCnt-allAvailableSize, totalCnt)
128154
}
129155

130156
if minTimeLeft != nil {
@@ -168,6 +194,47 @@ func processUnavailableFunc(pod *corev1.Pod) (bool, *int64) {
168194
return isUnavailable, minInterval
169195
}
170196

197+
func getValueFromExponentiation(exp *appsv1alpha1.ExpFunc, total int, roundUp bool) (int, float64, float64, error) {
198+
pow := 0.7
199+
coeff := 1.0
200+
var err error
201+
202+
if exp.Pow != nil {
203+
pow, err = strconv.ParseFloat(*exp.Pow, 64)
204+
if err != nil {
205+
return 0, 0, 0, err
206+
}
207+
}
208+
209+
if exp.Coeff != nil {
210+
coeff, err = strconv.ParseFloat(*exp.Coeff, 64)
211+
if err != nil {
212+
return 0, 0, 0, err
213+
}
214+
}
215+
216+
if total == 0 {
217+
return 0, coeff, pow, nil
218+
}
219+
220+
val := 0
221+
floatVal := coeff * math.Pow(float64(total), pow)
222+
if roundUp {
223+
val = int(math.Ceil(floatVal))
224+
} else {
225+
val = int(math.Floor(floatVal))
226+
}
227+
if val < 0 {
228+
return 0, coeff, pow, nil
229+
}
230+
231+
if val > total {
232+
return total, coeff, pow, nil
233+
}
234+
235+
return val, coeff, pow, nil
236+
}
237+
171238
func min(a, b *int64) *int64 {
172239
if a == nil {
173240
return b

0 commit comments

Comments
 (0)