Skip to content

Commit

Permalink
Merge pull request #910 from hashicorp/f-update-persisted
Browse files Browse the repository at this point in the history
Update agent-persisted services/checks
  • Loading branch information
armon committed May 6, 2015
2 parents 739d1fd + 8ef0123 commit ccbb1bb
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 29 deletions.
43 changes: 19 additions & 24 deletions command/agent/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -535,26 +535,24 @@ 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, stringHash(service.ID))
if _, err := os.Stat(svcPath); os.IsNotExist(err) {
wrapped := persistedService{
Token: a.state.ServiceToken(service.ID),
Service: service,
}
encoded, err := json.Marshal(wrapped)
if err != nil {
return nil
}
if err := os.MkdirAll(filepath.Dir(svcPath), 0700); err != nil {
return err
}
fh, err := os.OpenFile(svcPath, os.O_CREATE|os.O_WRONLY, 0600)
if err != nil {
return err
}
defer fh.Close()
if _, err := fh.Write(encoded); err != nil {
return err
}
wrapped := persistedService{
Token: a.state.ServiceToken(service.ID),
Service: service,
}
encoded, err := json.Marshal(wrapped)
if err != nil {
return nil
}
if err := os.MkdirAll(filepath.Dir(svcPath), 0700); err != nil {
return err
}
fh, err := os.OpenFile(svcPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600)
if err != nil {
return err
}
defer fh.Close()
if _, err := fh.Write(encoded); err != nil {
return err
}
return nil
}
Expand All @@ -571,9 +569,6 @@ func (a *Agent) purgeService(serviceID string) 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, stringHash(check.CheckID))
if _, err := os.Stat(checkPath); !os.IsNotExist(err) {
return err
}

// Create the persisted check
wrapped := persistedCheck{
Expand All @@ -589,7 +584,7 @@ func (a *Agent) persistCheck(check *structs.HealthCheck, chkType *CheckType) err
if err := os.MkdirAll(filepath.Dir(checkPath), 0700); err != nil {
return err
}
fh, err := os.OpenFile(checkPath, os.O_CREATE|os.O_WRONLY, 0600)
fh, err := os.OpenFile(checkPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600)
if err != nil {
return err
}
Expand Down
54 changes: 49 additions & 5 deletions command/agent/agent_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -533,11 +533,9 @@ func TestAgent_PersistService(t *testing.T) {
if err := agent.AddService(svc, nil, true, "mytoken"); err != nil {
t.Fatalf("err: %v", err)
}

if _, err := os.Stat(file); err != nil {
t.Fatalf("err: %s", err)
}

expected, err := json.Marshal(persistedService{
Token: "mytoken",
Service: svc,
Expand All @@ -552,6 +550,26 @@ func TestAgent_PersistService(t *testing.T) {
if !bytes.Equal(expected, content) {
t.Fatalf("bad: %s", string(content))
}

// Updates service definition on disk
svc.Port = 8001
if err := agent.AddService(svc, nil, true, "mytoken"); err != nil {
t.Fatalf("err: %v", err)
}
expected, err = json.Marshal(persistedService{
Token: "mytoken",
Service: svc,
})
if err != nil {
t.Fatalf("err: %s", err)
}
content, err = ioutil.ReadFile(file)
if err != nil {
t.Fatalf("err: %s", err)
}
if !bytes.Equal(expected, content) {
t.Fatalf("bad: %s", string(content))
}
agent.Shutdown()

// Should load it back during later start
Expand All @@ -561,12 +579,16 @@ func TestAgent_PersistService(t *testing.T) {
}
defer agent2.Shutdown()

if _, ok := agent2.state.services[svc.ID]; !ok {
restored, ok := agent2.state.services[svc.ID]
if !ok {
t.Fatalf("bad: %#v", agent2.state.services)
}
if agent2.state.serviceTokens[svc.ID] != "mytoken" {
t.Fatalf("bad: %#v", agent2.state.services[svc.ID])
}
if restored.Port != 8001 {
t.Fatalf("bad: %#v", restored)
}
}

func TestAgent_persistedService_compat(t *testing.T) {
Expand Down Expand Up @@ -731,11 +753,9 @@ func TestAgent_PersistCheck(t *testing.T) {
if err := agent.AddCheck(check, chkType, true, "mytoken"); err != nil {
t.Fatalf("err: %v", err)
}

if _, err := os.Stat(file); err != nil {
t.Fatalf("err: %s", err)
}

expected, err := json.Marshal(persistedCheck{
Check: check,
ChkType: chkType,
Expand All @@ -751,6 +771,27 @@ func TestAgent_PersistCheck(t *testing.T) {
if !bytes.Equal(expected, content) {
t.Fatalf("bad: %s", string(content))
}

// Updates the check definition on disk
check.Name = "mem1"
if err := agent.AddCheck(check, chkType, true, "mytoken"); err != nil {
t.Fatalf("err: %v", err)
}
expected, err = json.Marshal(persistedCheck{
Check: check,
ChkType: chkType,
Token: "mytoken",
})
if err != nil {
t.Fatalf("err: %s", err)
}
content, err = ioutil.ReadFile(file)
if err != nil {
t.Fatalf("err: %s", err)
}
if !bytes.Equal(expected, content) {
t.Fatalf("bad: %s", string(content))
}
agent.Shutdown()

// Should load it back during later start
Expand All @@ -767,6 +808,9 @@ func TestAgent_PersistCheck(t *testing.T) {
if result.Status != structs.HealthCritical {
t.Fatalf("bad: %#v", result)
}
if result.Name != "mem1" {
t.Fatalf("bad: %#v", result)
}

// Should have restored the monitor
if _, ok := agent2.checkMonitors[check.CheckID]; !ok {
Expand Down

0 comments on commit ccbb1bb

Please sign in to comment.