github.com/olli-ai/jx/v2@v2.0.400-0.20210921045218-14731b4dd448/pkg/jxfactory/connector/gcp/gcp.go (about)

     1  package gcp
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  
     8  	"github.com/olli-ai/jx/v2/pkg/jxfactory/connector"
     9  	"github.com/olli-ai/jx/v2/pkg/util"
    10  	"github.com/pkg/errors"
    11  	"k8s.io/client-go/rest"
    12  	"k8s.io/client-go/tools/clientcmd"
    13  	clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
    14  )
    15  
    16  // CreateGCPConfig creates a kubernetes config for the given connector
    17  func CreateGCPConfig(connector *connector.GKEConnector, dir string) (*rest.Config, error) {
    18  	project := connector.Project
    19  	if project == "" {
    20  		return nil, fmt.Errorf("missing project")
    21  	}
    22  	cluster := connector.Cluster
    23  	if cluster == "" {
    24  		return nil, fmt.Errorf("missing cluster")
    25  	}
    26  	args := []string{"container", "clusters", "get-credentials", cluster, "--project", project}
    27  	if connector.Zone != "" {
    28  		args = append(args, "--zone", connector.Zone)
    29  	} else if connector.Region != "" {
    30  		args = append(args, "--region", connector.Region)
    31  	} else {
    32  		return nil, fmt.Errorf("missing zone or region")
    33  	}
    34  
    35  	file, err := ioutil.TempFile(dir, "")
    36  	if err != nil {
    37  		return nil, errors.Wrapf(err, "failed to create temp file in %s", dir)
    38  	}
    39  	fileName := file.Name()
    40  
    41  	cmd := util.Command{
    42  		Dir:  dir,
    43  		Name: "gcloud",
    44  		Args: args,
    45  		Env: map[string]string{
    46  			"KUBECONFIG": fileName,
    47  		},
    48  		Out: os.Stdout,
    49  		Err: os.Stderr,
    50  	}
    51  	text, err := cmd.RunWithoutRetry()
    52  	fmt.Printf(text)
    53  	if err != nil {
    54  		return nil, err
    55  	}
    56  	config, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
    57  		&clientcmd.ClientConfigLoadingRules{Precedence: []string{fileName}},
    58  		&clientcmd.ConfigOverrides{ClusterInfo: clientcmdapi.Cluster{Server: ""}}).ClientConfig()
    59  	if err != nil {
    60  		return nil, errors.Wrapf(err, "failed to create client-go config for file %s", fileName)
    61  	}
    62  	return config, nil
    63  }