/
persistentvolume.go
executable file
·84 lines (71 loc) · 2.44 KB
/
persistentvolume.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
package kubernetes
import (
"reflect"
"github.com/weaveworks/scope/report"
apiv1 "k8s.io/api/core/v1"
)
// PersistentVolume represent kubernetes PersistentVolume interface
type PersistentVolume interface {
Meta
GetNode(probeID string) report.Node
GetAccessMode() string
GetVolume() string
GetStorageDriver() string
}
// persistentVolume represents kubernetes persistent volume
type persistentVolume struct {
*apiv1.PersistentVolume
Meta
}
// NewPersistentVolume returns new persistentVolume type
func NewPersistentVolume(p *apiv1.PersistentVolume) PersistentVolume {
return &persistentVolume{PersistentVolume: p, Meta: meta{p.ObjectMeta}}
}
// GetAccessMode returns access mode associated with PV
func (p *persistentVolume) GetAccessMode() string {
var accessMode string
if len(p.Spec.AccessModes) > 0 {
// A volume can only be mounted using one access mode at a time,
//even if it supports many.
accessMode = string(p.Spec.AccessModes[0])
}
return accessMode
}
// GetVolume returns volume name
func (p *persistentVolume) GetVolume() string {
var volume string
if p.Spec.ClaimRef != nil {
volume = p.Spec.ClaimRef.Name
}
return volume
}
// GetStorageDriver returns the backing driver of Persistent Volume
func (p *persistentVolume) GetStorageDriver() string {
persistentVolumeSource := reflect.ValueOf(p.Spec.PersistentVolumeSource)
// persistentVolumeSource will have exactly one field which won't be nil,
// depending on the type of backing driver used to create the persistent volume
// Iterate over the fields and return the non-nil field name
for i := 0; i < persistentVolumeSource.NumField(); i++ {
if !reflect.ValueOf(persistentVolumeSource.Field(i).Interface()).IsNil() {
return persistentVolumeSource.Type().Field(i).Name
}
}
return ""
}
// GetNode returns Persistent Volume as Node
func (p *persistentVolume) GetNode(probeID string) report.Node {
latests := map[string]string{
NodeType: "Persistent Volume",
VolumeClaim: p.GetVolume(),
StorageClassName: p.Spec.StorageClassName,
Status: string(p.Status.Phase),
AccessModes: p.GetAccessMode(),
report.ControlProbeID: probeID,
}
if p.GetStorageDriver() != "" {
latests[StorageDriver] = p.GetStorageDriver()
}
return p.MetaNode(report.MakePersistentVolumeNodeID(p.UID())).
WithLatests(latests).
WithLatestActiveControls(Describe)
}