chore: trim spaces for x-caddy, diff Caddy configs when comparing service specs

This commit is contained in:
Pasha Sviderski
2025-08-13 19:27:40 +10:00
parent 12c07812a2
commit dd7bc6c982
5 changed files with 101 additions and 11 deletions
+13
View File
@@ -1,8 +1,21 @@
package api package api
import "strings"
// CaddySpec is the Caddy reverse proxy configuration for a service. // CaddySpec is the Caddy reverse proxy configuration for a service.
type CaddySpec struct { type CaddySpec struct {
// Config contains the Caddy config (Caddyfile) content. It must not conflict with the Caddy configs // Config contains the Caddy config (Caddyfile) content. It must not conflict with the Caddy configs
// of other services. // of other services.
Config string Config string
} }
func (c *CaddySpec) Equals(other *CaddySpec) bool {
if c == nil {
return other == nil || strings.TrimSpace(other.Config) == ""
}
if other == nil {
return strings.TrimSpace(c.Config) == ""
}
return strings.TrimSpace(c.Config) == strings.TrimSpace(other.Config)
}
+3 -1
View File
@@ -84,9 +84,11 @@ func transformServicesCaddyExtension(project *types.Project) (*types.Project, er
} }
caddy.Config = string(content) caddy.Config = string(content)
service.Extensions[CaddyExtensionKey] = caddy
} }
caddy.Config = strings.TrimSpace(caddy.Config)
service.Extensions[CaddyExtensionKey] = caddy
return service, nil return service, nil
}) })
} }
+38 -4
View File
@@ -27,8 +27,25 @@ services:
`, `,
wantConfig: `example.com { wantConfig: `example.com {
reverse_proxy web:80 reverse_proxy web:80
} }`,
},
{
name: "x-caddy as string with extra spaces",
composeYAML: `
services:
web:
image: nginx
x-caddy: |+
example.com {
reverse_proxy web:80
}
`, `,
wantConfig: `example.com {
reverse_proxy web:80
}`,
}, },
{ {
name: "x-caddy as object with config field", name: "x-caddy as object with config field",
@@ -44,8 +61,26 @@ services:
`, `,
wantConfig: `example.com { wantConfig: `example.com {
reverse_proxy web:80 reverse_proxy web:80
} }`,
},
{
name: "x-caddy as object with config field and extra spaces",
composeYAML: `
services:
web:
image: nginx
x-caddy:
config: |+
example.com {
reverse_proxy web:80
}
`, `,
wantConfig: `example.com {
reverse_proxy web:80
}`,
}, },
{ {
name: "x-caddy with path to Caddyfile", name: "x-caddy with path to Caddyfile",
@@ -57,8 +92,7 @@ services:
`, `,
wantConfig: `test.example.com { wantConfig: `test.example.com {
reverse_proxy test:8000 reverse_proxy test:8000
} }`,
`,
}, },
{ {
name: "x-caddy with empty object", name: "x-caddy with empty object",
+43 -6
View File
@@ -264,8 +264,7 @@ func TestServiceSpecFromCompose(t *testing.T) {
Caddy: &api.CaddySpec{ Caddy: &api.CaddySpec{
Config: `test-caddy-config.example.com { Config: `test-caddy-config.example.com {
reverse_proxy {{ upstreams 80 }} reverse_proxy {{ upstreams 80 }}
} }`,
`,
}, },
}, },
}, },
@@ -315,8 +314,27 @@ services:
want: &api.CaddySpec{ want: &api.CaddySpec{
Config: `example.com { Config: `example.com {
reverse_proxy web:80 reverse_proxy web:80
} }`,
},
},
{
name: "x-caddy as string with extra spaces",
composeYAML: `
services:
web:
image: nginx
x-caddy: |+
example.com {
reverse_proxy web:80
}
`, `,
want: &api.CaddySpec{
Config: `example.com {
reverse_proxy web:80
}`,
}, },
}, },
{ {
@@ -334,8 +352,28 @@ services:
want: &api.CaddySpec{ want: &api.CaddySpec{
Config: `example.com { Config: `example.com {
reverse_proxy web:80 reverse_proxy web:80
} }`,
},
},
{
name: "x-caddy as object with config field and extra spaces",
composeYAML: `
services:
web:
image: nginx
x-caddy:
config: |+
example.com {
reverse_proxy web:80
}
`, `,
want: &api.CaddySpec{
Config: `example.com {
reverse_proxy web:80
}`,
}, },
}, },
{ {
@@ -349,8 +387,7 @@ services:
want: &api.CaddySpec{ want: &api.CaddySpec{
Config: `test.example.com { Config: `test.example.com {
reverse_proxy test:8000 reverse_proxy test:8000
} }`,
`,
}, },
}, },
{ {
+4
View File
@@ -72,6 +72,10 @@ func EvalContainerSpecChange(current api.ServiceSpec, new api.ServiceSpec) Conta
} }
// Check if any mutable properties changed. // Check if any mutable properties changed.
if !current.Caddy.Equals(new.Caddy) {
return ContainerNeedsRecreate
}
if !reflect.DeepEqual(current.Container.Resources, newResources) { if !reflect.DeepEqual(current.Container.Resources, newResources) {
return ContainerNeedsUpdate return ContainerNeedsUpdate
} }