feat(logs): update 'uc logs' command to support filtering by service/container

This commit is contained in:
Pasha Sviderski
2026-04-22 11:23:21 +10:00
parent cb72f67560
commit 2045819735
8 changed files with 203 additions and 56 deletions
+1 -20
View File
@@ -256,26 +256,7 @@ func (cli *Client) InspectContainer(
return api.MachineServiceContainer{}, fmt.Errorf("inspect service: %w", err)
}
prefixMatchCandidates := []api.MachineServiceContainer{}
for _, c := range append(svc.Containers, svc.HookContainers...) {
if c.Container.ID == containerNameOrID ||
c.Container.Name == containerNameOrID {
return c, nil
}
if strings.HasPrefix(c.Container.ID, containerNameOrID) {
prefixMatchCandidates = append(prefixMatchCandidates, c)
}
}
if len(prefixMatchCandidates) == 1 {
return prefixMatchCandidates[0], nil
} else if len(prefixMatchCandidates) > 1 {
return api.MachineServiceContainer{}, fmt.Errorf(
"multiple containers found with ID prefix '%s'", containerNameOrID)
}
return api.MachineServiceContainer{}, api.ErrNotFound
return svc.FindContainer(containerNameOrID)
}
// StartContainer starts the specified container within the service.
+20 -4
View File
@@ -5,6 +5,8 @@ import (
"errors"
"fmt"
"io"
"maps"
"slices"
"github.com/docker/docker/pkg/stringid"
"github.com/psviderski/uncloud/internal/machine/api/pb"
@@ -24,11 +26,25 @@ func (cli *Client) ServiceLogs(
return svc, nil, fmt.Errorf("inspect service: %w", err)
}
allContainers := append(svc.Containers, svc.HookContainers...)
if len(allContainers) == 0 {
containers := append(svc.Containers, svc.HookContainers...)
if len(containers) == 0 {
return svc, nil, fmt.Errorf("no containers found for service: %s", serviceNameOrID)
}
if len(opts.Containers) > 0 {
selected := make(map[string]api.MachineServiceContainer, len(opts.Containers))
for _, nameOrID := range opts.Containers {
ctr, err := svc.FindContainer(nameOrID)
if err != nil {
return svc, nil, fmt.Errorf("find container '%s' in service '%s': %w",
nameOrID, serviceNameOrID, err)
}
selected[ctr.Container.ID] = ctr
}
containers = slices.Collect(maps.Values(selected))
}
machines, err := cli.ListMachines(ctx, &api.MachineFilter{
NamesOrIDs: opts.Machines,
})
@@ -36,8 +52,8 @@ func (cli *Client) ServiceLogs(
return svc, nil, fmt.Errorf("list machines: %w", err)
}
ctrStreams := make([]<-chan api.ServiceLogEntry, 0, len(allContainers))
for _, ctr := range allContainers {
ctrStreams := make([]<-chan api.ServiceLogEntry, 0, len(containers))
for _, ctr := range containers {
// Skip containers not running on the specified machines.
m := machines.FindByNameOrID(ctr.MachineID)
if len(opts.Machines) > 0 && m == nil {