mirror of
https://github.com/containers/podman.git
synced 2025-05-20 00:27:03 +08:00

Support generating systemd unit files for a pod. Podman generates one unit file for the pod including the PID file for the infra container's conmon process and one unit file for each container (excluding the infra container). Note that this change implies refactorings in the `pkg/systemdgen` API. Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
201 lines
6.2 KiB
Go
201 lines
6.2 KiB
Go
package systemdgen
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestValidateRestartPolicy(t *testing.T) {
|
|
type ContainerInfo struct {
|
|
restart string
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
ContainerInfo ContainerInfo
|
|
wantErr bool
|
|
}{
|
|
{"good-on", ContainerInfo{restart: "no"}, false},
|
|
{"good-on-success", ContainerInfo{restart: "on-success"}, false},
|
|
{"good-on-failure", ContainerInfo{restart: "on-failure"}, false},
|
|
{"good-on-abnormal", ContainerInfo{restart: "on-abnormal"}, false},
|
|
{"good-on-watchdog", ContainerInfo{restart: "on-watchdog"}, false},
|
|
{"good-on-abort", ContainerInfo{restart: "on-abort"}, false},
|
|
{"good-always", ContainerInfo{restart: "always"}, false},
|
|
{"fail", ContainerInfo{restart: "foobar"}, true},
|
|
{"failblank", ContainerInfo{restart: ""}, true},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if err := validateRestartPolicy(tt.ContainerInfo.restart); (err != nil) != tt.wantErr {
|
|
t.Errorf("ValidateRestartPolicy() error = %v, wantErr %v", err, tt.wantErr)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestCreateContainerSystemdUnit(t *testing.T) {
|
|
goodID := `# container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401.service
|
|
# autogenerated by Podman CI
|
|
|
|
[Unit]
|
|
Description=Podman container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401.service
|
|
Documentation=man:podman-generate-systemd(1)
|
|
|
|
[Service]
|
|
Restart=always
|
|
ExecStart=/usr/bin/podman start 639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401
|
|
ExecStop=/usr/bin/podman stop -t 10 639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401
|
|
KillMode=none
|
|
Type=forking
|
|
PIDFile=/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target`
|
|
|
|
goodName := `# container-foobar.service
|
|
# autogenerated by Podman CI
|
|
|
|
[Unit]
|
|
Description=Podman container-foobar.service
|
|
Documentation=man:podman-generate-systemd(1)
|
|
|
|
[Service]
|
|
Restart=always
|
|
ExecStart=/usr/bin/podman start foobar
|
|
ExecStop=/usr/bin/podman stop -t 10 foobar
|
|
KillMode=none
|
|
Type=forking
|
|
PIDFile=/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target`
|
|
|
|
goodNameBoundTo := `# container-foobar.service
|
|
# autogenerated by Podman CI
|
|
|
|
[Unit]
|
|
Description=Podman container-foobar.service
|
|
Documentation=man:podman-generate-systemd(1)
|
|
RefuseManualStart=yes
|
|
RefuseManualStop=yes
|
|
BindsTo=a.service b.service c.service pod.service
|
|
After=a.service b.service c.service pod.service
|
|
|
|
[Service]
|
|
Restart=always
|
|
ExecStart=/usr/bin/podman start foobar
|
|
ExecStop=/usr/bin/podman stop -t 10 foobar
|
|
KillMode=none
|
|
Type=forking
|
|
PIDFile=/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target`
|
|
|
|
podGoodName := `# pod-123abc.service
|
|
# autogenerated by Podman CI
|
|
|
|
[Unit]
|
|
Description=Podman pod-123abc.service
|
|
Documentation=man:podman-generate-systemd(1)
|
|
Requires=container-1.service container-2.service
|
|
Before=container-1.service container-2.service
|
|
|
|
[Service]
|
|
Restart=always
|
|
ExecStart=/usr/bin/podman start jadda-jadda-infra
|
|
ExecStop=/usr/bin/podman stop -t 10 jadda-jadda-infra
|
|
KillMode=none
|
|
Type=forking
|
|
PIDFile=/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target`
|
|
|
|
tests := []struct {
|
|
name string
|
|
info ContainerInfo
|
|
want string
|
|
wantErr bool
|
|
}{
|
|
|
|
{"good with id",
|
|
ContainerInfo{
|
|
Executable: "/usr/bin/podman",
|
|
ServiceName: "container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401",
|
|
ContainerName: "639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401",
|
|
RestartPolicy: "always",
|
|
PIDFile: "/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid",
|
|
StopTimeout: 10,
|
|
PodmanVersion: "CI",
|
|
},
|
|
goodID,
|
|
false,
|
|
},
|
|
{"good with name",
|
|
ContainerInfo{
|
|
Executable: "/usr/bin/podman",
|
|
ServiceName: "container-foobar",
|
|
ContainerName: "foobar",
|
|
RestartPolicy: "always",
|
|
PIDFile: "/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid",
|
|
StopTimeout: 10,
|
|
PodmanVersion: "CI",
|
|
},
|
|
goodName,
|
|
false,
|
|
},
|
|
{"good with name and bound to",
|
|
ContainerInfo{
|
|
Executable: "/usr/bin/podman",
|
|
ServiceName: "container-foobar",
|
|
ContainerName: "foobar",
|
|
RestartPolicy: "always",
|
|
PIDFile: "/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid",
|
|
StopTimeout: 10,
|
|
PodmanVersion: "CI",
|
|
BoundToServices: []string{"pod", "a", "b", "c"},
|
|
},
|
|
goodNameBoundTo,
|
|
false,
|
|
},
|
|
{"pod",
|
|
ContainerInfo{
|
|
Executable: "/usr/bin/podman",
|
|
ServiceName: "pod-123abc",
|
|
ContainerName: "jadda-jadda-infra",
|
|
RestartPolicy: "always",
|
|
PIDFile: "/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid",
|
|
StopTimeout: 10,
|
|
PodmanVersion: "CI",
|
|
RequiredServices: []string{"container-1", "container-2"},
|
|
},
|
|
podGoodName,
|
|
false,
|
|
},
|
|
{"bad restart policy",
|
|
ContainerInfo{
|
|
Executable: "/usr/bin/podman",
|
|
ServiceName: "639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401",
|
|
RestartPolicy: "never",
|
|
PIDFile: "/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid",
|
|
StopTimeout: 10,
|
|
PodmanVersion: "CI",
|
|
},
|
|
"",
|
|
true,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := CreateContainerSystemdUnit(&tt.info, false)
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("CreateContainerSystemdUnit() error = \n%v, wantErr \n%v", err, tt.wantErr)
|
|
return
|
|
}
|
|
if got != tt.want {
|
|
t.Errorf("CreateContainerSystemdUnit() = \n%v, want \n%v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|