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  }