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 }