Files
neko-rooms/internal/room/labels.go
T
2023-09-30 17:26:44 +02:00

163 lines
3.9 KiB
Go

package room
import (
"fmt"
"regexp"
"strconv"
"strings"
"github.com/m1k1o/neko-rooms/internal/types"
)
var labelRegex = regexp.MustCompile(`^[a-z0-9.-]+$`)
type RoomLabels struct {
Name string
URL string
Mux bool
Epr EprPorts
NekoImage string
BrowserPolicy *BrowserPolicyLabels
UserDefined map[string]string
}
type BrowserPolicyLabels struct {
Type types.BrowserPolicyType
Path string
}
func (manager *RoomManagerCtx) extractLabels(labels map[string]string) (*RoomLabels, error) {
name, ok := labels["m1k1o.neko_rooms.name"]
if !ok {
return nil, fmt.Errorf("damaged container labels: name not found")
}
url, ok := labels["m1k1o.neko_rooms.url"]
if !ok {
// TODO: It should be always available.
url = manager.config.GetRoomUrl(name)
//return nil, fmt.Errorf("damaged container labels: url not found")
}
nekoImage, ok := labels["m1k1o.neko_rooms.neko_image"]
if !ok {
return nil, fmt.Errorf("damaged container labels: neko_image not found")
}
var mux bool
var epr EprPorts
muxStr, ok := labels["m1k1o.neko_rooms.mux"]
if ok {
muxPort, err := strconv.ParseUint(muxStr, 10, 16)
if err != nil {
return nil, err
}
mux = true
epr = EprPorts{
Min: uint16(muxPort),
Max: uint16(muxPort),
}
} else {
eprMinStr, ok := labels["m1k1o.neko_rooms.epr.min"]
if !ok {
return nil, fmt.Errorf("damaged container labels: epr.min not found")
}
eprMin, err := strconv.ParseUint(eprMinStr, 10, 16)
if err != nil {
return nil, err
}
eprMaxStr, ok := labels["m1k1o.neko_rooms.epr.max"]
if !ok {
return nil, fmt.Errorf("damaged container labels: epr.max not found")
}
eprMax, err := strconv.ParseUint(eprMaxStr, 10, 16)
if err != nil {
return nil, err
}
mux = false
epr = EprPorts{
Min: uint16(eprMin),
Max: uint16(eprMax),
}
}
var browserPolicy *BrowserPolicyLabels
if val, ok := labels["m1k1o.neko_rooms.browser_policy"]; ok && val == "true" {
policyType, ok := labels["m1k1o.neko_rooms.browser_policy.type"]
if !ok {
return nil, fmt.Errorf("damaged container labels: browser_policy.type not found")
}
policyPath, ok := labels["m1k1o.neko_rooms.browser_policy.path"]
if !ok {
return nil, fmt.Errorf("damaged container labels: browser_policy.path not found")
}
browserPolicy = &BrowserPolicyLabels{
Type: types.BrowserPolicyType(policyType),
Path: policyPath,
}
}
// extract user defined labels
userDefined := map[string]string{}
for key, val := range labels {
if strings.HasPrefix(key, "m1k1o.neko_rooms.x-") {
userDefined[strings.TrimPrefix(key, "m1k1o.neko_rooms.x-")] = val
}
}
return &RoomLabels{
Name: name,
URL: url,
NekoImage: nekoImage,
Mux: mux,
Epr: epr,
BrowserPolicy: browserPolicy,
UserDefined: userDefined,
}, nil
}
func (manager *RoomManagerCtx) serializeLabels(labels RoomLabels) map[string]string {
labelsMap := map[string]string{
"m1k1o.neko_rooms.name": labels.Name,
"m1k1o.neko_rooms.url": manager.config.GetRoomUrl(labels.Name),
"m1k1o.neko_rooms.instance": manager.config.InstanceName,
"m1k1o.neko_rooms.neko_image": labels.NekoImage,
}
if labels.Mux && labels.Epr.Min == labels.Epr.Max {
labelsMap["m1k1o.neko_rooms.mux"] = fmt.Sprintf("%d", labels.Epr.Min)
} else {
labelsMap["m1k1o.neko_rooms.epr.min"] = fmt.Sprintf("%d", labels.Epr.Min)
labelsMap["m1k1o.neko_rooms.epr.max"] = fmt.Sprintf("%d", labels.Epr.Max)
}
if labels.BrowserPolicy != nil {
labelsMap["m1k1o.neko_rooms.browser_policy"] = "true"
labelsMap["m1k1o.neko_rooms.browser_policy.type"] = string(labels.BrowserPolicy.Type)
labelsMap["m1k1o.neko_rooms.browser_policy.path"] = labels.BrowserPolicy.Path
}
for key, val := range labels.UserDefined {
// to lowercase
key = strings.ToLower(key)
labelsMap[fmt.Sprintf("m1k1o.neko_rooms.x-%s", key)] = val
}
return labelsMap
}
func CheckLabelKey(name string) bool {
return labelRegex.MatchString(name)
}