From d335f597575c69eee76d1024b3d1d16d0f3291bc Mon Sep 17 00:00:00 2001 From: Chanwit Kaewkasi Date: Wed, 14 Jan 2015 22:08:11 +0700 Subject: [PATCH] implement alternative negation syntax Signed-off-by: Chanwit Kaewkasi --- scheduler/filter/constraint.go | 9 +++++-- scheduler/filter/constraint_test.go | 38 +++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/scheduler/filter/constraint.go b/scheduler/filter/constraint.go index bfe8d42b71..9c7b370629 100644 --- a/scheduler/filter/constraint.go +++ b/scheduler/filter/constraint.go @@ -45,12 +45,17 @@ func (f *ConstraintFilter) Filter(config *dockerclient.ContainerConfig, nodes [] // keep the original for display in case of error v0 := v + k0 := k negate := false if strings.HasPrefix(v, "!") { - log.Debugf("negate detected") + log.Debugf("negate detected in value") v = strings.TrimPrefix(v, "!") negate = true + } else if strings.HasSuffix(k, "!") { + log.Debugf("negate detected in key") + k = strings.TrimSuffix(k, "!") + negate = true } useRegex := false @@ -84,7 +89,7 @@ func (f *ConstraintFilter) Filter(config *dockerclient.ContainerConfig, nodes [] } } if len(candidates) == 0 { - return nil, fmt.Errorf("unable to find a node that satisfies %s = %s", k, v0) + return nil, fmt.Errorf("unable to find a node that satisfies %s=%s", k0, v0) } nodes = candidates } diff --git a/scheduler/filter/constraint_test.go b/scheduler/filter/constraint_test.go index 786c48b062..9fc1fb830f 100644 --- a/scheduler/filter/constraint_test.go +++ b/scheduler/filter/constraint_test.go @@ -151,6 +151,44 @@ func TestConstraintNotExpr(t *testing.T) { assert.Equal(t, result[0].Labels["region"], "eu") } +func TestConstraintAlternativeNotExpr(t *testing.T) { + var ( + f = ConstraintFilter{} + nodes = testFixtures() + result []*cluster.Node + err error + ) + + // Check not (!) expression + result, err = f.Filter(&dockerclient.ContainerConfig{ + Env: []string{"constraint:name!=node0"}, + }, nodes) + assert.NoError(t, err) + assert.Len(t, result, 2) + + // Check not does_not_exist. All should be found + result, err = f.Filter(&dockerclient.ContainerConfig{ + Env: []string{"constraint:name!=does_not_exist"}, + }, nodes) + assert.NoError(t, err) + assert.Len(t, result, 3) + + // Check name must not start with n + result, err = f.Filter(&dockerclient.ContainerConfig{ + Env: []string{"constraint:name!=n*"}, + }, nodes) + assert.Error(t, err) + assert.Len(t, result, 0) + + // Check not with globber pattern + result, err = f.Filter(&dockerclient.ContainerConfig{ + Env: []string{"constraint:region!=us*"}, + }, nodes) + assert.NoError(t, err) + assert.Len(t, result, 1) + assert.Equal(t, result[0].Labels["region"], "eu") +} + func TestConstraintRegExp(t *testing.T) { var ( f = ConstraintFilter{}