github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/caas/kubernetes/provider/detectcloud.go (about) 1 // Copyright 2019 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package provider 5 6 import ( 7 "github.com/juju/errors" 8 9 k8s "github.com/juju/juju/caas/kubernetes" 10 "github.com/juju/juju/caas/kubernetes/clientconfig" 11 k8scloud "github.com/juju/juju/caas/kubernetes/cloud" 12 "github.com/juju/juju/cloud" 13 ) 14 15 // DetectClouds implements environs.CloudDetector. 16 func (p kubernetesEnvironProvider) DetectClouds() ([]cloud.Cloud, error) { 17 clouds := []cloud.Cloud{} 18 19 localKubeConfigClouds, err := localKubeConfigClouds() 20 if err != nil { 21 return clouds, errors.Annotate(err, "detecting local kube config clouds") 22 } 23 clouds = append(clouds, localKubeConfigClouds...) 24 25 mk8sCloud, err := p.builtinCloudGetter(p.cmdRunner) 26 if err == nil { 27 clouds = append(clouds, mk8sCloud) 28 return clouds, nil 29 } 30 if errors.IsNotFound(err) { 31 err = errors.Annotatef(err, "microk8s is not installed") 32 } 33 logger.Debugf("failed to query local microk8s: %s", err.Error()) 34 return clouds, nil 35 } 36 37 func localKubeConfigClouds() ([]cloud.Cloud, error) { 38 k8sConfig, err := clientconfig.GetLocalKubeConfig() 39 if err != nil { 40 return []cloud.Cloud{}, errors.Annotate(err, "reading local kubeconf") 41 } 42 43 return k8scloud.CloudsFromKubeConfigContextsWithParams( 44 k8scloud.CloudParamaters{ 45 Description: "A local Kubernetes context", 46 }, 47 k8sConfig, 48 ) 49 } 50 51 // DetectCloud implements environs.CloudDetector. 52 func (p kubernetesEnvironProvider) DetectCloud(name string) (cloud.Cloud, error) { 53 if name == k8s.K8sCloudMicrok8s { 54 // TODO: this whole thing is poorly written and we need to handle this better. 55 // Also builtinCloudGetter should really be called, microk8sCloudGetter... 56 microk8sCloud, err := p.builtinCloudGetter(p.cmdRunner) 57 if err != nil { 58 return cloud.Cloud{}, errors.Trace(err) 59 } 60 return microk8sCloud, nil 61 } 62 63 localKubeConfigClouds, err := localKubeConfigClouds() 64 if err != nil { 65 return cloud.Cloud{}, errors.Annotatef(err, "detecting local kube config clouds for %s", name) 66 } 67 68 for _, cloud := range localKubeConfigClouds { 69 if cloud.Name == name { 70 return cloud, nil 71 } 72 } 73 74 return cloud.Cloud{}, errors.NotFoundf("cloud %s", name) 75 }