add proxmoxaas-common-lib dependency, update types and functions to use proxmoxaas-common-lib

This commit is contained in:
2026-04-19 17:30:37 +00:00
parent a9b0763c36
commit b4e45940a5
6 changed files with 28 additions and 137 deletions
+3
View File
@@ -0,0 +1,3 @@
[submodule "proxmoxaas-common-lib"]
path = proxmoxaas-common-lib
url = https://git.tronnet.net/tronnet/proxmoxaas-common-lib
+15 -86
View File
@@ -1,5 +1,7 @@
package app
import paas "proxmoxaas-common-lib"
type Backend interface {
NewPool(poolname string) (int, error)
DelPool(poolname string) (int, error)
@@ -13,89 +15,16 @@ type Backend interface {
DelUserFromGroup(username Username, groupname Groupname) (int, error)
}
type Pool struct {
PoolID string `json:"poolid"`
Path string `json:"-"` // typically /pool/poolid from proxmox, only used internally
Groups []Group `json:"groups"`
Resources map[string]any `json:"resources"`
Templates Templates `json:"templates"`
AllowedNodes map[string]bool `json:"nodes-allowed"`
VMIDRange VMID `json:"vmid-allowed"`
Backups Backups `json:"backups-allowed"` // measured in numbers
}
// proxmox typically formats as gid-realm for non pve realms
// proxmox realms are formatted without realm values
// I assume that backends store groups by ID only and only proxmox will append the realm string
type Groupname struct {
GroupID string `json:"gid"`
Realm string `json:"realm"`
}
type Group struct {
Groupname Groupname `json:"groupname"`
Role string `json:"role"` // role in owner pool
Users []User `json:"users"`
}
type Username struct { // ie userid@realm
UserID string `json:"uid"`
Realm string `json:"realm"`
}
type User struct {
Username Username `json:"username"`
CN string `json:"cn"` // aka first name
SN string `json:"sn"` // aka last name
Mail string `json:"mail"`
Password string `json:"password"` // only used for POST requests
}
type VMID struct {
Min int `json:"min"`
MAx int `json:"max"`
}
type Backups struct {
Max int `json:"max"`
}
type Templates struct {
Instances struct {
LXC map[string]ResourceTemplate `json:"lxc"`
QEMU map[string]ResourceTemplate `json:"qemu"`
} `json:"instances"`
}
type SimpleResource struct {
Limits struct {
Global SimpleLimit `json:"global"`
Nodes map[string]SimpleLimit `json:"nodes"`
} `json:"limits"`
}
type SimpleLimit struct {
Max int `json:"max"`
}
type MatchResource struct {
Limits struct {
Global []MatchLimit `json:"global"`
Nodes map[string][]MatchLimit `json:"nodes"`
} `json:"limits"`
}
type MatchLimit struct {
Match string `json:"match"`
Name string `json:"name"`
Max int `json:"max"`
}
type ResourceTemplate struct {
Value string `json:"value"`
Resource struct {
Enabled bool `json:"enabled"`
Name string `json:"name"`
Amount int `json:"amount"`
} `json:"resource"`
}
type Pool = paas.Pool
type Groupname = paas.Groupname
type Group = paas.Group
type Username = paas.Username
type User = paas.User
type VMID = paas.VMID
type Backups = paas.Backups
type Templates = paas.Templates
type SimpleResource = paas.SimpleResource
type SimpleLimit = paas.SimpleLimit
type MatchResource = paas.MatchResource
type MatchLimit = paas.MatchLimit
type ResourceTemplate = paas.ResourceTemplate
-46
View File
@@ -1,46 +0,0 @@
package app
import (
"fmt"
"strings"
)
// returns an error if the groupname format was not correct
// TODO: handle group names with x-y format where y is not a registered realm
// TODO: handle group names with x-y-z-... format
func ParseGroupname(groupname string) (Groupname, error) {
g := Groupname{}
x := strings.Split(groupname, "-")
if len(x) == 1 {
g.GroupID = groupname
g.Realm = "pve"
return g, nil
} else if len(x) == 2 {
g.GroupID = x[0]
g.Realm = x[1]
return g, nil
} else {
return g, fmt.Errorf("groupid did not follow the format <groupid> or <groupid>-<realm>")
}
}
// returns an error if the username format was not correct
func ParseUsername(username string) (Username, error) {
u := Username{}
x := strings.Split(username, "@")
if len(x) == 2 {
u.UserID = x[0]
u.Realm = x[1]
return u, nil
} else {
return u, fmt.Errorf("userid did not follow the format <userid>@<realm>")
}
}
func (g Groupname) ToString() string {
return fmt.Sprintf("%s-%s", g.GroupID, g.Realm)
}
func (u Username) ToString() string {
return fmt.Sprintf("%s-%s", u.UserID, u.Realm)
}
+6 -5
View File
@@ -9,6 +9,7 @@ import (
"net/http"
"strconv"
paas "proxmoxaas-common-lib"
common "user-manager-api/app/common"
ldap "user-manager-api/app/ldap"
pve "user-manager-api/app/pve"
@@ -58,7 +59,7 @@ func Run(configPath *string) {
}
// attempt to parse username
body.Username, err = common.ParseUsername(body.UsernameRaw)
body.Username, err = paas.ParseUsername(body.UsernameRaw)
if err != nil { // username format incorrect
c.JSON(http.StatusBadRequest, gin.H{"auth": false, "error": err.Error()})
return
@@ -167,7 +168,7 @@ func Run(configPath *string) {
c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Errorf("Missing required path parameter groupid")})
return
}
groupname, err := common.ParseGroupname(groupid)
groupname, err := paas.ParseGroupname(groupid)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err})
return
@@ -193,7 +194,7 @@ func Run(configPath *string) {
c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Errorf("Missing required path parameter groupid")})
return
}
groupname, err := common.ParseGroupname(groupid)
groupname, err := paas.ParseGroupname(groupid)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err})
return
@@ -225,7 +226,7 @@ func Run(configPath *string) {
return
}
groupname, err := common.ParseGroupname(groupid)
groupname, err := paas.ParseGroupname(groupid)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err})
return
@@ -257,7 +258,7 @@ func Run(configPath *string) {
return
}
groupname, err := common.ParseGroupname(groupid)
groupname, err := paas.ParseGroupname(groupid)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err})
return
+3
View File
@@ -8,8 +8,11 @@ require (
github.com/go-ldap/ldap/v3 v3.4.13
github.com/luthermonson/go-proxmox v0.4.1
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d
proxmoxaas-common-lib v0.0.0
)
replace proxmoxaas-common-lib => ./proxmoxaas-common-lib
require (
github.com/Azure/go-ntlmssp v0.1.0 // indirect
github.com/buger/goterm v1.0.4 // indirect