forked from influxdata/telegraf-operator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
class_data.go
99 lines (81 loc) · 2.89 KB
/
class_data.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
/*
Copyright (c) 2020 InfluxData
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package main
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"github.com/go-logr/logr"
"github.com/influxdata/toml"
)
// directoryClassDataHandler provides a handler for getting class data from class name.
type directoryClassDataHandler struct {
Logger logr.Logger
TelegrafClassesDirectory string
}
// classDataHandler defines interface for validating class data and converting from class name to class data.
type classDataHandler interface {
getData(className string) (string, error)
validateClassData() error
}
func newDirectoryClassDataHandler(logger logr.Logger, telegrafClassesDirectory string) *directoryClassDataHandler {
return &directoryClassDataHandler{
Logger: logger,
TelegrafClassesDirectory: telegrafClassesDirectory,
}
}
func (c *directoryClassDataHandler) validateClassData() error {
classDataValid := true
filesAvailable := false
c.Logger.Info(fmt.Sprintf("validating class data from directory %s", c.TelegrafClassesDirectory))
files, err := ioutil.ReadDir(c.TelegrafClassesDirectory)
if err != nil {
c.Logger.Info(fmt.Sprintf("unable to retrieve class data from directory: %v", err))
}
for _, file := range files {
stat, err := os.Stat(filepath.Join(c.TelegrafClassesDirectory, file.Name()))
if err != nil {
c.Logger.Info(fmt.Sprintf("unable to stat %s: %v", file.Name(), err))
continue
}
if stat.Mode().IsRegular() {
data, err := ioutil.ReadFile(filepath.Join(c.TelegrafClassesDirectory, file.Name()))
if err != nil {
c.Logger.Info(fmt.Sprintf("unable to retrieve class data from file %s: %v", file.Name(), err))
} else {
filesAvailable = true
if _, err := toml.Parse(data); err != nil {
c.Logger.Info(fmt.Sprintf("unable to parse class data %s: %v", file.Name(), err))
classDataValid = false
}
}
}
}
if !classDataValid {
return fmt.Errorf("class data contains errors ; unable to continue")
}
if !filesAvailable {
return fmt.Errorf("no class data found ; unable to continue")
}
return nil
}
// getData returns class data for a given class name.
func (c *directoryClassDataHandler) getData(className string) (string, error) {
data, err := ioutil.ReadFile(filepath.Join(c.TelegrafClassesDirectory, className))
if err != nil {
c.Logger.Info("unable to class data for %s: %v", className, err)
return "", err
}
return string(data), nil
}