Skip to content

Commit 7f61093

Browse files
author
Ricardo Lüders
authored
OCPBUGS-22958: adds cluster storageclasses gather (#858) (#865)
* feat(gather): adds cluster storageclasses docs: updated gathered data * refactor: renaming gather after review
1 parent e0f175b commit 7f61093

File tree

5 files changed

+189
-0
lines changed

5 files changed

+189
-0
lines changed

docs/gathered-data.md

+26
Original file line numberDiff line numberDiff line change
@@ -1881,6 +1881,32 @@ None
18811881
None
18821882

18831883

1884+
## StorageClasses
1885+
1886+
Collects the cluster `StorageClass` available in cluster.
1887+
1888+
### API Reference
1889+
- https://docs.openshift.com/container-platform/4.13/rest_api/storage_apis/storageclass-storage-k8s-io-v1.html
1890+
1891+
### Sample data
1892+
- [docs/insights-archive-sample/config/storage/storageclasses/standard-csi.json](./insights-archive-sample/config/storage/storageclasses/standard-csi.json)
1893+
1894+
### Location in archive
1895+
- `config/storage/storageclasses/{name}.json`
1896+
1897+
### Config ID
1898+
`clusterconfig/storage_classes`
1899+
1900+
### Released version
1901+
- 4.15
1902+
1903+
### Backported versions
1904+
None
1905+
1906+
### Changes
1907+
None
1908+
1909+
18841910
## StorageCluster
18851911

18861912
Collects `storageclusters.ocs.openshift.io` resources
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"metadata": {
3+
"name": "standard-csi",
4+
"uid": "325921f8-e18e-4861-96b6-8976bebbf07b",
5+
"resourceVersion": "6648",
6+
"creationTimestamp": "2023-11-01T12:49:07Z",
7+
"annotations": {
8+
"storageclass.kubernetes.io/is-default-class": "true"
9+
}
10+
},
11+
"provisioner": "pd.csi.storage.gke.io",
12+
"parameters": {
13+
"replication-type": "none",
14+
"type": "pd-standard"
15+
},
16+
"reclaimPolicy": "Delete",
17+
"allowVolumeExpansion": true,
18+
"volumeBindingMode": "WaitForFirstConsumer"
19+
}

pkg/gatherers/clusterconfig/clusterconfig_gatherer.go

