in pkg/gcp/gcp-kubeconfig.go [76:177]
func configFromEnvAndMD(ctx context.Context, kr *mesh.KRun) error {
if kr.ProjectId == "" {
kr.ProjectId = os.Getenv("PROJECT_ID")
}
if kr.ClusterName == "" {
kr.ClusterName = os.Getenv("CLUSTER_NAME")
}
if kr.ClusterLocation == "" {
kr.ClusterLocation = os.Getenv("CLUSTER_LOCATION")
}
if kr.ProjectNumber == "" {
kr.ProjectNumber = os.Getenv("PROJECT_NUMBER")
}
t0 := time.Now()
var gsa string
if metadata.OnGCE() {
// TODO: detect if the cluster is k8s from some env ?
// If ADC is set, we will only use the env variables. Else attempt to init from metadata server.
metaProjectId, _ := metadata.ProjectID()
if kr.ProjectId == "" {
kr.ProjectId = metaProjectId
}
//instanceID, _ := metadata.InstanceID() // 00bf...f23
//instanceName, _ := metadata.InstanceName()
//zone, _ := metadata.Zone()
//pAttr, _ := metadata.ProjectAttributes() //
//hn, _ := metadata.Hostname() //
//iAttr, _ := metadata.InstanceAttributes() // zone us-central1-1
gsa, _ = metadata.Email("default")
//log.Println("Additional metadata:", "iid", instanceID, "iname", instanceName, "iattr", iAttr,
// "zone", zone, "hostname", hn, "pAttr", pAttr, "email", email)
if kr.Namespace == "" {
if strings.HasPrefix(gsa, "k8s-") {
parts := strings.Split(gsa[4:], "@")
kr.Namespace = parts[0]
if mesh.Debug {
log.Println("Defaulting Namespace based on GSA: ", kr.Namespace, gsa)
}
}
}
var err error
if kr.InCluster && kr.ClusterName == "" {
kr.ClusterName, err = metadata.Get("instance/attributes/cluster-name")
if err != nil {
log.Println("Can't find cluster name")
// Not a critical problem - it's using in-cluster credentials.
}
}
if kr.InCluster && kr.ClusterLocation == "" {
kr.ClusterLocation, err = metadata.Get("instance/attributes/cluster-location")
if err != nil {
// Not a critical problem.
log.Println("Can't find cluster location")
}
}
if kr.InstanceID == "" {
kr.InstanceID, _ = metadata.InstanceID()
}
}
if kr.Namespace == "" {
// Explicitly set ?
labels, err := ProjectLabels(ctx, kr.ProjectId)
if err != nil {
log.Println("Failed to find labels")
return err
}
kr.Namespace = labels["mesh-namespace"]
}
if kr.Namespace == "" {
// Default convention for project-as-namespace:
// PREFIX-CONFIG_PROJECT-NAMESPACE-SUFFIX
// Pid may have lowercase letters/digits/hyphens - mostly DNS conventions.
pidparts := strings.Split(kr.ProjectId, "-")
if len(pidparts) > 2 {
kr.Namespace = pidparts[len(pidparts) - 2]
if mesh.Debug {
log.Println("Defaulting Namespace based on project ID: ", kr.Namespace, kr.ProjectId)
}
}
}
log.Println("GCP config ",
"gsa", gsa,
"cluster", kr.ProjectId + "/" + kr.ClusterLocation + "/" + kr.ClusterName,
"projectNumber", kr.ProjectNumber,
"iid", kr.InstanceID,
"location", kr.ClusterLocation,
"sinceStart", time.Since(t0))
return nil
}