in pkg/controller/service/listeners.go [113:295]
func (mgr *ListenerManager) buildListenerFromServicePort(reqCtx *RequestContext, port v1.ServicePort) (model.ListenerAttribute, error) {
listener := model.ListenerAttribute{
NamedKey: &model.ListenerNamedKey{
Prefix: model.DEFAULT_PREFIX,
CID: base.CLUSTER_ID,
Namespace: reqCtx.Service.Namespace,
ServiceName: reqCtx.Service.Name,
Port: port.Port,
},
ListenerPort: int(port.Port),
}
listener.Description = listener.NamedKey.Key()
listener.VGroupName = getVGroupNamedKey(reqCtx.Service, port).Key()
proto, err := protocol(reqCtx.Anno.Get(ProtocolPort), port)
if err != nil {
return listener, err
}
listener.Protocol = proto
if reqCtx.Anno.Get(VGroupPort) != "" {
vGroupId, err := vgroup(reqCtx.Anno.Get(VGroupPort), port)
if err != nil {
return listener, err
}
listener.VGroupId = vGroupId
}
if reqCtx.Anno.Get(Scheduler) != "" {
listener.Scheduler = reqCtx.Anno.Get(Scheduler)
}
if reqCtx.Anno.Get(PersistenceTimeout) != "" {
timeout, err := strconv.Atoi(reqCtx.Anno.Get(PersistenceTimeout))
if err != nil {
return listener, fmt.Errorf("Annotation persistence timeout must be integer, but got [%s]. message=[%s] ",
reqCtx.Anno.Get(PersistenceTimeout), err.Error())
}
listener.PersistenceTimeout = &timeout
}
if reqCtx.Anno.Get(CertID) != "" {
listener.CertId = reqCtx.Anno.Get(CertID)
}
if reqCtx.Anno.Get(EnableHttp2) != "" {
listener.EnableHttp2 = model.FlagType(reqCtx.Anno.Get(EnableHttp2))
}
if reqCtx.Anno.Get(ForwardPort) != "" && listener.Protocol == model.HTTP {
forwardPort, err := forwardPort(reqCtx.Anno.Get(ForwardPort), int(port.Port))
if err != nil {
return listener, fmt.Errorf("Annotation ForwardPort error: %s ", err.Error())
}
listener.ForwardPort = forwardPort
listener.ListenerForward = model.OnFlag
}
if reqCtx.Anno.Get(IdleTimeout) != "" {
idleTimeout, err := strconv.Atoi(reqCtx.Anno.Get(IdleTimeout))
if err != nil {
return listener, fmt.Errorf("Annotation IdleTimeout must be integer, but got [%s]. message=[%s] ",
reqCtx.Anno.Get(IdleTimeout), err.Error())
}
listener.IdleTimeout = idleTimeout
}
// acl
if reqCtx.Anno.Get(AclStatus) != "" {
listener.AclStatus = model.FlagType(reqCtx.Anno.Get(AclStatus))
}
if reqCtx.Anno.Get(AclType) != "" {
listener.AclType = reqCtx.Anno.Get(AclType)
}
if reqCtx.Anno.Get(AclID) != "" {
listener.AclId = reqCtx.Anno.Get(AclID)
}
// connection drain
if reqCtx.Anno.Get(ConnectionDrain) != "" {
listener.ConnectionDrain = model.FlagType(reqCtx.Anno.Get(ConnectionDrain))
}
if reqCtx.Anno.Get(ConnectionDrainTimeout) != "" {
timeout, err := strconv.Atoi(reqCtx.Anno.Get(ConnectionDrainTimeout))
if err != nil {
return listener, fmt.Errorf("Annotation ConnectionDrainTimeout must be integer, but got [%s]. message=[%s] ",
reqCtx.Anno.Get(ConnectionDrainTimeout), err.Error())
}
listener.ConnectionDrainTimeout = timeout
}
// cookie
if reqCtx.Anno.Get(Cookie) != "" {
listener.Cookie = reqCtx.Anno.Get(Cookie)
}
if reqCtx.Anno.Get(CookieTimeout) != "" {
timeout, err := strconv.Atoi(reqCtx.Anno.Get(CookieTimeout))
if err != nil {
return listener, fmt.Errorf("Annotation CookieTimeout must be integer, but got [%s]. message=[%s] ",
reqCtx.Anno.Get(CookieTimeout), err.Error())
}
listener.CookieTimeout = timeout
}
if reqCtx.Anno.Get(SessionStick) != "" {
listener.StickySession = model.FlagType(reqCtx.Anno.Get(SessionStick))
}
if reqCtx.Anno.Get(SessionStickType) != "" {
listener.StickySessionType = reqCtx.Anno.Get(SessionStickType)
}
// x-forwarded-for
if reqCtx.Anno.Get(XForwardedForProto) != "" {
listener.XForwardedForProto = model.FlagType(reqCtx.Anno.Get(XForwardedForProto))
}
// health check
if reqCtx.Anno.Get(HealthyThreshold) != "" {
t, err := strconv.Atoi(reqCtx.Anno.Get(HealthyThreshold))
if err != nil {
return listener, fmt.Errorf("Annotation HealthyThreshold must be integer, but got [%s]. message=[%s] ",
reqCtx.Anno.Get(HealthyThreshold), err.Error())
}
listener.HealthyThreshold = t
}
if reqCtx.Anno.Get(UnhealthyThreshold) != "" {
t, err := strconv.Atoi(reqCtx.Anno.Get(UnhealthyThreshold))
if err != nil {
return listener, fmt.Errorf("Annotation UnhealthyThreshold must be integer, but got [%s]. message=[%s] ",
reqCtx.Anno.Get(UnhealthyThreshold), err.Error())
}
listener.UnhealthyThreshold = t
}
if reqCtx.Anno.Get(HealthCheckConnectTimeout) != "" {
timeout, err := strconv.Atoi(reqCtx.Anno.Get(HealthCheckConnectTimeout))
if err != nil {
return listener, fmt.Errorf("Annotation HealthCheckConnectTimeout must be integer, but got [%s]. message=[%s] ",
reqCtx.Anno.Get(HealthCheckConnectTimeout), err.Error())
}
listener.HealthCheckConnectTimeout = timeout
}
if reqCtx.Anno.Get(HealthCheckConnectPort) != "" {
port, err := strconv.Atoi(reqCtx.Anno.Get(HealthCheckConnectPort))
if err != nil {
return listener, fmt.Errorf("Annotation HealthCheckConnectPort must be integer, but got [%s]. message=[%s] ",
reqCtx.Anno.Get(HealthCheckConnectPort), err.Error())
}
listener.HealthCheckConnectPort = port
}
if reqCtx.Anno.Get(HealthCheckInterval) != "" {
t, err := strconv.Atoi(reqCtx.Anno.Get(HealthCheckInterval))
if err != nil {
return listener, fmt.Errorf("Annotation HealthCheckInterval must be integer, but got [%s]. message=[%s] ",
reqCtx.Anno.Get(HealthCheckInterval), err.Error())
}
listener.HealthCheckInterval = t
}
if reqCtx.Anno.Get(HealthCheckDomain) != "" {
listener.HealthCheckDomain = reqCtx.Anno.Get(HealthCheckDomain)
}
if reqCtx.Anno.Get(HealthCheckURI) != "" {
listener.HealthCheckURI = reqCtx.Anno.Get(HealthCheckURI)
}
if reqCtx.Anno.Get(HealthCheckHTTPCode) != "" {
listener.HealthCheckHttpCode = reqCtx.Anno.Get(HealthCheckHTTPCode)
}
if reqCtx.Anno.Get(HealthCheckType) != "" {
listener.HealthCheckType = reqCtx.Anno.Get(HealthCheckType)
}
if reqCtx.Anno.Get(HealthCheckFlag) != "" {
listener.HealthCheck = model.FlagType(reqCtx.Anno.Get(HealthCheckFlag))
}
if reqCtx.Anno.Get(HealthCheckTimeout) != "" {
timeout, err := strconv.Atoi(reqCtx.Anno.Get(HealthCheckTimeout))
if err != nil {
return listener, fmt.Errorf("Annotation HealthCheckTimeout must be integer, but got [%s]. message=[%s] ",
reqCtx.Anno.Get(HealthCheckTimeout), err.Error())
}
listener.HealthCheckTimeout = timeout
}
return listener, nil
}