export adding id-specifier code to setContainerNameForTemplate

Signed-off-by: Boaz Shuster <boaz.shuster.github@gmail.com>
This commit is contained in:
Boaz Shuster
2021-11-11 11:45:36 +02:00
parent 6ee3b33d38
commit 73e1cdfe9e
2 changed files with 89 additions and 26 deletions

View File

@ -206,6 +206,46 @@ func containerServiceName(ctr *libpod.Container, options entities.GenerateSystem
return nameOrID, serviceName
}
// setContainerNameForTemplate updates startCommand to contain the name argument with
// a value that includes the identify specifier.
// In case startCommand doesn't contain that argument it's added after "run" and its
// value will be set to info.ServiceName concated with the identify specifier %i.
func setContainerNameForTemplate(startCommand []string, info *containerInfo) ([]string, error) {
// find the index of "--name" in the command slice
nameIx := -1
for argIx, arg := range startCommand {
if arg == "--name" {
nameIx = argIx + 1
break
}
if strings.HasPrefix(arg, "--name=") {
nameIx = argIx
break
}
}
switch {
case nameIx == -1:
// if not found, add --name argument in the command slice before the "run" argument.
// it's assumed that the command slice contains this argument.
runIx := -1
for argIx, arg := range startCommand {
if arg == "run" {
runIx = argIx
break
}
}
if runIx == -1 {
return startCommand, fmt.Errorf("\"run\" is missing in the command arguments")
}
startCommand = append(startCommand[:runIx+1], startCommand[runIx:]...)
startCommand[runIx+1] = fmt.Sprintf("--name=%s-%%i", info.ServiceName)
default:
// append the identity specifier (%i) to the end of the --name value
startCommand[nameIx] = fmt.Sprintf("%s-%%i", startCommand[nameIx])
}
return startCommand, nil
}
// executeContainerTemplate executes the container template on the specified
// containerInfo. Note that the containerInfo is also post processed and
// completed, which allows for an easier unit testing.
@ -392,32 +432,9 @@ func executeContainerTemplate(info *containerInfo, options entities.GenerateSyst
startCommand = escapeSystemdArguments(startCommand)
if options.TemplateUnitFile {
info.IdentifySpecifier = true
runIx := -1
nameIx := -1
// Add systemd identify specifier next to the name value
// to set a name to the container according to the parameters passed to systemd.
// In case no --name set for that container, use ServiceName specified
// in the containerInfo struct.
for argIx, arg := range startCommand {
if arg == "run" {
runIx = argIx
continue
}
if arg == "--name" {
nameIx = argIx + 1
break
}
if strings.HasPrefix(arg, "--name=") {
nameIx = argIx
break
}
}
if nameIx == -1 {
startCommand = append(startCommand[:runIx+1], startCommand[runIx:]...)
startCommand[runIx+1] = fmt.Sprintf("--name=%s-%%i", info.ServiceName)
fmt.Println(startCommand)
} else {
startCommand[nameIx] = fmt.Sprintf("%s-%%i", startCommand[nameIx])
startCommand, err = setContainerNameForTemplate(startCommand, info)
if err != nil {
return "", err
}
}
info.ExecStart = strings.Join(startCommand, " ")

View File

@ -1,6 +1,7 @@
package generate
import (
"fmt"
"testing"
"github.com/containers/podman/v3/pkg/domain/entities"
@ -1036,3 +1037,48 @@ WantedBy=multi-user.target default.target
})
}
}
func TestSetContainerNameForTemplate(t *testing.T) {
tt := []struct {
name string
startCommand []string
info *containerInfo
expected []string
err error
}{
{
name: "no name argument is set",
startCommand: []string{"/usr/bin/podman", "run", "busybox", "top"},
info: &containerInfo{ServiceName: "container-122"},
expected: []string{"/usr/bin/podman", "run", "--name=container-122-%i", "busybox", "top"},
err: nil,
},
{
name: "--name=value is used in arguments",
startCommand: []string{"/usr/bin/podman", "run", "--name=lovely_james", "busybox", "top"},
info: &containerInfo{},
expected: []string{"/usr/bin/podman", "run", "--name=lovely_james-%i", "busybox", "top"},
err: nil,
},
{
name: "--name value is used in arguments",
startCommand: []string{"/usr/bin/podman", "run", "--name", "lovely_james", "busybox", "top"},
info: &containerInfo{},
expected: []string{"/usr/bin/podman", "run", "--name", "lovely_james-%i", "busybox", "top"},
err: nil,
},
{
name: "--name value is used in arguments",
startCommand: []string{"/usr/bin/podman", "create", "busybox", "top"},
info: &containerInfo{},
expected: []string{"/usr/bin/podman", "create", "busybox", "top"},
err: fmt.Errorf("\"run\" is missing in the command arguments"),
},
}
for _, te := range tt {
res, err := setContainerNameForTemplate(te.startCommand, te.info)
assert.Equal(t, te.err, err)
assert.Equal(t, te.expected, res)
}
}