/
persistentvolumeclaim.go
executable file
·86 lines (72 loc) · 2.48 KB
/
persistentvolumeclaim.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
package kubernetes
import (
"github.com/weaveworks/scope/report"
apiv1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
)
const (
// BetaStorageClassAnnotation is the annotation for default storage class
BetaStorageClassAnnotation = "volume.beta.kubernetes.io/storage-class"
)
// PersistentVolumeClaim represents kubernetes PVC interface
type PersistentVolumeClaim interface {
Meta
Selector() (labels.Selector, error)
GetNode(string) report.Node
GetStorageClass() string
GetCapacity() string
}
// persistentVolumeClaim represents kubernetes Persistent Volume Claims
type persistentVolumeClaim struct {
*apiv1.PersistentVolumeClaim
Meta
}
// NewPersistentVolumeClaim returns new Persistent Volume Claim type
func NewPersistentVolumeClaim(p *apiv1.PersistentVolumeClaim) PersistentVolumeClaim {
return &persistentVolumeClaim{PersistentVolumeClaim: p, Meta: meta{p.ObjectMeta}}
}
// GetStorageClass will fetch storage class name from given PVC
func (p *persistentVolumeClaim) GetStorageClass() string {
// Use Beta storage class annotation first
storageClassName := p.Annotations[BetaStorageClassAnnotation]
if storageClassName != "" {
return storageClassName
}
if p.Spec.StorageClassName != nil {
storageClassName = *p.Spec.StorageClassName
}
return storageClassName
}
// GetCapacity returns the storage size of PVC
func (p *persistentVolumeClaim) GetCapacity() string {
capacity := p.Spec.Resources.Requests[apiv1.ResourceStorage]
if capacity.String() != "" {
return capacity.String()
}
return ""
}
// GetNode returns Persistent Volume Claim as Node
func (p *persistentVolumeClaim) GetNode(probeID string) report.Node {
latests := map[string]string{
NodeType: "Persistent Volume Claim",
Status: string(p.Status.Phase),
VolumeName: p.Spec.VolumeName,
StorageClassName: p.GetStorageClass(),
report.ControlProbeID: probeID,
}
if p.GetCapacity() != "" {
latests[VolumeCapacity] = p.GetCapacity()
}
return p.MetaNode(report.MakePersistentVolumeClaimNodeID(p.UID())).
WithLatests(latests).
WithLatestActiveControls(CreateVolumeSnapshot, Describe)
}
// Selector returns all Persistent Volume Claim selector
func (p *persistentVolumeClaim) Selector() (labels.Selector, error) {
selector, err := metav1.LabelSelectorAsSelector(p.Spec.Selector)
if err != nil {
return nil, err
}
return selector, nil
}