feat(compose): client methods for inspecting images

This commit is contained in:
Pavel Sviderski
2025-03-26 20:38:41 +10:00
parent c42968c812
commit 03c5c054e1
3 changed files with 77 additions and 0 deletions
+29
View File
@@ -2,13 +2,17 @@ package api
import ( import (
"context" "context"
"fmt"
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
"github.com/psviderski/uncloud/internal/machine/api/pb" "github.com/psviderski/uncloud/internal/machine/api/pb"
"google.golang.org/grpc/metadata"
"slices"
) )
type Client interface { type Client interface {
ContainerClient ContainerClient
DNSClient DNSClient
ImageClient
MachineClient MachineClient
ServiceClient ServiceClient
} }
@@ -27,6 +31,11 @@ type DNSClient interface {
GetDomain(ctx context.Context) (string, error) GetDomain(ctx context.Context) (string, error)
} }
type ImageClient interface {
InspectImage(ctx context.Context, id string) ([]MachineImage, error)
InspectRemoteImage(ctx context.Context, id string) ([]MachineRemoteImage, error)
}
type MachineClient interface { type MachineClient interface {
InspectMachine(ctx context.Context, id string) (*pb.MachineMember, error) InspectMachine(ctx context.Context, id string) (*pb.MachineMember, error)
ListMachines(ctx context.Context) ([]*pb.MachineMember, error) ListMachines(ctx context.Context) ([]*pb.MachineMember, error)
@@ -35,3 +44,23 @@ type MachineClient interface {
type ServiceClient interface { type ServiceClient interface {
InspectService(ctx context.Context, id string) (Service, error) InspectService(ctx context.Context, id string) (Service, error)
} }
// ProxyMachinesContext returns a new context that proxies gRPC requests to the specified machines.
// If namesOrIDs is nil, all machines are included.
func ProxyMachinesContext(ctx context.Context, cli MachineClient, namesOrIDs []string) (context.Context, error) {
machines, err := cli.ListMachines(ctx)
if err != nil {
return nil, fmt.Errorf("list machines: %w", err)
}
md := metadata.New(nil)
for _, m := range machines {
if namesOrIDs == nil ||
slices.Contains(namesOrIDs, m.Machine.Name) || slices.Contains(namesOrIDs, m.Machine.Id) {
machineIP, _ := m.Machine.Network.ManagementIp.ToAddr()
md.Append("machines", machineIP.String())
}
}
return metadata.NewOutgoingContext(ctx, md), nil
}
+28
View File
@@ -0,0 +1,28 @@
package api
import (
"github.com/distribution/reference"
"github.com/docker/docker/api/types"
v1 "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/psviderski/uncloud/internal/machine/api/pb"
)
type MachineImage struct {
Metadata *pb.Metadata
Image types.ImageInspect
}
// MachineRemoteImage represents an image in a remote registry fetched by a particular machine.
type MachineRemoteImage struct {
Metadata *pb.Metadata
Image RemoteImage
}
// RemoteImage represents an image in a remote registry. The canonical reference includes the image digest.
// Either IndexManifest or ImageManifest must be set depending on whether the reference points to an index
// (multi-platform image) or a single-platform image.
type RemoteImage struct {
Reference reference.Canonical
IndexManifest *v1.Index
ImageManifest *v1.Manifest
}
+20
View File
@@ -0,0 +1,20 @@
package client
import (
"context"
dockerclient "github.com/docker/docker/client"
"github.com/psviderski/uncloud/pkg/api"
)
func (cli *Client) InspectImage(ctx context.Context, id string) ([]api.MachineImage, error) {
images, err := cli.Docker.InspectImage(ctx, id)
if dockerclient.IsErrNotFound(err) {
err = api.ErrNotFound
}
return images, err
}
func (cli *Client) InspectRemoteImage(ctx context.Context, id string) ([]api.MachineRemoteImage, error) {
return cli.Docker.InspectRemoteImage(ctx, id)
}