+1
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ var gatheringFunctions = map[string]gathererFuncPtr{
8383
"scheduler_logs": (*Gatherer).GatherSchedulerLogs,
8484
"service_accounts": (*Gatherer).GatherServiceAccounts,
8585
"silenced_alerts": (*Gatherer).GatherSilencedAlerts,
86+
"storage_classes": (*Gatherer).GatherStorageClasses,
8687
"storage_cluster": (*Gatherer).GatherStorageCluster,
8788
"support_secret": (*Gatherer).GatherSupportSecret,
8889
"tsdb_status": (*Gatherer).GatherPrometheusTSDBStatus,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package clusterconfig
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
v1 "k8s.io/client-go/kubernetes/typed/storage/v1"
8+
9+
"github.com/openshift/insights-operator/pkg/record"
10+
storagev1 "k8s.io/api/storage/v1"
11+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12+
"k8s.io/client-go/kubernetes"
13+
)
14+
15+
// GatherStorageClasses Collects the cluster `StorageClass` available in cluster.
16+
//
17+
// ### API Reference
18+
// - https://docs.openshift.com/container-platform/4.13/rest_api/storage_apis/storageclass-storage-k8s-io-v1.html
19+
//
20+
// ### Sample data
21+
// - docs/insights-archive-sample/config/storage/storageclasses/standard-csi.json
22+
//
23+
// ### Location in archive
24+
// - `config/storage/storageclasses/{name}.json`
25+
//
26+
// ### Config ID
27+
// `clusterconfig/storage_classes`
28+
//
29+
// ### Released version
30+
// - 4.15
31+
//
32+
// ### Backported versions
33+
// None
34+
//
35+
// ### Changes
36+
// None
37+
func (g *Gatherer) GatherStorageClasses(ctx context.Context) ([]record.Record, []error) {
38+
kubeClient, err := kubernetes.NewForConfig(g.gatherKubeConfig)
39+
if err != nil {
40+
return nil, []error{err}
41+
}
42+
43+
return gatherStorageClasses(ctx, kubeClient.StorageV1())
44+
}
45+
46+
func gatherStorageClasses(ctx context.Context, storageClient v1.StorageV1Interface) ([]record.Record, []error) {
47+
storageClasses, err := listStorageClasses(ctx, storageClient.StorageClasses())
48+
if err != nil {
49+
return nil, []error{err}
50+
}
51+
52+
var records []record.Record
53+
for i := range storageClasses.Items {
54+
item := &storageClasses.Items[i]
55+
records = append(records, record.Record{
56+
Name: fmt.Sprintf("config/storage/storageclasses/%s", item.GetName()),
57+
Item: record.ResourceMarshaller{Resource: item},
58+
})
59+
}
60+
61+
return records, nil
62+
}
63+
64+
func listStorageClasses(ctx context.Context, storageClient v1.StorageClassInterface) (*storagev1.StorageClassList, error) {
65+
storageClasses, err := storageClient.List(ctx, metav1.ListOptions{})
66+
if err != nil {
67+
return nil, err
68+
}
69+
return storageClasses, nil
70+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package clusterconfig
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/openshift/insights-operator/pkg/record"
8+
"github.com/stretchr/testify/assert"
9+
storagev1 "k8s.io/api/storage/v1"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/client-go/kubernetes/fake"
12+
)
13+
14+
func TestGatherStorageClasses(t *testing.T) {
15+
tests := []struct {
16+
name string
17+
storageClasses []storagev1.StorageClass
18+
wantRecords []record.Record
19+
wantErrCount int
20+
}{
21+
{
22+
name: "Successful retrieval of storageclasses",
23+
storageClasses: []storagev1.StorageClass{
24+
{
25+
ObjectMeta: metav1.ObjectMeta{Name: "standard-csi"},
26+
Provisioner: "pd.csi.storage.gke.io",
27+
Parameters: map[string]string{
28+
"replication-type": "none",
29+
"type": "pd-standard",
30+
},
31+
},
32+
},
33+
wantRecords: []record.Record{
34+
{
35+
Name: "config/storage/storageclasses/standard-csi",
36+
Item: record.ResourceMarshaller{
37+
Resource: &storagev1.StorageClass{
38+
ObjectMeta: metav1.ObjectMeta{Name: "standard-csi"},
39+
Provisioner: "pd.csi.storage.gke.io",
40+
Parameters: map[string]string{
41+
"replication-type": "none",
42+
"type": "pd-standard",
43+
},
44+
},
45+
},
46+
},
47+
},
48+
wantErrCount: 0,
49+
},
50+
{
51+
name: "Retrieval no storageclasses items",
52+
storageClasses: nil,
53+
wantRecords: nil,
54+
wantErrCount: 0,
55+
},
56+
}
57+
58+
for _, tt := range tests {
59+
t.Run(tt.name, func(t *testing.T) {
60+
// Create a fake client and store it in a variable
61+
kubeClient := fake.NewSimpleClientset(&storagev1.StorageClassList{
62+
Items: tt.storageClasses,
63+
})
64+
65+
// Call the gatherStorageClasses function with the fake client
66+
records, errs := gatherStorageClasses(context.Background(), kubeClient.StorageV1())
67+
68+
// Verify the results
69+
assert.Equal(t, tt.wantRecords, records)
70+
assert.Len(t, errs, tt.wantErrCount)
71+
})
72+
}
73+
}

0 commit comments

Comments
 (0)