add cluster ok value and checks
This commit is contained in:
+15
-4
@@ -76,6 +76,11 @@ func Run() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
router.GET("/", func(c *gin.Context) {
|
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()
|
v, err := cluster.Get()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||||
@@ -87,10 +92,13 @@ func Run() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
router.GET("/nodes/:node", func(c *gin.Context) {
|
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")
|
nodeid := c.Param("node")
|
||||||
|
|
||||||
node, err := cluster.GetNode(nodeid)
|
node, err := cluster.GetNode(nodeid)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
|
c.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
|
||||||
return
|
return
|
||||||
@@ -101,15 +109,18 @@ func Run() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
router.GET("/nodes/:node/instances/:vmid", func(c *gin.Context) {
|
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")
|
nodeid := c.Param("node")
|
||||||
vmid, err := strconv.ParseUint(c.Param("vmid"), 10, 64)
|
vmid, err := strconv.ParseUint(c.Param("vmid"), 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("%s could not be converted to vmid (uint)", c.Param("instance"))})
|
c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("%s could not be converted to vmid (uint)", c.Param("instance"))})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
node, err := cluster.GetNode(nodeid)
|
node, err := cluster.GetNode(nodeid)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||||
return
|
return
|
||||||
|
|||||||
+13
-3
@@ -20,8 +20,11 @@ func (cluster *Cluster) Get() (*Cluster, error) {
|
|||||||
// aquire cluster lock
|
// aquire cluster lock
|
||||||
cluster.lock.Lock()
|
cluster.lock.Lock()
|
||||||
defer cluster.lock.Unlock()
|
defer cluster.lock.Unlock()
|
||||||
|
if cluster.OK {
|
||||||
return cluster, nil
|
return cluster, nil
|
||||||
|
} else {
|
||||||
|
return nil, fmt.Errorf("cluster state is invalid")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// hard sync cluster
|
// hard sync cluster
|
||||||
@@ -29,6 +32,8 @@ func (cluster *Cluster) Sync() error {
|
|||||||
// aquire lock on cluster, release on return
|
// aquire lock on cluster, release on return
|
||||||
cluster.lock.Lock()
|
cluster.lock.Lock()
|
||||||
|
|
||||||
|
cluster.OK = false
|
||||||
|
|
||||||
cluster.Nodes = make(map[string]*Node)
|
cluster.Nodes = make(map[string]*Node)
|
||||||
|
|
||||||
wg, _ := errgroup.WithContext(context.Background())
|
wg, _ := errgroup.WithContext(context.Background())
|
||||||
@@ -68,6 +73,10 @@ func (cluster *Cluster) Sync() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cluster.lock.Lock()
|
||||||
|
cluster.OK = true
|
||||||
|
cluster.lock.Unlock()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,6 +119,7 @@ func (cluster *Cluster) GetNode(hostName string) (*Node, error) {
|
|||||||
// aquire cluster lock
|
// aquire cluster lock
|
||||||
cluster.lock.Lock()
|
cluster.lock.Lock()
|
||||||
defer cluster.lock.Unlock()
|
defer cluster.lock.Unlock()
|
||||||
|
|
||||||
// get host
|
// get host
|
||||||
host, ok := cluster.Nodes[hostName]
|
host, ok := cluster.Nodes[hostName]
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -202,10 +212,10 @@ func (cluster *Cluster) RebuildNode(hostName string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (host *Node) GetInstance(vmid uint) (*Instance, error) {
|
func (host *Node) GetInstance(vmid uint) (*Instance, error) {
|
||||||
|
|
||||||
// aquire host lock
|
// aquire host lock
|
||||||
host.lock.Lock()
|
host.lock.Lock()
|
||||||
defer host.lock.Unlock()
|
defer host.lock.Unlock()
|
||||||
|
|
||||||
// get instance
|
// get instance
|
||||||
instance, ok := host.Instances[InstanceID(vmid)]
|
instance, ok := host.Instances[InstanceID(vmid)]
|
||||||
if !ok {
|
if !ok {
|
||||||
|
|||||||
+4
-9
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"maps"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -200,9 +201,7 @@ func (host *Node) VirtualMachine(VMID uint) (*Instance, error) {
|
|||||||
|
|
||||||
func MergeVMDisksAndUnused(vmc *proxmox.VirtualMachineConfig) map[string]string {
|
func MergeVMDisksAndUnused(vmc *proxmox.VirtualMachineConfig) map[string]string {
|
||||||
mergedDisks := vmc.MergeDisks()
|
mergedDisks := vmc.MergeDisks()
|
||||||
for k, v := range vmc.Unuseds {
|
maps.Copy(mergedDisks, vmc.Unuseds)
|
||||||
mergedDisks[k] = v
|
|
||||||
}
|
|
||||||
return mergedDisks
|
return mergedDisks
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,12 +246,8 @@ func (host *Node) Container(VMID uint) (*Instance, error) {
|
|||||||
|
|
||||||
func MergeCTDisksAndUnused(cc *proxmox.ContainerConfig) map[string]string {
|
func MergeCTDisksAndUnused(cc *proxmox.ContainerConfig) map[string]string {
|
||||||
mergedDisks := make(map[string]string)
|
mergedDisks := make(map[string]string)
|
||||||
for k, v := range cc.Unuseds {
|
maps.Copy(mergedDisks, cc.Unuseds)
|
||||||
mergedDisks[k] = v
|
maps.Copy(mergedDisks, cc.Mps)
|
||||||
}
|
|
||||||
for k, v := range cc.Mps {
|
|
||||||
mergedDisks[k] = v
|
|
||||||
}
|
|
||||||
mergedDisks["rootfs"] = cc.RootFS
|
mergedDisks["rootfs"] = cc.RootFS
|
||||||
return mergedDisks
|
return mergedDisks
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ type Cluster struct {
|
|||||||
lock sync.Mutex
|
lock sync.Mutex
|
||||||
pve ProxmoxClient
|
pve ProxmoxClient
|
||||||
Nodes map[string]*Node `json:"nodes"`
|
Nodes map[string]*Node `json:"nodes"`
|
||||||
|
OK bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// add mutex and pve api Node object
|
// add mutex and pve api Node object
|
||||||
|
|||||||
Reference in New Issue
Block a user