mirror of
https://github.com/ClusterCockpit/cc-backend
synced 2025-06-08 08:33:49 +02:00
Start implementing nodestate rest api
This commit is contained in:
parent
d1a7002422
commit
7db83d216e
@ -7,6 +7,9 @@ package api
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/ClusterCockpit/cc-backend/internal/repository"
|
||||||
|
"github.com/ClusterCockpit/cc-backend/pkg/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Node struct {
|
type Node struct {
|
||||||
@ -27,4 +30,12 @@ func (api *RestApi) updateNodeStates(rw http.ResponseWriter, r *http.Request) {
|
|||||||
handleError(fmt.Errorf("parsing request body failed: %w", err), http.StatusBadRequest, rw)
|
handleError(fmt.Errorf("parsing request body failed: %w", err), http.StatusBadRequest, rw)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
repo := repository.GetNodeRepository()
|
||||||
|
|
||||||
|
for _, node := range req.Nodes {
|
||||||
|
state := schema.NodeStateUnknown
|
||||||
|
// TODO: Determine valid node state
|
||||||
|
repo.UpdateNodeState(node.Name, req.Cluster, &state)
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,12 +5,14 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"database/sql"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"maps"
|
"maps"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/ClusterCockpit/cc-backend/pkg/archive"
|
||||||
"github.com/ClusterCockpit/cc-backend/pkg/log"
|
"github.com/ClusterCockpit/cc-backend/pkg/log"
|
||||||
"github.com/ClusterCockpit/cc-backend/pkg/lrucache"
|
"github.com/ClusterCockpit/cc-backend/pkg/lrucache"
|
||||||
"github.com/ClusterCockpit/cc-backend/pkg/schema"
|
"github.com/ClusterCockpit/cc-backend/pkg/schema"
|
||||||
@ -134,16 +136,11 @@ func (r *NodeRepository) GetNode(id int64, withMeta bool) (*schema.Node, error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
const NamedNodeInsert string = `
|
const NamedNodeInsert string = `
|
||||||
INSERT INTO node (hostname, cluster, subcluster, node_state, health_state, raw_meta_data)
|
INSERT INTO node (hostname, cluster, subcluster, node_state, health_state)
|
||||||
VALUES (:hostname, :cluster, :subcluster, :node_state, :health_state, :raw_meta_data);`
|
VALUES (:hostname, :cluster, :subcluster, :node_state, :health_state);`
|
||||||
|
|
||||||
func (r *NodeRepository) AddNode(node *schema.Node) (int64, error) {
|
func (r *NodeRepository) AddNode(node *schema.Node) (int64, error) {
|
||||||
var err error
|
var err error
|
||||||
node.RawMetaData, err = json.Marshal(node.MetaData)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Error while marshaling metadata for node '%v'", node.Hostname)
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
res, err := r.DB.NamedExec(NamedNodeInsert, node)
|
res, err := r.DB.NamedExec(NamedNodeInsert, node)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -159,8 +156,35 @@ func (r *NodeRepository) AddNode(node *schema.Node) (int64, error) {
|
|||||||
return node.ID, nil
|
return node.ID, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *NodeRepository) UpdateNodeState(hostname string, nodeState *schema.NodeState) error {
|
func (r *NodeRepository) UpdateNodeState(hostname string, cluster string, nodeState *schema.NodeState) error {
|
||||||
if _, err := sq.Update("node").Set("node_state", nodeState).Where("node.hostname = ?", hostname).RunWith(r.DB).Exec(); err != nil {
|
var id int64
|
||||||
|
if err := sq.Select("id").From("node").
|
||||||
|
Where("node.hostname = ?", hostname).Where("node.cluster = ?", cluster).RunWith(r.DB).
|
||||||
|
QueryRow().Scan(&id); err != nil {
|
||||||
|
if err == sql.ErrNoRows {
|
||||||
|
subcluster, err := archive.GetSubClusterByNode(cluster, hostname)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Error while getting subcluster for node '%s' in cluster '%s': %v", hostname, cluster, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
node := schema.Node{
|
||||||
|
Hostname: hostname, Cluster: cluster, SubCluster: subcluster, NodeState: *nodeState,
|
||||||
|
HealthState: schema.MonitoringStateFull,
|
||||||
|
}
|
||||||
|
_, err = r.AddNode(&node)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Error while adding node '%s' to database: %v", hostname, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
log.Warnf("Error while querying node '%v' from database", id)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := sq.Update("node").Set("node_state", nodeState).Where("node.id = ?", id).RunWith(r.DB).Exec(); err != nil {
|
||||||
log.Errorf("error while updating node '%s'", hostname)
|
log.Errorf("error while updating node '%s'", hostname)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -168,14 +192,14 @@ func (r *NodeRepository) UpdateNodeState(hostname string, nodeState *schema.Node
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *NodeRepository) UpdateHealthState(hostname string, healthState *schema.MonitoringState) error {
|
// func (r *NodeRepository) UpdateHealthState(hostname string, healthState *schema.MonitoringState) error {
|
||||||
if _, err := sq.Update("node").Set("health_state", healthState).Where("node.id = ?", id).RunWith(r.DB).Exec(); err != nil {
|
// if _, err := sq.Update("node").Set("health_state", healthState).Where("node.id = ?", id).RunWith(r.DB).Exec(); err != nil {
|
||||||
log.Errorf("error while updating node '%d'", id)
|
// log.Errorf("error while updating node '%d'", id)
|
||||||
return err
|
// return err
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
return nil
|
// return nil
|
||||||
}
|
// }
|
||||||
|
|
||||||
func (r *NodeRepository) DeleteNode(id int64) error {
|
func (r *NodeRepository) DeleteNode(id int64) error {
|
||||||
_, err := r.DB.Exec(`DELETE FROM node WHERE node.id = ?`, id)
|
_, err := r.DB.Exec(`DELETE FROM node WHERE node.id = ?`, id)
|
||||||
|
BIN
internal/repository/testdata/job.db
vendored
BIN
internal/repository/testdata/job.db
vendored
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user