Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pruning tree reach results #71

Open
howardjohn opened this issue Jul 5, 2023 · 2 comments
Open

Pruning tree reach results #71

howardjohn opened this issue Jul 5, 2023 · 2 comments

Comments

@howardjohn
Copy link

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
Copy link
Member

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
Copy link
Member

egonelbre commented Jul 6, 2023

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]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants