github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/pkg/systemd/generate/systemdgen_test.go (about)

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