Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Authorization field to Plugins for Info #14383

Merged
merged 2 commits into from
May 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 5 additions & 7 deletions libpod/define/info.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ type Info struct {
Version Version `json:"version"`
}

// HostInfo describes the libpod host
// SecurityInfo describes the libpod host
type SecurityInfo struct {
AppArmorEnabled bool `json:"apparmorEnabled"`
DefaultCapabilities string `json:"capabilities"`
Expand Down Expand Up @@ -64,8 +64,7 @@ type RemoteSocket struct {
Exists bool `json:"exists,omitempty"`
}

// SlirpInfo describes the slirp executable that
// is being being used.
// SlirpInfo describes the slirp executable that is being used
type SlirpInfo struct {
Executable string `json:"executable"`
Package string `json:"package"`
Expand All @@ -78,8 +77,7 @@ type IDMappings struct {
UIDMap []idtools.IDMap `json:"uidmap"`
}

// DistributionInfo describes the host distribution
// for libpod
// DistributionInfo describes the host distribution for libpod
type DistributionInfo struct {
Distribution string `json:"distribution"`
Variant string `json:"variant,omitempty"`
Expand Down Expand Up @@ -141,8 +139,8 @@ type Plugins struct {
Volume []string `json:"volume"`
Network []string `json:"network"`
Log []string `json:"log"`
// FIXME what should we do with Authorization, docker seems to return nothing by default
// Authorization []string `json:"authorization"`
// Authorization is provided for compatibility, will always be nil as Podman has no daemon
Authorization []string `json:"authorization"`
}

type CPUUsage struct {
Expand Down
63 changes: 26 additions & 37 deletions libpod/info.go
Original file line number Diff line number Diff line change
Expand Up @@ -199,50 +199,38 @@ func (r *Runtime) hostInfo() (*define.HostInfo, error) {
info.OCIRuntime = ociruntimeInfo
}

up, err := readUptime()
duration, err := procUptime()
if err != nil {
return nil, errors.Wrapf(err, "error reading up time")
}
// Convert uptime in seconds to a human-readable format
upSeconds := up + "s"
upDuration, err := time.ParseDuration(upSeconds)
if err != nil {
return nil, errors.Wrapf(err, "error parsing system uptime")
}

// TODO Isn't there a simple lib for this, something like humantime?
hoursFound := false
var timeBuffer bytes.Buffer
var hoursBuffer bytes.Buffer
for _, elem := range upDuration.String() {
timeBuffer.WriteRune(elem)
if elem == 'h' || elem == 'm' {
timeBuffer.WriteRune(' ')
if elem == 'h' {
hoursFound = true
}
}
if !hoursFound {
hoursBuffer.WriteRune(elem)
}

uptime := struct {
hours float64
minutes float64
seconds float64
}{
hours: duration.Truncate(time.Hour).Hours(),
minutes: duration.Truncate(time.Minute).Minutes(),
seconds: duration.Truncate(time.Second).Seconds(),
}

info.Uptime = timeBuffer.String()
if hoursFound {
hours, err := strconv.ParseFloat(hoursBuffer.String(), 64)
if err == nil {
days := hours / 24
info.Uptime = fmt.Sprintf("%s (Approximately %.2f days)", info.Uptime, days)
}
// Could not find a humanize-formatter for time.Duration
var buffer bytes.Buffer
buffer.WriteString(fmt.Sprintf("%.0fh %.0fm %.2fs",
uptime.hours,
math.Mod(uptime.seconds, 3600)/60,
math.Mod(uptime.seconds, 60),
))
if int64(uptime.hours) > 0 {
buffer.WriteString(fmt.Sprintf(" (Approximately %.2f days)", uptime.hours/24))
}
info.Uptime = buffer.String()

return &info, nil
}

func (r *Runtime) getContainerStoreInfo() (define.ContainerStore, error) {
var (
paused, running, stopped int
)
var paused, running, stopped int
cs := define.ContainerStore{}
cons, err := r.GetAllContainers()
if err != nil {
Expand Down Expand Up @@ -353,16 +341,17 @@ func readKernelVersion() (string, error) {
return string(f[2]), nil
}

func readUptime() (string, error) {
func procUptime() (time.Duration, error) {
var zero time.Duration
buf, err := ioutil.ReadFile("/proc/uptime")
if err != nil {
return "", err
return zero, err
}
f := bytes.Fields(buf)
if len(f) < 1 {
return "", fmt.Errorf("invalid uptime")
return zero, errors.New("unable to parse uptime from /proc/uptime")
}
return string(f[0]), nil
return time.ParseDuration(string(f[0]) + "s")
}

// GetHostDistributionInfo returns a map containing the host's distribution and version
Expand Down