Refactoring

This commit is contained in:
yusing 2024-09-25 03:43:47 +08:00
parent 17115cfb0b
commit dc3575c8fd
7 changed files with 42 additions and 42 deletions

View file

@ -1,6 +1,6 @@
.PHONY: all build up quick-restart restart logs get udp-server .PHONY: all build up quick-restart restart logs get udp-server
all: build quick-restart logs all: debug
setup: setup:
mkdir -p config certs mkdir -p config certs

View file

@ -3,7 +3,7 @@ package autocert
type CertState int type CertState int
const ( const (
CertStateValid CertState = 0 CertStateValid CertState = iota
CertStateExpired CertState = iota CertStateExpired
CertStateMismatch CertState = iota CertStateMismatch
) )

View file

@ -9,31 +9,11 @@ import (
U "github.com/yusing/go-proxy/utils" U "github.com/yusing/go-proxy/utils"
) )
type ProxyProperties struct {
DockerHost string `yaml:"-" json:"docker_host"`
ContainerName string `yaml:"-" json:"container_name"`
ImageName string `yaml:"-" json:"image_name"`
PublicPortMapping PortMapping `yaml:"-" json:"public_port_mapping"` // non-zero publicPort:types.Port
PrivatePortMapping PortMapping `yaml:"-" json:"private_port_mapping"` // privatePort:types.Port
NetworkMode string `yaml:"-" json:"network_mode"`
Aliases []string `yaml:"-" json:"aliases"`
IsExcluded bool `yaml:"-" json:"is_excluded"`
IdleTimeout string `yaml:"-" json:"idle_timeout"`
WakeTimeout string `yaml:"-" json:"wake_timeout"`
StopMethod string `yaml:"-" json:"stop_method"`
StopTimeout string `yaml:"-" json:"stop_timeout"` // stop_method = "stop" only
StopSignal string `yaml:"-" json:"stop_signal"` // stop_method = "stop" | "kill" only
Running bool `yaml:"-" json:"running"`
}
type Container struct { type Container struct {
*types.Container *types.Container
*ProxyProperties *ProxyProperties
} }
type PortMapping = map[string]types.Port
func FromDocker(c *types.Container, dockerHost string) (res Container) { func FromDocker(c *types.Container, dockerHost string) (res Container) {
res.Container = c res.Container = c
res.ProxyProperties = &ProxyProperties{ res.ProxyProperties = &ProxyProperties{
@ -119,9 +99,6 @@ func (c Container) getPublicPortMapping() PortMapping {
func (c Container) getPrivatePortMapping() PortMapping { func (c Container) getPrivatePortMapping() PortMapping {
res := make(PortMapping) res := make(PortMapping)
for _, v := range c.Ports { for _, v := range c.Ports {
if v.PublicPort == 0 {
continue
}
res[fmt.Sprint(v.PrivatePort)] = v res[fmt.Sprint(v.PrivatePort)] = v
} }
return res return res

View file

@ -0,0 +1,22 @@
package docker
import "github.com/docker/docker/api/types"
type PortMapping = map[string]types.Port
type ProxyProperties struct {
DockerHost string `yaml:"-" json:"docker_host"`
ContainerName string `yaml:"-" json:"container_name"`
ImageName string `yaml:"-" json:"image_name"`
PublicPortMapping PortMapping `yaml:"-" json:"public_port_mapping"` // non-zero publicPort:types.Port
PrivatePortMapping PortMapping `yaml:"-" json:"private_port_mapping"` // privatePort:types.Port
NetworkMode string `yaml:"-" json:"network_mode"`
Aliases []string `yaml:"-" json:"aliases"`
IsExcluded bool `yaml:"-" json:"is_excluded"`
IdleTimeout string `yaml:"-" json:"idle_timeout"`
WakeTimeout string `yaml:"-" json:"wake_timeout"`
StopMethod string `yaml:"-" json:"stop_method"`
StopTimeout string `yaml:"-" json:"stop_timeout"` // stop_method = "stop" only
StopSignal string `yaml:"-" json:"stop_signal"` // stop_method = "stop" | "kill" only
Running bool `yaml:"-" json:"running"`
}

View file

@ -139,17 +139,18 @@ func (p *DockerProvider) entriesFromContainerLabels(container D.Container) (M.Ra
// selecting correct host port // selecting correct host port
replacePrivPorts := func() { replacePrivPorts := func() {
if container.HostConfig.NetworkMode != "host" { if container.HostConfig.NetworkMode == "host" {
entries.RangeAll(func(_ string, entry *M.RawEntry) { return
entryPortSplit := strings.Split(entry.Port, ":")
n := len(entryPortSplit)
// if the port matches the proxy port, replace it with the public port
if p, ok := container.PrivatePortMapping[entryPortSplit[n-1]]; ok {
entryPortSplit[n-1] = fmt.Sprint(p.PublicPort)
entry.Port = strings.Join(entryPortSplit, ":")
}
})
} }
entries.RangeAll(func(_ string, entry *M.RawEntry) {
entryPortSplit := strings.Split(entry.Port, ":")
n := len(entryPortSplit)
// if the port matches the proxy port, replace it with the public port
if p, ok := container.PrivatePortMapping[entryPortSplit[n-1]]; ok {
entryPortSplit[n-1] = fmt.Sprint(p.PublicPort)
entry.Port = strings.Join(entryPortSplit, ":")
}
})
} }
replacePrivPorts() replacePrivPorts()

View file

@ -264,6 +264,7 @@ func TestImplicitExcludeNoExposedPort(t *testing.T) {
Ports: []types.Port{ Ports: []types.Port{
{Type: "tcp", PrivatePort: 6379, PublicPort: 0}, // not exposed {Type: "tcp", PrivatePort: 6379, PublicPort: 0}, // not exposed
}, },
State: "running",
}, "")) }, ""))
ExpectNoError(t, err.Error()) ExpectNoError(t, err.Error())
@ -271,7 +272,7 @@ func TestImplicitExcludeNoExposedPort(t *testing.T) {
ExpectFalse(t, ok) ExpectFalse(t, ok)
} }
func TestExcludeNonExposedPort(t *testing.T) { func TestNotExcludeSpecifiedPort(t *testing.T) {
var p DockerProvider var p DockerProvider
entries, err := p.entriesFromContainerLabels(D.FromDocker(&types.Container{ entries, err := p.entriesFromContainerLabels(D.FromDocker(&types.Container{
Image: "redis", Image: "redis",
@ -280,13 +281,13 @@ func TestExcludeNonExposedPort(t *testing.T) {
{Type: "tcp", PrivatePort: 6379, PublicPort: 0}, // not exposed {Type: "tcp", PrivatePort: 6379, PublicPort: 0}, // not exposed
}, },
Labels: map[string]string{ Labels: map[string]string{
"proxy.redis.port": "6379:6379", // should be excluded even specified "proxy.redis.port": "6379:6379", // but specified in label
}, },
}, "")) }, ""))
ExpectNoError(t, err.Error()) ExpectNoError(t, err.Error())
_, ok := entries.Load("redis") _, ok := entries.Load("redis")
ExpectFalse(t, ok) ExpectTrue(t, ok)
} }
func TestNotExcludeNonExposedPortHostNetwork(t *testing.T) { func TestNotExcludeNonExposedPortHostNetwork(t *testing.T) {
@ -298,7 +299,7 @@ func TestNotExcludeNonExposedPortHostNetwork(t *testing.T) {
{Type: "tcp", PrivatePort: 6379, PublicPort: 0}, // not exposed {Type: "tcp", PrivatePort: 6379, PublicPort: 0}, // not exposed
}, },
Labels: map[string]string{ Labels: map[string]string{
"proxy.redis.port": "6379:6379", // should be excluded even specified "proxy.redis.port": "6379:6379",
}, },
} }
cont.HostConfig.NetworkMode = "host" cont.HostConfig.NetworkMode = "host"

View file

@ -100,7 +100,6 @@ func Serialize(data any) (SerializedObject, E.NestedError) {
} }
} }
default: default:
// return nil, fmt.Errorf("unsupported type: %s", value.Kind())
return nil, E.Unsupported("type", value.Kind()) return nil, E.Unsupported("type", value.Kind())
} }