1// Package out defines output ports (interfaces) for infrastructure.
2// These interfaces define the contract between use cases and driven adapters
3// (Docker, filesystem, etc.).
4package out
5
6import (
7 "context"
8 "io"
9
10 "github.com/bnema/gordon/internal/domain"
11)
12
13// ContainerRuntime defines the contract for container runtime operations.
14// This interface abstracts the underlying container runtime (Docker, Podman, etc.).
15type ContainerRuntime interface {
16 // Container lifecycle
17 CreateContainer(ctx context.Context, config *domain.ContainerConfig) (*domain.Container, error)
18 StartContainer(ctx context.Context, containerID string) error
19 StopContainer(ctx context.Context, containerID string) error
20 RestartContainer(ctx context.Context, containerID string) error
21 RemoveContainer(ctx context.Context, containerID string, force bool) error
22 RenameContainer(ctx context.Context, containerID, newName string) error
23
24 // Container inspection
25 ListContainers(ctx context.Context, all bool) ([]*domain.Container, error)
26 InspectContainer(ctx context.Context, containerID string) (*domain.Container, error)
27 GetContainerLogs(ctx context.Context, containerID string, follow bool) (io.ReadCloser, error)
28
29 // Image operations
30 PullImage(ctx context.Context, image string) error
31 PullImageWithAuth(ctx context.Context, image, username, password string) error
32 TagImage(ctx context.Context, sourceRef, targetRef string) error
33 UntagImage(ctx context.Context, imageRef string) error
34 RemoveImage(ctx context.Context, image string, force bool) error
35 ListImages(ctx context.Context) ([]string, error)
36
37 // Runtime information
38 Ping(ctx context.Context) error
39 Version(ctx context.Context) (string, error)
40
41 // Health and status
42 IsContainerRunning(ctx context.Context, containerID string) (bool, error)
43 GetContainerHealthStatus(ctx context.Context, containerID string) (status string, hasHealthcheck bool, err error)
44 GetContainerPort(ctx context.Context, containerID string, internalPort int) (int, error)
45
46 // Image and port inspection
47 GetImageExposedPorts(ctx context.Context, imageRef string) ([]int, error)
48 GetContainerExposedPorts(ctx context.Context, containerID string) ([]int, error)
49 GetContainerNetworkInfo(ctx context.Context, containerID string) (string, int, error)
50 GetContainerNetwork(ctx context.Context, containerID string) (string, error)
51
52 // Volume management
53 InspectImageVolumes(ctx context.Context, imageRef string) ([]string, error)
54 VolumeExists(ctx context.Context, volumeName string) (bool, error)
55 CreateVolume(ctx context.Context, volumeName string) error
56 RemoveVolume(ctx context.Context, volumeName string, force bool) error
57 ListVolumes(ctx context.Context) ([]*domain.VolumeInfo, error)
58
59 // Environment inspection
60 InspectImageEnv(ctx context.Context, imageRef string) ([]string, error)
61
62 // Label inspection
63 GetImageLabels(ctx context.Context, imageRef string) (map[string]string, error)
64
65 // Image identity
66 GetImageID(ctx context.Context, imageRef string) (string, error)
67
68 // In-container operations
69 ExecInContainer(ctx context.Context, containerID string, cmd []string) (*ExecResult, error)
70 CopyFromContainer(ctx context.Context, containerID, srcPath string) (io.ReadCloser, error)
71
72 // Network management
73 CreateNetwork(ctx context.Context, name string, options map[string]string) error
74 RemoveNetwork(ctx context.Context, name string) error
75 ListNetworks(ctx context.Context) ([]*domain.NetworkInfo, error)
76 NetworkExists(ctx context.Context, name string) (bool, error)
77 ConnectContainerToNetwork(ctx context.Context, containerName, networkName string) error
78 DisconnectContainerFromNetwork(ctx context.Context, containerName, networkName string) error
79}
80
81// ContainerLister is the subset of ContainerRuntime needed by the orphan GC.
82type ContainerLister interface {
83 ListContainers(ctx context.Context, all bool) ([]*domain.Container, error)
84}
85
86// ExecResult holds the result of executing a command in a container.
87type ExecResult struct {
88 ExitCode int
89 Stdout []byte
90 Stderr []byte
91}