From 6d92686bdc92d2c193ab297a149da8d10c86070c Mon Sep 17 00:00:00 2001 From: Justin Toh Date: Sat, 16 Oct 2021 23:10:02 +0800 Subject: [PATCH] feat: Support CSIStorageCapacity relationships Signed-off-by: Justin Toh --- README.md | 3 ++- internal/graph/graph.go | 7 +++++++ internal/graph/kubernetes.go | 26 ++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a15c0a8..807e0f1 100644 --- a/README.md +++ b/README.md @@ -90,8 +90,9 @@ List of supported relationships used for discovering dependent objects: - [ClusterRole References](https://kubernetes.io/docs/reference/kubernetes-api/authorization-resources/cluster-role-v1/), [ClusterRoleBinding References](https://kubernetes.io/docs/reference/kubernetes-api/authorization-resources/cluster-role-binding-v1/), [Role References](https://kubernetes.io/docs/reference/kubernetes-api/authorization-resources/role-v1/) & [RoleBinding References](https://kubernetes.io/docs/reference/kubernetes-api/authorization-resources/role-binding-v1/) - [Controller References](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/controller-ref.md) & [Owner References](https://kubernetes.io/docs/concepts/overview/working-with-objects/owners-dependents/) - [CSINode References](https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/csi-node-v1/) + - [CSIStorageCapacity References](https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/csi-storage-capacity-v1beta1/) - [Event References](https://kubernetes.io/docs/reference/kubernetes-api/cluster-resources/event-v1/) - - [Ingress References](https://kubernetes.io/docs/reference/kubernetes-api/service-resources/ingress-v1/) & [IngressClass Reference](https://kubernetes.io/docs/reference/kubernetes-api/service-resources/ingress-class-v1/) + - [Ingress References](https://kubernetes.io/docs/reference/kubernetes-api/service-resources/ingress-v1/) & [IngressClass References](https://kubernetes.io/docs/reference/kubernetes-api/service-resources/ingress-class-v1/) - [MutatingWebhookConfiguration References](https://kubernetes.io/docs/reference/kubernetes-api/extend-resources/mutating-webhook-configuration-v1/) & [ValidatingWebhookConfiguration References](https://kubernetes.io/docs/reference/kubernetes-api/extend-resources/validating-webhook-configuration-v1/) - [PersistentVolume References](https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-v1/) & [PersistentVolumeClaim References](https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-claim-v1/) - [Pod References](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/) diff --git a/internal/graph/graph.go b/internal/graph/graph.go index 6f35d5f..eb75f61 100644 --- a/internal/graph/graph.go +++ b/internal/graph/graph.go @@ -556,6 +556,13 @@ func ResolveDependents(m meta.RESTMapper, objects []unstructuredv1.Unstructured, klog.V(4).Infof("Failed to get relationships for csinode named \"%s\": %s: %s", node.Name, err) continue } + // Populate dependents based on CSIStorageCapacity relationships + case node.Group == "storage.k8s.io" && node.Kind == "CSIStorageCapacity": + rmap, err = getCSIStorageCapacityRelationships(node) + if err != nil { + klog.V(4).Infof("Failed to get relationships for csistoragecapacity named \"%s\": %s: %s", node.Name, err) + continue + } // Populate dependents based on StorageClass relationships case node.Group == "storage.k8s.io" && node.Kind == "StorageClass": rmap, err = getStorageClassRelationships(node) diff --git a/internal/graph/kubernetes.go b/internal/graph/kubernetes.go index f8c6ff6..c04aeca 100644 --- a/internal/graph/kubernetes.go +++ b/internal/graph/kubernetes.go @@ -12,6 +12,7 @@ import ( policyv1beta1 "k8s.io/api/policy/v1beta1" rbacv1 "k8s.io/api/rbac/v1" storagev1 "k8s.io/api/storage/v1" + storagev1beta1 "k8s.io/api/storage/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" @@ -36,6 +37,9 @@ const ( // Kubernetes CSINode relationships. RelationshipCSINodeDriver Relationship = "CSINodeDriver" + // Kubernetes CSIStorageCapacity relationships. + RelationshipCSIStorageCapacityStorageClass Relationship = "CSIStorageCapacityStorageClass" + // Kubernetes Event relationships. RelationshipEventRegarding Relationship = "EventRegarding" RelationshipEventRelated Relationship = "EventRelated" @@ -221,6 +225,28 @@ func getCSINodeRelationships(n *Node) (*RelationshipMap, error) { return &result, nil } +// getCSIStorageCapacityRelationships returns a map of relationships that this +// CSIStorageCapacity has with other objects, based on what was referenced in +// its manifest. +func getCSIStorageCapacityRelationships(n *Node) (*RelationshipMap, error) { + var csisc storagev1beta1.CSIStorageCapacity + err := runtime.DefaultUnstructuredConverter.FromUnstructured(n.UnstructuredContent(), &csisc) + if err != nil { + return nil, err + } + + var ref ObjectReference + result := newRelationshipMap() + + // RelationshipCSIStorageCapacityStorageClass + if sc := csisc.StorageClassName; len(sc) > 0 { + ref = ObjectReference{Group: "storage.k8s.io", Kind: "StorageClass", Name: sc} + result.AddDependencyByKey(ref.Key(), RelationshipCSIStorageCapacityStorageClass) + } + + return &result, nil +} + // getEventRelationships returns a map of relationships that this Event has with // other objects, based on what was referenced in its manifest. //nolint:unparam