mirror of
				https://github.com/ClusterCockpit/cc-backend
				synced 2025-11-04 01:25:06 +01:00 
			
		
		
		
	Start implementing nodestate rest api
This commit is contained in:
		@@ -7,6 +7,9 @@ package api
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
	"github.com/ClusterCockpit/cc-backend/internal/repository"
 | 
			
		||||
	"github.com/ClusterCockpit/cc-backend/pkg/schema"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
		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
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"database/sql"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"maps"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/ClusterCockpit/cc-backend/pkg/archive"
 | 
			
		||||
	"github.com/ClusterCockpit/cc-backend/pkg/log"
 | 
			
		||||
	"github.com/ClusterCockpit/cc-backend/pkg/lrucache"
 | 
			
		||||
	"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 = `
 | 
			
		||||
INSERT INTO node (hostname, cluster, subcluster, node_state, health_state, raw_meta_data)
 | 
			
		||||
	VALUES (: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);`
 | 
			
		||||
 | 
			
		||||
func (r *NodeRepository) AddNode(node *schema.Node) (int64, 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)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -159,8 +156,35 @@ func (r *NodeRepository) AddNode(node *schema.Node) (int64, error) {
 | 
			
		||||
	return node.ID, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *NodeRepository) UpdateNodeState(hostname string, nodeState *schema.NodeState) error {
 | 
			
		||||
	if _, err := sq.Update("node").Set("node_state", nodeState).Where("node.hostname = ?", hostname).RunWith(r.DB).Exec(); err != nil {
 | 
			
		||||
func (r *NodeRepository) UpdateNodeState(hostname string, cluster string, nodeState *schema.NodeState) error {
 | 
			
		||||
	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)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
@@ -168,14 +192,14 @@ func (r *NodeRepository) UpdateNodeState(hostname string, nodeState *schema.Node
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 {
 | 
			
		||||
		log.Errorf("error while updating node '%d'", id)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
// 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 {
 | 
			
		||||
// 		log.Errorf("error while updating node '%d'", id)
 | 
			
		||||
// 		return err
 | 
			
		||||
// 	}
 | 
			
		||||
//
 | 
			
		||||
// 	return nil
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func (r *NodeRepository) DeleteNode(id int64) error {
 | 
			
		||||
	_, 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.
										
									
								
							
		Reference in New Issue
	
	Block a user