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  }