mirror of
https://github.com/cirruslabs/orchard.git
synced 2026-09-29 19:41:15 +02:00
108 lines
2.5 KiB
Go
108 lines
2.5 KiB
Go
//nolint:err113,perfsprint // preserve the original endpoint validation errors
|
|
package v1
|
|
|
|
import "fmt"
|
|
|
|
type EndpointSpec struct {
|
|
Name string `json:"name"`
|
|
Protocol EndpointProtocol `json:"protocol"`
|
|
Target ConnectionTarget `json:"target"`
|
|
WorkerPortRange *PortRange `json:"workerPortRange,omitempty"`
|
|
}
|
|
|
|
func (endpoint EndpointSpec) Validate() error {
|
|
if endpoint.Name == "" {
|
|
return fmt.Errorf("endpoint name cannot be empty")
|
|
}
|
|
|
|
if err := endpoint.Protocol.Validate(); err != nil {
|
|
return fmt.Errorf("endpoint %q: %w", endpoint.Name, err)
|
|
}
|
|
|
|
if err := endpoint.Target.Validate(); err != nil {
|
|
return fmt.Errorf("endpoint %q: %w", endpoint.Name, err)
|
|
}
|
|
|
|
if portRange := endpoint.WorkerPortRange; portRange != nil {
|
|
if err := portRange.Validate(); err != nil {
|
|
return fmt.Errorf("endpoint %q has invalid worker port range: %w", endpoint.Name, err)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type EndpointStatus struct {
|
|
Name string `json:"name"`
|
|
Protocol EndpointProtocol `json:"protocol"`
|
|
WorkerPort uint16 `json:"workerPort,omitempty"`
|
|
State EndpointState `json:"state"`
|
|
Message string `json:"message,omitempty"`
|
|
}
|
|
|
|
type EndpointProtocol string
|
|
|
|
const (
|
|
EndpointProtocolTCP EndpointProtocol = "tcp"
|
|
EndpointProtocolUDP EndpointProtocol = "udp"
|
|
)
|
|
|
|
func (protocol EndpointProtocol) Validate() error {
|
|
switch protocol {
|
|
case EndpointProtocolTCP, EndpointProtocolUDP:
|
|
return nil
|
|
default:
|
|
return fmt.Errorf(
|
|
"unsupported endpoint protocol %q: expected %s or %s",
|
|
protocol,
|
|
EndpointProtocolTCP,
|
|
EndpointProtocolUDP,
|
|
)
|
|
}
|
|
}
|
|
|
|
type PortRange struct {
|
|
Min uint16 `json:"min"`
|
|
Max uint16 `json:"max"`
|
|
}
|
|
|
|
func (portRange PortRange) Validate() error {
|
|
if portRange.Min == 0 {
|
|
return fmt.Errorf("minimum port must be greater than zero")
|
|
}
|
|
|
|
if portRange.Min > portRange.Max {
|
|
return fmt.Errorf(
|
|
"minimum port %d exceeds maximum port %d",
|
|
portRange.Min,
|
|
portRange.Max,
|
|
)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type EndpointState string
|
|
|
|
const (
|
|
EndpointStateListening EndpointState = "listening"
|
|
EndpointStateError EndpointState = "error"
|
|
)
|
|
|
|
func ValidateEndpoints(endpoints []EndpointSpec) error {
|
|
seenNames := make(map[string]struct{}, len(endpoints))
|
|
|
|
for _, endpoint := range endpoints {
|
|
if err := endpoint.Validate(); err != nil {
|
|
return err
|
|
}
|
|
if _, exists := seenNames[endpoint.Name]; exists {
|
|
return fmt.Errorf("endpoint %q is duplicated", endpoint.Name)
|
|
}
|
|
|
|
seenNames[endpoint.Name] = struct{}{}
|
|
}
|
|
|
|
return nil
|
|
}
|