internal/pkg/api/metadata.go (65 lines of code) (raw):
// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
// or more contributor license agreements. Licensed under the Elastic License;
// you may not use this file except in compliance with the Elastic License.
package api
import (
"encoding/json"
"fmt"
"strings"
"github.com/docker/go-units"
)
func parseDownloadRate(jsonDownloadRate json.RawMessage) (*float64, error) {
var fDownloadRate float64
err := json.Unmarshal(jsonDownloadRate, &fDownloadRate)
if err == nil {
return &fDownloadRate, nil
}
// Handle string download_rate with format human_unitps
var rawDownloadRate string
err = json.Unmarshal(jsonDownloadRate, &rawDownloadRate)
if err != nil {
return nil, fmt.Errorf("error unmarshaling download_rate: %w", err)
}
if rawDownloadRate != "" {
downloadRate, err := units.FromHumanSize(strings.TrimSuffix(rawDownloadRate, "ps"))
if err != nil {
return nil, fmt.Errorf("error converting download_rate from human size: %w", err)
}
fDownloadRate := float64(downloadRate)
return &fDownloadRate, nil
}
return nil, nil
}
func (t *UpgradeMetadataDownloading) UnmarshalJSON(b []byte) error {
object := make(map[string]json.RawMessage)
err := json.Unmarshal(b, &object)
if err != nil {
return err
}
if raw, found := object["download_rate"]; found {
downloadRate, err := parseDownloadRate(raw)
if err != nil {
return err
}
t.DownloadRate = downloadRate
delete(object, "download_rate")
}
if raw, found := object["download_percent"]; found {
err = json.Unmarshal(raw, &t.DownloadPercent)
if err != nil {
return fmt.Errorf("error reading 'download_percent': %w", err)
}
delete(object, "download_percent")
}
if raw, found := object["retry_error_msg"]; found {
err = json.Unmarshal(raw, &t.RetryErrorMsg)
if err != nil {
return fmt.Errorf("error reading 'retry_error_msg': %w", err)
}
delete(object, "retry_error_msg")
}
if raw, found := object["retry_until"]; found {
err = json.Unmarshal(raw, &t.RetryUntil)
if err != nil {
return fmt.Errorf("error reading 'retry_until': %w", err)
}
delete(object, "retry_until")
}
return err
}