Skip to content

Commit 09c2546

Browse files
Merge pull request #25844 from ygalblum/quadlet-network-delete
Quadlet - allow deleting the network when stopping the service
2 parents f64204f + 0d4a148 commit 09c2546

File tree

5 files changed

+95
-17
lines changed

5 files changed

+95
-17
lines changed

docs/source/markdown/podman-systemd.unit.5.md

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1348,23 +1348,24 @@ particularly interesting when using special options to control network creation,
13481348

13491349
Valid options for `[Network]` are listed below:
13501350

1351-
| **[Network] options** | **podman network create equivalent** |
1352-
|-------------------------------------|--------------------------------------|
1353-
| ContainersConfModule=/etc/nvd\.conf | --module=/etc/nvd\.conf |
1354-
| DisableDNS=true | --disable-dns |
1355-
| DNS=192.168.55.1 | --dns=192.168.55.1 |
1356-
| Driver=bridge | --driver bridge |
1357-
| Gateway=192.168.55.3 | --gateway 192.168.55.3 |
1358-
| GlobalArgs=--log-level=debug | --log-level=debug |
1359-
| Internal=true | --internal |
1360-
| IPAMDriver=dhcp | --ipam-driver dhcp |
1361-
| IPRange=192.168.55.128/25 | --ip-range 192.168.55.128/25 |
1362-
| IPv6=true | --ipv6 |
1363-
| Label="XYZ" | --label "XYZ" |
1364-
| NetworkName=foo | podman network create foo |
1365-
| Options=isolate=true | --opt isolate=true |
1366-
| PodmanArgs=--dns=192.168.55.1 | --dns=192.168.55.1 |
1367-
| Subnet=192.5.0.0/16 | --subnet 192.5.0.0/16 |
1351+
| **[Network] options** | **podman network create equivalent** |
1352+
|-------------------------------------|-----------------------------------------------------------------|
1353+
| ContainersConfModule=/etc/nvd\.conf | --module=/etc/nvd\.conf |
1354+
| DisableDNS=true | --disable-dns |
1355+
| DNS=192.168.55.1 | --dns=192.168.55.1 |
1356+
| Driver=bridge | --driver bridge |
1357+
| Gateway=192.168.55.3 | --gateway 192.168.55.3 |
1358+
| GlobalArgs=--log-level=debug | --log-level=debug |
1359+
| Internal=true | --internal |
1360+
| IPAMDriver=dhcp | --ipam-driver dhcp |
1361+
| IPRange=192.168.55.128/25 | --ip-range 192.168.55.128/25 |
1362+
| IPv6=true | --ipv6 |
1363+
| Label="XYZ" | --label "XYZ" |
1364+
| NetworkDeleteOnStop=true | Add ExecStopPost to delete the network when the unit is stopped |
1365+
| NetworkName=foo | podman network create foo |
1366+
| Options=isolate=true | --opt isolate=true |
1367+
| PodmanArgs=--dns=192.168.55.1 | --dns=192.168.55.1 |
1368+
| Subnet=192.5.0.0/16 | --subnet 192.5.0.0/16 |
13681369

13691370
Supported keys in `[Network]` section are:
13701371

@@ -1447,6 +1448,10 @@ Set one or more OCI labels on the network. The format is a list of
14471448

14481449
This key can be listed multiple times.
14491450

1451+
### `NetworkDeleteOnStop=` (defaults to `false`)
1452+
1453+
When set to `true` the network is deleted when the service is stopped
1454+
14501455
### `NetworkName=`
14511456

14521457
The (optional) name of the Podman network. If this is not specified, the default value of

