-
Notifications
You must be signed in to change notification settings - Fork 4
/
ifxmeasurementcfg.go
244 lines (221 loc) · 7.82 KB
/
ifxmeasurementcfg.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
package config
import (
"fmt"
"sort"
"strings"
)
/***************************
IfxMeasurementCfg DB backends
-GetIfxMeasurementCfgByID(struct)
-GetIfxMeasurementCfgMap (map - for interna config use
-GetIfxMeasurementCfgArray(Array - for web ui use )
-GetIfxMeasurementCfgBySQLQuery(struct - for web ui use )
-GetIfxMeasurementCfgDistinctNamesArray
-GetIfxMeasurementTagsArray
-AddIfxMeasurementCfg
-DelIfxMeasurementCfg
-UpdateIfxMeasurementCfg
-GetIfxMeasurementCfgAffectOnDel
***********************************/
/*GetIfxMeasurementCfgByID get device data by id*/
func (dbc *DatabaseCfg) GetIfxMeasurementCfgByID(id string) (IfxMeasurementCfg, error) {
cfgarray, err := dbc.GetIfxMeasurementCfgArray("id='" + id + "'")
if err != nil {
return IfxMeasurementCfg{}, err
}
if len(cfgarray) > 1 {
return IfxMeasurementCfg{}, fmt.Errorf("Error %d results on get IfxMeasurementCfg by id %s", len(cfgarray), id)
}
if len(cfgarray) == 0 {
return IfxMeasurementCfg{}, fmt.Errorf("Error no values have been returned with this id %s in the influx config table", id)
}
return *cfgarray[0], nil
}
/*GetIfxMeasurementCfgMap return data in map format*/
func (dbc *DatabaseCfg) GetIfxMeasurementCfgMap(filter string) (map[string]*IfxMeasurementCfg, error) {
cfgarray, err := dbc.GetIfxMeasurementCfgArray(filter)
cfgmap := make(map[string]*IfxMeasurementCfg)
for _, val := range cfgarray {
cfgmap[val.ID] = val
log.Debugf("%+v", *val)
}
return cfgmap, err
}
/*GetIfxMeasurementCfgArray generate an array of devices with all its information */
func (dbc *DatabaseCfg) GetIfxMeasurementCfgArray(filter string) ([]*IfxMeasurementCfg, error) {
var err error
var devices []*IfxMeasurementCfg
//Get Only data for selected devices
if len(filter) > 0 {
if err = dbc.x.Where(filter).Find(&devices); err != nil {
log.Warnf("Fail to get IfxMeasurementCfg data filtered with %s : %v\n", filter, err)
return nil, err
}
} else {
if err = dbc.x.Find(&devices); err != nil {
log.Warnf("Fail to get influxcfg data: %v\n", err)
return nil, err
}
}
return devices, nil
}
/*GetIfxMeasurementCfgBySQLQuery Gets an IfxMeasurementCfg with all its information */
func (dbc *DatabaseCfg) GetIfxMeasurementCfgBySQLQuery(sqlquery string) (IfxMeasurementCfg, error) {
var err error
var cfgarray []*IfxMeasurementCfg
//Get Only data for selected devices
if err = dbc.x.SQL(sqlquery).Find(&cfgarray); err != nil {
log.Warnf("Failed getting IfxMeasurementCfg data with sql %s. Error: %s\n", sqlquery, err)
return IfxMeasurementCfg{}, err
}
if len(cfgarray) > 1 {
return IfxMeasurementCfg{}, fmt.Errorf("Error %d results getting IfxMeasurementCfg by sqlquery %s", len(cfgarray), sqlquery)
}
if len(cfgarray) == 0 {
return IfxMeasurementCfg{}, fmt.Errorf("Error no values have been returned with this sqlquery %s in the config table", sqlquery)
}
return *cfgarray[0], nil
}
/*GetIfxMeasurementCfgDistinctNamesArray generate an array of IfxMeasurementCfg with distinct names */
func (dbc *DatabaseCfg) GetIfxMeasurementCfgDistinctNamesArray(filter string) ([]*IfxMeasurementCfg, error) {
var err error
var msmts []*IfxMeasurementCfg
if err = dbc.x.Distinct("name").Where(filter).OrderBy("lower(name)").Find(&msmts); err != nil {
log.Warnf("Failed to get IfxMeasurementCfg data filtered with %s : %v\n", filter, err)
return nil, err
}
return msmts, nil
}
/*GetIfxMeasurementTagsArray Gets the array of tags for the measurements passed in filter */
/*The filter contains a list of measurement names*/
/*then with these measurement names a list of tags is obtained*/
func (dbc *DatabaseCfg) GetIfxMeasurementTagsArray(filter string) ([]string, error) {
var err error
var tags []string
var msmts []*IfxMeasurementCfg
var namesfilter string
namesfilter = "`name` IN ('" + strings.Replace(filter, ",", "','", -1) + "')"
//Get the list of measurement tags
if err = dbc.x.Where(namesfilter).Find(&msmts); err != nil {
log.Warnf("Failed to get IfxMeasurementCfg data filtered with (%s). Error: %v", filter, err)
return nil, err
}
for _, msmt := range msmts {
for _, tag := range msmt.Tags {
//Don't add duplicates
if !strings.Contains(","+strings.Join(tags, ",")+",", ","+tag+",") {
tags = append(tags, tag)
}
}
}
if len(tags) > 0 {
sort.Strings(tags)
}
log.Infof("Got Measurement Tags Successfully: %+v", tags)
return tags, nil
}
// AddOrUpdateIfxMeasurementCfg this method inserts data if not previously exists or updates it if already exists
func (dbc *DatabaseCfg) AddOrUpdateIfxMeasurementCfg(dev *IfxMeasurementCfg) (int64, error) {
log.Debugf("AddOrUpdateIfxMeasurementCfg. ADD OR UPDATE %+v", dev)
//check if exist
m, err := dbc.GetIfxMeasurementCfgArray("id = '" + dev.ID + "'")
if err != nil {
return 0, err
}
switch len(m) {
case 1:
log.Debugf("Updating IfxMeasurementCfg %+v", m)
return dbc.UpdateIfxMeasurementCfg(m[0].ID, dev)
case 0:
log.Debugf("Adding new IfxMeasurementCfg %+v", dev)
return dbc.AddIfxMeasurementCfg(dev)
default:
log.Errorf("There is some error when searching for IfxMeasurement %+v , found %d", dev, len(m))
return 0, fmt.Errorf("There is some error when searching for IfxMeasurement %+v , found %d", dev, len(m))
}
}
/*AddIfxMeasurementCfg for adding new devices*/
func (dbc *DatabaseCfg) AddIfxMeasurementCfg(dev *IfxMeasurementCfg) (int64, error) {
var err error
var affected int64
session := dbc.x.NewSession()
defer session.Close()
affected, err = session.Insert(dev)
if err != nil {
session.Rollback()
return 0, err
}
//no other relation
err = session.Commit()
if err != nil {
return 0, err
}
log.Infof("Added new InfluxMeasurement Successfully with id %s ", dev.ID)
dbc.addChanges(affected)
return affected, nil
}
/*DelIfxMeasurementCfg for deleting influx databases from ID*/
func (dbc *DatabaseCfg) DelIfxMeasurementCfg(id string) (int64, error) {
var affected int64
var err error
session := dbc.x.NewSession()
defer session.Close()
affected, err = session.Where("id='" + id + "'").Delete(&IfxMeasurementCfg{})
if err != nil {
session.Rollback()
return 0, err
}
err = session.Commit()
if err != nil {
return 0, err
}
log.Infof("Deleted Successfully influx measurements with ID %s [ %d Devices Affected ]", id, affected)
dbc.addChanges(affected)
return affected, nil
}
/*UpdateIfxMeasurementCfg for adding new IfxMeasurementCfg*/
func (dbc *DatabaseCfg) UpdateIfxMeasurementCfg(id string, dev *IfxMeasurementCfg) (int64, error) {
var affecteddev, affected int64
var err error
session := dbc.x.NewSession()
defer session.Close()
if id != dev.ID { //ID has been changed
/*
affecteddev, err = session.Where("kapacitorid='" + id + "'").Cols("kapacitorid").Update(&AlertIDCfg{KapacitorID: dev.ID})
if err != nil {
session.Rollback()
return 0, fmt.Errorf("Error on Update InfluxConfig on update id(old) %s with (new): %s, error: %s", id, dev.ID, err)
}*/
log.Infof("Updated Influx Config to %s devices ", affecteddev)
}
affected, err = session.Where("id='" + id + "'").UseBool().AllCols().Update(dev)
if err != nil {
session.Rollback()
return 0, err
}
err = session.Commit()
if err != nil {
return 0, err
}
log.Infof("Updated Influx Measurement Successfully with id %s and data:%+v, affected", id, dev)
dbc.addChanges(affected + affecteddev)
return affected, nil
}
/*GetIfxMeasurementCfgAffectOnDel for deleting devices from ID*/
func (dbc *DatabaseCfg) GetIfxMeasurementCfgAffectOnDel(id string) ([]*DbObjAction, error) {
var devices []*AlertIDCfg
var obj []*DbObjAction
if err := dbc.x.Where("kapacitorid='" + id + "'").Find(&devices); err != nil {
log.Warnf("Error on Get Outout db id %d for devices , error: %s", id, err)
return nil, err
}
for _, val := range devices {
obj = append(obj, &DbObjAction{
Type: "alertidcfg",
TypeDesc: "",
ObID: val.ID,
Action: "Change alert to Other Kapacitor alert",
})
}
return obj, nil
}