loov / goda

Go Dependency Analysis toolkit
MIT License
1.39k stars 45 forks source link

Pruning `tree reach` results #71

Open howardjohn opened 1 year ago

howardjohn commented 1 year ago

goda tree reach(...) is super useful for finding why a dependency is imported. However, for commonly used packages it can be a bit unweildy. An example is below:

``` $ goda tree 'reach(./pilot/cmd/pilot-discovery/...:all, k8s.io/api/authorization/v1beta1)' ├ istio.io/istio/pilot/cmd/pilot-discovery └ istio.io/istio/pilot/cmd/pilot-discovery/app └ istio.io/istio/pilot/pkg/bootstrap ├ istio.io/istio/pilot/pkg/config/kube/crdclient ├ istio.io/istio/pkg/kube ├ istio.io/client-go/pkg/clientset/versioned └ k8s.io/client-go/discovery └ k8s.io/client-go/kubernetes/scheme └ k8s.io/api/authorization/v1beta1 ├ istio.io/client-go/pkg/clientset/versioned/fake ├ istio.io/client-go/pkg/clientset/versioned ~ ├ k8s.io/client-go/discovery ~ └ k8s.io/client-go/discovery/fake └ k8s.io/client-go/discovery ~ ├ k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset └ k8s.io/client-go/discovery ~ ├ k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake ├ k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset ~ ├ k8s.io/client-go/discovery ~ └ k8s.io/client-go/discovery/fake ~ ├ k8s.io/client-go/discovery ~ ├ k8s.io/client-go/discovery/cached/disk ├ k8s.io/client-go/discovery ~ ├ k8s.io/client-go/discovery/cached/memory └ k8s.io/client-go/discovery ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/discovery/cached/memory ~ ├ k8s.io/client-go/discovery/fake ~ ├ k8s.io/client-go/kubernetes ├ k8s.io/client-go/discovery ~ ├ k8s.io/client-go/kubernetes/typed/admissionregistration/v1 ├ k8s.io/client-go/applyconfigurations/admissionregistration/v1 └ k8s.io/client-go/applyconfigurations/meta/v1 └ k8s.io/client-go/discovery ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1 ├ k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1 ├ k8s.io/client-go/applyconfigurations/admissionregistration/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1 ├ k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1 ├ k8s.io/client-go/applyconfigurations/admissionregistration/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1 ├ k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/apps/v1 ├ k8s.io/client-go/applyconfigurations/apps/v1 ├ k8s.io/client-go/applyconfigurations/core/v1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ ├ k8s.io/client-go/applyconfigurations/autoscaling/v1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/apps/v1beta1 ├ k8s.io/client-go/applyconfigurations/apps/v1beta1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/apps/v1beta2 ├ k8s.io/client-go/applyconfigurations/apps/v1beta2 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/authentication/v1 └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/authentication/v1alpha1 └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/authentication/v1beta1 └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/authorization/v1 └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/authorization/v1beta1 ├ k8s.io/api/authorization/v1beta1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/autoscaling/v1 ├ k8s.io/client-go/applyconfigurations/autoscaling/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/autoscaling/v2 ├ k8s.io/client-go/applyconfigurations/autoscaling/v2 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1 ├ k8s.io/client-go/applyconfigurations/autoscaling/v2beta1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2 ├ k8s.io/client-go/applyconfigurations/autoscaling/v2beta2 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/batch/v1 ├ k8s.io/client-go/applyconfigurations/batch/v1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/batch/v1beta1 ├ k8s.io/client-go/applyconfigurations/batch/v1beta1 ├ k8s.io/client-go/applyconfigurations/batch/v1 ~ ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/certificates/v1 ├ k8s.io/client-go/applyconfigurations/certificates/v1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/certificates/v1alpha1 ├ k8s.io/client-go/applyconfigurations/certificates/v1alpha1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/certificates/v1beta1 ├ k8s.io/client-go/applyconfigurations/certificates/v1beta1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/coordination/v1 ├ k8s.io/client-go/applyconfigurations/coordination/v1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/coordination/v1beta1 ├ k8s.io/client-go/applyconfigurations/coordination/v1beta1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/core/v1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/discovery/v1 ├ k8s.io/client-go/applyconfigurations/discovery/v1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/discovery/v1beta1 ├ k8s.io/client-go/applyconfigurations/discovery/v1beta1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/events/v1 ├ k8s.io/client-go/applyconfigurations/events/v1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/events/v1beta1 ├ k8s.io/client-go/applyconfigurations/events/v1beta1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/extensions/v1beta1 ├ k8s.io/client-go/applyconfigurations/extensions/v1beta1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1 ├ k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1 ├ k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta2 ├ k8s.io/client-go/applyconfigurations/flowcontrol/v1beta2 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3 ├ k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/networking/v1 ├ k8s.io/client-go/applyconfigurations/networking/v1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/networking/v1alpha1 ├ k8s.io/client-go/applyconfigurations/networking/v1alpha1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/networking/v1beta1 ├ k8s.io/client-go/applyconfigurations/networking/v1beta1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/node/v1 ├ k8s.io/client-go/applyconfigurations/node/v1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/node/v1alpha1 ├ k8s.io/client-go/applyconfigurations/node/v1alpha1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/node/v1beta1 ├ k8s.io/client-go/applyconfigurations/node/v1beta1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/policy/v1 ├ k8s.io/client-go/applyconfigurations/policy/v1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/policy/v1beta1 ├ k8s.io/client-go/applyconfigurations/policy/v1beta1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/rbac/v1 ├ k8s.io/client-go/applyconfigurations/rbac/v1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/rbac/v1alpha1 ├ k8s.io/client-go/applyconfigurations/rbac/v1alpha1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/rbac/v1beta1 ├ k8s.io/client-go/applyconfigurations/rbac/v1beta1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/resource/v1alpha2 ├ k8s.io/client-go/applyconfigurations/resource/v1alpha2 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/scheduling/v1 ├ k8s.io/client-go/applyconfigurations/scheduling/v1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1 ├ k8s.io/client-go/applyconfigurations/scheduling/v1alpha1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/scheduling/v1beta1 ├ k8s.io/client-go/applyconfigurations/scheduling/v1beta1 └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/storage/v1 ├ k8s.io/client-go/applyconfigurations/storage/v1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/typed/storage/v1alpha1 ├ k8s.io/client-go/applyconfigurations/storage/v1alpha1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ └ k8s.io/client-go/kubernetes/typed/storage/v1beta1 ├ k8s.io/client-go/applyconfigurations/storage/v1beta1 ├ k8s.io/client-go/applyconfigurations/core/v1 ~ └ k8s.io/client-go/applyconfigurations/meta/v1 ~ └ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/kubernetes/fake ├ k8s.io/api/authorization/v1beta1 ~ ├ k8s.io/client-go/discovery ~ ├ k8s.io/client-go/discovery/fake ~ ├ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/kubernetes/typed/admissionregistration/v1 ~ ├ k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake ├ k8s.io/client-go/applyconfigurations/admissionregistration/v1 ~ └ k8s.io/client-go/kubernetes/typed/admissionregistration/v1 ~ ├ k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake ├ k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1 ~ └ k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake ├ k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/fake ├ k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1 ~ └ k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/apps/v1 ~ ├ k8s.io/client-go/kubernetes/typed/apps/v1/fake ├ k8s.io/client-go/applyconfigurations/apps/v1 ~ ├ k8s.io/client-go/applyconfigurations/autoscaling/v1 ~ └ k8s.io/client-go/kubernetes/typed/apps/v1 ~ ├ k8s.io/client-go/kubernetes/typed/apps/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake ├ k8s.io/client-go/applyconfigurations/apps/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/apps/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/apps/v1beta2 ~ ├ k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake ├ k8s.io/client-go/applyconfigurations/apps/v1beta2 ~ └ k8s.io/client-go/kubernetes/typed/apps/v1beta2 ~ ├ k8s.io/client-go/kubernetes/typed/authentication/v1 ~ ├ k8s.io/client-go/kubernetes/typed/authentication/v1/fake └ k8s.io/client-go/kubernetes/typed/authentication/v1 ~ ├ k8s.io/client-go/kubernetes/typed/authentication/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/authentication/v1alpha1/fake └ k8s.io/client-go/kubernetes/typed/authentication/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/authentication/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake └ k8s.io/client-go/kubernetes/typed/authentication/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/authorization/v1 ~ ├ k8s.io/client-go/kubernetes/typed/authorization/v1/fake └ k8s.io/client-go/kubernetes/typed/authorization/v1 ~ ├ k8s.io/client-go/kubernetes/typed/authorization/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake ├ k8s.io/api/authorization/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/authorization/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/autoscaling/v1 ~ ├ k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake ├ k8s.io/client-go/applyconfigurations/autoscaling/v1 ~ └ k8s.io/client-go/kubernetes/typed/autoscaling/v1 ~ ├ k8s.io/client-go/kubernetes/typed/autoscaling/v2 ~ ├ k8s.io/client-go/kubernetes/typed/autoscaling/v2/fake ├ k8s.io/client-go/applyconfigurations/autoscaling/v2 ~ └ k8s.io/client-go/kubernetes/typed/autoscaling/v2 ~ ├ k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1 ~ ├ k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake ├ k8s.io/client-go/applyconfigurations/autoscaling/v2beta1 ~ └ k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1 ~ ├ k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2 ~ ├ k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake ├ k8s.io/client-go/applyconfigurations/autoscaling/v2beta2 ~ └ k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2 ~ ├ k8s.io/client-go/kubernetes/typed/batch/v1 ~ ├ k8s.io/client-go/kubernetes/typed/batch/v1/fake ├ k8s.io/client-go/applyconfigurations/batch/v1 ~ └ k8s.io/client-go/kubernetes/typed/batch/v1 ~ ├ k8s.io/client-go/kubernetes/typed/batch/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake ├ k8s.io/client-go/applyconfigurations/batch/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/batch/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/certificates/v1 ~ ├ k8s.io/client-go/kubernetes/typed/certificates/v1/fake ├ k8s.io/client-go/applyconfigurations/certificates/v1 ~ └ k8s.io/client-go/kubernetes/typed/certificates/v1 ~ ├ k8s.io/client-go/kubernetes/typed/certificates/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/certificates/v1alpha1/fake ├ k8s.io/client-go/applyconfigurations/certificates/v1alpha1 ~ └ k8s.io/client-go/kubernetes/typed/certificates/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/certificates/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake ├ k8s.io/client-go/applyconfigurations/certificates/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/certificates/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/coordination/v1 ~ ├ k8s.io/client-go/kubernetes/typed/coordination/v1/fake ├ k8s.io/client-go/applyconfigurations/coordination/v1 ~ └ k8s.io/client-go/kubernetes/typed/coordination/v1 ~ ├ k8s.io/client-go/kubernetes/typed/coordination/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake ├ k8s.io/client-go/applyconfigurations/coordination/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/coordination/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/core/v1 ~ ├ k8s.io/client-go/kubernetes/typed/core/v1/fake ├ k8s.io/client-go/applyconfigurations/core/v1 ~ ├ k8s.io/client-go/kubernetes/scheme ~ └ k8s.io/client-go/kubernetes/typed/core/v1 ~ ├ k8s.io/client-go/kubernetes/typed/discovery/v1 ~ ├ k8s.io/client-go/kubernetes/typed/discovery/v1/fake ├ k8s.io/client-go/applyconfigurations/discovery/v1 ~ └ k8s.io/client-go/kubernetes/typed/discovery/v1 ~ ├ k8s.io/client-go/kubernetes/typed/discovery/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake ├ k8s.io/client-go/applyconfigurations/discovery/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/discovery/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/events/v1 ~ ├ k8s.io/client-go/kubernetes/typed/events/v1/fake ├ k8s.io/client-go/applyconfigurations/events/v1 ~ └ k8s.io/client-go/kubernetes/typed/events/v1 ~ ├ k8s.io/client-go/kubernetes/typed/events/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/events/v1beta1/fake ├ k8s.io/client-go/applyconfigurations/events/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/events/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/extensions/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake ├ k8s.io/client-go/applyconfigurations/extensions/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/extensions/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake ├ k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1 ~ └ k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake ├ k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta2 ~ ├ k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta2/fake ├ k8s.io/client-go/applyconfigurations/flowcontrol/v1beta2 ~ └ k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta2 ~ ├ k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3 ~ ├ k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/fake ├ k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3 ~ └ k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3 ~ ├ k8s.io/client-go/kubernetes/typed/networking/v1 ~ ├ k8s.io/client-go/kubernetes/typed/networking/v1/fake ├ k8s.io/client-go/applyconfigurations/networking/v1 ~ └ k8s.io/client-go/kubernetes/typed/networking/v1 ~ ├ k8s.io/client-go/kubernetes/typed/networking/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/networking/v1alpha1/fake ├ k8s.io/client-go/applyconfigurations/networking/v1alpha1 ~ └ k8s.io/client-go/kubernetes/typed/networking/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/networking/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake ├ k8s.io/client-go/applyconfigurations/networking/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/networking/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/node/v1 ~ ├ k8s.io/client-go/kubernetes/typed/node/v1/fake ├ k8s.io/client-go/applyconfigurations/node/v1 ~ └ k8s.io/client-go/kubernetes/typed/node/v1 ~ ├ k8s.io/client-go/kubernetes/typed/node/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/node/v1alpha1/fake ├ k8s.io/client-go/applyconfigurations/node/v1alpha1 ~ └ k8s.io/client-go/kubernetes/typed/node/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/node/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/node/v1beta1/fake ├ k8s.io/client-go/applyconfigurations/node/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/node/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/policy/v1 ~ ├ k8s.io/client-go/kubernetes/typed/policy/v1/fake ├ k8s.io/client-go/applyconfigurations/policy/v1 ~ └ k8s.io/client-go/kubernetes/typed/policy/v1 ~ ├ k8s.io/client-go/kubernetes/typed/policy/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake ├ k8s.io/client-go/applyconfigurations/policy/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/policy/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/rbac/v1 ~ ├ k8s.io/client-go/kubernetes/typed/rbac/v1/fake ├ k8s.io/client-go/applyconfigurations/rbac/v1 ~ └ k8s.io/client-go/kubernetes/typed/rbac/v1 ~ ├ k8s.io/client-go/kubernetes/typed/rbac/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake ├ k8s.io/client-go/applyconfigurations/rbac/v1alpha1 ~ └ k8s.io/client-go/kubernetes/typed/rbac/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/rbac/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake ├ k8s.io/client-go/applyconfigurations/rbac/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/rbac/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/resource/v1alpha2 ~ ├ k8s.io/client-go/kubernetes/typed/resource/v1alpha2/fake ├ k8s.io/client-go/applyconfigurations/resource/v1alpha2 ~ └ k8s.io/client-go/kubernetes/typed/resource/v1alpha2 ~ ├ k8s.io/client-go/kubernetes/typed/scheduling/v1 ~ ├ k8s.io/client-go/kubernetes/typed/scheduling/v1/fake ├ k8s.io/client-go/applyconfigurations/scheduling/v1 ~ └ k8s.io/client-go/kubernetes/typed/scheduling/v1 ~ ├ k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake ├ k8s.io/client-go/applyconfigurations/scheduling/v1alpha1 ~ └ k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/scheduling/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake ├ k8s.io/client-go/applyconfigurations/scheduling/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/scheduling/v1beta1 ~ ├ k8s.io/client-go/kubernetes/typed/storage/v1 ~ ├ k8s.io/client-go/kubernetes/typed/storage/v1/fake ├ k8s.io/client-go/applyconfigurations/storage/v1 ~ └ k8s.io/client-go/kubernetes/typed/storage/v1 ~ ├ k8s.io/client-go/kubernetes/typed/storage/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake ├ k8s.io/client-go/applyconfigurations/storage/v1alpha1 ~ └ k8s.io/client-go/kubernetes/typed/storage/v1alpha1 ~ ├ k8s.io/client-go/kubernetes/typed/storage/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake ├ k8s.io/client-go/applyconfigurations/storage/v1beta1 ~ └ k8s.io/client-go/kubernetes/typed/storage/v1beta1 ~ ├ k8s.io/client-go/kubernetes/scheme ~ ├ k8s.io/client-go/restmapper └ k8s.io/client-go/discovery ~ ├ sigs.k8s.io/gateway-api/pkg/client/clientset/versioned └ k8s.io/client-go/discovery ~ └ sigs.k8s.io/gateway-api/pkg/client/clientset/versioned/fake ├ k8s.io/client-go/discovery ~ ├ k8s.io/client-go/discovery/fake ~ └ sigs.k8s.io/gateway-api/pkg/client/clientset/versioned ~ └ istio.io/istio/pkg/kube/kclient ├ istio.io/istio/pkg/config/schema/kubeclient ├ istio.io/client-go/pkg/clientset/versioned ~ ├ k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset ~ ├ k8s.io/client-go/kubernetes ~ └ sigs.k8s.io/gateway-api/pkg/client/clientset/versioned ~ └ istio.io/istio/pkg/kube ~ ├ istio.io/istio/pilot/pkg/config/kube/gateway ├ istio.io/istio/pilot/pkg/serviceregistry/kube/controller ├ istio.io/istio/pilot/pkg/config/kube/crdclient ~ ├ istio.io/istio/pilot/pkg/leaderelection ├ istio.io/istio/pilot/pkg/leaderelection/k8sleaderelection └ istio.io/istio/pilot/pkg/leaderelection/k8sleaderelection/k8sresourcelock ├ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/kubernetes/typed/coordination/v1 ~ └ k8s.io/client-go/kubernetes/typed/core/v1 ~ ├ istio.io/istio/pilot/pkg/leaderelection/k8sleaderelection/k8sresourcelock ~ ├ istio.io/istio/pkg/kube ~ ├ istio.io/istio/pkg/revisions ├ istio.io/istio/pkg/kube ~ └ istio.io/istio/pkg/kube/kclient ~ └ k8s.io/client-go/kubernetes ~ ├ istio.io/istio/pkg/kube ~ ├ istio.io/istio/pkg/kube/inject ├ istio.io/istio/pkg/kube ~ └ istio.io/istio/pkg/kube/watcher/configmapwatcher ├ istio.io/istio/pkg/kube ~ └ istio.io/istio/pkg/kube/kclient ~ ├ istio.io/istio/pkg/kube/kclient ~ ├ istio.io/istio/pkg/kube/kclient/clienttest ├ istio.io/istio/pkg/config/schema/kubeclient ~ ├ istio.io/istio/pkg/kube ~ └ istio.io/istio/pkg/kube/kclient ~ ├ istio.io/istio/pkg/kube/multicluster ├ istio.io/istio/pkg/kube ~ ├ istio.io/istio/pkg/kube/kclient ~ ├ istio.io/istio/pkg/kube/namespace └ istio.io/istio/pkg/kube/kclient ~ └ k8s.io/client-go/kubernetes ~ ├ istio.io/istio/pkg/kube/namespace ~ ├ istio.io/istio/pkg/webhooks ├ istio.io/istio/pkg/kube ~ └ istio.io/istio/pkg/kube/kclient ~ ├ istio.io/istio/security/pkg/k8s └ istio.io/istio/pkg/kube/kclient ~ └ k8s.io/client-go/kubernetes ~ ├ istio.io/istio/pkg/kube ~ ├ istio.io/istio/pkg/kube/inject ~ ├ istio.io/istio/pkg/kube/kclient ~ └ istio.io/istio/pkg/revisions ~ ├ istio.io/istio/pilot/pkg/config/kube/ingress ├ istio.io/istio/pilot/pkg/serviceregistry/kube/controller ~ ├ istio.io/istio/pkg/kube ~ └ istio.io/istio/pkg/kube/kclient ~ ├ istio.io/istio/pilot/pkg/credentials/kube ├ istio.io/istio/pkg/kube ~ ├ istio.io/istio/pkg/kube/kclient ~ ├ istio.io/istio/pkg/kube/multicluster ~ ├ k8s.io/apiserver/pkg/authentication/serviceaccount └ k8s.io/client-go/kubernetes/typed/core/v1 ~ └ k8s.io/client-go/kubernetes/typed/authorization/v1 ~ ├ istio.io/istio/pilot/pkg/leaderelection ~ ├ istio.io/istio/pilot/pkg/serviceregistry/kube/controller ~ ├ istio.io/istio/pilot/pkg/status/distribution ├ istio.io/istio/pilot/pkg/xds ├ istio.io/istio/pilot/pkg/config/kube/gateway ~ ├ istio.io/istio/pilot/pkg/config/kube/ingress ~ ├ istio.io/istio/pilot/pkg/credentials/kube ~ ├ istio.io/istio/pilot/pkg/serviceregistry/kube/controller ~ ├ istio.io/istio/pkg/kube ~ ├ istio.io/istio/pkg/kube/multicluster ~ └ k8s.io/client-go/kubernetes/fake ~ ├ k8s.io/client-go/informers ├ k8s.io/client-go/informers/admissionregistration ├ k8s.io/client-go/informers/admissionregistration/v1 ├ k8s.io/client-go/informers/internalinterfaces └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/admissionregistration/v1alpha1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/admissionregistration/v1beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/apiserverinternal ├ k8s.io/client-go/informers/apiserverinternal/v1alpha1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/apps ├ k8s.io/client-go/informers/apps/v1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/apps/v1beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/apps/v1beta2 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/autoscaling ├ k8s.io/client-go/informers/autoscaling/v1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/autoscaling/v2 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/autoscaling/v2beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/autoscaling/v2beta2 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/batch ├ k8s.io/client-go/informers/batch/v1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/batch/v1beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/certificates ├ k8s.io/client-go/informers/certificates/v1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/certificates/v1alpha1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/certificates/v1beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/coordination ├ k8s.io/client-go/informers/coordination/v1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/coordination/v1beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/core ├ k8s.io/client-go/informers/core/v1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/discovery ├ k8s.io/client-go/informers/discovery/v1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/discovery/v1beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/events ├ k8s.io/client-go/informers/events/v1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/events/v1beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/extensions ├ k8s.io/client-go/informers/extensions/v1beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/flowcontrol ├ k8s.io/client-go/informers/flowcontrol/v1alpha1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/flowcontrol/v1beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/flowcontrol/v1beta2 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/flowcontrol/v1beta3 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/networking ├ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/networking/v1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/networking/v1alpha1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/networking/v1beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/node ├ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/node/v1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/node/v1alpha1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/node/v1beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/policy ├ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/policy/v1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/policy/v1beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/rbac ├ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/rbac/v1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/rbac/v1alpha1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/rbac/v1beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/resource ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/informers/resource/v1alpha2 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/scheduling ├ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/scheduling/v1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/scheduling/v1alpha1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/scheduling/v1beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/storage ├ k8s.io/client-go/informers/internalinterfaces ~ ├ k8s.io/client-go/informers/storage/v1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/informers/storage/v1alpha1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/informers/storage/v1beta1 ├ k8s.io/client-go/informers/internalinterfaces ~ └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/kubernetes ~ ├ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/kubernetes/typed/core/v1 ~ ├ istio.io/istio/pilot/pkg/xds ~ ├ istio.io/istio/pkg/config/analysis/incluster ├ istio.io/istio/pilot/pkg/config/kube/crdclient ~ ├ istio.io/istio/pkg/config/analysis/analyzers ├ istio.io/istio/pkg/config/analysis/analyzers/annotations ├ istio.io/istio/pkg/config/analysis/analyzers/maturity └ istio.io/istio/pkg/config/analysis/analyzers/util └ istio.io/istio/pkg/kube/inject ~ ├ istio.io/istio/pkg/config/analysis/analyzers/util ~ └ istio.io/istio/pkg/kube/inject ~ ├ istio.io/istio/pkg/config/analysis/analyzers/authz └ istio.io/istio/pkg/config/analysis/analyzers/util ~ ├ istio.io/istio/pkg/config/analysis/analyzers/deployment └ istio.io/istio/pkg/config/analysis/analyzers/util ~ ├ istio.io/istio/pkg/config/analysis/analyzers/destinationrule └ istio.io/istio/pkg/config/analysis/analyzers/util ~ ├ istio.io/istio/pkg/config/analysis/analyzers/envoyfilter └ istio.io/istio/pkg/config/analysis/analyzers/util ~ ├ istio.io/istio/pkg/config/analysis/analyzers/gateway ├ istio.io/istio/pilot/pkg/credentials/kube ~ ├ istio.io/istio/pilot/pkg/xds ~ └ istio.io/istio/pkg/config/analysis/analyzers/util ~ ├ istio.io/istio/pkg/config/analysis/analyzers/injection └ istio.io/istio/pkg/config/analysis/analyzers/util ~ ├ istio.io/istio/pkg/config/analysis/analyzers/multicluster ├ istio.io/istio/pkg/config/analysis/analyzers/util ~ └ istio.io/istio/pkg/kube/multicluster ~ ├ istio.io/istio/pkg/config/analysis/analyzers/service └ istio.io/istio/pkg/config/analysis/analyzers/util ~ ├ istio.io/istio/pkg/config/analysis/analyzers/serviceentry └ istio.io/istio/pkg/config/analysis/analyzers/util ~ ├ istio.io/istio/pkg/config/analysis/analyzers/sidecar └ istio.io/istio/pkg/config/analysis/analyzers/util ~ ├ istio.io/istio/pkg/config/analysis/analyzers/telemetry └ istio.io/istio/pkg/config/analysis/analyzers/util ~ └ istio.io/istio/pkg/config/analysis/analyzers/virtualservice └ istio.io/istio/pkg/config/analysis/analyzers/util ~ ├ istio.io/istio/pkg/config/analysis/local ├ istio.io/istio/pilot/pkg/config/file └ istio.io/istio/pkg/kube ~ ├ istio.io/istio/pilot/pkg/config/kube/crdclient ~ └ istio.io/istio/pkg/kube ~ └ istio.io/istio/pkg/kube ~ ├ istio.io/istio/pkg/config/mesh/kubemesh ├ istio.io/istio/pkg/kube ~ └ istio.io/istio/pkg/kube/watcher/configmapwatcher ~ ├ istio.io/istio/pkg/kube ~ ├ istio.io/istio/pkg/kube/inject ~ ├ istio.io/istio/pkg/kube/multicluster ~ ├ istio.io/istio/pkg/kube/namespace ~ ├ istio.io/istio/pkg/revisions ~ ├ istio.io/istio/pkg/webhooks ~ ├ istio.io/istio/pkg/webhooks/validation/controller ├ istio.io/istio/pkg/kube ~ └ istio.io/istio/pkg/kube/kclient ~ ├ istio.io/istio/pkg/webhooks/validation/server └ istio.io/istio/pkg/kube ~ ├ istio.io/istio/security/pkg/k8s/chiron └ k8s.io/client-go/kubernetes ~ ├ istio.io/istio/security/pkg/pki/ca ├ istio.io/istio/security/pkg/k8s/controller └ k8s.io/client-go/kubernetes/typed/core/v1 ~ └ k8s.io/client-go/kubernetes/typed/core/v1 ~ ├ istio.io/istio/security/pkg/pki/ra ├ istio.io/istio/security/pkg/k8s/chiron ~ ├ istio.io/istio/security/pkg/pki/ca ~ ├ istio.io/istio/security/pkg/server/ca ├ istio.io/istio/pkg/kube ~ ├ istio.io/istio/pkg/kube/kclient ~ ├ istio.io/istio/pkg/kube/namespace ~ └ istio.io/istio/security/pkg/pki/ca ~ └ k8s.io/client-go/kubernetes ~ ├ istio.io/istio/security/pkg/server/ca ~ └ istio.io/istio/security/pkg/server/ca/authenticate/kubeauth ├ istio.io/istio/security/pkg/k8s/tokenreview └ k8s.io/client-go/kubernetes ~ └ k8s.io/client-go/kubernetes ~ ```

