func KubeConfig(kubeConfig string) Option {
	return func(h *Hvnr) {
		h.kubeConfigPath = kubeConfig
	}
}
KubeConfig is an option to set a specific Kubernetes configuration path
package havener
import (
	"fmt"
	"io"
	"os"
	"time"
	"github.com/gonvenience/wrap"
	"golang.org/x/sync/syncmap"
	corev1 "k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
	"k8s.io/apimachinery/pkg/runtime/schema"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/rest"
	"k8s.io/kubectl/pkg/describe"
)
var m = new(syncmap.Map)
func AddShutdownFunction(f func()) {
	m.Store(time.Now().String(), f)
}
func GracefulShutdown() {
	m.Range(func(key, value interface{}) bool {
		switch f := value.(type) {
		case func():
			f()
		}
		return true
	})
}
type Hvnr struct {
	kubeConfigPath string
	client         kubernetes.Interface
	restconfig     *rest.Config
	clusterName    string
}
type Havener interface {
	Client() kubernetes.Interface
	RESTConfig() *rest.Config
	ClusterName() string
	ListPods(namespaces ...string) ([]*corev1.Pod, error)
	ListNodes() ([]corev1.Node, error)
	ListSecrets(namespaces ...string) ([]*corev1.Secret, error)
	ListConfigMaps(namespaces ...string) ([]*corev1.ConfigMap, error)
	ListCustomResourceDefinition(string) ([]unstructured.Unstructured, error)
	TopDetails() (*TopDetails, error)
	RetrieveLogs(parallelDownloads int, target string, includeConfigFiles bool) error
	PodExec(pod *corev1.Pod, container string, command []string, stdin io.Reader, stdout io.Writer, stderr io.Writer, tty bool) error
	NodeExec(node corev1.Node, containerImage string, timeoutSeconds int, command []string, stdin io.Reader, stdout io.Writer, stderr io.Writer, tty bool) error
}
type Option func(*Hvnr)