* fix: EC UI template error when viewing shard details Fixed field name mismatch in volume.html where it was using .ShardDetails instead of .Shards. Added a robust type conversion wrapper in templates.go to handle int64 to uint64 conversion for bytesToHumanReadable. Added regression test to ensure future stability. * refactor: improve bytesToHumanReadable and test robustness - Handled more integer types (uint32, int32, uint) in bytesToHumanReadable. - Improved volume_test.go to verify both shards are formatted correctly. * refactor: add bounds checking to bytesToHumanReadable Added checks for negative values in signed integer types to avoid incorrect formatting when converting to uint64. Addressed feedback from coderabbitai.
64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
package volume_server_ui
|
|
|
|
import (
|
|
_ "embed"
|
|
"fmt"
|
|
"html/template"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
|
)
|
|
|
|
func percentFrom(total uint64, part_of uint64) string {
|
|
return fmt.Sprintf("%.2f", (float64(part_of)/float64(total))*100)
|
|
}
|
|
|
|
func bytesToHumanReadable(b interface{}) string {
|
|
switch v := b.(type) {
|
|
case uint64:
|
|
return util.BytesToHumanReadable(v)
|
|
case int64:
|
|
if v < 0 {
|
|
return fmt.Sprintf("%d B", v)
|
|
}
|
|
return util.BytesToHumanReadable(uint64(v))
|
|
case int:
|
|
if v < 0 {
|
|
return fmt.Sprintf("%d B", v)
|
|
}
|
|
return util.BytesToHumanReadable(uint64(v))
|
|
case uint32:
|
|
return util.BytesToHumanReadable(uint64(v))
|
|
case int32:
|
|
if v < 0 {
|
|
return fmt.Sprintf("%d B", v)
|
|
}
|
|
return util.BytesToHumanReadable(uint64(v))
|
|
case uint:
|
|
return util.BytesToHumanReadable(uint64(v))
|
|
default:
|
|
return fmt.Sprintf("%v", b)
|
|
}
|
|
}
|
|
|
|
func join(data []int64) string {
|
|
var ret []string
|
|
for _, d := range data {
|
|
ret = append(ret, strconv.Itoa(int(d)))
|
|
}
|
|
return strings.Join(ret, ",")
|
|
}
|
|
|
|
var funcMap = template.FuncMap{
|
|
"join": join,
|
|
"bytesToHumanReadable": bytesToHumanReadable,
|
|
"percentFrom": percentFrom,
|
|
"isNotEmpty": util.IsNotEmpty,
|
|
}
|
|
|
|
//go:embed volume.html
|
|
var volumeHtml string
|
|
|
|
var StatusTpl = template.Must(template.New("status").Funcs(funcMap).Parse(volumeHtml))
|