mirror of
https://github.com/containers/podman.git
synced 2025-06-24 19:42:56 +08:00
export adding id-specifier code to setContainerNameForTemplate
Signed-off-by: Boaz Shuster <boaz.shuster.github@gmail.com>
This commit is contained in:
@ -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, " ")
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user