pkg/systemd/quadlet/quadlet.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ const (
126126
KeyMount = "Mount"
127127
KeyNetwork = "Network"
128128
KeyNetworkAlias = "NetworkAlias"
129+
KeyNetworkDeleteOnStop = "NetworkDeleteOnStop"
129130
KeyNetworkName = "NetworkName"
130131
KeyNoNewPrivileges = "NoNewPrivileges"
131132
KeyNotify = "Notify"
@@ -327,6 +328,7 @@ var (
327328
KeyIPv6: true,
328329
KeyInternal: true,
329330
KeyNetworkName: true,
331+
KeyNetworkDeleteOnStop: true,
330332
KeyOptions: true,
331333
KeyServiceName: true,
332334
KeySubnet: true,
@@ -948,6 +950,12 @@ func ConvertNetwork(network *parser.UnitFile, name string, unitsInfoMap map[stri
948950
// Need the containers filesystem mounted to start podman
949951
service.Add(UnitGroup, "RequiresMountsFor", "%t/containers")
950952

953+
if network.LookupBooleanWithDefault(NetworkGroup, KeyNetworkDeleteOnStop, false) {
954+
serviceStopPostCmd := createBasePodmanCommand(network, NetworkGroup)
955+
serviceStopPostCmd.add("network", "rm", networkName)
956+
service.AddCmdline(ServiceGroup, "ExecStopPost", serviceStopPostCmd.Args)
957+
}
958+
951959
podman := createBasePodmanCommand(network, NetworkGroup)
952960

953961
podman.add("network", "create", "--ignore")

test/e2e/quadlet/delete.network

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
## assert-podman-stop-post-args "network"
2+
## assert-podman-stop-post-args "rm"
3+
## assert-podman-stop-post-final-args "test-network"
4+
5+
[Network]
6+
NetworkName=test-network
7+
NetworkDeleteOnStop=true

test/e2e/quadlet_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,6 +1017,7 @@ BOGUS=foo
10171017
Entry("Network - subnet, gateway and range", "subnet-trio.network"),
10181018
Entry("Network - global args", "globalargs.network"),
10191019
Entry("Network - Containers Conf Modules", "containersconfmodule.network"),
1020+
Entry("Network - Delete on stop", "delete.network"),
10201021

10211022
Entry("Image - Basic", "basic.image"),
10221023
Entry("Image - Architecture", "arch.image"),

test/system/252-quadlet.bats

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,63 @@ EOF
517517
run_podman network rm $network_name
518518
}
519519

520+
@test "quadlet - network delete with dependencies" {
521+
# Save the unit name to use as the network for the container
522+
local network_name=$(safename)
523+
local quadlet_network_unit=dep_$(safename).network
524+
local quadlet_network_file=$PODMAN_TMPDIR/${quadlet_network_unit}
525+
cat > $quadlet_network_file <<EOF
526+
[Network]
527+
NetworkName=${network_name}
528+
NetworkDeleteOnStop=true
529+
EOF
530+
531+
local quadlet_tmpdir=$(mktemp -d --tmpdir=$PODMAN_TMPDIR quadlet.XXXXXX)
532+
# Have quadlet create the systemd unit file for the network unit
533+
run_quadlet "$quadlet_network_file" "$quadlet_tmpdir"
534+
535+
# Save the network service name since the variable will be overwritten
536+
local network_service=$QUADLET_SERVICE_NAME
537+
538+
local quadlet_container_file=$PODMAN_TMPDIR/user_$(safename).container
539+
cat > $quadlet_container_file <<EOF
540+
[Container]
541+
Image=$IMAGE
542+
Exec=top
543+
Network=$quadlet_network_unit
544+
EOF
545+
546+
run_quadlet "$quadlet_container_file" "$quadlet_tmpdir"
547+
548+
# Save the container service name for readability
549+
local container_service=$QUADLET_SERVICE_NAME
550+
551+
# Network should not exist
552+
run_podman 1 network exists $network_name
553+
554+
# Start the container service
555+
service_setup $container_service
556+
557+
# Network system unit should be active
558+
run systemctl show --property=ActiveState "$network_service"
559+
assert "$output" = "ActiveState=active" \
560+
"network should be active via dependency"
561+
562+
# Network should exist
563+
run_podman network exists $network_name
564+
565+
# Stop the Network Service
566+
service_cleanup $network_service inactive
567+
568+
# Container system unit should be active
569+
run systemctl show --property=ActiveState "$container_service"
570+
assert "$output" = "ActiveState=failed" \
571+
"container service should be failed via dependency"
572+
573+
# Network should not exist
574+
run_podman 1 network exists $network_name
575+
}
576+
520577
# A quadlet container depends on a quadlet network
521578
@test "quadlet - network dependency" {
522579
# Save the unit name to use as the network for the container

0 commit comments

Comments
 (0)