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  }