The issue here seems to be that we have a fan-out and fan-in. For example, a bunch of the trees end with k8s.io/client-go/kubernetes/scheme. Then we just have one segment that k8s.io/client-go/kubernetes/scheme is not a leaf.

I think we can prune off these in some manner to reduce the size of the tree in some way.

I am not 100% sure how this would work, though -- since you effectively lose some of the data if we do this. I suppose "tree" is not an effective way to represent what is really a DAG, so maybe that is inherit to the problem. But it does seem like there could be a way to list out why a dependency is used in less than 800 lines in the command above.

I intend to explore what this might look like, but wanted to open an issue in the meantime

egonelbre commented 1 year ago

If there are things that you do not care about, it's possible to use:

goda tree 'reach(./pilot/cmd/pilot-discovery/...:all, k8s.io/api/authorization/v1beta1) - k8s.io/client-go/kubernetes/scheme'

# or

goda tree 'reach(./pilot/cmd/pilot-discovery/...:all, k8s.io/api/authorization/v1beta1) - k8s.io/client-go/kubernetes/scheme/...'

The other thing that can help reduce the graph is:

goda tree 'transitive(reach(./pilot/cmd/pilot-discovery/...:all, k8s.io/api/authorization/v1beta1))'

But it does seem like there could be a way to list out why a dependency is used in less than 800 lines in the command above.

The main issue in your scenario seems to be that the package is used indirectly from so many package, the full info ends up being too much.

Few ideas that do come to mind how the output could be reduced:

  1. Just pick a few ways how a package can be used (e.g. if there are 100 paths, then only show 3).
  2. Try to print the DAG as a graph to the console
  3. Try to collapse linear entries, e.g. if there is a "A -> B" and outgoing count from A and incoming count to B is 1, then they can be represented as a single node in the printout.
egonelbre commented 1 year ago

Oh, maybe printing things as layers would help?

// Input graph
A -> {B, Z}
B -> C
C -> Z
D -> C

Ranking, would give us something like:
#0: [A]
#1: [B, D]
#2: [C]
#3: [Z]

Which, then could be printed something like:

#0: A -> B #1
      -> Z

#1: B -> C #2
    D -> C #2

#2: C -> Z

We can ignore printing the last layer, because it doesn't have any outgoing edges. As for the ranking algorithm, there are multiple options; I'm not sure which would be the best.

As for the command name, maybe:

goda topo [expr]