From 61145361fd6e32437b49226212b3ee74b088736a Mon Sep 17 00:00:00 2001 From: Anis Elleuch Date: Wed, 5 Dec 2018 02:35:22 +0100 Subject: [PATCH] Fallback to non-loopback IF addresses for Domain IPs (#6918) When MINIO_PUBLIC_IPS is not specified and no endpoints are passed as arguments, fallback to the address of non loop-back interfaces. This is useful so users can avoid setting MINIO_PUBLIC_IPS in docker or orchestration scripts, ince users naturally setup an internal network that connects all instances. --- cmd/common-main.go | 8 ++++++-- cmd/endpoint.go | 35 ++++++++++++++++++++--------------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/cmd/common-main.go b/cmd/common-main.go index d0decbef4..041579440 100644 --- a/cmd/common-main.go +++ b/cmd/common-main.go @@ -221,14 +221,18 @@ func handleCommonEnvVars() { minioEndpointsEnv, ok := os.LookupEnv("MINIO_PUBLIC_IPS") if ok { minioEndpoints := strings.Split(minioEndpointsEnv, ",") - globalDomainIPs = set.NewStringSet() for i, ip := range minioEndpoints { if net.ParseIP(ip) == nil { logger.FatalIf(errInvalidArgument, "Unable to initialize Minio server with invalid MINIO_PUBLIC_IPS[%d]: %s", i, ip) } - globalDomainIPs.Add(ip) } + updateDomainIPs(set.CreateStringSet(minioEndpoints...)) + } else { + // Add found interfaces IP address to global domain IPS, + // loopback addresses will be naturally dropped. + updateDomainIPs(localIP4) } + if globalDomainName != "" && !globalDomainIPs.IsEmpty() && globalEtcdClient != nil { var err error globalDNSConfig, err = dns.NewCoreDNS(globalDomainName, globalDomainIPs, globalMinioPort, globalEtcdClient) diff --git a/cmd/endpoint.go b/cmd/endpoint.go index 17f75a45d..d47c7cfd9 100644 --- a/cmd/endpoint.go +++ b/cmd/endpoint.go @@ -455,7 +455,12 @@ func CreateEndpoints(serverAddr string, args ...[]string) (string, EndpointList, return serverAddr, endpoints, setupType, err } - updateDomainIPs(uniqueArgs) + _, dok := os.LookupEnv("MINIO_DOMAIN") + _, eok := os.LookupEnv("MINIO_ETCD_ENDPOINTS") + _, iok := os.LookupEnv("MINIO_PUBLIC_IPS") + if dok && eok && !iok { + updateDomainIPs(uniqueArgs) + } setupType = DistXLSetupType return serverAddr, endpoints, setupType, nil @@ -509,21 +514,21 @@ func GetRemotePeers(endpoints EndpointList) []string { return peerSet.ToSlice() } -// In federated and distributed setup, update IP addresses of the hosts passed in command line -// if MINIO_PUBLIC_IPS are not set manually func updateDomainIPs(endPoints set.StringSet) { - _, dok := os.LookupEnv("MINIO_DOMAIN") - _, eok := os.LookupEnv("MINIO_ETCD_ENDPOINTS") - _, iok := os.LookupEnv("MINIO_PUBLIC_IPS") - if dok && eok && !iok { - globalDomainIPs = set.NewStringSet() - for e := range endPoints { - host, _, _ := net.SplitHostPort(e) - ipList, _ := getHostIP4(host) - remoteIPList := ipList.FuncMatch(func(ip string, matchString string) bool { - return !strings.HasPrefix(ip, "127.") - }, "") - globalDomainIPs.Add(remoteIPList.ToSlice()[0]) + ipList := set.NewStringSet() + for e := range endPoints { + host, _, err := net.SplitHostPort(e) + if err != nil { + if strings.Contains(err.Error(), "missing port in address") { + host = e + } else { + continue + } } + IPs, _ := getHostIP4(host) + ipList = ipList.Union(IPs) } + globalDomainIPs = ipList.FuncMatch(func(ip string, matchString string) bool { + return !strings.HasPrefix(ip, "127.") + }, "") }