diff --git a/probe/kubernetes/persistentvolume.go b/probe/kubernetes/persistentvolume.go index 66a413b27..2a920c0cb 100644 --- a/probe/kubernetes/persistentvolume.go +++ b/probe/kubernetes/persistentvolume.go @@ -1,6 +1,8 @@ package kubernetes import ( + "reflect" + "github.com/weaveworks/scope/report" apiv1 "k8s.io/api/core/v1" ) @@ -11,6 +13,7 @@ type PersistentVolume interface { GetNode() report.Node GetAccessMode() string GetVolume() string + GetStorageDriver() string } // persistentVolume represents kubernetes persistent volume @@ -45,13 +48,34 @@ func (p *persistentVolume) GetVolume() string { 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() report.Node { - return p.MetaNode(report.MakePersistentVolumeNodeID(p.UID())).WithLatests(map[string]string{ + latests := map[string]string{ NodeType: "Persistent Volume", VolumeClaim: p.GetVolume(), StorageClassName: p.Spec.StorageClassName, Status: string(p.Status.Phase), AccessModes: p.GetAccessMode(), - }) + } + + if p.GetStorageDriver() != "" { + latests[StorageDriver] = p.GetStorageDriver() + } + + return p.MetaNode(report.MakePersistentVolumeNodeID(p.UID())).WithLatests(latests) } diff --git a/probe/kubernetes/reporter.go b/probe/kubernetes/reporter.go index 886e6ca00..3dfa8c793 100644 --- a/probe/kubernetes/reporter.go +++ b/probe/kubernetes/reporter.go @@ -33,6 +33,7 @@ const ( Message = report.KubernetesMessage VolumeName = report.KubernetesVolumeName Provisioner = report.KubernetesProvisioner + StorageDriver = report.KubernetesStorageDriver ) // Exposed for testing @@ -112,6 +113,7 @@ var ( StorageClassName: {ID: StorageClassName, Label: "Storage class", From: report.FromLatest, Priority: 3}, AccessModes: {ID: AccessModes, Label: "Access modes", From: report.FromLatest, Priority: 5}, Status: {ID: Status, Label: "Status", From: report.FromLatest, Priority: 6}, + StorageDriver: {ID: StorageDriver, Label: "Storage driver", From: report.FromLatest, Priority: 7}, } PersistentVolumeClaimMetadataTemplates = report.MetadataTemplates{ diff --git a/render/expected/expected.go b/render/expected/expected.go index 290ceb128..3852b9634 100644 --- a/render/expected/expected.go +++ b/render/expected/expected.go @@ -290,6 +290,7 @@ var ( kubernetes.VolumeClaim: "pvc-6124", kubernetes.AccessModes: "ReadWriteOnce", kubernetes.StorageClassName: "standard", + kubernetes.StorageDriver: "iSCSI", }), fixture.StorageClassNodeID: StorageClass(fixture.StorageClassNodeID, fixture.PersistentVolumeClaimNodeID). diff --git a/report/map_keys.go b/report/map_keys.go index ba41c03d1..fa5bea503 100644 --- a/report/map_keys.go +++ b/report/map_keys.go @@ -80,6 +80,7 @@ const ( KubernetesMessage = "kubernetes_message" KubernetesVolumeName = "kubernetes_volume_name" KubernetesProvisioner = "kubernetes_provisioner" + KubernetesStorageDriver = "kubernetes_storage_driver" // probe/awsecs ECSCluster = "ecs_cluster" ECSCreatedAt = "ecs_created_at" diff --git a/test/fixture/report_fixture.go b/test/fixture/report_fixture.go index 00f883064..f914077f2 100644 --- a/test/fixture/report_fixture.go +++ b/test/fixture/report_fixture.go @@ -380,6 +380,7 @@ var ( kubernetes.VolumeClaim: "pvc-6124", kubernetes.AccessModes: "ReadWriteOnce", kubernetes.StorageClassName: "standard", + kubernetes.StorageDriver: "iSCSI", }). WithTopology(report.PersistentVolume), },