Skip to content

Commit c4f3f6d

Browse files
Orzeliussmira
andcommitted
feat: implement kubernetes server-side apply
* add SSA via the new go-kubernetes library implementation to talosctl `upgrade-k8s` command * add SSA via direct ResourceInterface call into talos (machined) with a manual inventory update * add an integration test for ssa functionality Co-authored-by: Andrey Smirnov <andrey.smirnov@siderolabs.com> Signed-off-by: Orzelius <33936483+Orzelius@users.noreply.github.com> Signed-off-by: Andrey Smirnov <andrey.smirnov@siderolabs.com>
1 parent f12fd2b commit c4f3f6d

File tree

12 files changed

+688
-49
lines changed

12 files changed

+688
-49
lines changed

go.mod

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ require (
147147
github.com/siderolabs/go-debug v0.6.1
148148
github.com/siderolabs/go-kmsg v0.1.4
149149
github.com/siderolabs/go-kubeconfig v0.1.1
150-
github.com/siderolabs/go-kubernetes v0.2.28
150+
github.com/siderolabs/go-kubernetes v0.2.29
151151
github.com/siderolabs/go-loadbalancer v0.5.0
152152
github.com/siderolabs/go-pcidb v0.3.2
153153
github.com/siderolabs/go-pointer v1.0.1
@@ -192,6 +192,7 @@ require (
192192
k8s.io/klog/v2 v2.130.1
193193
k8s.io/utils v0.0.0-20251002143259-bc988d571ff4
194194
kernel.org/pub/linux/libs/security/libcap/cap v1.2.77
195+
sigs.k8s.io/cli-utils v0.37.3-0.20250918194211-77c836a69463
195196
sigs.k8s.io/hydrophone v0.7.0
196197
)
197198

@@ -251,17 +252,21 @@ require (
251252
github.com/emicklei/dot v1.10.0 // indirect
252253
github.com/emicklei/go-restful/v3 v3.13.0 // indirect
253254
github.com/evanphx/json-patch v5.9.11+incompatible // indirect
255+
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
254256
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect
257+
github.com/fatih/camelcase v1.0.0 // indirect
255258
github.com/felixge/httpsnoop v1.0.4 // indirect
259+
github.com/fluxcd/cli-utils v0.36.0-flux.15 // indirect
260+
github.com/fluxcd/pkg/ssa v0.60.0 // indirect
256261
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
257262
github.com/gdamore/encoding v1.0.1 // indirect
258263
github.com/ghodss/yaml v1.0.0 // indirect
259-
github.com/go-errors/errors v1.4.2 // indirect
264+
github.com/go-errors/errors v1.5.1 // indirect
260265
github.com/go-logr/logr v1.4.3 // indirect
261266
github.com/go-logr/stdr v1.2.2 // indirect
262-
github.com/go-openapi/jsonpointer v0.21.0 // indirect
267+
github.com/go-openapi/jsonpointer v0.21.1 // indirect
263268
github.com/go-openapi/jsonreference v0.21.0 // indirect
264-
github.com/go-openapi/swag v0.23.0 // indirect
269+
github.com/go-openapi/swag v0.23.1 // indirect
265270
github.com/go-resty/resty/v2 v2.17.0 // indirect
266271
github.com/gogo/protobuf v1.3.2 // indirect
267272
github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
@@ -287,7 +292,7 @@ require (
287292
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect
288293
github.com/lmittmann/tint v1.0.4 // indirect
289294
github.com/lucasb-eyer/go-colorful v1.3.0 // indirect
290-
github.com/mailru/easyjson v0.7.7 // indirect
295+
github.com/mailru/easyjson v0.9.0 // indirect
291296
github.com/mattn/go-colorable v0.1.14 // indirect
292297
github.com/mattn/go-runewidth v0.0.16 // indirect
293298
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
@@ -330,6 +335,7 @@ require (
330335
github.com/siderolabs/protoenc v0.2.4 // indirect
331336
github.com/siderolabs/tcpproxy v0.1.0 // indirect
332337
github.com/spf13/afero v1.14.0 // indirect
338+
github.com/spyzhov/ajson v0.9.6 // indirect
333339
github.com/stoewer/go-strcase v1.3.0 // indirect
334340
github.com/u-root/uio v0.0.0-20240224005618-d2acac8f3701 // indirect
335341
github.com/vbatts/tar-split v0.12.2 // indirect
@@ -365,9 +371,11 @@ require (
365371
gopkg.in/yaml.v2 v2.4.0 // indirect
366372
gopkg.in/yaml.v3 v3.0.1 // indirect
367373
k8s.io/cli-runtime v0.35.0 // indirect
374+
k8s.io/component-helpers v0.35.0 // indirect
368375
k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect
369376
kernel.org/pub/linux/libs/security/libcap/psx v1.2.77 // indirect
370377
rsc.io/qr v0.2.0 // indirect
378+
sigs.k8s.io/controller-runtime v0.22.2 // indirect
371379
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
372380
sigs.k8s.io/knftables v0.0.18 // indirect
373381
sigs.k8s.io/kustomize/api v0.20.1 // indirect

go.sum

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -217,14 +217,22 @@ github.com/equinix-ms/go-vmw-guestrpc v1.0.0 h1:O1+zDPdtli9NDWFyYe9ChaaROr3MJusE
217217
github.com/equinix-ms/go-vmw-guestrpc v1.0.0/go.mod h1:YB8EWh3S7z7T2BmHYc95pGynNqjMLJCFnt0X57B0+p4=
218218
github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb4Z+d1UQi45df52xW8=
219219
github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
220+
github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU=
221+
github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM=
220222
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4=
221223
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc=
224+
github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8=
225+
github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=
222226
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
223227
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
224228
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
225229
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
226230
github.com/florianl/go-tc v0.4.7 h1:Ysai5TIx4PgOzqI/1cse/pquOFCEkWofKtc/EPumfrg=
227231
github.com/florianl/go-tc v0.4.7/go.mod h1:Fdz6eHitQZwylSvpAW3y9R9cUrnS/zinuAdjJpD7XqY=
232+
github.com/fluxcd/cli-utils v0.36.0-flux.15 h1:Et5QLnIpRjj+oZtM9gEybkAaoNsjysHq0y1253Ai94Y=
233+
github.com/fluxcd/cli-utils v0.36.0-flux.15/go.mod h1:AqRUmWIfNE7cdL6NWSGF0bAlypGs+9x5UQ2qOtlEzv4=
234+
github.com/fluxcd/pkg/ssa v0.60.0 h1:ikA78TWSLDmIc8I/goGAU/buYF6jto/gswE5hnOfWGk=
235+
github.com/fluxcd/pkg/ssa v0.60.0/go.mod h1:3k9t4B4UjOF0536RQssQ4r9BXLSCq6FSTnUNKseFVHQ=
228236
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
229237
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
230238
github.com/foxboron/go-uefi v0.0.0-20251010190908-d29549a44f29 h1:2XQY2y+CZCLpFjK5p2EEMwDdP99c7AWP29WhCTkiQm8=
@@ -249,19 +257,21 @@ github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
249257
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
250258
github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc=
251259
github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY=
252-
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
253-
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
260+
github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk=
261+
github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
254262
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
255263
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
256264
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
257265
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
258266
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
259-
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
260-
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
267+
github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
268+
github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
269+
github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic=
270+
github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk=
261271
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
262272
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
263-
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
264-
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
273+
github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU=
274+
github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0=
265275
github.com/go-quicktest/qt v1.101.1-0.20240301121107-c6c8733fa1e6 h1:teYtXy9B7y5lHTp8V9KPxpYRAVA7dozigQcMiBust1s=
266276
github.com/go-quicktest/qt v1.101.1-0.20240301121107-c6c8733fa1e6/go.mod h1:p4lGIVX+8Wa6ZPNDvqcxq36XpUDLh42FLetFU7odllI=
267277
github.com/go-resty/resty/v2 v2.17.0 h1:pW9DeXcaL4Rrym4EZ8v7L19zZiIlWPg5YXAcVmt+gN0=
@@ -447,8 +457,8 @@ github.com/lmittmann/tint v1.0.4 h1:LeYihpJ9hyGvE0w+K2okPTGUdVLfng1+nDNVR4vWISc=
447457
github.com/lmittmann/tint v1.0.4/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
448458
github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag=
449459
github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
450-
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
451-
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
460+
github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
461+
github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
452462
github.com/martinlindhe/base36 v1.1.1 h1:1F1MZ5MGghBXDZ2KJ3QfxmiydlWOGB8HCEtkap5NkVg=
453463
github.com/martinlindhe/base36 v1.1.1/go.mod h1:vMS8PaZ5e/jV9LwFKlm0YLnXl/hpOihiBxKkIoc3g08=
454464
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
@@ -647,8 +657,8 @@ github.com/siderolabs/go-kmsg v0.1.4 h1:RLAa90O9bWuhA3pXPAYAdrI+kzcqTshZASRA5yso
647657
github.com/siderolabs/go-kmsg v0.1.4/go.mod h1:BLkt2N2DHT0wsFMz32lMw6vNEZL90c8ZnBjpIUoBb/M=
648658
github.com/siderolabs/go-kubeconfig v0.1.1 h1:tZlgpelj/OqrcHVUwISPN0NRgObcflpH9WtE41mtQZ0=
649659
github.com/siderolabs/go-kubeconfig v0.1.1/go.mod h1:QaGp4i9L95oDbcU7jDn30aw4gnREkb3O5otgxw8imOk=
650-
github.com/siderolabs/go-kubernetes v0.2.28 h1:mnhVvSZLWfEBXS/OpZVnyDjtm2GS/Nq7rsDjQUh7f14=
651-
github.com/siderolabs/go-kubernetes v0.2.28/go.mod h1:iFJsycHXGtEyBDRlDyopAMS7UuzyiHeYl7lWjK8ZdxA=
660+
github.com/siderolabs/go-kubernetes v0.2.29 h1:Kak66iJjIIFwqcr7iP2EB4cPDhO2bE9ci61p6gH74Jc=
661+
github.com/siderolabs/go-kubernetes v0.2.29/go.mod h1:D6b6O6oVFXPUBTN+euLTF3llSw5GmUqP749brODKF5s=
652662
github.com/siderolabs/go-loadbalancer v0.5.0 h1:0v7E6GrxoONyqwcmHiA+J0vIDPWbkTmevHGCFb4tjdc=
653663
github.com/siderolabs/go-loadbalancer v0.5.0/go.mod h1:tRVouZ9i2R/TRbNUF9MqyBlV2wsjX0cxkYTjPXcI9P0=
654664
github.com/siderolabs/go-pcidb v0.3.2 h1:18KMjsc+AO2r6/pl0KLBR9xOXO0ULLCXwmGhIukoAbw=
@@ -697,6 +707,8 @@ github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4
697707
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
698708
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
699709
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
710+
github.com/spyzhov/ajson v0.9.6 h1:iJRDaLa+GjhCDAt1yFtU/LKMtLtsNVKkxqlpvrHHlpQ=
711+
github.com/spyzhov/ajson v0.9.6/go.mod h1:a6oSw0MMb7Z5aD2tPoPO+jq11ETKgXUr2XktHdT8Wt8=
700712
github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=
701713
github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=
702714
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -1061,6 +1073,8 @@ k8s.io/client-go v0.35.0 h1:IAW0ifFbfQQwQmga0UdoH0yvdqrbwMdq9vIFEhRpxBE=
10611073
k8s.io/client-go v0.35.0/go.mod h1:q2E5AAyqcbeLGPdoRB+Nxe3KYTfPce1Dnu1myQdqz9o=
10621074
k8s.io/component-base v0.35.0 h1:+yBrOhzri2S1BVqyVSvcM3PtPyx5GUxCK2tinZz1G94=
10631075
k8s.io/component-base v0.35.0/go.mod h1:85SCX4UCa6SCFt6p3IKAPej7jSnF3L8EbfSyMZayJR0=
1076+
k8s.io/component-helpers v0.35.0 h1:wcXv7HJRksgVjM4VlXJ1CNFBpyDHruRI99RrBtrJceA=
1077+
k8s.io/component-helpers v0.35.0/go.mod h1:ahX0m/LTYmu7fL3W8zYiIwnQ/5gT28Ex4o2pymF63Co=
10641078
k8s.io/cri-api v0.35.0 h1:fxLSKyJHqbyCSUsg1rW4DRpmjSEM/elZ1GXzYTSLoDQ=
10651079
k8s.io/cri-api v0.35.0/go.mod h1:Cnt29u/tYl1Se1cBRL30uSZ/oJ5TaIp4sZm1xDLvcMc=
10661080
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
@@ -1085,6 +1099,10 @@ pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk=
10851099
pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
10861100
rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY=
10871101
rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs=
1102+
sigs.k8s.io/cli-utils v0.37.3-0.20250918194211-77c836a69463 h1:cogPZ9yOTBY+1TxAXD7DnqQqTrN83iwNTdq08z3lFao=
1103+
sigs.k8s.io/cli-utils v0.37.3-0.20250918194211-77c836a69463/go.mod h1:u5LTcoijf7f18rMNL7PVNyJzoGEriT+tS57ZSVG3nc4=
1104+
sigs.k8s.io/controller-runtime v0.22.2 h1:cK2l8BGWsSWkXz09tcS4rJh95iOLney5eawcK5A33r4=
1105+
sigs.k8s.io/controller-runtime v0.22.2/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8=
10881106
sigs.k8s.io/hydrophone v0.7.0 h1:BKEb8m6mcVL6kFEZ4jUCk5VD81bqm2XPtNxFT52ifxc=
10891107
sigs.k8s.io/hydrophone v0.7.0/go.mod h1:w22N+PiIfL6XrIAxEqnZ7HnoER3F447WvdDlQhURiro=
10901108
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=

hack/release.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,14 @@ The interactive installer mode has been removed from `talosctl apply-config` (`-
8686
It has been deprecated since Talos v1.12.0, and now fully removed.
8787
The related `GenerateConfiguration` API method has also been removed.
8888
Users are encouraged to use other installation methods, such as using pre-generated configuration files, or using Omni.
89+
"""
90+
91+
[notes.k8s_ssa]
92+
title = "Kubernetes server-side apply"
93+
description = """\
94+
Talos now uses inventory backed server-side apply when applying bootsrap manifests (including `extraManifests` and `inlineManifests`).
95+
Purging of unneeded manifests is automatically performed.
96+
The switch and inventory backfill is automatic and no action is needed from the user.
8997
"""
9098

9199
[make_deps]

0 commit comments

Comments
 (0)