1
0
mirror of https://github.com/minio/mc.git synced 2025-07-31 18:24:21 +03:00

improve UI for netperf inspired from object perf test (#4117)

Refer for the behavior https://asciinema.org/a/501270
This commit is contained in:
Harshavardhana
2022-06-13 04:17:28 -07:00
committed by GitHub
parent fc64e84829
commit 36d5749991
5 changed files with 128 additions and 59 deletions

115
cmd/support-perf-net.go Normal file
View File

@ -0,0 +1,115 @@
// Copyright (c) 2022 MinIO, Inc.
//
// This file is part of MinIO Object Storage stack
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package cmd
import (
"context"
"os"
"time"
tea "github.com/charmbracelet/bubbletea"
"github.com/minio/cli"
json "github.com/minio/colorjson"
"github.com/minio/madmin-go"
"github.com/minio/mc/pkg/probe"
)
type netperfResult madmin.NetperfResult
func (m netperfResult) String() (msg string) {
// string version is handled by banner.
return ""
}
func (m netperfResult) JSON() string {
JSONBytes, e := json.MarshalIndent(m, "", " ")
fatalIf(probe.NewError(e), "Unable to marshal into JSON.")
return string(JSONBytes)
}
func mainAdminSpeedtestNetperf(ctx *cli.Context, aliasedURL string) error {
client, perr := newAdminClient(aliasedURL)
if perr != nil {
fatalIf(perr.Trace(aliasedURL), "Unable to initialize admin client.")
return nil
}
ctxt, cancel := context.WithCancel(globalContext)
defer cancel()
duration, e := time.ParseDuration(ctx.String("duration"))
if e != nil {
fatalIf(probe.NewError(e), "Unable to parse duration")
return nil
}
if duration <= 0 {
fatalIf(errInvalidArgument(), "duration cannot be 0 or negative")
return nil
}
resultCh := make(chan madmin.NetperfResult)
go func() {
result, err := client.Netperf(ctxt, duration)
fatalIf(probe.NewError(err), "Unable to capture network perf results")
resultCh <- result
close(resultCh)
}()
if globalJSON {
for {
select {
case result := <-resultCh:
printMsg(netperfResult(result))
return nil
}
}
}
done := make(chan struct{})
p := tea.NewProgram(initSpeedTestUI())
go func() {
if e := p.Start(); e != nil {
os.Exit(1)
}
close(done)
}()
go func() {
for {
select {
case result := <-resultCh:
p.Send(speedTestResult{
nresult: &result,
final: true,
})
return
default:
p.Send(speedTestResult{
nresult: &madmin.NetperfResult{},
})
time.Sleep(100 * time.Millisecond)
}
}
}()
<-done
return nil
}