mirror of
https://github.com/containers/podman.git
synced 2025-05-20 16:47:39 +08:00
Merge pull request #24794 from ruihe774/fix-quadlet-container-network
quadlet: fix inter-dependency of containers in `Network=`
This commit is contained in:
@ -591,6 +591,8 @@ func generateUnitsInfoMap(units []*parser.UnitFile) map[string]*quadlet.UnitInfo
|
||||
switch {
|
||||
case strings.HasSuffix(unit.Filename, ".container"):
|
||||
serviceName = quadlet.GetContainerServiceName(unit)
|
||||
// Prefill resouceNames for .container files. This solves network reusing.
|
||||
resourceName = quadlet.GetContainerResourceName(unit)
|
||||
case strings.HasSuffix(unit.Filename, ".volume"):
|
||||
serviceName = quadlet.GetVolumeServiceName(unit)
|
||||
case strings.HasSuffix(unit.Filename, ".kube"):
|
||||
|
@ -559,15 +559,7 @@ func ConvertContainer(container *parser.UnitFile, isUser bool, unitsInfoMap map[
|
||||
}
|
||||
}
|
||||
|
||||
containerName, ok := container.Lookup(ContainerGroup, KeyContainerName)
|
||||
if !ok || len(containerName) == 0 {
|
||||
// By default, We want to name the container by the service name
|
||||
if strings.Contains(container.Filename, "@") {
|
||||
containerName = "systemd-%p_%i"
|
||||
} else {
|
||||
containerName = "systemd-%N"
|
||||
}
|
||||
}
|
||||
containerName := getContainerName(container)
|
||||
|
||||
// Set PODMAN_SYSTEMD_UNIT so that podman auto-update can restart the service.
|
||||
service.Add(ServiceGroup, "Environment", "PODMAN_SYSTEMD_UNIT=%n")
|
||||
@ -868,14 +860,37 @@ func ConvertContainer(container *parser.UnitFile, isUser bool, unitsInfoMap map[
|
||||
|
||||
service.AddCmdline(ServiceGroup, "ExecStart", podman.Args)
|
||||
|
||||
return service, nil
|
||||
}
|
||||
|
||||
// Get the unresolved container name that may contain '%'.
|
||||
func getContainerName(container *parser.UnitFile) string {
|
||||
containerName, ok := container.Lookup(ContainerGroup, KeyContainerName)
|
||||
if !ok || len(containerName) == 0 {
|
||||
// By default, We want to name the container by the service name.
|
||||
if strings.Contains(container.Filename, "@") {
|
||||
containerName = "systemd-%p_%i"
|
||||
} else {
|
||||
containerName = "systemd-%N"
|
||||
}
|
||||
}
|
||||
return containerName
|
||||
}
|
||||
|
||||
// Get the resolved container name that contains no '%'.
|
||||
// Returns an empty string if not resolvable.
|
||||
func GetContainerResourceName(container *parser.UnitFile) string {
|
||||
containerName := getContainerName(container)
|
||||
|
||||
// XXX: only %N is handled.
|
||||
// it is difficult to properly implement specifiers handling without consulting systemd.
|
||||
resourceName := strings.ReplaceAll(containerName, "%N", unitInfo.ServiceName)
|
||||
if !strings.Contains(resourceName, "%") {
|
||||
unitInfo.ResourceName = resourceName
|
||||
}
|
||||
resourceName := strings.ReplaceAll(containerName, "%N", GetContainerServiceName(container))
|
||||
|
||||
return service, nil
|
||||
if !strings.Contains(resourceName, "%") {
|
||||
return resourceName
|
||||
} else {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
func defaultOneshotServiceGroup(service *parser.UnitFile, remainAfterExit bool) {
|
||||
|
7
test/e2e/quadlet/a.network.reuse.container
Normal file
7
test/e2e/quadlet/a.network.reuse.container
Normal file
@ -0,0 +1,7 @@
|
||||
## assert-podman-args "--network" "container:systemd-basic"
|
||||
## assert-key-is "Unit" "Requires" "basic.service"
|
||||
## assert-key-is-regex "Unit" "After" "network-online.target|podman-user-wait-network-online.service" "basic.service"
|
||||
|
||||
[Container]
|
||||
Image=localhost/imagename
|
||||
Network=basic.container
|
7
test/e2e/quadlet/a.network.reuse.name.container
Normal file
7
test/e2e/quadlet/a.network.reuse.name.container
Normal file
@ -0,0 +1,7 @@
|
||||
## assert-podman-args "--network" "container:foobar"
|
||||
## assert-key-is "Unit" "Requires" "name.service"
|
||||
## assert-key-is-regex "Unit" "After" "network-online.target|podman-user-wait-network-online.service" "name.service"
|
||||
|
||||
[Container]
|
||||
Image=localhost/imagename
|
||||
Network=name.container
|
@ -1109,6 +1109,8 @@ BOGUS=foo
|
||||
Entry("Container - Quadlet build with multiple tags", "build.multiple-tags.container", []string{"multiple-tags.build"}),
|
||||
Entry("Container - Reuse another container's network", "network.reuse.container", []string{"basic.container"}),
|
||||
Entry("Container - Reuse another named container's network", "network.reuse.name.container", []string{"name.container"}),
|
||||
Entry("Container - Reuse another container's network", "a.network.reuse.container", []string{"basic.container"}),
|
||||
Entry("Container - Reuse another named container's network", "a.network.reuse.name.container", []string{"name.container"}),
|
||||
|
||||
Entry("Volume - Quadlet image (.build)", "build.quadlet.volume", []string{"basic.build"}),
|
||||
Entry("Volume - Quadlet image (.image)", "image.quadlet.volume", []string{"basic.image"}),
|
||||
|
Reference in New Issue
Block a user