Skip to content

Commit 0d4a148

Browse files
committed
Quadlet - allow deleting the network when stopping the service
Signed-off-by: Ygal Blum <[email protected]>
1 parent ce7db6e commit 0d4a148

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
@@ -1330,23 +1330,24 @@ particularly interesting when using special options to control network creation,
13301330

13311331
Valid options for `[Network]` are listed below:
13321332

1333-
| **[Network] options** | **podman network create equivalent** |
1334-
|-------------------------------------|--------------------------------------|
1335-
| ContainersConfModule=/etc/nvd\.conf | --module=/etc/nvd\.conf |
1336-
| DisableDNS=true | --disable-dns |
1337-
| DNS=192.168.55.1 | --dns=192.168.55.1 |
1338-
| Driver=bridge | --driver bridge |
1339-
| Gateway=192.168.55.3 | --gateway 192.168.55.3 |
1340-
| GlobalArgs=--log-level=debug | --log-level=debug |
1341-
| Internal=true | --internal |
1342-
| IPAMDriver=dhcp | --ipam-driver dhcp |
1343-
| IPRange=192.168.55.128/25 | --ip-range 192.168.55.128/25 |
1344-
| IPv6=true | --ipv6 |
1345-
| Label="XYZ" | --label "XYZ" |
1346-
| NetworkName=foo | podman network create foo |
1347-
| Options=isolate=true | --opt isolate=true |
1348-
| PodmanArgs=--dns=192.168.55.1 | --dns=192.168.55.1 |
1349-
| Subnet=192.5.0.0/16 | --subnet 192.5.0.0/16 |
1333+
| **[Network] options** | **podman network create equivalent** |
1334+
|-------------------------------------|-----------------------------------------------------------------|
1335+
| ContainersConfModule=/etc/nvd\.conf | --module=/etc/nvd\.conf |
1336+
| DisableDNS=true | --disable-dns |
1337+
| DNS=192.168.55.1 | --dns=192.168.55.1 |
1338+
| Driver=bridge | --driver bridge |
1339+
| Gateway=192.168.55.3 | --gateway 192.168.55.3 |
1340+
| GlobalArgs=--log-level=debug | --log-level=debug |
1341+
| Internal=true | --internal |
1342+
| IPAMDriver=dhcp | --ipam-driver dhcp |
1343+
| IPRange=192.168.55.128/25 | --ip-range 192.168.55.128/25 |
1344+
| IPv6=true | --ipv6 |
1345+
| Label="XYZ" | --label "XYZ" |
1346+
| NetworkDeleteOnStop=true | Add ExecStopPost to delete the network when the unit is stopped |
1347+
| NetworkName=foo | podman network create foo |
1348+
| Options=isolate=true | --opt isolate=true |
1349+
| PodmanArgs=--dns=192.168.55.1 | --dns=192.168.55.1 |
1350+
| Subnet=192.5.0.0/16 | --subnet 192.5.0.0/16 |
13501351

13511352
Supported keys in `[Network]` section are:
13521353

@@ -1429,6 +1430,10 @@ Set one or more OCI labels on the network. The format is a list of
14291430

14301431
This key can be listed multiple times.
14311432

1433+
### `NetworkDeleteOnStop=` (defaults to `false`)
1434+
1435+
When set to `true` the network is deleted when the service is stopped
1436+
14321437
### `NetworkName=`
14331438

14341439
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"
@@ -323,6 +324,7 @@ var (
323324
KeyIPv6: true,
324325
KeyInternal: true,
325326
KeyNetworkName: true,
327+
KeyNetworkDeleteOnStop: true,
326328
KeyOptions: true,
327329
KeyServiceName: true,
328330
KeySubnet: true,
@@ -940,6 +942,12 @@ func ConvertNetwork(network *parser.UnitFile, name string, unitsInfoMap map[stri
940942
// Need the containers filesystem mounted to start podman
941943
service.Add(UnitGroup, "RequiresMountsFor", "%t/containers")
942944

945+
if network.LookupBooleanWithDefault(NetworkGroup, KeyNetworkDeleteOnStop, false) {
946+
serviceStopPostCmd := createBasePodmanCommand(network, NetworkGroup)
947+
serviceStopPostCmd.add("network", "rm", networkName)
948+
service.AddCmdline(ServiceGroup, "ExecStopPost", serviceStopPostCmd.Args)
949+
}
950+
943951
podman := createBasePodmanCommand(network, NetworkGroup)
944952

945953
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
@@ -979,6 +979,7 @@ BOGUS=foo
979979
Entry("Network - subnet, gateway and range", "subnet-trio.network"),
980980
Entry("Network - global args", "globalargs.network"),
981981
Entry("Network - Containers Conf Modules", "containersconfmodule.network"),
982+
Entry("Network - Delete on stop", "delete.network"),
982983

983984
Entry("Image - Basic", "basic.image"),
984985
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)