traefik/vendor/github.com/mesosphere/mesos-dns/records/chains.go
2017-03-09 13:13:02 +01:00

81 lines
2 KiB
Go

package records
import (
"github.com/mesosphere/mesos-dns/records/labels"
)
// chain is a generation func that consumes record-like strings and does
// something with them
type chain func(...string)
const (
protocolNone = "" // for readability
domainNone = "" // for readability
)
// withProtocol appends `._{protocol}.{framework}` to records. if protocol is "" then
// the protocols "tcp" and "udp" are assumed.
func withProtocol(protocol, framework string, spec labels.Func, gen chain) chain {
return func(records ...string) {
protocol = spec(protocol)
if protocol != protocolNone {
for i := range records {
records[i] += "._" + protocol + "." + framework
}
} else {
records = append(records, records...)
for i, j := 0, len(records)/2; j < len(records); {
records[i] += "._tcp." + framework
records[j] += "._udp." + framework
i++
j++
}
}
gen(records...)
}
}
// withSubdomains appends `.{subdomain}` (for each subdomain spec'd) to records.
// the empty subdomain "" indicates to generate records w/o a subdomain fragment.
func withSubdomains(subdomains []string, gen chain) chain {
if len(subdomains) == 0 {
return gen
}
return func(records ...string) {
var (
recordLen = len(records)
tmp = make([]string, recordLen*len(subdomains))
offset = 0
)
for s := range subdomains {
if subdomains[s] == domainNone {
copy(tmp[offset:], records)
} else {
for i := range records {
tmp[offset+i] = records[i] + "." + subdomains[s]
}
}
offset += recordLen
}
gen(tmp...)
}
}
// withNamedPort prepends a `_{discoveryInfo port name}.` to records
func withNamedPort(portName string, spec labels.Func, gen chain) chain {
portName = spec(portName)
if portName == "" {
return gen
}
return func(records ...string) {
// generate without port-name prefix
gen(records...)
// generate with port-name prefix
for i := range records {
records[i] = "_" + portName + "." + records[i]
}
gen(records...)
}
}