Alias support

Signed-off-by: Madhu Venugopal <madhu@docker.com>
This commit is contained in:
Madhu Venugopal 2016-01-04 14:02:03 -08:00
parent 60bbe6e2d4
commit 63e20c2f3d
2 changed files with 56 additions and 4 deletions

View file

@ -64,6 +64,7 @@ type endpoint struct {
prefAddress net.IP
prefAddressV6 net.IP
ipamOptions map[string]string
aliases map[string]string
dbIndex uint64
dbExists bool
sync.Mutex
@ -748,6 +749,16 @@ func CreateOptionDisableResolution() EndpointOption {
}
}
//CreateOptionAlias function returns an option setter for setting endpoint alias
func CreateOptionAlias(name string, alias string) EndpointOption {
return func(ep *endpoint) {
if ep.aliases == nil {
ep.aliases = make(map[string]string)
}
ep.aliases[alias] = name
}
}
// JoinOptionPriority function returns an option setter for priority option to
// be passed to the endpoint.Join() method.
func JoinOptionPriority(ep Endpoint, prio int) EndpointOption {

View file

@ -424,26 +424,67 @@ func (sb *sandbox) ResolveName(name string) net.IP {
parts := strings.Split(name, ".")
log.Debugf("To resolve %v", parts)
for _, ep := range sb.getConnectedEndpoints() {
reqName := parts[0]
networkName := ""
if len(parts) > 1 {
networkName = parts[1]
}
epList := sb.getConnectedEndpoints()
// First check for local container alias
ip = sb.resolveName(reqName, networkName, epList, true)
if ip != nil {
return ip
}
// Resolve the actual container name
return sb.resolveName(reqName, networkName, epList, false)
}
func (sb *sandbox) resolveName(req string, networkName string, epList []*endpoint, alias bool) net.IP {
for _, ep := range epList {
name := req
n := ep.getNetwork()
if len(parts) > 1 && parts[1] != "" && parts[1] != n.Name() {
if networkName != "" && networkName != n.Name() {
continue
}
if alias {
if ep.aliases == nil {
continue
}
var ok bool
ep.Lock()
name, ok = ep.aliases[req]
ep.Unlock()
if !ok {
continue
}
} else {
// If it is a regular lookup and if the requested name is an alias
// dont perform a svc lookup for this endpoint.
ep.Lock()
if _, ok := ep.aliases[req]; ok {
ep.Unlock()
continue
}
ep.Unlock()
}
sr, ok := n.getController().svcDb[n.ID()]
if !ok {
continue
}
n.Lock()
ip, ok = sr.svcMap[parts[0]]
ip, ok := sr.svcMap[name]
n.Unlock()
if ok {
return ip
}
}
return ip
return nil
}
func (sb *sandbox) SetKey(basePath string) error {