Skip to content

Commit 73865d2

Browse files
authored
fix(deps): update module libovsdb (#6046)
Signed-off-by: zhangzujian <zhangzujian.7@gmail.com>
1 parent 2b8ed74 commit 73865d2

File tree

12 files changed

+125
-121
lines changed

12 files changed

+125
-121
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ require (
9595
github.com/buger/jsonparser v1.1.1 // indirect
9696
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
9797
github.com/cenkalti/hub v1.0.2 // indirect
98-
github.com/cenkalti/rpc2 v1.0.4 // indirect
98+
github.com/cenkalti/rpc2 v1.0.5 // indirect
9999
github.com/cespare/xxhash/v2 v2.3.0 // indirect
100100
github.com/chai2010/gettext-go v1.0.3 // indirect
101101
github.com/container-storage-interface/spec v1.12.0 // indirect
@@ -292,7 +292,7 @@ replace (
292292
github.com/mdlayher/arp => github.com/kubeovn/arp v0.0.0-20240218024213-d9612a263f68
293293
github.com/openshift/api => github.com/openshift/api v0.0.0-20191219222812-2987a591a72c
294294
github.com/openshift/client-go => github.com/openshift/client-go v0.0.0-20210112165513-ebc401615f47
295-
github.com/ovn-kubernetes/libovsdb => github.com/kubeovn/libovsdb v0.0.0-20250902054237-bde1f5f13d47
295+
github.com/ovn-kubernetes/libovsdb => github.com/kubeovn/libovsdb v0.0.0-20251212071713-cb1c2bc5d43e
296296
k8s.io/api => k8s.io/api v0.34.3
297297
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.34.3
298298
k8s.io/apimachinery => k8s.io/apimachinery v0.34.3

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1x
4646
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
4747
github.com/cenkalti/hub v1.0.2 h1:Nqv9TNaA9boeO2wQFW8o87BY3zKthtnzXmWGmJqhAV8=
4848
github.com/cenkalti/hub v1.0.2/go.mod h1:8LAFAZcCasb83vfxatMUnZHRoQcffho2ELpHb+kaTJU=
49-
github.com/cenkalti/rpc2 v1.0.4 h1:MJWmm7mbt8r/ZkQS+qr/e2KMMrhMLPr/62CYZIHybdI=
50-
github.com/cenkalti/rpc2 v1.0.4/go.mod h1:2yfU5b86vOr16+iY1jN3MvT6Kxc9Nf8j5iZWwUf7iaw=
49+
github.com/cenkalti/rpc2 v1.0.5 h1:T6l4SS3ja3eaJfRyZrn7Oco/PSx/pr3YK5cjCgLVLTk=
50+
github.com/cenkalti/rpc2 v1.0.5/go.mod h1:2yfU5b86vOr16+iY1jN3MvT6Kxc9Nf8j5iZWwUf7iaw=
5151
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
5252
github.com/cert-manager/cert-manager v1.19.2 h1:jSprN1h5pgNDSl7HClAmIzXuTxic/5FXJ32kbQHqjlM=
5353
github.com/cert-manager/cert-manager v1.19.2/go.mod h1:e9NzLtOKxTw7y99qLyWGmPo6mrC1Nh0EKKcMkRfK+GE=
@@ -390,8 +390,8 @@ github.com/kubeovn/gonetworkmanager/v3 v3.0.0-20250410045132-f48faac0d315 h1:PYw
390390
github.com/kubeovn/gonetworkmanager/v3 v3.0.0-20250410045132-f48faac0d315/go.mod h1:/SGJYGjOEAz+rw8JvkkbpcAyjQF1v4XPgpn1HqRg1fs=
391391
github.com/kubeovn/kubevirt-client-go v0.0.0-20251128080558-ab7d8b8b5a66 h1:FlIRHOhiL78OOMcvM8rfEACgdBKiDpw0E3FSn272wJA=
392392
github.com/kubeovn/kubevirt-client-go v0.0.0-20251128080558-ab7d8b8b5a66/go.mod h1:98SIBmkgyZgcqIA+Rx3p2JLIk0Njjs5ZjyWu71epN7g=
393-
github.com/kubeovn/libovsdb v0.0.0-20250902054237-bde1f5f13d47 h1:qWX4iRn+Bm+KxSeuPBeTPTAJQf0Be7uMikvEN9D5B9o=
394-
github.com/kubeovn/libovsdb v0.0.0-20250902054237-bde1f5f13d47/go.mod h1:/19bkWV962l/SCxz/XZ45UZvGyvOQhQKYquHmTxfWIk=
393+
github.com/kubeovn/libovsdb v0.0.0-20251212071713-cb1c2bc5d43e h1:/DjPaByhzfDJcJ8A9jqoi16q/O1N5nGOHy9VmNZVnVM=
394+
github.com/kubeovn/libovsdb v0.0.0-20251212071713-cb1c2bc5d43e/go.mod h1:uqOuVsuGSJPoHDOS5O9VkJz/TIPm6Az/YZesHZ3qwDw=
395395
github.com/kubeovn/ovsdb v0.0.0-20240410091831-5dd26006c475 h1:KZba2Kj9TXCUdUSqOR3eiy4VvkkIyhDVImYmYs6GQWU=
396396
github.com/kubeovn/ovsdb v0.0.0-20240410091831-5dd26006c475/go.mod h1:LAd0qoeAAm/QyZcpxN2BnpndM2/dhZt+/kokPvcxKcE=
397397
github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0 h1:nHHjmvjitIiyPlUHk/ofpgvBcNcawJLtf4PYHORLjAA=

pkg/daemon/exporter_metric.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@ func (c *Controller) setIPLocalPortRangeMetric() {
3030
}
3131

3232
func (c *Controller) setCheckSumErrMetric() {
33-
cmdstr := "netstat -us"
34-
cmd := exec.Command("sh", "-c", cmdstr)
35-
output, err := cmd.CombinedOutput()
33+
output, err := exec.Command("netstat", "-us").CombinedOutput()
3634
if err != nil {
3735
klog.Errorf("failed to exec cmd 'netstat -us', err %v", err)
3836
return

pkg/ovn_leader_checker/ovn.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import (
2424

2525
kubeovnv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1"
2626
"github.com/kubeovn/kube-ovn/pkg/ovs"
27+
"github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnnb"
28+
"github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnsb"
2729
"github.com/kubeovn/kube-ovn/pkg/util"
2830
)
2931

@@ -336,9 +338,9 @@ func doOvnLeaderCheck(cfg *Configuration, podName, podNamespace string) {
336338
}
337339

338340
if !cfg.ISICDBServer {
339-
sbLeader := isDBLeader("OVN_Southbound", 6642)
341+
sbLeader := isDBLeader(ovnsb.DatabaseName, 6642)
340342
patch := util.KVPatch{
341-
"ovn-nb-leader": strconv.FormatBool(isDBLeader("OVN_Northbound", 6641)),
343+
"ovn-nb-leader": strconv.FormatBool(isDBLeader(ovnnb.DatabaseName, 6641)),
342344
"ovn-sb-leader": strconv.FormatBool(sbLeader),
343345
"ovn-northd-leader": strconv.FormatBool(checkNorthdActive()),
344346
}

pkg/ovnmonitor/config.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"github.com/spf13/pflag"
77
"k8s.io/klog/v2"
88

9+
"github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnnb"
10+
"github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnsb"
911
"github.com/kubeovn/kube-ovn/pkg/util"
1012
)
1113

@@ -70,7 +72,7 @@ func ParseFlags() (*Configuration, error) {
7072
argDatabaseVswitchFilePidPath = pflag.String("database.vswitch.file.pid.path", "/var/run/openvswitch/ovsdb-server.pid", "OVS db process id file.")
7173
argDatabaseVswitchFileSystemIDPath = pflag.String("database.vswitch.file.system.id.path", "/etc/openvswitch/system-id.conf", "OVS system id file.")
7274

73-
argDatabaseNorthboundName = pflag.String("database.northbound.name", "OVN_Northbound", "The name of OVN NB (northbound) db.")
75+
argDatabaseNorthboundName = pflag.String("database.northbound.name", ovnnb.DatabaseName, "The name of OVN NB (northbound) db.")
7476
argDatabaseNorthboundSocketRemote = pflag.String("database.northbound.socket.remote", "unix:/run/ovn/ovnnb_db.sock", "JSON-RPC unix socket to OVN NB db.")
7577
argDatabaseNorthboundSocketControl = pflag.String("database.northbound.socket.control", "unix:/run/ovn/ovnnb_db.ctl", "JSON-RPC unix socket to OVN NB app.")
7678
argDatabaseNorthboundFileDataPath = pflag.String("database.northbound.file.data.path", "/etc/ovn/ovnnb_db.db", "OVN NB db file.")
@@ -80,7 +82,7 @@ func ParseFlags() (*Configuration, error) {
8082
argDatabaseNorthboundPortSsl = pflag.Int("database.northbound.port.ssl", 6631, "OVN NB db network socket secure port.")
8183
argDatabaseNorthboundPortRaft = pflag.Int("database.northbound.port.raft", 6643, "OVN NB db network port for clustering (raft)")
8284

83-
argDatabaseSouthboundName = pflag.String("database.southbound.name", "OVN_Southbound", "The name of OVN SB (southbound) db.")
85+
argDatabaseSouthboundName = pflag.String("database.southbound.name", ovnsb.DatabaseName, "The name of OVN SB (southbound) db.")
8486
argDatabaseSouthboundSocketRemote = pflag.String("database.southbound.socket.remote", "unix:/run/ovn/ovnsb_db.sock", "JSON-RPC unix socket to OVN SB db.")
8587
argDatabaseSouthboundSocketControl = pflag.String("database.southbound.socket.control", "unix:/run/ovn/ovnsb_db.ctl", "JSON-RPC unix socket to OVN SB app.")
8688
argDatabaseSouthboundFileDataPath = pflag.String("database.southbound.file.data.path", "/etc/ovn/ovnsb_db.db", "OVN SB db file.")

pkg/ovnmonitor/exporter.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99
"github.com/kubeovn/ovsdb"
1010
"k8s.io/klog/v2"
1111

12+
"github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnnb"
13+
"github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnsb"
1214
"github.com/kubeovn/kube-ovn/pkg/util"
1315
)
1416

@@ -205,8 +207,8 @@ func (e *Exporter) exportOvnDBFileSizeGauge() {
205207
nbPath := e.Client.Database.Northbound.File.Data.Path
206208
sbPath := e.Client.Database.Southbound.File.Data.Path
207209
dirDbMap := map[string]string{
208-
nbPath: "OVN_Northbound",
209-
sbPath: "OVN_Southbound",
210+
nbPath: ovnnb.DatabaseName,
211+
sbPath: ovnsb.DatabaseName,
210212
}
211213
for dbFile, database := range dirDbMap {
212214
fileInfo, err := os.Stat(dbFile)
@@ -260,8 +262,8 @@ func (e *Exporter) exportOvnClusterEnableGauge() {
260262
func (e *Exporter) exportOvnClusterInfoGauge() {
261263
resetOvnClusterMetrics()
262264
dirDbMap := map[string]string{
263-
"nb": "OVN_Northbound",
264-
"sb": "OVN_Southbound",
265+
"nb": ovnnb.DatabaseName,
266+
"sb": ovnsb.DatabaseName,
265267
}
266268
for direction, database := range dirDbMap {
267269
clusterStatus, err := getClusterInfo(direction, database)
@@ -275,7 +277,7 @@ func (e *Exporter) exportOvnClusterInfoGauge() {
275277

276278
func (e *Exporter) exportOvnDBStatusGauge() {
277279
metricDBStatus.Reset()
278-
dbList := []string{"OVN_Northbound", "OVN_Southbound"}
280+
dbList := []string{ovnnb.DatabaseName, ovnsb.DatabaseName}
279281
for _, database := range dbList {
280282
ok, err := getDBStatus(database)
281283
if err != nil {
@@ -288,15 +290,15 @@ func (e *Exporter) exportOvnDBStatusGauge() {
288290
metricDBStatus.WithLabelValues(e.Client.System.Hostname, database).Set(0)
289291

290292
switch database {
291-
case "OVN_Northbound":
293+
case ovnnb.DatabaseName:
292294
checkNbDbCnt++
293295
if checkNbDbCnt < 6 {
294296
klog.Warningf("Failed to get OVN NB DB status for %v times", checkNbDbCnt)
295297
return
296298
}
297299
klog.Warningf("Failed to get OVN NB DB status for %v times, ready to restore OVN DB", checkNbDbCnt)
298300
checkNbDbCnt = 0
299-
case "OVN_Southbound":
301+
case ovnsb.DatabaseName:
300302
checkSbDbCnt++
301303
if checkSbDbCnt < 6 {
302304
klog.Warningf("Failed to get OVN SB DB status for %v times", checkSbDbCnt)

pkg/ovnmonitor/util.go

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import (
1010

1111
"github.com/kubeovn/ovsdb"
1212
"k8s.io/klog/v2"
13+
14+
"github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnnb"
15+
"github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnsb"
1316
)
1417

1518
// IncrementErrorCounter increases the counter of failed queries to OVN server.
@@ -23,8 +26,7 @@ func (e *Exporter) getOvnStatus() map[string]int {
2326
result := make(map[string]int)
2427

2528
// get ovn-northbound status
26-
cmdstr := "ovn-appctl -t /var/run/ovn/ovnnb_db.ctl cluster/status OVN_Northbound"
27-
cmd := exec.Command("sh", "-c", cmdstr)
29+
cmd := exec.Command("ovn-appctl", "-t", "/var/run/ovn/ovnnb_db.ctl", "cluster/status", ovnnb.DatabaseName) // #nosec G204
2830
output, err := cmd.CombinedOutput()
2931
if err != nil {
3032
klog.Errorf("get ovn-northbound status failed, err %v", err)
@@ -33,8 +35,7 @@ func (e *Exporter) getOvnStatus() map[string]int {
3335
result["ovsdb-server-northbound"] = parseDbStatus(string(output))
3436

3537
// get ovn-southbound status
36-
cmdstr = "ovn-appctl -t /var/run/ovn/ovnsb_db.ctl cluster/status OVN_Southbound"
37-
cmd = exec.Command("sh", "-c", cmdstr)
38+
cmd = exec.Command("ovn-appctl", "-t", "/var/run/ovn/ovnsb_db.ctl", "cluster/status", ovnsb.DatabaseName) // #nosec G204
3839
output, err = cmd.CombinedOutput()
3940
if err != nil {
4041
klog.Errorf("get ovn-southbound status failed, err %v", err)
@@ -48,9 +49,8 @@ func (e *Exporter) getOvnStatus() map[string]int {
4849
klog.Errorf("read ovn-northd pid failed, err %v", err)
4950
result["ovn-northd"] = 0
5051
} else {
51-
cmdstr := fmt.Sprintf("ovn-appctl -t /var/run/ovn/ovn-northd.%s.ctl status", strings.Trim(string(pid), "\n"))
52-
klog.V(3).Infof("cmd is %v", cmdstr)
53-
cmd := exec.Command("sh", "-c", cmdstr) // #nosec G204
52+
// #nosec G204
53+
cmd := exec.Command("ovn-appctl", "-t", fmt.Sprintf("/var/run/ovn/ovn-northd.%s.ctl", strings.Trim(string(pid), "\n")), "status")
5454
output, err := cmd.CombinedOutput()
5555
if err != nil {
5656
klog.Errorf("get ovn-northd status failed, err %v", err)
@@ -76,8 +76,7 @@ func (e *Exporter) getOvnStatusContent() map[string]string {
7676
result := map[string]string{"ovsdb-server-northbound": "", "ovsdb-server-southbound": ""}
7777

7878
// get ovn-northbound status
79-
cmdstr := "ovn-appctl -t /var/run/ovn/ovnnb_db.ctl cluster/status OVN_Northbound"
80-
cmd := exec.Command("sh", "-c", cmdstr)
79+
cmd := exec.Command("ovn-appctl", "-t", "/var/run/ovn/ovnnb_db.ctl", "cluster/status", ovnnb.DatabaseName) // #nosec G204
8180
output, err := cmd.CombinedOutput()
8281
if err != nil {
8382
klog.Errorf("get ovn-northbound status failed, err %v", err)
@@ -88,8 +87,7 @@ func (e *Exporter) getOvnStatusContent() map[string]string {
8887
}
8988

9089
// get ovn-southbound status
91-
cmdstr = "ovn-appctl -t /var/run/ovn/ovnsb_db.ctl cluster/status OVN_Southbound"
92-
cmd = exec.Command("sh", "-c", cmdstr)
90+
cmd = exec.Command("ovn-appctl", "-t", "/var/run/ovn/ovnsb_db.ctl", "cluster/status", ovnsb.DatabaseName) // #nosec G204
9391
output, err = cmd.CombinedOutput()
9492
if err != nil {
9593
klog.Errorf("get ovn-southbound status failed, err %v", err)
@@ -103,8 +101,7 @@ func (e *Exporter) getOvnStatusContent() map[string]string {
103101
}
104102

105103
func getClusterEnableState(dbName string) (bool, error) {
106-
cmdstr := "ovsdb-tool db-is-clustered " + dbName
107-
cmd := exec.Command("sh", "-c", cmdstr) // #nosec G204
104+
cmd := exec.Command("ovsdb-tool", "db-is-clustered", dbName) // #nosec G204
108105
_, err := cmd.CombinedOutput()
109106
if err != nil {
110107
klog.Error(err)
@@ -116,7 +113,7 @@ func getClusterEnableState(dbName string) (bool, error) {
116113
func (e *Exporter) setLogicalSwitchInfoMetric() {
117114
lsws, err := e.Client.GetLogicalSwitches()
118115
if err != nil {
119-
klog.Errorf("%s: %v", e.Client.Database.Southbound.Name, err)
116+
klog.Errorf("failed to get logical switches: %v", err)
120117
e.IncrementErrorCounter()
121118
} else {
122119
for _, lsw := range lsws {
@@ -178,16 +175,13 @@ func (e *Exporter) setLogicalSwitchPortInfoMetric() {
178175
}
179176

180177
func getClusterInfo(direction, dbName string) (*OVNDBClusterStatus, error) {
181-
clusterStatus := &OVNDBClusterStatus{}
182-
var err error
183-
184-
cmdstr := fmt.Sprintf("ovn-appctl -t /var/run/ovn/ovn%s_db.ctl cluster/status %s", direction, dbName)
185-
cmd := exec.Command("sh", "-c", cmdstr) // #nosec G204
178+
cmd := exec.Command("ovn-appctl", "-t", fmt.Sprintf("/var/run/ovn/ovn%s_db.ctl", direction), "cluster/status", dbName) // #nosec G204
186179
output, err := cmd.CombinedOutput()
187180
if err != nil {
188181
return nil, fmt.Errorf("failed to retrieve cluster/status info for database %s: %w", dbName, err)
189182
}
190183

184+
clusterStatus := &OVNDBClusterStatus{}
191185
for line := range strings.SplitSeq(string(output), "\n") {
192186
idx := strings.Index(line, ":")
193187
if idx == -1 {
@@ -311,16 +305,17 @@ func parseDbStatus(output string) int {
311305
}
312306

313307
func getDBStatus(dbName string) (bool, error) {
314-
var cmdstr string
308+
var cmd *exec.Cmd
315309
var result bool
316310
switch dbName {
317-
case "OVN_Northbound":
318-
cmdstr = "ovn-appctl -t /var/run/ovn/ovnnb_db.ctl ovsdb-server/get-db-storage-status " + dbName
319-
case "OVN_Southbound":
320-
cmdstr = "ovn-appctl -t /var/run/ovn/ovnsb_db.ctl ovsdb-server/get-db-storage-status " + dbName
311+
case ovnnb.DatabaseName:
312+
cmd = exec.Command("ovn-appctl", "-t", "/var/run/ovn/ovnnb_db.ctl", "ovsdb-server/get-db-storage-status", dbName) // #nosec G204
313+
case ovnsb.DatabaseName:
314+
cmd = exec.Command("ovn-appctl", "-t", "/var/run/ovn/ovnsb_db.ctl", "ovsdb-server/get-db-storage-status", dbName) // #nosec G204
315+
default:
316+
return false, fmt.Errorf("unknown db name %s", dbName)
321317
}
322318

323-
cmd := exec.Command("sh", "-c", cmdstr) // #nosec G204
324319
output, err := cmd.CombinedOutput()
325320
if err != nil {
326321
klog.Errorf("get %s status failed, err %v", dbName, err)

pkg/ovs/ovn-nb-suite_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ type OvnClientTestSuite struct {
3838
}
3939

4040
func emptyNbDatabaseModel() (model.ClientDBModel, error) {
41-
return model.NewClientDBModel("OVN_Northbound", nil)
41+
return model.NewClientDBModel(ovnnb.DatabaseName, nil)
4242
}
4343

4444
func (suite *OvnClientTestSuite) SetupSuite() {

pkg/ovs/ovn.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func NewDynamicOvnNbClient(
6666
ovnNbTimeout, ovsDbConTimeout, ovsDbInactivityTimeout int,
6767
tables ...string,
6868
) (*OVNNbClient, map[string]model.Model, error) {
69-
dbModel, err := model.NewClientDBModel("OVN_Northbound", nil)
69+
dbModel, err := model.NewClientDBModel(ovnnb.DatabaseName, nil)
7070
if err != nil {
7171
return nil, nil, fmt.Errorf("failed to create client db model: %w", err)
7272
}
@@ -113,7 +113,7 @@ func NewDynamicOvnNbClient(
113113
models[name] = model
114114
}
115115

116-
if dbModel, err = model.NewClientDBModel("OVN_Northbound", models); err != nil {
116+
if dbModel, err = model.NewClientDBModel(ovnnb.DatabaseName, models); err != nil {
117117
return nil, nil, fmt.Errorf("failed to create dynamic client db model: %w", err)
118118
}
119119

@@ -284,9 +284,9 @@ func (c *ovsDbClient) Transact(method string, operations []ovsdb.Operation) erro
284284

285285
var dbType string
286286
switch c.Schema().Name {
287-
case "OVN_Northbound":
287+
case ovnnb.DatabaseName:
288288
dbType = "ovn-nb"
289-
case "OVN_Southbound":
289+
case ovnsb.DatabaseName:
290290
dbType = "ovn-sb"
291291
}
292292

pkg/ovsdb/ovnnb/model.go

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)