pve-go/scheme.go
2021-12-10 20:33:20 +01:00

83 lines
1.4 KiB
Go

// Copyright (C) 2020 Marius Schellenberger
package pve
import (
"errors"
"fmt"
"net/url"
"strconv"
"strings"
)
const (
PVEScheme = "pve"
PVESchemeURL = PVEScheme + "://"
MinID = 100
InvalidID = 0
)
var (
ErrInvalidPVEURL = errors.New("invalid pve url scheme")
ErrNoID = errors.New("missing id in url")
ErrInvalidID = errors.New("invalid id")
ErrParsingID = errors.New("error parsing id in url")
)
func ValidateID(id int) error {
if id < MinID {
return ErrInvalidID
}
return nil
}
func ParseURL(s string) (pool, node string, id int, err error) {
u, err := url.Parse(s)
if err != nil {
return
}
if u.Scheme != PVEScheme {
err = ErrInvalidPVEURL
return
}
a := strings.Split(u.Path, "/")
if len(a) != 3 {
err = ErrInvalidPVEURL
return
}
if a[2] == "" {
err = ErrNoID
return
}
id, err = strconv.Atoi(a[2])
if err != nil {
err = ErrParsingID
}
return u.Host, a[1], id, ValidateID(id)
}
func ServerRefFromURL(s string) (ref *ServerRef, err error) {
pool, node, id, err := ParseURL(s)
if err != nil {
return
}
ref = &ServerRef{
ID: id,
Node: node,
Pool: pool,
}
return
}
func NewURL(pool, node string, id int) string {
return fmt.Sprintf("%s%s/%s/%d", PVESchemeURL, pool, node, id)
}
func K8sURL(url string) (string, error) {
pool, _, id, err := ParseURL(url)
if err != nil {
return "", nil
}
return NewURL(pool, "", id), nil
}