diff --git a/command/agent/agent.go b/command/agent/agent.go index cbda67e7ae..cbee5f49d8 100644 --- a/command/agent/agent.go +++ b/command/agent/agent.go @@ -491,7 +491,7 @@ func (a *Agent) ResumeSync() { // persistService saves a service definition to a JSON file in the data dir func (a *Agent) persistService(service *structs.NodeService) error { - svcPath := filepath.Join(a.config.DataDir, servicesDir, service.ID) + svcPath := filepath.Join(a.config.DataDir, servicesDir, stringHash(service.ID)) if _, err := os.Stat(svcPath); os.IsNotExist(err) { encoded, err := json.Marshal(service) if err != nil { @@ -514,7 +514,7 @@ func (a *Agent) persistService(service *structs.NodeService) error { // purgeService removes a persisted service definition file from the data dir func (a *Agent) purgeService(serviceID string) error { - svcPath := filepath.Join(a.config.DataDir, servicesDir, serviceID) + svcPath := filepath.Join(a.config.DataDir, servicesDir, stringHash(serviceID)) if _, err := os.Stat(svcPath); err == nil { return os.Remove(svcPath) } @@ -565,7 +565,7 @@ func (a *Agent) restoreServices() error { // persistCheck saves a check definition to the local agent's state directory func (a *Agent) persistCheck(check *structs.HealthCheck, chkType *CheckType) error { - checkPath := filepath.Join(a.config.DataDir, checksDir, check.CheckID) + checkPath := filepath.Join(a.config.DataDir, checksDir, stringHash(check.CheckID)) if _, err := os.Stat(checkPath); !os.IsNotExist(err) { return err } @@ -593,7 +593,7 @@ func (a *Agent) persistCheck(check *structs.HealthCheck, chkType *CheckType) err // purgeCheck removes a persisted check definition file from the data dir func (a *Agent) purgeCheck(checkID string) error { - checkPath := filepath.Join(a.config.DataDir, checksDir, checkID) + checkPath := filepath.Join(a.config.DataDir, checksDir, stringHash(checkID)) if _, err := os.Stat(checkPath); err == nil { return os.Remove(checkPath) } diff --git a/command/agent/agent_test.go b/command/agent/agent_test.go index ee50e563ce..e2a7ef70e0 100644 --- a/command/agent/agent_test.go +++ b/command/agent/agent_test.go @@ -398,7 +398,7 @@ func TestAgent_PersistService(t *testing.T) { Port: 8000, } - file := filepath.Join(agent.config.DataDir, servicesDir, svc.ID) + file := filepath.Join(agent.config.DataDir, servicesDir, stringHash(svc.ID)) // Check is not persisted unless requested if err := agent.AddService(svc, nil, false); err != nil { @@ -455,7 +455,7 @@ func TestAgent_PurgeService(t *testing.T) { Port: 8000, } - file := filepath.Join(agent.config.DataDir, servicesDir, svc.ID) + file := filepath.Join(agent.config.DataDir, servicesDir, stringHash(svc.ID)) if err := agent.AddService(svc, nil, true); err != nil { t.Fatalf("err: %v", err) } @@ -513,7 +513,7 @@ func TestAgent_PurgeServiceOnDuplicate(t *testing.T) { } defer agent2.Shutdown() - file := filepath.Join(agent.config.DataDir, servicesDir, svc1.ID) + file := filepath.Join(agent.config.DataDir, servicesDir, stringHash(svc1.ID)) if _, err := os.Stat(file); err == nil { t.Fatalf("should have removed persisted service") } @@ -546,7 +546,7 @@ func TestAgent_PersistCheck(t *testing.T) { Interval: 10 * time.Second, } - file := filepath.Join(agent.config.DataDir, checksDir, check.CheckID) + file := filepath.Join(agent.config.DataDir, checksDir, stringHash(check.CheckID)) // Not persisted if not requested if err := agent.AddCheck(check, chkType, false); err != nil { @@ -615,7 +615,7 @@ func TestAgent_PurgeCheck(t *testing.T) { ServiceName: "redis", } - file := filepath.Join(agent.config.DataDir, checksDir, check.CheckID) + file := filepath.Join(agent.config.DataDir, checksDir, stringHash(check.CheckID)) if err := agent.AddCheck(check, nil, true); err != nil { t.Fatalf("err: %v", err) } @@ -677,7 +677,7 @@ func TestAgent_PurgeCheckOnDuplicate(t *testing.T) { } defer agent2.Shutdown() - file := filepath.Join(agent.config.DataDir, checksDir, check1.CheckID) + file := filepath.Join(agent.config.DataDir, checksDir, stringHash(check1.CheckID)) if _, err := os.Stat(file); err == nil { t.Fatalf("should have removed persisted check") } diff --git a/command/agent/util.go b/command/agent/util.go index f1a88df4e3..d8cb465299 100644 --- a/command/agent/util.go +++ b/command/agent/util.go @@ -2,6 +2,7 @@ package agent import ( "bytes" + "crypto/md5" crand "crypto/rand" "fmt" "math" @@ -91,3 +92,8 @@ func encodeMsgPack(msg interface{}) ([]byte, error) { err := codec.NewEncoder(&buf, msgpackHandle).Encode(msg) return buf.Bytes(), err } + +// stringHash returns a simple md5sum for a string. +func stringHash(s string) string { + return fmt.Sprintf("%x", md5.Sum([]byte(s))) +} diff --git a/command/agent/util_test.go b/command/agent/util_test.go index 538d052aa2..92b89d26f4 100644 --- a/command/agent/util_test.go +++ b/command/agent/util_test.go @@ -30,3 +30,12 @@ func TestRandomStagger(t *testing.T) { } } } + +func TestStringHash(t *testing.T) { + in := "hello world" + expected := "5eb63bbbe01eeed093cb22bb8f5acdc3" + + if out := stringHash(in); out != expected { + t.Fatalf("bad: %s", out) + } +}