github.com/AbhinandanKurakure/podman/v3@v3.4.10/pkg/systemd/generate/pods_test.go (about) 1 package generate 2 3 import ( 4 "testing" 5 6 "github.com/containers/podman/v3/pkg/domain/entities" 7 "github.com/stretchr/testify/assert" 8 ) 9 10 func TestValidateRestartPolicyPod(t *testing.T) { 11 type podInfo struct { 12 restart string 13 } 14 tests := []struct { 15 name string 16 podInfo podInfo 17 wantErr bool 18 }{ 19 {"good-on", podInfo{restart: "no"}, false}, 20 {"good-on-success", podInfo{restart: "on-success"}, false}, 21 {"good-on-failure", podInfo{restart: "on-failure"}, false}, 22 {"good-on-abnormal", podInfo{restart: "on-abnormal"}, false}, 23 {"good-on-watchdog", podInfo{restart: "on-watchdog"}, false}, 24 {"good-on-abort", podInfo{restart: "on-abort"}, false}, 25 {"good-always", podInfo{restart: "always"}, false}, 26 {"fail", podInfo{restart: "foobar"}, true}, 27 {"failblank", podInfo{restart: ""}, true}, 28 } 29 for _, tt := range tests { 30 test := tt 31 t.Run(tt.name, func(t *testing.T) { 32 if err := validateRestartPolicy(test.podInfo.restart); (err != nil) != test.wantErr { 33 t.Errorf("ValidateRestartPolicy() error = %v, wantErr %v", err, test.wantErr) 34 } 35 }) 36 } 37 } 38 39 func TestCreatePodSystemdUnit(t *testing.T) { 40 serviceInfo := `# pod-123abc.service 41 ` 42 headerInfo := `# autogenerated by Podman CI 43 ` 44 podContent := ` 45 [Unit] 46 Description=Podman pod-123abc.service 47 Documentation=man:podman-generate-systemd(1) 48 Wants=network-online.target 49 After=network-online.target 50 RequiresMountsFor=/var/run/containers/storage 51 Requires=container-1.service container-2.service 52 Before=container-1.service container-2.service 53 54 [Service] 55 Environment=PODMAN_SYSTEMD_UNIT=%n 56 Restart=on-failure 57 TimeoutStopSec=102 58 ExecStart=/usr/bin/podman start jadda-jadda-infra 59 ExecStop=/usr/bin/podman stop -t 42 jadda-jadda-infra 60 ExecStopPost=/usr/bin/podman stop -t 42 jadda-jadda-infra 61 PIDFile=/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid 62 Type=forking 63 64 [Install] 65 WantedBy=default.target 66 ` 67 podGood := serviceInfo + headerInfo + podContent 68 podGoodNoHeaderInfo := serviceInfo + podContent 69 70 podGoodNamedNew := `# pod-123abc.service 71 # autogenerated by Podman CI 72 73 [Unit] 74 Description=Podman pod-123abc.service 75 Documentation=man:podman-generate-systemd(1) 76 Wants=network-online.target 77 After=network-online.target 78 RequiresMountsFor=/var/run/containers/storage 79 Requires=container-1.service container-2.service 80 Before=container-1.service container-2.service 81 82 [Service] 83 Environment=PODMAN_SYSTEMD_UNIT=%n 84 Restart=on-failure 85 TimeoutStopSec=70 86 ExecStartPre=/bin/rm -f %t/pod-123abc.pid %t/pod-123abc.pod-id 87 ExecStartPre=/usr/bin/podman pod create --infra-conmon-pidfile %t/pod-123abc.pid --pod-id-file %t/pod-123abc.pod-id --name foo "bar=arg with space" --replace 88 ExecStart=/usr/bin/podman pod start --pod-id-file %t/pod-123abc.pod-id 89 ExecStop=/usr/bin/podman pod stop --ignore --pod-id-file %t/pod-123abc.pod-id -t 10 90 ExecStopPost=/usr/bin/podman pod rm --ignore -f --pod-id-file %t/pod-123abc.pod-id 91 PIDFile=%t/pod-123abc.pid 92 Type=forking 93 94 [Install] 95 WantedBy=default.target 96 ` 97 98 podGoodNamedNewWithRootArgs := `# pod-123abc.service 99 # autogenerated by Podman CI 100 101 [Unit] 102 Description=Podman pod-123abc.service 103 Documentation=man:podman-generate-systemd(1) 104 Wants=network-online.target 105 After=network-online.target 106 RequiresMountsFor=/var/run/containers/storage 107 Requires=container-1.service container-2.service 108 Before=container-1.service container-2.service 109 110 [Service] 111 Environment=PODMAN_SYSTEMD_UNIT=%n 112 Restart=on-failure 113 TimeoutStopSec=70 114 ExecStartPre=/bin/rm -f %t/pod-123abc.pid %t/pod-123abc.pod-id 115 ExecStartPre=/usr/bin/podman --events-backend none --runroot /root pod create --infra-conmon-pidfile %t/pod-123abc.pid --pod-id-file %t/pod-123abc.pod-id --name foo "bar=arg with space" --replace 116 ExecStart=/usr/bin/podman --events-backend none --runroot /root pod start --pod-id-file %t/pod-123abc.pod-id 117 ExecStop=/usr/bin/podman --events-backend none --runroot /root pod stop --ignore --pod-id-file %t/pod-123abc.pod-id -t 10 118 ExecStopPost=/usr/bin/podman --events-backend none --runroot /root pod rm --ignore -f --pod-id-file %t/pod-123abc.pod-id 119 PIDFile=%t/pod-123abc.pid 120 Type=forking 121 122 [Install] 123 WantedBy=default.target 124 ` 125 126 podGoodNamedNewWithReplaceFalse := `# pod-123abc.service 127 # autogenerated by Podman CI 128 129 [Unit] 130 Description=Podman pod-123abc.service 131 Documentation=man:podman-generate-systemd(1) 132 Wants=network-online.target 133 After=network-online.target 134 RequiresMountsFor=/var/run/containers/storage 135 Requires=container-1.service container-2.service 136 Before=container-1.service container-2.service 137 138 [Service] 139 Environment=PODMAN_SYSTEMD_UNIT=%n 140 Restart=on-failure 141 TimeoutStopSec=70 142 ExecStartPre=/bin/rm -f %t/pod-123abc.pid %t/pod-123abc.pod-id 143 ExecStartPre=/usr/bin/podman pod create --infra-conmon-pidfile %t/pod-123abc.pid --pod-id-file %t/pod-123abc.pod-id --name foo --replace 144 ExecStart=/usr/bin/podman pod start --pod-id-file %t/pod-123abc.pod-id 145 ExecStop=/usr/bin/podman pod stop --ignore --pod-id-file %t/pod-123abc.pod-id -t 10 146 ExecStopPost=/usr/bin/podman pod rm --ignore -f --pod-id-file %t/pod-123abc.pod-id 147 PIDFile=%t/pod-123abc.pid 148 Type=forking 149 150 [Install] 151 WantedBy=default.target 152 ` 153 154 podNewLabelWithCurlyBraces := `# pod-123abc.service 155 # autogenerated by Podman CI 156 157 [Unit] 158 Description=Podman pod-123abc.service 159 Documentation=man:podman-generate-systemd(1) 160 Wants=network-online.target 161 After=network-online.target 162 RequiresMountsFor=/var/run/containers/storage 163 Requires=container-1.service container-2.service 164 Before=container-1.service container-2.service 165 166 [Service] 167 Environment=PODMAN_SYSTEMD_UNIT=%n 168 Restart=on-failure 169 TimeoutStopSec=70 170 ExecStartPre=/bin/rm -f %t/pod-123abc.pid %t/pod-123abc.pod-id 171 ExecStartPre=/usr/bin/podman pod create --infra-conmon-pidfile %t/pod-123abc.pid --pod-id-file %t/pod-123abc.pod-id --name foo --label key={{someval}} --replace 172 ExecStart=/usr/bin/podman pod start --pod-id-file %t/pod-123abc.pod-id 173 ExecStop=/usr/bin/podman pod stop --ignore --pod-id-file %t/pod-123abc.pod-id -t 10 174 ExecStopPost=/usr/bin/podman pod rm --ignore -f --pod-id-file %t/pod-123abc.pod-id 175 PIDFile=%t/pod-123abc.pid 176 Type=forking 177 178 [Install] 179 WantedBy=default.target 180 ` 181 182 tests := []struct { 183 name string 184 info podInfo 185 want string 186 new bool 187 noHeader bool 188 wantErr bool 189 }{ 190 {"pod", 191 podInfo{ 192 Executable: "/usr/bin/podman", 193 ServiceName: "pod-123abc", 194 InfraNameOrID: "jadda-jadda-infra", 195 PIDFile: "/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 196 StopTimeout: 42, 197 PodmanVersion: "CI", 198 GraphRoot: "/var/lib/containers/storage", 199 RunRoot: "/var/run/containers/storage", 200 RequiredServices: []string{"container-1", "container-2"}, 201 CreateCommand: []string{"podman", "pod", "create", "--name", "foo", "bar=arg with space"}, 202 }, 203 podGood, 204 false, 205 false, 206 false, 207 }, 208 {"pod noHeader", 209 podInfo{ 210 Executable: "/usr/bin/podman", 211 ServiceName: "pod-123abc", 212 InfraNameOrID: "jadda-jadda-infra", 213 PIDFile: "/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 214 StopTimeout: 42, 215 PodmanVersion: "CI", 216 GraphRoot: "/var/lib/containers/storage", 217 RunRoot: "/var/run/containers/storage", 218 RequiredServices: []string{"container-1", "container-2"}, 219 CreateCommand: []string{"podman", "pod", "create", "--name", "foo", "bar=arg with space"}, 220 }, 221 podGoodNoHeaderInfo, 222 false, 223 true, 224 false, 225 }, 226 {"pod with root args", 227 podInfo{ 228 Executable: "/usr/bin/podman", 229 ServiceName: "pod-123abc", 230 InfraNameOrID: "jadda-jadda-infra", 231 PIDFile: "/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 232 StopTimeout: 42, 233 PodmanVersion: "CI", 234 GraphRoot: "/var/lib/containers/storage", 235 RunRoot: "/var/run/containers/storage", 236 RequiredServices: []string{"container-1", "container-2"}, 237 CreateCommand: []string{"podman", "--events-backend", "none", "--runroot", "/root", "pod", "create", "--name", "foo", "bar=arg with space"}, 238 }, 239 podGood, 240 false, 241 false, 242 false, 243 }, 244 {"pod --new", 245 podInfo{ 246 Executable: "/usr/bin/podman", 247 ServiceName: "pod-123abc", 248 InfraNameOrID: "jadda-jadda-infra", 249 PIDFile: "/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 250 StopTimeout: 10, 251 PodmanVersion: "CI", 252 GraphRoot: "/var/lib/containers/storage", 253 RunRoot: "/var/run/containers/storage", 254 RequiredServices: []string{"container-1", "container-2"}, 255 CreateCommand: []string{"podman", "pod", "create", "--name", "foo", "bar=arg with space"}, 256 }, 257 podGoodNamedNew, 258 true, 259 false, 260 false, 261 }, 262 {"pod --new with root args", 263 podInfo{ 264 Executable: "/usr/bin/podman", 265 ServiceName: "pod-123abc", 266 InfraNameOrID: "jadda-jadda-infra", 267 PIDFile: "/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 268 StopTimeout: 10, 269 PodmanVersion: "CI", 270 GraphRoot: "/var/lib/containers/storage", 271 RunRoot: "/var/run/containers/storage", 272 RequiredServices: []string{"container-1", "container-2"}, 273 CreateCommand: []string{"podman", "--events-backend", "none", "--runroot", "/root", "pod", "create", "--name", "foo", "bar=arg with space"}, 274 }, 275 podGoodNamedNewWithRootArgs, 276 true, 277 false, 278 false, 279 }, 280 {"pod --new with --replace=false", 281 podInfo{ 282 Executable: "/usr/bin/podman", 283 ServiceName: "pod-123abc", 284 InfraNameOrID: "jadda-jadda-infra", 285 PIDFile: "/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 286 StopTimeout: 10, 287 PodmanVersion: "CI", 288 GraphRoot: "/var/lib/containers/storage", 289 RunRoot: "/var/run/containers/storage", 290 RequiredServices: []string{"container-1", "container-2"}, 291 CreateCommand: []string{"podman", "pod", "create", "--name", "foo", "--replace=false"}, 292 }, 293 podGoodNamedNewWithReplaceFalse, 294 true, 295 false, 296 false, 297 }, 298 {"pod --new with double curly braces", 299 podInfo{ 300 Executable: "/usr/bin/podman", 301 ServiceName: "pod-123abc", 302 InfraNameOrID: "jadda-jadda-infra", 303 PIDFile: "/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 304 StopTimeout: 10, 305 PodmanVersion: "CI", 306 GraphRoot: "/var/lib/containers/storage", 307 RunRoot: "/var/run/containers/storage", 308 RequiredServices: []string{"container-1", "container-2"}, 309 CreateCommand: []string{"podman", "pod", "create", "--name", "foo", "--label", "key={{someval}}"}, 310 }, 311 podNewLabelWithCurlyBraces, 312 true, 313 false, 314 false, 315 }, 316 {"pod --new with ID files", 317 podInfo{ 318 Executable: "/usr/bin/podman", 319 ServiceName: "pod-123abc", 320 InfraNameOrID: "jadda-jadda-infra", 321 PIDFile: "/run/containers/storage/overlay-containers/639c53578af4d84b8800b4635fa4e680ee80fd67e0e6a2d4eea48d1e3230f401/userdata/conmon.pid", 322 StopTimeout: 10, 323 PodmanVersion: "CI", 324 GraphRoot: "/var/lib/containers/storage", 325 RunRoot: "/var/run/containers/storage", 326 RequiredServices: []string{"container-1", "container-2"}, 327 CreateCommand: []string{"podman", "pod", "create", "--infra-conmon-pidfile", "/tmp/pod-123abc.pid", "--pod-id-file", "/tmp/pod-123abc.pod-id", "--name", "foo", "bar=arg with space"}, 328 }, 329 podGoodNamedNew, 330 true, 331 false, 332 false, 333 }, 334 } 335 336 for _, tt := range tests { 337 test := tt 338 t.Run(tt.name, func(t *testing.T) { 339 opts := entities.GenerateSystemdOptions{ 340 New: test.new, 341 NoHeader: test.noHeader, 342 } 343 got, err := executePodTemplate(&test.info, opts) 344 if (err != nil) != test.wantErr { 345 t.Errorf("CreatePodSystemdUnit() error = \n%v, wantErr \n%v", err, test.wantErr) 346 return 347 } 348 assert.Equal(t, test.want, got) 349 }) 350 } 351 }