From 8340912a28c23afda18abb2943bc0c012d450b8f Mon Sep 17 00:00:00 2001 From: Diptanu Choudhury Date: Mon, 28 Mar 2016 12:25:16 -0700 Subject: [PATCH] Added support for interpolation in check cmd and args --- client/driver/executor/executor.go | 8 +++++++- client/driver/executor/executor_test.go | 16 +++++++++++++--- nomad/mock/mock.go | 14 +++++++++++++- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/client/driver/executor/executor.go b/client/driver/executor/executor.go index e9a45e2d5..2136eef49 100644 --- a/client/driver/executor/executor.go +++ b/client/driver/executor/executor.go @@ -545,11 +545,17 @@ func (e *UniversalExecutor) createCheck(check *structs.ServiceCheck, checkID str return nil, fmt.Errorf("couldn't create check for %v", check.Name) } -// interpolateServices interpolates tags in a service with values from the +// interpolateServices interpolates tags in a service and checks with values from the // task's environment. func (e *UniversalExecutor) interpolateServices(task *structs.Task) { e.ctx.TaskEnv.Build() for _, service := range task.Services { + for _, check := range service.Checks { + if check.Type == structs.ServiceCheckScript { + check.Cmd = e.ctx.TaskEnv.ReplaceEnv(check.Cmd) + check.Args = e.ctx.TaskEnv.ParseAndReplace(check.Args) + } + } service.Tags = e.ctx.TaskEnv.ParseAndReplace(service.Tags) } } diff --git a/client/driver/executor/executor_test.go b/client/driver/executor/executor_test.go index 0dc91e17c..f5322d0b3 100644 --- a/client/driver/executor/executor_test.go +++ b/client/driver/executor/executor_test.go @@ -278,8 +278,18 @@ func TestExecutorInterpolateServices(t *testing.T) { executor.(*UniversalExecutor).ctx = ctx executor.(*UniversalExecutor).interpolateServices(task) - expected := []string{"pci:true", "datacenter:dc1"} - if !reflect.DeepEqual(task.Services[0].Tags, expected) { - t.Fatalf("expected: %v, actual: %v", expected, task.Services[0].Tags) + expectedTags := []string{"pci:true", "datacenter:dc1"} + if !reflect.DeepEqual(task.Services[0].Tags, expectedTags) { + t.Fatalf("expected: %v, actual: %v", expectedTags, task.Services[0].Tags) + } + + expectedCheckCmd := "/usr/local/check-table-mysql" + expectedCheckArgs := []string{"5.6"} + if !reflect.DeepEqual(task.Services[0].Checks[0].Cmd, expectedCheckCmd) { + t.Fatalf("expected: %v, actual: %v", expectedCheckCmd, task.Services[0].Checks[0].Cmd) + } + + if !reflect.DeepEqual(task.Services[0].Checks[0].Args, expectedCheckArgs) { + t.Fatalf("expected: %v, actual: %v", expectedCheckArgs, task.Services[0].Checks[0].Args) } } diff --git a/nomad/mock/mock.go b/nomad/mock/mock.go index 432917c80..24ea87f20 100644 --- a/nomad/mock/mock.go +++ b/nomad/mock/mock.go @@ -47,7 +47,9 @@ func Node() *structs.Node { "consul": "foobar.dc1", }, Meta: map[string]string{ - "pci-dss": "true", + "pci-dss": "true", + "database": "mysql", + "version": "5.6", }, NodeClass: "linux-medium-pci", Status: structs.NodeStatusReady, @@ -97,6 +99,16 @@ func Job() *structs.Job { Name: "${TASK}-frontend", PortLabel: "http", Tags: []string{"pci:${meta.pci-dss}", "datacenter:${node.datacenter}"}, + Checks: []*structs.ServiceCheck{ + { + Name: "check-table", + Type: structs.ServiceCheckScript, + Cmd: "/usr/local/check-table-${meta.database}", + Args: []string{"${meta.version}"}, + Interval: 30 * time.Second, + Timeout: 5 * time.Second, + }, + }, }, { Name: "${TASK}-admin",