traefik/pkg/config/runtime/runtime_tcp.go

142 lines
4.3 KiB
Go
Raw Normal View History

2019-08-14 15:28:04 +00:00
package runtime
import (
"context"
"errors"
2019-09-02 09:38:04 +00:00
"fmt"
2023-08-16 15:50:06 +00:00
"slices"
2019-08-14 15:28:04 +00:00
2022-11-21 17:36:05 +00:00
"github.com/rs/zerolog/log"
2023-02-03 14:24:05 +00:00
"github.com/traefik/traefik/v3/pkg/config/dynamic"
"github.com/traefik/traefik/v3/pkg/logs"
2019-08-14 15:28:04 +00:00
)
2019-09-02 09:38:04 +00:00
// GetTCPRoutersByEntryPoints returns all the tcp routers by entry points name and routers name.
2019-08-14 15:28:04 +00:00
func (c *Configuration) GetTCPRoutersByEntryPoints(ctx context.Context, entryPoints []string) map[string]map[string]*TCPRouterInfo {
entryPointsRouters := make(map[string]map[string]*TCPRouterInfo)
for rtName, rt := range c.TCPRouters {
2022-11-21 17:36:05 +00:00
logger := log.Ctx(ctx).With().Str(logs.RouterName, rtName).Logger()
2019-09-02 09:38:04 +00:00
entryPointsCount := 0
for _, entryPointName := range rt.EntryPoints {
2023-08-16 15:50:06 +00:00
if !slices.Contains(entryPoints, entryPointName) {
2019-09-02 09:38:04 +00:00
rt.AddError(fmt.Errorf("entryPoint %q doesn't exist", entryPointName), false)
2022-11-21 17:36:05 +00:00
logger.Error().Str(logs.EntryPointName, entryPointName).
Msg("EntryPoint doesn't exist")
2019-08-14 15:28:04 +00:00
continue
}
if _, ok := entryPointsRouters[entryPointName]; !ok {
entryPointsRouters[entryPointName] = make(map[string]*TCPRouterInfo)
}
2019-09-02 09:38:04 +00:00
entryPointsCount++
rt.Using = append(rt.Using, entryPointName)
2019-08-14 15:28:04 +00:00
entryPointsRouters[entryPointName][rtName] = rt
}
2019-09-02 09:38:04 +00:00
if entryPointsCount == 0 {
rt.AddError(errors.New("no valid entryPoint for this router"), true)
2022-11-21 17:36:05 +00:00
logger.Error().Msg("No valid entryPoint for this router")
2019-09-02 09:38:04 +00:00
}
2019-08-14 15:28:04 +00:00
}
return entryPointsRouters
}
2019-09-02 09:38:04 +00:00
// TCPRouterInfo holds information about a currently running TCP router.
2019-08-14 15:28:04 +00:00
type TCPRouterInfo struct {
*dynamic.TCPRouter // dynamic configuration
Err []string `json:"error,omitempty"` // initialization error
// Status reports whether the router is disabled, in a warning state, or all good (enabled).
// If not in "enabled" state, the reason for it should be in the list of Err.
// It is the caller's responsibility to set the initial status.
2019-09-02 09:38:04 +00:00
Status string `json:"status,omitempty"`
Using []string `json:"using,omitempty"` // Effective entry points used by that router.
2019-08-14 15:28:04 +00:00
}
// AddError adds err to r.Err, if it does not already exist.
// If critical is set, r is marked as disabled.
func (r *TCPRouterInfo) AddError(err error, critical bool) {
for _, value := range r.Err {
if value == err.Error() {
return
}
}
r.Err = append(r.Err, err.Error())
if critical {
r.Status = StatusDisabled
return
}
// only set it to "warning" if not already in a worse state
if r.Status != StatusDisabled {
r.Status = StatusWarning
}
}
2019-09-02 09:38:04 +00:00
// TCPServiceInfo holds information about a currently running TCP service.
2019-08-14 15:28:04 +00:00
type TCPServiceInfo struct {
*dynamic.TCPService // dynamic configuration
Err []string `json:"error,omitempty"` // initialization error
// Status reports whether the service is disabled, in a warning state, or all good (enabled).
// If not in "enabled" state, the reason for it should be in the list of Err.
// It is the caller's responsibility to set the initial status.
Status string `json:"status,omitempty"`
UsedBy []string `json:"usedBy,omitempty"` // list of routers using that service
}
// AddError adds err to s.Err, if it does not already exist.
// If critical is set, s is marked as disabled.
func (s *TCPServiceInfo) AddError(err error, critical bool) {
for _, value := range s.Err {
if value == err.Error() {
return
}
}
s.Err = append(s.Err, err.Error())
if critical {
s.Status = StatusDisabled
return
}
// only set it to "warning" if not already in a worse state
if s.Status != StatusDisabled {
s.Status = StatusWarning
}
}
2021-06-11 13:30:05 +00:00
// TCPMiddlewareInfo holds information about a currently running middleware.
type TCPMiddlewareInfo struct {
*dynamic.TCPMiddleware // dynamic configuration
// Err contains all the errors that occurred during service creation.
Err []string `json:"error,omitempty"`
Status string `json:"status,omitempty"`
UsedBy []string `json:"usedBy,omitempty"` // list of TCP routers and services using that middleware.
}
// AddError adds err to s.Err, if it does not already exist.
// If critical is set, m is marked as disabled.
func (m *TCPMiddlewareInfo) AddError(err error, critical bool) {
for _, value := range m.Err {
if value == err.Error() {
return
}
}
m.Err = append(m.Err, err.Error())
if critical {
m.Status = StatusDisabled
return
}
// only set it to "warning" if not already in a worse state
if m.Status != StatusDisabled {
m.Status = StatusWarning
}
}