Skip to content

Commit 98a3681

Browse files
committed
core: Fix persistence data not being loaded and stored
1 parent abd7ecf commit 98a3681

2 files changed

Lines changed: 30 additions & 25 deletions

File tree

mod-system/interface.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ type interfacePlugin struct {
3434
}
3535

3636
type interfaceResource struct {
37-
nagocheck.Resource
37+
nagocheck.Resource `json:"-"`
3838

3939
linkState string
4040
linkSpeed int
@@ -71,7 +71,7 @@ func (p *interfacePlugin) DefineFlags(kp nagocheck.KingpinNode) {
7171
}
7272

7373
func (p *interfacePlugin) DefineCheck() nagopher.Check {
74-
deltaRange := nagopher.NewBounds(nagopher.LowerBound(0))
74+
deltaRange := nagopher.NewBounds(nagopher.LowerBound(math.Inf(-1)), nagopher.UpperBound(0))
7575
resource := newInterfaceResource(p)
7676

7777
check := nagopher.NewCheck("interface", newInterfaceSummarizer(p))
@@ -88,11 +88,12 @@ func (p *interfacePlugin) DefineCheck() nagopher.Check {
8888
}
8989

9090
func newInterfaceResource(plugin *interfacePlugin) *interfaceResource {
91-
return &interfaceResource{
92-
Resource: nagocheck.NewResource(plugin,
93-
nagocheck.ResourcePersistence(plugin.InterfaceName),
94-
),
95-
}
91+
resource := &interfaceResource{}
92+
resource.Resource = nagocheck.NewResource(plugin,
93+
nagocheck.ResourcePersistence(plugin.InterfaceName, &resource),
94+
)
95+
96+
return resource
9697
}
9798

9899
func (r *interfaceResource) Probe(warnings nagopher.WarningCollection) (metrics []nagopher.Metric, _ error) {

nagocheck/resource.go

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/snapserv/nagopher"
2626
"io/ioutil"
2727
"os"
28+
"strings"
2829
"syscall"
2930
)
3031

@@ -38,13 +39,16 @@ type Resource interface {
3839
type ResourceOpt func(*baseResource)
3940

4041
type baseResource struct {
41-
nagopher.Resource
42-
plugin Plugin
42+
nagopher.Resource `json:"-"`
43+
plugin Plugin
4344

44-
persistenceKey string
45+
persistenceKey string
46+
persistenceStore interface{}
4547
}
4648

47-
const shmOpenFlags = os.O_CREATE | os.O_RDONLY | syscall.O_DSYNC | syscall.O_RSYNC
49+
const shmOpenFlags = os.O_CREATE | syscall.O_DSYNC | syscall.O_RSYNC
50+
const shmReadFlags = shmOpenFlags | os.O_RDONLY
51+
const shmWriteFlags = shmOpenFlags | os.O_WRONLY | os.O_TRUNC
4852
const shmDefaultMode = 0600
4953

5054
// NewResource instantiates baseResource with the given functional options
@@ -62,27 +66,27 @@ func NewResource(plugin Plugin, options ...ResourceOpt) Resource {
6266
}
6367

6468
// ResourcePersistence is a functional option for NewResource(), which enables resource persistence with the given key
65-
func ResourcePersistence(uniqueKey string) ResourceOpt {
69+
func ResourcePersistence(uniqueKey string, dataStore interface{}) ResourceOpt {
6670
return func(r *baseResource) {
67-
r.persistenceKey = r.Plugin().Name() + uniqueKey
71+
r.persistenceKey = strings.ToLower(".nagocheck-" + r.Plugin().Name() + "-" + uniqueKey)
72+
r.persistenceStore = dataStore
6873
}
6974
}
7075

71-
func (r baseResource) Probe(warnings nagopher.WarningCollection) ([]nagopher.Metric, error) {
76+
func (r baseResource) Setup(warnings nagopher.WarningCollection) error {
7277
if err := r.loadPersistentData(); err != nil {
73-
return []nagopher.Metric{}, fmt.Errorf("nagopher: unable to load persistent data: %s", err.Error())
78+
return fmt.Errorf("unable to load persistent data: %s", err.Error())
7479
}
7580

76-
metrics, err := r.Resource.Probe(warnings)
77-
if err != nil {
78-
return metrics, err
79-
}
81+
return nil
82+
}
8083

84+
func (r baseResource) Teardown(warnings nagopher.WarningCollection) error {
8185
if err := r.storePersistentData(); err != nil {
82-
return []nagopher.Metric{}, fmt.Errorf("nagopher: unable to store persistent data: %s", err.Error())
86+
return fmt.Errorf("unable to store persistent data: %s", err.Error())
8387
}
8488

85-
return metrics, err
89+
return nil
8690
}
8791

8892
func (r *baseResource) loadPersistentData() (rerr error) {
@@ -92,7 +96,7 @@ func (r *baseResource) loadPersistentData() (rerr error) {
9296
}
9397

9498
// Attempt to open or create file using SHM
95-
file, err := shm.Open(r.persistenceKey, shmOpenFlags, shmDefaultMode)
99+
file, err := shm.Open(r.persistenceKey, shmReadFlags, shmDefaultMode)
96100
if err != nil {
97101
return err
98102
}
@@ -113,7 +117,7 @@ func (r *baseResource) loadPersistentData() (rerr error) {
113117

114118
// Attempt to unmarshal contents as JSON into target
115119
if len(jsonData) > 0 {
116-
if err := json.Unmarshal(jsonData, r); err != nil {
120+
if err := json.Unmarshal(jsonData, r.persistenceStore); err != nil {
117121
return err
118122
}
119123
}
@@ -128,13 +132,13 @@ func (r baseResource) storePersistentData() (rerr error) {
128132
}
129133

130134
// Attempt to marshal source into JSON
131-
jsonData, err := json.Marshal(r)
135+
jsonData, err := json.Marshal(r.persistenceStore)
132136
if err != nil {
133137
return err
134138
}
135139

136140
// Attempt to open or create file using SHM
137-
file, err := shm.Open(r.persistenceKey, shmOpenFlags, shmDefaultMode)
141+
file, err := shm.Open(r.persistenceKey, shmWriteFlags, shmDefaultMode)
138142
if err != nil {
139143
return err
140144
}

0 commit comments

Comments
 (0)