From 87c93e90cd73868cfcb7f581fed9d42b8849730b Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 6 Jun 2025 16:04:53 +0200 Subject: [PATCH] Implement node query --- api/schema.graphqls | 1 - internal/repository/node.go | 49 +++++++++++++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/api/schema.graphqls b/api/schema.graphqls index a7bafde..794c630 100644 --- a/api/schema.graphqls +++ b/api/schema.graphqls @@ -393,7 +393,6 @@ type TimeRangeOutput { input NodeFilter { hostname: StringInput cluster: StringInput - subCluster: StringInput nodeState: NodeState healthState: MonitoringState } diff --git a/internal/repository/node.go b/internal/repository/node.go index 29200ec..f6425cf 100644 --- a/internal/repository/node.go +++ b/internal/repository/node.go @@ -5,6 +5,7 @@ package repository import ( + "context" "database/sql" "encoding/json" "fmt" @@ -12,6 +13,7 @@ import ( "sync" "time" + "github.com/ClusterCockpit/cc-backend/internal/graph/model" "github.com/ClusterCockpit/cc-backend/pkg/archive" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/lrucache" @@ -212,8 +214,51 @@ func (r *NodeRepository) DeleteNode(id int64) error { return nil } -func (r *NodeRepository) QueryNodes() ([]*schema.Node, error) { - return nil, nil +func (r *NodeRepository) QueryNodes( + ctx context.Context, + filters []*model.NodeFilter, +) ([]*schema.Node, error) { + query, qerr := SecurityCheck(ctx, sq.Select(jobColumns...).From("node")) + if qerr != nil { + return nil, qerr + } + + for _, f := range filters { + if f.Hostname != nil { + query = buildStringCondition("node.hostname", f.Hostname, query) + } + if f.Cluster != nil { + query = buildStringCondition("node.cluster", f.Cluster, query) + } + if f.NodeState != nil { + query = query.Where("node.node_state = ?", f.NodeState) + } + if f.HealthState != nil { + query = query.Where("node.health_state = ?", f.HealthState) + } + } + + rows, err := query.RunWith(r.stmtCache).Query() + if err != nil { + queryString, queryVars, _ := query.ToSql() + log.Errorf("Error while running query '%s' %v: %v", queryString, queryVars, err) + return nil, err + } + + nodes := make([]*schema.Node, 0, 50) + for rows.Next() { + node := schema.Node{} + + if err := rows.Scan(&node.Hostname, &node.Cluster, &node.SubCluster, + &node.NodeState, &node.HealthState); err != nil { + rows.Close() + log.Warn("Error while scanning rows (Nodes)") + return nil, err + } + nodes = append(nodes, &node) + } + + return nodes, nil } func (r *NodeRepository) ListNodes(cluster string) ([]*schema.Node, error) {