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
58 // Environment inspection
59 InspectImageEnv(ctx context.Context, imageRef string) ([]string, error)
60
61 // Label inspection
62 GetImageLabels(ctx context.Context, imageRef string) (map[string]string, error)
63
64 // In-container operations
65 ExecInContainer(ctx context.Context, containerID string, cmd []string) (*ExecResult, error)
66 CopyFromContainer(ctx context.Context, containerID, srcPath string) (io.ReadCloser, error)
67
68 // Network management
69 CreateNetwork(ctx context.Context, name string, options map[string]string) error
70 RemoveNetwork(ctx context.Context, name string) error
71 ListNetworks(ctx context.Context) ([]*domain.NetworkInfo, error)
72 NetworkExists(ctx context.Context, name string) (bool, error)
73 ConnectContainerToNetwork(ctx context.Context, containerName, networkName string) error
74 DisconnectContainerFromNetwork(ctx context.Context, containerName, networkName string) error
75}
76
77// ExecResult holds the result of executing a command in a container.
78type ExecResult struct {
79 ExitCode int
80 Stdout []byte
81 Stderr []byte
82}