agent/util/hostfinder.go (94 lines of code) (raw):
package util
import (
"os"
"sync"
"github.com/aliyun/aliyun_assist_client/agent/hybrid/instance"
"github.com/aliyun/aliyun_assist_client/agent/log"
"github.com/aliyun/aliyun_assist_client/common/metaserver"
"github.com/aliyun/aliyun_assist_client/common/requester"
)
const (
// HYBRID_DOMAIN_VPC is same as apiserver.IntranetDomain
HYBRID_DOMAIN_VPC = ".axt.aliyun.com"
)
var (
g_domainId = ""
g_azoneId = ""
g_instanceId = ""
g_domainIdInitLock sync.RWMutex
g_azoneIdInitLock sync.RWMutex
g_instanceIdInitLock sync.RWMutex
)
func GetAzoneId() string {
g_azoneIdInitLock.RLock()
if g_azoneId == "" {
g_azoneIdInitLock.RUnlock()
g_azoneIdInitLock.Lock()
defer g_azoneIdInitLock.Unlock()
if g_azoneId == "" {
if azoneId, err := metaserver.GetZoneId(log.GetLogger()); err != nil {
g_azoneId = "unknown"
} else {
g_azoneId = azoneId
}
}
} else {
defer g_azoneIdInitLock.RUnlock()
}
return g_azoneId
}
func GetInstanceId() string {
g_instanceIdInitLock.RLock()
if g_instanceId == "" {
g_instanceIdInitLock.RUnlock()
g_instanceIdInitLock.Lock()
defer g_instanceIdInitLock.Unlock()
if g_instanceId == "" {
if instance.IsHybrid() {
if instanceId := instance.ReadInstanceId(); instanceId != "" {
g_instanceId = instanceId
} else {
g_instanceId = "unknown"
}
} else {
if instanceId, err := metaserver.GetInstanceId(log.GetLogger()); err != nil {
g_instanceId = "unknown"
} else {
g_instanceId = instanceId
}
}
}
} else {
defer g_instanceIdInitLock.RUnlock()
}
return g_instanceId
}
func IsSelfHosted() bool {
return os.Getenv("ALIYUN_ASSIST_SERVER_HOST") != ""
}
func GetRegionId() string {
regionId, err := requester.GetRegionId(log.GetLogger())
if err != nil {
log.GetLogger().WithError(err).Errorln("Failed to determine region id")
}
return regionId
}
// GetServerHost returns empty string when region id is invalid as error handling
func GetServerHost() string {
g_domainIdInitLock.RLock()
if g_domainId == "" {
g_domainIdInitLock.RUnlock()
g_domainIdInitLock.Lock()
defer g_domainIdInitLock.Unlock()
if g_domainId == "" {
var err error
domainId, err := requester.GetServerDomain(log.GetLogger())
if err != nil {
log.GetLogger().WithError(err).Errorln("Failed to determine API server domain")
} else {
g_domainId = domainId
}
}
} else {
defer g_domainIdInitLock.RUnlock()
}
return g_domainId
}