mirror of
https://github.com/tailscale/tailscale.git
synced 2025-04-18 20:51:45 +00:00
46 lines
1.0 KiB
Go
46 lines
1.0 KiB
Go
![]() |
// Copyright (c) 2022 Tailscale Inc & AUTHORS All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
// Package cloudenv reports which known cloud environment we're running in.
|
||
|
package cloudenv
|
||
|
|
||
|
import (
|
||
|
"sync/atomic"
|
||
|
|
||
|
gcpmetadata "cloud.google.com/go/compute/metadata"
|
||
|
)
|
||
|
|
||
|
// GoogleMetadataAndDNSIP is the metadata IP used by Google Cloud.
|
||
|
// It's also the *.internal DNS server, and proxies to 8.8.8.8.
|
||
|
const GoogleMetadataAndDNSIP = "169.254.169.254"
|
||
|
|
||
|
// Cloud is a recognize cloud environment with properties that
|
||
|
// Tailscale can specialize for in places.
|
||
|
type Cloud string
|
||
|
|
||
|
const (
|
||
|
GCP = Cloud("gcp") // Google Cloud
|
||
|
)
|
||
|
|
||
|
var cloudAtomic atomic.Value // of Cloud
|
||
|
|
||
|
// Get returns the current cloud, or the empty string if unknown.
|
||
|
func Get() Cloud {
|
||
|
c, ok := cloudAtomic.Load().(Cloud)
|
||
|
if ok {
|
||
|
return c
|
||
|
}
|
||
|
c = getCloud()
|
||
|
cloudAtomic.Store(c) // even if empty
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
func getCloud() Cloud {
|
||
|
if gcpmetadata.OnGCE() {
|
||
|
return GCP
|
||
|
}
|
||
|
// TODO: more, as needed.
|
||
|
return ""
|
||
|
}
|