From 24371eb401bbed7a2c807f7fec1e8fee74ee88e0 Mon Sep 17 00:00:00 2001 From: Pavel Sviderski Date: Sun, 17 Nov 2024 19:41:47 +1000 Subject: [PATCH] move Docker manager to docker package --- internal/cli/client/service.go | 4 +-- .../machine/{docker.go => docker/manager.go} | 14 +++++----- .../manager_darwin.go} | 4 +-- .../manager_linux.go} | 28 +++++++++---------- internal/machine/network.go | 7 +++-- 5 files changed, 29 insertions(+), 28 deletions(-) rename internal/machine/{docker.go => docker/manager.go} (74%) rename internal/machine/{docker_darwin.go => docker/manager_darwin.go} (58%) rename internal/machine/{docker_linux.go => docker/manager_linux.go} (63%) diff --git a/internal/cli/client/service.go b/internal/cli/client/service.go index 952d6381..c91c7441 100644 --- a/internal/cli/client/service.go +++ b/internal/cli/client/service.go @@ -11,8 +11,8 @@ import ( "google.golang.org/protobuf/types/known/emptypb" "slices" "strings" - machinecore "uncloud/internal/machine" "uncloud/internal/machine/api/pb" + "uncloud/internal/machine/docker" "uncloud/internal/secret" ) @@ -111,7 +111,7 @@ func (c *Client) RunService(ctx context.Context, opts *ServiceOptions) (RunServi } netConfig := &network.NetworkingConfig{ EndpointsConfig: map[string]*network.EndpointSettings{ - machinecore.DockerNetworkName: {}, + docker.NetworkName: {}, }, } // TODO: pull image if it doesn't exist on the machine. diff --git a/internal/machine/docker.go b/internal/machine/docker/manager.go similarity index 74% rename from internal/machine/docker.go rename to internal/machine/docker/manager.go index 73611384..b5adbacb 100644 --- a/internal/machine/docker.go +++ b/internal/machine/docker/manager.go @@ -1,4 +1,4 @@ -package machine +package docker import ( "context" @@ -10,24 +10,24 @@ import ( ) const ( - DockerNetworkName = "uncloud" - DockerUserChain = "DOCKER-USER" + NetworkName = "uncloud" + UserChain = "DOCKER-USER" ) -type DockerManager struct { +type Manager struct { client *client.Client store *store.Store } -func NewDockerManager(client *client.Client, store *store.Store) *DockerManager { - return &DockerManager{ +func NewManager(client *client.Client, store *store.Store) *Manager { + return &Manager{ client: client, store: store, } } // WaitDaemonReady waits for the Docker daemon to start and be ready to serve requests. -func (d *DockerManager) WaitDaemonReady(ctx context.Context) error { +func (d *Manager) WaitDaemonReady(ctx context.Context) error { ticker := time.NewTicker(1 * time.Second) defer ticker.Stop() diff --git a/internal/machine/docker_darwin.go b/internal/machine/docker/manager_darwin.go similarity index 58% rename from internal/machine/docker_darwin.go rename to internal/machine/docker/manager_darwin.go index 5a5a29cd..abb1f5b0 100644 --- a/internal/machine/docker_darwin.go +++ b/internal/machine/docker/manager_darwin.go @@ -1,6 +1,6 @@ //go:build darwin -package machine +package docker import ( "context" @@ -9,6 +9,6 @@ import ( ) // EnsureUncloudNetwork is a stub for darwin. -func (d *DockerManager) EnsureUncloudNetwork(ctx context.Context, subnet netip.Prefix) error { +func (d *Manager) EnsureUncloudNetwork(ctx context.Context, subnet netip.Prefix) error { return fmt.Errorf("not supported on darwin") } diff --git a/internal/machine/docker_linux.go b/internal/machine/docker/manager_linux.go similarity index 63% rename from internal/machine/docker_linux.go rename to internal/machine/docker/manager_linux.go index 3ff3b3f9..adb86d7e 100644 --- a/internal/machine/docker_linux.go +++ b/internal/machine/docker/manager_linux.go @@ -1,4 +1,4 @@ -package machine +package docker import ( "context" @@ -11,34 +11,34 @@ import ( "uncloud/internal/machine/network" ) -// EnsureUncloudNetwork creates the Docker bridge network DockerNetworkName with the provided machine subnet +// EnsureUncloudNetwork creates the Docker bridge network NetworkName with the provided machine subnet // if it doesn't exist. If the network exists but has a different subnet, it removes and recreates the network. // It also configures iptables to allow container access from the WireGuard network. -func (d *DockerManager) EnsureUncloudNetwork(ctx context.Context, subnet netip.Prefix) error { +func (d *Manager) EnsureUncloudNetwork(ctx context.Context, subnet netip.Prefix) error { // Ensure the Docker network 'uncloud' is created with the correct subnet. needsCreation := false - nw, err := d.client.NetworkInspect(ctx, DockerNetworkName, dnetwork.InspectOptions{}) + nw, err := d.client.NetworkInspect(ctx, NetworkName, dnetwork.InspectOptions{}) if err != nil { if !client.IsErrNotFound(err) { - return fmt.Errorf("inspect Docker network %q: %w", DockerNetworkName, err) + return fmt.Errorf("inspect Docker network %q: %w", NetworkName, err) } needsCreation = true } else if nw.IPAM.Config[0].Subnet != subnet.String() { // Remove the Docker network if the subnet is different. // It could be a leftover from a previous incomplete cleanup. slog.Info( - "Removing Docker network with old subnet.", "name", DockerNetworkName, "subnet", nw.IPAM.Config[0].Subnet, + "Removing Docker network with old subnet.", "name", NetworkName, "subnet", nw.IPAM.Config[0].Subnet, ) - if err = d.client.NetworkRemove(ctx, DockerNetworkName); err != nil { + if err = d.client.NetworkRemove(ctx, NetworkName); err != nil { // It can still fail if the network is in use by a container. Leave it to the user to resolve the issue. - return fmt.Errorf("remove Docker network %q: %w", DockerNetworkName, err) + return fmt.Errorf("remove Docker network %q: %w", NetworkName, err) } needsCreation = true } if needsCreation { if _, err = d.client.NetworkCreate( - ctx, DockerNetworkName, dnetwork.CreateOptions{ + ctx, NetworkName, dnetwork.CreateOptions{ Driver: "bridge", Scope: "local", IPAM: &dnetwork.IPAM{ @@ -50,12 +50,12 @@ func (d *DockerManager) EnsureUncloudNetwork(ctx context.Context, subnet netip.P }, }, ); err != nil { - return fmt.Errorf("create Docker network %q: %w", DockerNetworkName, err) + return fmt.Errorf("create Docker network %q: %w", NetworkName, err) } - slog.Info("Docker network created.", "name", DockerNetworkName, "subnet", subnet.String()) + slog.Info("Docker network created.", "name", NetworkName, "subnet", subnet.String()) - if nw, err = d.client.NetworkInspect(ctx, DockerNetworkName, dnetwork.InspectOptions{}); err != nil { - return fmt.Errorf("inspect Docker network %q: %w", DockerNetworkName, err) + if nw, err = d.client.NetworkInspect(ctx, NetworkName, dnetwork.InspectOptions{}); err != nil { + return fmt.Errorf("inspect Docker network %q: %w", NetworkName, err) } } @@ -69,7 +69,7 @@ func (d *DockerManager) EnsureUncloudNetwork(ctx context.Context, subnet netip.P bridgeName := "br-" + nw.ID[:12] ipt := iptables.GetIptable(iptables.IPv4) rule := []string{"--in-interface", network.WireGuardInterfaceName, "--out-interface", bridgeName, "-j", "ACCEPT"} - if err = ipt.ProgramRule(iptables.Filter, DockerUserChain, iptables.Insert, rule); err != nil { + if err = ipt.ProgramRule(iptables.Filter, UserChain, iptables.Insert, rule); err != nil { return fmt.Errorf("insert iptables rule: %w", err) } diff --git a/internal/machine/network.go b/internal/machine/network.go index 229c04df..75487b66 100644 --- a/internal/machine/network.go +++ b/internal/machine/network.go @@ -16,6 +16,7 @@ import ( "time" "uncloud/internal/machine/api/pb" "uncloud/internal/machine/corroservice" + "uncloud/internal/machine/docker" "uncloud/internal/machine/network" "uncloud/internal/machine/store" ) @@ -106,12 +107,12 @@ func (nc *networkController) Run(ctx context.Context) error { } defer cli.Close() - docker := NewDockerManager(cli, nc.store) - if err := docker.WaitDaemonReady(ctx); err != nil { + manager := docker.NewManager(cli, nc.store) + if err := manager.WaitDaemonReady(ctx); err != nil { return fmt.Errorf("wait for Docker daemon: %w", err) } - if err := docker.EnsureUncloudNetwork(ctx, nc.state.Network.Subnet); err != nil { + if err := manager.EnsureUncloudNetwork(ctx, nc.state.Network.Subnet); err != nil { return err } slog.Info("Docker network configured.")