github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/pkg/systemd/generate/containers_test.go (about) 1 package generate 2 3 import ( 4 "testing" 5 6 "github.com/containers/podman/v2/pkg/domain/entities" 7 ) 8 9 func TestValidateRestartPolicyContainer(t *testing.T) { 10 type containerInfo struct { 11 restart string 12 } 13 tests := []struct { 14 name string 15 containerInfo containerInfo 16 wantErr bool 17 }{ 18 {"good-on", containerInfo{restart: "no"}, false}, 19 {"good-on-success", containerInfo{restart: "on-success"}, false}, 20 {"good-on-failure", containerInfo{restart: "on-failure"}, false}, 21 {"good-on-abnormal", containerInfo{restart: "on-abnormal"}, false}, 22 {"good-on-watchdog", containerInfo{restart: "on-watchdog"}, false}, 23 {"good-on-abort", containerInfo{restart: "on-abort"}, false}, 24 {"good-always", containerInfo{restart: "always"}, false}, 25 {"fail", containerInfo{restart: "foobar"}, true}, 26 {"failblank", containerInfo{restart: ""}, true}, 27 } 28 for _, tt := range tests { 29 test := tt 30 t.Run(tt.name, func(t *testing.T) { 31 if err := validateRestartPolicy(test.containerInfo.restart); (err != nil) != test.wantErr { 32 t.Errorf("ValidateRestartPolicy() error = %v, wantErr %v", err, test.wantErr) 33 } 34 }) 35 } 36 } 37 38 func TestCreateContainerSystemdUnit(t *testing.T) { 39 goodID := `# container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401.service 40 # autogenerated by Podman CI 41 42 [Unit] 43 Description=Podman container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401.service 44 Documentation=man:podman-generate-systemd(1) 45 Wants=network.target 46 After=network-online.target 47 48 [Service] 49 Environment=PODMAN_SYSTEMD_UNIT=%n 50 Restart=always 51 ExecStart=/usr/bin/podman start 639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401 52 ExecStop=/usr/bin/podman stop -t 10 639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401 53 ExecStopPost=/usr/bin/podman stop -t 10 639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401 54 PIDFile=/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid 55 KillMode=none 56 Type=forking 57 58 [Install] 59 WantedBy=multi-user.target default.target 60 ` 61 62 goodName := `# container-foobar.service 63 # autogenerated by Podman CI 64 65 [Unit] 66 Description=Podman container-foobar.service 67 Documentation=man:podman-generate-systemd(1) 68 Wants=network.target 69 After=network-online.target 70 71 [Service] 72 Environment=PODMAN_SYSTEMD_UNIT=%n 73 Restart=always 74 ExecStart=/usr/bin/podman start foobar 75 ExecStop=/usr/bin/podman stop -t 10 foobar 76 ExecStopPost=/usr/bin/podman stop -t 10 foobar 77 PIDFile=/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid 78 KillMode=none 79 Type=forking 80 81 [Install] 82 WantedBy=multi-user.target default.target 83 ` 84 85 goodNameBoundTo := `# container-foobar.service 86 # autogenerated by Podman CI 87 88 [Unit] 89 Description=Podman container-foobar.service 90 Documentation=man:podman-generate-systemd(1) 91 Wants=network.target 92 After=network-online.target 93 BindsTo=a.service b.service c.service pod.service 94 After=a.service b.service c.service pod.service 95 96 [Service] 97 Environment=PODMAN_SYSTEMD_UNIT=%n 98 Restart=always 99 ExecStart=/usr/bin/podman start foobar 100 ExecStop=/usr/bin/podman stop -t 10 foobar 101 ExecStopPost=/usr/bin/podman stop -t 10 foobar 102 PIDFile=/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid 103 KillMode=none 104 Type=forking 105 106 [Install] 107 WantedBy=multi-user.target default.target 108 ` 109 110 goodWithNameAndGeneric := `# jadda-jadda.service 111 # autogenerated by Podman CI 112 113 [Unit] 114 Description=Podman jadda-jadda.service 115 Documentation=man:podman-generate-systemd(1) 116 Wants=network.target 117 After=network-online.target 118 119 [Service] 120 Environment=PODMAN_SYSTEMD_UNIT=%n 121 Restart=always 122 ExecStartPre=/bin/rm -f %t/jadda-jadda.pid %t/jadda-jadda.ctr-id 123 ExecStart=/usr/bin/podman run --conmon-pidfile %t/jadda-jadda.pid --cidfile %t/jadda-jadda.ctr-id --cgroups=no-conmon -d --replace --name jadda-jadda --hostname hello-world awesome-image:latest command arg1 ... argN "foo=arg \"with \" space" 124 ExecStop=/usr/bin/podman stop --ignore --cidfile %t/jadda-jadda.ctr-id -t 42 125 ExecStopPost=/usr/bin/podman rm --ignore -f --cidfile %t/jadda-jadda.ctr-id 126 PIDFile=%t/jadda-jadda.pid 127 KillMode=none 128 Type=forking 129 130 [Install] 131 WantedBy=multi-user.target default.target 132 ` 133 134 goodWithExplicitShortDetachParam := `# jadda-jadda.service 135 # autogenerated by Podman CI 136 137 [Unit] 138 Description=Podman jadda-jadda.service 139 Documentation=man:podman-generate-systemd(1) 140 Wants=network.target 141 After=network-online.target 142 143 [Service] 144 Environment=PODMAN_SYSTEMD_UNIT=%n 145 Restart=always 146 ExecStartPre=/bin/rm -f %t/jadda-jadda.pid %t/jadda-jadda.ctr-id 147 ExecStart=/usr/bin/podman run --conmon-pidfile %t/jadda-jadda.pid --cidfile %t/jadda-jadda.ctr-id --cgroups=no-conmon --replace -d --name jadda-jadda --hostname hello-world awesome-image:latest command arg1 ... argN 148 ExecStop=/usr/bin/podman stop --ignore --cidfile %t/jadda-jadda.ctr-id -t 42 149 ExecStopPost=/usr/bin/podman rm --ignore -f --cidfile %t/jadda-jadda.ctr-id 150 PIDFile=%t/jadda-jadda.pid 151 KillMode=none 152 Type=forking 153 154 [Install] 155 WantedBy=multi-user.target default.target 156 ` 157 158 goodNameNewWithPodFile := `# jadda-jadda.service 159 # autogenerated by Podman CI 160 161 [Unit] 162 Description=Podman jadda-jadda.service 163 Documentation=man:podman-generate-systemd(1) 164 Wants=network.target 165 After=network-online.target 166 167 [Service] 168 Environment=PODMAN_SYSTEMD_UNIT=%n 169 Restart=always 170 ExecStartPre=/bin/rm -f %t/jadda-jadda.pid %t/jadda-jadda.ctr-id 171 ExecStart=/usr/bin/podman run --conmon-pidfile %t/jadda-jadda.pid --cidfile %t/jadda-jadda.ctr-id --cgroups=no-conmon --pod-id-file /tmp/pod-foobar.pod-id-file --replace -d --name jadda-jadda --hostname hello-world awesome-image:latest command arg1 ... argN 172 ExecStop=/usr/bin/podman stop --ignore --cidfile %t/jadda-jadda.ctr-id -t 42 173 ExecStopPost=/usr/bin/podman rm --ignore -f --cidfile %t/jadda-jadda.ctr-id 174 PIDFile=%t/jadda-jadda.pid 175 KillMode=none 176 Type=forking 177 178 [Install] 179 WantedBy=multi-user.target default.target 180 ` 181 182 goodNameNewDetach := `# jadda-jadda.service 183 # autogenerated by Podman CI 184 185 [Unit] 186 Description=Podman jadda-jadda.service 187 Documentation=man:podman-generate-systemd(1) 188 Wants=network.target 189 After=network-online.target 190 191 [Service] 192 Environment=PODMAN_SYSTEMD_UNIT=%n 193 Restart=always 194 ExecStartPre=/bin/rm -f %t/jadda-jadda.pid %t/jadda-jadda.ctr-id 195 ExecStart=/usr/bin/podman run --conmon-pidfile %t/jadda-jadda.pid --cidfile %t/jadda-jadda.ctr-id --cgroups=no-conmon --replace --detach --name jadda-jadda --hostname hello-world awesome-image:latest command arg1 ... argN 196 ExecStop=/usr/bin/podman stop --ignore --cidfile %t/jadda-jadda.ctr-id -t 42 197 ExecStopPost=/usr/bin/podman rm --ignore -f --cidfile %t/jadda-jadda.ctr-id 198 PIDFile=%t/jadda-jadda.pid 199 KillMode=none 200 Type=forking 201 202 [Install] 203 WantedBy=multi-user.target default.target 204 ` 205 206 goodIDNew := `# container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401.service 207 # autogenerated by Podman CI 208 209 [Unit] 210 Description=Podman container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401.service 211 Documentation=man:podman-generate-systemd(1) 212 Wants=network.target 213 After=network-online.target 214 215 [Service] 216 Environment=PODMAN_SYSTEMD_UNIT=%n 217 Restart=always 218 ExecStartPre=/bin/rm -f %t/container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401.pid %t/container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401.ctr-id 219 ExecStart=/usr/bin/podman run --conmon-pidfile %t/container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401.pid --cidfile %t/container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401.ctr-id --cgroups=no-conmon -d awesome-image:latest 220 ExecStop=/usr/bin/podman stop --ignore --cidfile %t/container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401.ctr-id -t 10 221 ExecStopPost=/usr/bin/podman rm --ignore -f --cidfile %t/container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401.ctr-id 222 PIDFile=%t/container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401.pid 223 KillMode=none 224 Type=forking 225 226 [Install] 227 WantedBy=multi-user.target default.target 228 ` 229 230 tests := []struct { 231 name string 232 info containerInfo 233 want string 234 new bool 235 wantErr bool 236 }{ 237 238 {"good with id", 239 containerInfo{ 240 Executable: "/usr/bin/podman", 241 ServiceName: "container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401", 242 ContainerNameOrID: "639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401", 243 RestartPolicy: "always", 244 PIDFile: "/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 245 StopTimeout: 10, 246 PodmanVersion: "CI", 247 EnvVariable: EnvVariable, 248 }, 249 goodID, 250 false, 251 false, 252 }, 253 {"good with name", 254 containerInfo{ 255 Executable: "/usr/bin/podman", 256 ServiceName: "container-foobar", 257 ContainerNameOrID: "foobar", 258 RestartPolicy: "always", 259 PIDFile: "/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 260 StopTimeout: 10, 261 PodmanVersion: "CI", 262 EnvVariable: EnvVariable, 263 }, 264 goodName, 265 false, 266 false, 267 }, 268 {"good with name and bound to", 269 containerInfo{ 270 Executable: "/usr/bin/podman", 271 ServiceName: "container-foobar", 272 ContainerNameOrID: "foobar", 273 RestartPolicy: "always", 274 PIDFile: "/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 275 StopTimeout: 10, 276 PodmanVersion: "CI", 277 BoundToServices: []string{"pod", "a", "b", "c"}, 278 EnvVariable: EnvVariable, 279 }, 280 goodNameBoundTo, 281 false, 282 false, 283 }, 284 {"bad restart policy", 285 containerInfo{ 286 Executable: "/usr/bin/podman", 287 ServiceName: "639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401", 288 RestartPolicy: "never", 289 PIDFile: "/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 290 StopTimeout: 10, 291 PodmanVersion: "CI", 292 EnvVariable: EnvVariable, 293 }, 294 "", 295 false, 296 true, 297 }, 298 {"good with name and generic", 299 containerInfo{ 300 Executable: "/usr/bin/podman", 301 ServiceName: "jadda-jadda", 302 ContainerNameOrID: "jadda-jadda", 303 RestartPolicy: "always", 304 PIDFile: "/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 305 StopTimeout: 42, 306 PodmanVersion: "CI", 307 CreateCommand: []string{"I'll get stripped", "container", "run", "--name", "jadda-jadda", "--hostname", "hello-world", "awesome-image:latest", "command", "arg1", "...", "argN", "foo=arg \"with \" space"}, 308 EnvVariable: EnvVariable, 309 }, 310 goodWithNameAndGeneric, 311 true, 312 false, 313 }, 314 {"good with explicit short detach param", 315 containerInfo{ 316 Executable: "/usr/bin/podman", 317 ServiceName: "jadda-jadda", 318 ContainerNameOrID: "jadda-jadda", 319 RestartPolicy: "always", 320 PIDFile: "/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 321 StopTimeout: 42, 322 PodmanVersion: "CI", 323 CreateCommand: []string{"I'll get stripped", "container", "run", "-d", "--name", "jadda-jadda", "--hostname", "hello-world", "awesome-image:latest", "command", "arg1", "...", "argN"}, 324 EnvVariable: EnvVariable, 325 }, 326 goodWithExplicitShortDetachParam, 327 true, 328 false, 329 }, 330 {"good with explicit short detach param and podInfo", 331 containerInfo{ 332 Executable: "/usr/bin/podman", 333 ServiceName: "jadda-jadda", 334 ContainerNameOrID: "jadda-jadda", 335 RestartPolicy: "always", 336 PIDFile: "/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 337 StopTimeout: 42, 338 PodmanVersion: "CI", 339 CreateCommand: []string{"I'll get stripped", "container", "run", "-d", "--name", "jadda-jadda", "--hostname", "hello-world", "awesome-image:latest", "command", "arg1", "...", "argN"}, 340 EnvVariable: EnvVariable, 341 pod: &podInfo{ 342 PodIDFile: "/tmp/pod-foobar.pod-id-file", 343 }, 344 }, 345 goodNameNewWithPodFile, 346 true, 347 false, 348 }, 349 {"good with explicit full detach param", 350 containerInfo{ 351 Executable: "/usr/bin/podman", 352 ServiceName: "jadda-jadda", 353 ContainerNameOrID: "jadda-jadda", 354 RestartPolicy: "always", 355 PIDFile: "/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 356 StopTimeout: 42, 357 PodmanVersion: "CI", 358 CreateCommand: []string{"I'll get stripped", "container", "run", "--detach", "--name", "jadda-jadda", "--hostname", "hello-world", "awesome-image:latest", "command", "arg1", "...", "argN"}, 359 EnvVariable: EnvVariable, 360 }, 361 goodNameNewDetach, 362 true, 363 false, 364 }, 365 {"good with id and no param", 366 containerInfo{ 367 Executable: "/usr/bin/podman", 368 ServiceName: "container-639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401", 369 ContainerNameOrID: "639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401", 370 RestartPolicy: "always", 371 PIDFile: "/var/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 372 StopTimeout: 10, 373 PodmanVersion: "CI", 374 CreateCommand: []string{"I'll get stripped", "container", "run", "awesome-image:latest"}, 375 EnvVariable: EnvVariable, 376 }, 377 goodIDNew, 378 true, 379 false, 380 }, 381 } 382 for _, tt := range tests { 383 test := tt 384 t.Run(tt.name, func(t *testing.T) { 385 opts := entities.GenerateSystemdOptions{ 386 New: test.new, 387 } 388 got, err := executeContainerTemplate(&test.info, opts) 389 if (err != nil) != test.wantErr { 390 t.Errorf("CreateContainerSystemdUnit() error = \n%v, wantErr \n%v", err, test.wantErr) 391 return 392 } 393 if got != test.want { 394 t.Errorf("CreateContainerSystemdUnit() = \n%v\n---------> want\n%v", got, test.want) 395 } 396 }) 397 } 398 }