forked from openebs-archive/node-disk-manager
-
Notifications
You must be signed in to change notification settings - Fork 1
/
probe.go
109 lines (90 loc) · 2.98 KB
/
probe.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
/*
Copyright 2018 The OpenEBS Authors.
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 controller
import (
"sort"
"github.com/openebs/node-disk-manager/blockdevice"
"github.com/openebs/node-disk-manager/pkg/util"
"k8s.io/klog"
)
// EventMessage struct contains attribute of event message info.
type EventMessage struct {
Action string // Action is event action like attach/detach
Devices []*blockdevice.BlockDevice // list of block device details
}
// Probe contains name, state and probeinterface
type Probe struct {
Priority int
Name string
State bool
Interface ProbeInterface
}
// Start implements ProbeInterface's Start()
func (p *Probe) Start() {
p.Interface.Start()
}
// FillBlockDeviceDetails implements ProbeInterface's FillBlockDeviceDetails()
func (p *Probe) FillBlockDeviceDetails(blockDevice *blockdevice.BlockDevice) {
p.Interface.FillBlockDeviceDetails(blockDevice)
}
// ProbeInterface contains Start() and FillBlockDeviceDetails()
type ProbeInterface interface {
Start()
FillBlockDeviceDetails(*blockdevice.BlockDevice)
}
// sortableProbes contains a slice of probes
type sortableProbes []*Probe
// Len returns the length of a slice.
func (ps sortableProbes) Len() int {
return len(ps)
}
// Swap swaps the elements with indexes i and j.
func (ps sortableProbes) Swap(i, j int) {
ps[i], ps[j] = ps[j], ps[i]
}
// Less reports whether the element with
// index i should sort before the element with index j.
func (ps sortableProbes) Less(i, j int) bool {
return ps[i].Priority < ps[j].Priority
}
// AddNewProbe adds new probe to controller object
func (c *Controller) AddNewProbe(probe *Probe) {
c.Lock()
defer c.Unlock()
probes := c.Probes
probes = append(probes, probe)
sort.Sort(sortableProbes(probes))
c.Probes = probes
klog.Info("configured ", probe.Name, " : state ", util.StateStatus(probe.State))
}
// ListProbe returns list of active probe associated with controller object
func (c *Controller) ListProbe() []*Probe {
c.Lock()
defer c.Unlock()
listProbe := make([]*Probe, 0)
for _, probe := range c.Probes {
if probe.State {
listProbe = append(listProbe, probe)
}
}
return listProbe
}
// FillBlockDeviceDetails lists registered probes and fills details from each probe
func (c *Controller) FillBlockDeviceDetails(blockDevice *blockdevice.BlockDevice) {
blockDevice.NodeAttributes = c.NodeAttributes
probes := c.ListProbe()
for _, probe := range probes {
probe.FillBlockDeviceDetails(blockDevice)
klog.Info("details filled by ", probe.Name)
}
}