master
go 160 lines 3.86 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package powervault
4
5 import (
6 "context"
7 _ "embed"
8 "errors"
9 "fmt"
10 "time"
11
12 "github.com/netdata/netdata/go/plugins/pkg/confopt"
13 "github.com/netdata/netdata/go/plugins/pkg/matcher"
14 "github.com/netdata/netdata/go/plugins/pkg/metrix"
15 "github.com/netdata/netdata/go/plugins/pkg/web"
16 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
17 "github.com/netdata/netdata/go/plugins/plugin/go.d/collector/powervault/client"
18 )
19
20 //go:embed "config_schema.json"
21 var configSchema string
22
23 //go:embed "charts.yaml"
24 var chartTemplateYAML string
25
26 func init() {
27 collectorapi.Register("powervault", collectorapi.Creator{
28 JobConfigSchema: configSchema,
29 Defaults: collectorapi.Defaults{
30 UpdateEvery: 30,
31 },
32 CreateV2: func() collectorapi.CollectorV2 { return New() },
33 Config: func() any { return &Config{} },
34 })
35 }
36
37 func New() *Collector {
38 store := metrix.NewCollectorStore()
39 mx := newCollectorMetrics(store)
40
41 return &Collector{
42 Config: Config{
43 HTTPConfig: web.HTTPConfig{
44 RequestConfig: web.RequestConfig{
45 URL: "https://127.0.0.1",
46 },
47 ClientConfig: web.ClientConfig{
48 Timeout: confopt.Duration(30 * time.Second),
49 },
50 },
51 AuthDigest: "sha256",
52 },
53 store: store,
54 mx: mx,
55 }
56 }
57
58 type Config struct {
59 Vnode string `yaml:"vnode,omitempty" json:"vnode"`
60 UpdateEvery int `yaml:"update_every,omitempty" json:"update_every"`
61 AutoDetectionRetry int `yaml:"autodetection_retry,omitempty" json:"autodetection_retry"`
62 web.HTTPConfig `yaml:",inline" json:""`
63 AuthDigest string `yaml:"auth_digest,omitempty" json:"auth_digest"`
64 VolumeSelector string `yaml:"volume_selector,omitempty" json:"volume_selector"`
65 }
66
67 type (
68 Collector struct {
69 collectorapi.Base
70 Config `yaml:",inline" json:""`
71
72 store metrix.CollectorStore
73 mx *collectorMetrics
74
75 client *client.Client
76
77 discovered discovered
78 lastDiscoveryOK bool
79 runs int
80
81 volMatcher matcher.Matcher
82 }
83 discovered struct {
84 system []client.SystemInfo
85 controllers []client.Controller
86 drives []client.Drive
87 fans []client.Fan
88 psus []client.PowerSupply
89 sensors []client.Sensor
90 frus []client.FRU
91 volumes map[string]client.Volume // keyed by volume-name
92 pools []client.Pool
93 ports []client.Port
94 }
95 )
96
97 func (c *Collector) Configuration() any {
98 return c.Config
99 }
100
101 func (c *Collector) Init(context.Context) error {
102 if c.Username == "" || c.Password == "" {
103 return errors.New("config: username and password aren't set")
104 }
105
106 digest := c.AuthDigest
107 if digest == "" {
108 digest = "sha256"
109 }
110 if digest != "sha256" && digest != "md5" {
111 return fmt.Errorf("config: auth_digest must be 'sha256' or 'md5', got %q", digest)
112 }
113
114 cli, err := client.New(c.ClientConfig, c.RequestConfig, digest)
115 if err != nil {
116 return fmt.Errorf("error creating PowerVault client: %v", err)
117 }
118 c.client = cli
119
120 if c.VolumeSelector != "" {
121 m, err := matcher.NewSimplePatternsMatcher(c.VolumeSelector)
122 if err != nil {
123 return fmt.Errorf("error creating volume selector: %v", err)
124 }
125 c.volMatcher = m
126 }
127
128 c.Debugf("using URL %s", c.URL)
129 c.Debugf("using timeout: %s", c.Timeout)
130 c.Debugf("using auth digest: %s", digest)
131
132 return nil
133 }
134
135 func (c *Collector) volumeMatches(name string) bool {
136 if c.volMatcher == nil {
137 return true
138 }
139 return c.volMatcher.MatchString(name)
140 }
141
142 func (c *Collector) Check(context.Context) error {
143 if err := c.client.Login(); err != nil {
144 return err
145 }
146 if err := c.client.SetLocale(); err != nil {
147 c.Warningf("error setting locale: %v", err)
148 }
149 return c.discovery()
150 }
151
152 func (c *Collector) Collect(context.Context) error {
153 return c.collect()
154 }
155
156 func (c *Collector) MetricStore() metrix.CollectorStore { return c.store }
157
158 func (c *Collector) ChartTemplateYAML() string { return chartTemplateYAML }
159
160 func (c *Collector) Cleanup(context.Context) {}