func (e *Environment) Teardown() {
	teardown()
}
Teardown closes the tunnel
package landscaper
import (
	"fmt"
	"os"
	"time"
	"github.com/sirupsen/logrus"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/labels"
	_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"  
	restclient "k8s.io/client-go/rest"
	"k8s.io/helm/pkg/helm"
	"k8s.io/helm/pkg/kube"
	helmversion "k8s.io/helm/pkg/version"
	podutil "k8s.io/kubernetes/pkg/api/pod"
	"k8s.io/kubernetes/pkg/apis/core"
	"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
	"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
)
var tillerTunnel *kube.Tunnel
type Environment struct {
	HelmHome                  string         
	DryRun                    bool           
	Wait                      bool           
	WaitTimeout               time.Duration  
	ChartLoader               ChartLoader    
	ReleaseNamePrefix         string         
	ComponentFiles            []string       
	LandscapeDir              string         
	Namespace                 string         
	Verbose                   bool           
	Context                   string         
	Loop                      bool           
	LoopInterval              time.Duration  
	TillerNamespace           string         
	AzureKeyVault             string         
	Environment               string         
	ConfigurationOverrideFile string         
	helmClient                helm.Interface
	kubeClient                internalversion.CoreInterface
	DisabledStages            stringSlice  
}
type stringSlice []string
func (stringSlice *stringSlice) String() string {
	return ""
}
func (stringSlice *stringSlice) Set(value string) error {
	*stringSlice = append(*stringSlice, value)
	return nil
}
func (stringSlice *stringSlice) Type() string {
	return "stringSlice"
}
func (e *Environment) HelmClient() helm.Interface {
	if e.helmClient == nil {
		logrus.WithFields(logrus.Fields{"helmClientVersion": helmversion.Version, "tillerNamespace": e.TillerNamespace}).Debug("Setup Helm Client")
		tillerHost, err := setupConnection(e.Context, e.TillerNamespace)
		if err != nil {
			logrus.WithField("error", err).Fatalf("Could not set up connection to helm")
			return nil
		}
		logrus.WithField("host", tillerHost).Debug("Tiller host address")
		e.helmClient = helm.NewClient(helm.Host(tillerHost), helm.ConnectTimeout(5))
		logrus.WithField("client", e.helmClient).Debug("Helm client")
		err = e.helmClient.PingTiller()
		if err != nil {
			logrus.WithField("error", err).Fatalf("Can't ping Tiller")
		}
		tillerVersion, err := e.helmClient.GetVersion()
		if err != nil {
			logrus.WithField("error", err).Fatalf("Could not retrieve Helm Tiller version")
			return nil
		}
		compatible := helmversion.IsCompatible(helmversion.Version, tillerVersion.Version.SemVer)
		logrus.WithFields(logrus.Fields{"tillerVersion": tillerVersion.Version.SemVer, "clientServerCompatible": compatible}).Info("Connected to Tiller")
		if !compatible {
			logrus.Warn("Helm and Tiller report incompatible version numbers")
		}
	}
	return e.helmClient
}
func (e *Environment) KubeClient() internalversion.CoreInterface {
	if e.kubeClient == nil {
		logrus.Debug("Setup Kubernetes Client")
		_, client, err := getKubeClient(e.Context)
		if err != nil {
			logrus.WithField("error", err).Fatalf("Could not build Kubernetes client config")
			return nil
		}
		version, err := client.ServerVersion()
		if err != nil {
			logrus.WithField("error", err).Fatalf("Could not create retrieve Kubernetes server version")
			return nil
		}
		logrus.WithFields(logrus.Fields{"kubernetesVersion": version.String()}).Info("Connected to Kubernetes")
		e.kubeClient = client.Core()
	}
	return e.kubeClient
}