mirror of
https://github.com/opencontainers/runc.git
synced 2026-07-11 06:03:57 +08:00
Merge pull request #3303 from kolyshkin/labels
libcontainer: optimize utils.SearchLabels
This commit is contained in:
@@ -162,7 +162,10 @@ func execProcess(context *cli.Context) (int, error) {
|
||||
if err != nil {
|
||||
return -1, err
|
||||
}
|
||||
bundle := utils.SearchLabels(state.Config.Labels, "bundle")
|
||||
bundle, ok := utils.SearchLabels(state.Config.Labels, "bundle")
|
||||
if !ok {
|
||||
return -1, errors.New("bundle not found in labels")
|
||||
}
|
||||
p, err := getProcess(context, bundle)
|
||||
if err != nil {
|
||||
return -1, err
|
||||
|
||||
@@ -876,8 +876,7 @@ func (c *linuxContainer) handleCriuConfigurationFile(rpcOpts *criurpc.CriuOpts)
|
||||
// Look for annotations. The annotation 'org.criu.config'
|
||||
// specifies if CRIU should use a different, container specific
|
||||
// configuration file.
|
||||
_, annotations := utils.Annotations(c.config.Labels)
|
||||
configFile, exists := annotations["org.criu.config"]
|
||||
configFile, exists := utils.SearchLabels(c.config.Labels, "org.criu.config")
|
||||
if exists {
|
||||
// If the annotation 'org.criu.config' exists and is set
|
||||
// to a non-empty string, tell CRIU to use that as a
|
||||
|
||||
@@ -132,19 +132,16 @@ func WithProcfd(root, unsafePath string, fn func(procfd string) error) error {
|
||||
return fn(procfd)
|
||||
}
|
||||
|
||||
// SearchLabels searches a list of key-value pairs for the provided key and
|
||||
// returns the corresponding value. The pairs must be separated with '='.
|
||||
func SearchLabels(labels []string, query string) string {
|
||||
for _, l := range labels {
|
||||
parts := strings.SplitN(l, "=", 2)
|
||||
if len(parts) < 2 {
|
||||
continue
|
||||
}
|
||||
if parts[0] == query {
|
||||
return parts[1]
|
||||
// SearchLabels searches through a list of key=value pairs for a given key,
|
||||
// returning its value, and the binary flag telling whether the key exist.
|
||||
func SearchLabels(labels []string, key string) (string, bool) {
|
||||
key += "="
|
||||
for _, s := range labels {
|
||||
if strings.HasPrefix(s, key) {
|
||||
return s[len(key):], true
|
||||
}
|
||||
}
|
||||
return ""
|
||||
return "", false
|
||||
}
|
||||
|
||||
// Annotations returns the bundle path and user defined annotations from the
|
||||
|
||||
@@ -8,22 +8,28 @@ import (
|
||||
)
|
||||
|
||||
var labelTest = []struct {
|
||||
labels []string
|
||||
query string
|
||||
expectedValue string
|
||||
labels []string
|
||||
query string
|
||||
expVal string
|
||||
expOk bool
|
||||
}{
|
||||
{[]string{"bundle=/path/to/bundle"}, "bundle", "/path/to/bundle"},
|
||||
{[]string{"test=a", "test=b"}, "bundle", ""},
|
||||
{[]string{"bundle=a", "test=b", "bundle=c"}, "bundle", "a"},
|
||||
{[]string{"", "test=a", "bundle=b"}, "bundle", "b"},
|
||||
{[]string{"test", "bundle=a"}, "bundle", "a"},
|
||||
{[]string{"test=a", "bundle="}, "bundle", ""},
|
||||
{[]string{"bundle=/path/to/bundle"}, "bundle", "/path/to/bundle", true},
|
||||
{[]string{"test=a", "test=b"}, "bundle", "", false},
|
||||
{[]string{"bundle=a", "test=b", "bundle=c"}, "bundle", "a", true},
|
||||
{[]string{"", "test=a", "bundle=b"}, "bundle", "b", true},
|
||||
{[]string{"test", "bundle=a"}, "bundle", "a", true},
|
||||
{[]string{"test=a", "bundle="}, "bundle", "", true},
|
||||
}
|
||||
|
||||
func TestSearchLabels(t *testing.T) {
|
||||
for _, tt := range labelTest {
|
||||
if v := SearchLabels(tt.labels, tt.query); v != tt.expectedValue {
|
||||
t.Errorf("expected value '%s' for query '%s'; got '%s'", tt.expectedValue, tt.query, v)
|
||||
v, ok := SearchLabels(tt.labels, tt.query)
|
||||
if ok != tt.expOk {
|
||||
t.Errorf("expected ok: %v, got %v", tt.expOk, ok)
|
||||
continue
|
||||
}
|
||||
if v != tt.expVal {
|
||||
t.Errorf("expected value '%s' for query '%s'; got '%s'", tt.expVal, tt.query, v)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user