// 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 }