From abbce2322b6cec4441c6627e0bbe20a8efd16c0e Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Mon, 15 Jun 2026 16:15:31 +0000 Subject: [PATCH] add cluster ok value and checks --- app/app.go | 19 +++++++++++++++---- app/model.go | 16 +++++++++++++--- app/proxmox.go | 13 ++++--------- app/types.go | 1 + 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/app/app.go b/app/app.go index 6c1ddb3..bd1a135 100644 --- a/app/app.go +++ b/app/app.go @@ -76,6 +76,11 @@ func Run() { }) router.GET("/", func(c *gin.Context) { + if !cluster.OK { + c.JSON(http.StatusInternalServerError, gin.H{"error": "cluster state is invalid"}) + return + } + v, err := cluster.Get() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) @@ -87,10 +92,13 @@ func Run() { }) router.GET("/nodes/:node", func(c *gin.Context) { + if !cluster.OK { + c.JSON(http.StatusInternalServerError, gin.H{"error": "cluster state is invalid"}) + return + } + nodeid := c.Param("node") - node, err := cluster.GetNode(nodeid) - if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": err.Error()}) return @@ -101,15 +109,18 @@ func Run() { }) router.GET("/nodes/:node/instances/:vmid", func(c *gin.Context) { + if !cluster.OK { + c.JSON(http.StatusInternalServerError, gin.H{"error": "cluster state is invalid"}) + return + } + nodeid := c.Param("node") vmid, err := strconv.ParseUint(c.Param("vmid"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("%s could not be converted to vmid (uint)", c.Param("instance"))}) return } - node, err := cluster.GetNode(nodeid) - if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return diff --git a/app/model.go b/app/model.go index 6579ebc..95d625a 100644 --- a/app/model.go +++ b/app/model.go @@ -20,8 +20,11 @@ func (cluster *Cluster) Get() (*Cluster, error) { // aquire cluster lock cluster.lock.Lock() defer cluster.lock.Unlock() - - return cluster, nil + if cluster.OK { + return cluster, nil + } else { + return nil, fmt.Errorf("cluster state is invalid") + } } // hard sync cluster @@ -29,6 +32,8 @@ func (cluster *Cluster) Sync() error { // aquire lock on cluster, release on return cluster.lock.Lock() + cluster.OK = false + cluster.Nodes = make(map[string]*Node) wg, _ := errgroup.WithContext(context.Background()) @@ -68,6 +73,10 @@ func (cluster *Cluster) Sync() error { return err } + cluster.lock.Lock() + cluster.OK = true + cluster.lock.Unlock() + return nil } @@ -110,6 +119,7 @@ func (cluster *Cluster) GetNode(hostName string) (*Node, error) { // aquire cluster lock cluster.lock.Lock() defer cluster.lock.Unlock() + // get host host, ok := cluster.Nodes[hostName] if !ok { @@ -202,10 +212,10 @@ func (cluster *Cluster) RebuildNode(hostName string) error { } func (host *Node) GetInstance(vmid uint) (*Instance, error) { - // aquire host lock host.lock.Lock() defer host.lock.Unlock() + // get instance instance, ok := host.Instances[InstanceID(vmid)] if !ok { diff --git a/app/proxmox.go b/app/proxmox.go index 811162b..6a9674b 100644 --- a/app/proxmox.go +++ b/app/proxmox.go @@ -4,6 +4,7 @@ import ( "context" "crypto/tls" "fmt" + "maps" "net/http" "strconv" "strings" @@ -200,9 +201,7 @@ func (host *Node) VirtualMachine(VMID uint) (*Instance, error) { func MergeVMDisksAndUnused(vmc *proxmox.VirtualMachineConfig) map[string]string { mergedDisks := vmc.MergeDisks() - for k, v := range vmc.Unuseds { - mergedDisks[k] = v - } + maps.Copy(mergedDisks, vmc.Unuseds) return mergedDisks } @@ -247,12 +246,8 @@ func (host *Node) Container(VMID uint) (*Instance, error) { func MergeCTDisksAndUnused(cc *proxmox.ContainerConfig) map[string]string { mergedDisks := make(map[string]string) - for k, v := range cc.Unuseds { - mergedDisks[k] = v - } - for k, v := range cc.Mps { - mergedDisks[k] = v - } + maps.Copy(mergedDisks, cc.Unuseds) + maps.Copy(mergedDisks, cc.Mps) mergedDisks["rootfs"] = cc.RootFS return mergedDisks } diff --git a/app/types.go b/app/types.go index 032b52d..beb91cb 100644 --- a/app/types.go +++ b/app/types.go @@ -17,6 +17,7 @@ type Cluster struct { lock sync.Mutex pve ProxmoxClient Nodes map[string]*Node `json:"nodes"` + OK bool } // add mutex and pve api Node object