github.com/operator-framework/operator-lifecycle-manager@v0.30.0/test/e2e/ctx/provisioner_kubeconfig.go (about)

     1  package ctx
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io"
     7  	"net"
     8  	"os"
     9  	"path/filepath"
    10  
    11  	"k8s.io/client-go/rest"
    12  	"k8s.io/client-go/tools/clientcmd"
    13  )
    14  
    15  func Provision(ctx *TestContext) (func(), error) {
    16  	path := os.Getenv("KUBECONFIG")
    17  	if path == "" {
    18  		home, err := os.UserHomeDir()
    19  		if err != nil {
    20  			return nil, fmt.Errorf("failed to determine kubeconfig path: %s", err.Error())
    21  		}
    22  		path = filepath.Join(home, ".kube", "config")
    23  	}
    24  
    25  	f, err := os.Open(path)
    26  	if os.IsNotExist(err) {
    27  		// try in-cluster config
    28  		// see https://github.com/coreos/etcd-operator/issues/731#issuecomment-283804819
    29  		if len(os.Getenv("KUBERNETES_SERVICE_HOST")) == 0 {
    30  			addrs, err := net.LookupHost("kubernetes.default.svc")
    31  			if err != nil {
    32  				return nil, fmt.Errorf("failed to resolve kubernetes service: %s", err.Error())
    33  			}
    34  			os.Setenv("KUBERNETES_SERVICE_HOST", addrs[0])
    35  		}
    36  
    37  		if len(os.Getenv("KUBERNETES_SERVICE_PORT")) == 0 {
    38  			os.Setenv("KUBERNETES_SERVICE_PORT", "443")
    39  		}
    40  
    41  		restConfig, err := rest.InClusterConfig()
    42  		if err != nil {
    43  			return nil, fmt.Errorf("failed to retrieve in-cluster config: %s", err.Error())
    44  		}
    45  
    46  		ctx.restConfig = restConfig
    47  		return func() {}, setDerivedFields(ctx)
    48  	}
    49  	if err != nil {
    50  		return nil, fmt.Errorf("failed to open kubeconfig: %s", err.Error())
    51  	}
    52  	defer f.Close()
    53  
    54  	const MaxKubeconfigBytes = 65535
    55  	var b bytes.Buffer
    56  	n, err := b.ReadFrom(io.LimitReader(f, MaxKubeconfigBytes))
    57  	if err != nil {
    58  		return nil, fmt.Errorf("failed to read kubeconfig: %s", err.Error())
    59  	}
    60  	if n >= MaxKubeconfigBytes {
    61  		return nil, fmt.Errorf("kubeconfig larger than maximum allowed size: %d bytes", MaxKubeconfigBytes)
    62  	}
    63  
    64  	restConfig, err := clientcmd.RESTConfigFromKubeConfig(b.Bytes())
    65  	if err != nil {
    66  		return nil, fmt.Errorf("error loading kubeconfig: %s", err.Error())
    67  	}
    68  
    69  	ctx.restConfig = restConfig
    70  
    71  	return func() {}, setDerivedFields(ctx)
    72  }