This commit is contained in:
@@ -15,11 +15,27 @@ import (
|
||||
"firewall_containers/network-go/config"
|
||||
)
|
||||
|
||||
// DockerAPI defines the interface for Docker operations, enabling mock implementations for testing
|
||||
type DockerAPI interface {
|
||||
Close() error
|
||||
EnsureNetwork(ctx context.Context, netCfg config.NetworkConfig) error
|
||||
RemoveNetwork(ctx context.Context, networkName string) error
|
||||
ConnectContainer(ctx context.Context, containerName, networkName, ip string) error
|
||||
DisconnectContainer(ctx context.Context, containerName, networkName string) error
|
||||
InspectContainer(ctx context.Context, containerName string) (*types.ContainerJSON, error)
|
||||
WaitForContainerRunning(ctx context.Context, containerName string, timeout time.Duration) error
|
||||
GetContainerPID(ctx context.Context, containerName string) (int, error)
|
||||
AddRouteInContainer(ctx context.Context, containerName, network, gateway string) error
|
||||
}
|
||||
|
||||
// Client wraps the Docker SDK client
|
||||
type Client struct {
|
||||
cli *client.Client
|
||||
}
|
||||
|
||||
// Ensure Client implements DockerAPI
|
||||
var _ DockerAPI = (*Client)(nil)
|
||||
|
||||
// NewClient creates a new Docker client
|
||||
func NewClient() (*Client, error) {
|
||||
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
|
||||
@@ -36,7 +52,6 @@ func (c *Client) Close() error {
|
||||
|
||||
// EnsureNetwork creates a Docker network if it does not already exist
|
||||
func (c *Client) EnsureNetwork(ctx context.Context, netCfg config.NetworkConfig) error {
|
||||
// Check if network already exists
|
||||
existingNetworks, err := c.cli.NetworkList(ctx, network.ListOptions{
|
||||
Filters: filters.NewArgs(filters.Arg("name", netCfg.NetworkName)),
|
||||
})
|
||||
@@ -46,12 +61,10 @@ func (c *Client) EnsureNetwork(ctx context.Context, netCfg config.NetworkConfig)
|
||||
|
||||
for _, n := range existingNetworks {
|
||||
if n.Name == netCfg.NetworkName {
|
||||
// Network already exists, skip creation
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// Parse subnet and gateway
|
||||
_, ipNet, err := net.ParseCIDR(netCfg.Subnet)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to parse subnet %s: %w", netCfg.Subnet, err)
|
||||
@@ -62,7 +75,6 @@ func (c *Client) EnsureNetwork(ctx context.Context, netCfg config.NetworkConfig)
|
||||
return fmt.Errorf("failed to parse gateway IP %s", netCfg.Gateway)
|
||||
}
|
||||
|
||||
// Create the network
|
||||
createOpts := network.CreateOptions{
|
||||
Driver: "bridge",
|
||||
IPAM: &network.IPAM{
|
||||
@@ -84,7 +96,7 @@ func (c *Client) EnsureNetwork(ctx context.Context, netCfg config.NetworkConfig)
|
||||
return fmt.Errorf("failed to create network %s: %w", netCfg.NetworkName, err)
|
||||
}
|
||||
|
||||
_ = resp // response contains ID and warnings
|
||||
_ = resp
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -154,6 +166,7 @@ func (c *Client) WaitForContainerRunning(ctx context.Context, containerName stri
|
||||
}
|
||||
}
|
||||
|
||||
// GetContainerPID returns the PID of a container for nsenter operations
|
||||
func (c *Client) GetContainerPID(ctx context.Context, containerName string) (int, error) {
|
||||
cont, err := c.cli.ContainerInspect(ctx, containerName)
|
||||
if err != nil {
|
||||
@@ -184,4 +197,4 @@ func (c *Client) AddRouteInContainer(ctx context.Context, containerName, network
|
||||
return fmt.Errorf("failed to add route in container %s: %w\noutput: %s", containerName, err, string(output))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user