mirror of
https://github.com/ClusterCockpit/cc-backend
synced 2025-07-28 15:16:07 +02:00
.github
api
schema.graphqls
swagger.json
swagger.yaml
build
cmd
configs
docs
init
internal
pkg
tools
web
.gitignore
.goreleaser.yaml
LICENSE
Makefile
README.md
ReleaseNotes.md
go.mod
go.sum
gqlgen.yml
startDemo.sh
tools.go
302 lines
6.5 KiB
GraphQL
302 lines
6.5 KiB
GraphQL
scalar Time
|
|
scalar Any
|
|
|
|
scalar NullableFloat
|
|
scalar MetricScope
|
|
scalar JobState
|
|
|
|
type Job {
|
|
id: ID!
|
|
jobId: Int!
|
|
user: String!
|
|
project: String!
|
|
cluster: String!
|
|
subCluster: String!
|
|
startTime: Time!
|
|
duration: Int!
|
|
walltime: Int!
|
|
numNodes: Int!
|
|
numHWThreads: Int!
|
|
numAcc: Int!
|
|
SMT: Int!
|
|
exclusive: Int!
|
|
partition: String!
|
|
arrayJobId: Int!
|
|
monitoringStatus: Int!
|
|
state: JobState!
|
|
tags: [Tag!]!
|
|
resources: [Resource!]!
|
|
concurrentJobs: JobLinkResultList
|
|
|
|
metaData: Any
|
|
userData: User
|
|
}
|
|
|
|
type JobLink {
|
|
id: ID!
|
|
jobId: Int!
|
|
}
|
|
|
|
type Cluster {
|
|
name: String!
|
|
partitions: [String!]! # Slurm partitions
|
|
metricConfig: [MetricConfig!]!
|
|
subClusters: [SubCluster!]! # Hardware partitions/subclusters
|
|
}
|
|
|
|
type SubCluster {
|
|
name: String!
|
|
nodes: String!
|
|
numberOfNodes: Int!
|
|
processorType: String!
|
|
socketsPerNode: Int!
|
|
coresPerSocket: Int!
|
|
threadsPerCore: Int!
|
|
flopRateScalar: MetricValue!
|
|
flopRateSimd: MetricValue!
|
|
memoryBandwidth: MetricValue!
|
|
topology: Topology!
|
|
}
|
|
|
|
type MetricValue {
|
|
unit: Unit!
|
|
value: Float!
|
|
}
|
|
|
|
type Topology {
|
|
node: [Int!]
|
|
socket: [[Int!]!]
|
|
memoryDomain: [[Int!]!]
|
|
die: [[Int!]!]
|
|
core: [[Int!]!]
|
|
accelerators: [Accelerator!]
|
|
}
|
|
|
|
type Accelerator {
|
|
id: String!
|
|
type: String!
|
|
model: String!
|
|
}
|
|
|
|
type SubClusterConfig {
|
|
name: String!
|
|
peak: Float
|
|
normal: Float
|
|
caution: Float
|
|
alert: Float
|
|
remove: Boolean
|
|
}
|
|
|
|
type MetricConfig {
|
|
name: String!
|
|
unit: Unit!
|
|
scope: MetricScope!
|
|
aggregation: String!
|
|
timestep: Int!
|
|
peak: Float!
|
|
normal: Float
|
|
caution: Float!
|
|
alert: Float!
|
|
subClusters: [SubClusterConfig!]!
|
|
}
|
|
|
|
type Tag {
|
|
id: ID!
|
|
type: String!
|
|
name: String!
|
|
}
|
|
|
|
type Resource {
|
|
hostname: String!
|
|
hwthreads: [Int!]
|
|
accelerators: [String!]
|
|
configuration: String
|
|
}
|
|
|
|
type JobMetricWithName {
|
|
name: String!
|
|
scope: MetricScope!
|
|
metric: JobMetric!
|
|
}
|
|
|
|
type JobMetric {
|
|
unit: Unit
|
|
timestep: Int!
|
|
series: [Series!]
|
|
statisticsSeries: StatsSeries
|
|
}
|
|
|
|
type Series {
|
|
hostname: String!
|
|
id: String
|
|
statistics: MetricStatistics
|
|
data: [NullableFloat!]!
|
|
}
|
|
|
|
type Unit {
|
|
base: String!
|
|
prefix: String
|
|
}
|
|
|
|
type MetricStatistics {
|
|
avg: Float!
|
|
min: Float!
|
|
max: Float!
|
|
}
|
|
|
|
type StatsSeries {
|
|
mean: [NullableFloat!]!
|
|
min: [NullableFloat!]!
|
|
max: [NullableFloat!]!
|
|
}
|
|
|
|
type MetricFootprints {
|
|
metric: String!
|
|
data: [NullableFloat!]!
|
|
}
|
|
|
|
type Footprints {
|
|
nodehours: [NullableFloat!]!
|
|
metrics: [MetricFootprints!]!
|
|
}
|
|
|
|
enum Aggregate { USER, PROJECT, CLUSTER }
|
|
enum Weights { NODE_COUNT, NODE_HOURS }
|
|
|
|
type NodeMetrics {
|
|
host: String!
|
|
subCluster: String!
|
|
metrics: [JobMetricWithName!]!
|
|
}
|
|
|
|
type Count {
|
|
name: String!
|
|
count: Int!
|
|
}
|
|
|
|
type User {
|
|
username: String!
|
|
name: String!
|
|
email: String!
|
|
}
|
|
|
|
type Query {
|
|
clusters: [Cluster!]! # List of all clusters
|
|
tags: [Tag!]! # List of all tags
|
|
|
|
user(username: String!): User
|
|
allocatedNodes(cluster: String!): [Count!]!
|
|
|
|
job(id: ID!): Job
|
|
jobMetrics(id: ID!, metrics: [String!], scopes: [MetricScope!]): [JobMetricWithName!]!
|
|
jobsFootprints(filter: [JobFilter!], metrics: [String!]!): Footprints
|
|
|
|
jobs(filter: [JobFilter!], page: PageRequest, order: OrderByInput): JobResultList!
|
|
jobsStatistics(filter: [JobFilter!], groupBy: Aggregate): [JobsStatistics!]!
|
|
jobsCount(filter: [JobFilter]!, groupBy: Aggregate!, weight: Weights, limit: Int): [Count!]!
|
|
|
|
rooflineHeatmap(filter: [JobFilter!]!, rows: Int!, cols: Int!, minX: Float!, minY: Float!, maxX: Float!, maxY: Float!): [[Float!]!]!
|
|
|
|
nodeMetrics(cluster: String!, nodes: [String!], scopes: [MetricScope!], metrics: [String!], from: Time!, to: Time!): [NodeMetrics!]!
|
|
}
|
|
|
|
type Mutation {
|
|
createTag(type: String!, name: String!): Tag!
|
|
deleteTag(id: ID!): ID!
|
|
addTagsToJob(job: ID!, tagIds: [ID!]!): [Tag!]!
|
|
removeTagsFromJob(job: ID!, tagIds: [ID!]!): [Tag!]!
|
|
|
|
updateConfiguration(name: String!, value: String!): String
|
|
}
|
|
|
|
type IntRangeOutput { from: Int!, to: Int! }
|
|
type TimeRangeOutput { from: Time!, to: Time! }
|
|
|
|
input JobFilter {
|
|
tags: [ID!]
|
|
jobId: StringInput
|
|
arrayJobId: Int
|
|
user: StringInput
|
|
project: StringInput
|
|
jobName: StringInput
|
|
cluster: StringInput
|
|
partition: StringInput
|
|
duration: IntRange
|
|
|
|
minRunningFor: Int
|
|
|
|
numNodes: IntRange
|
|
numAccelerators: IntRange
|
|
numHWThreads: IntRange
|
|
|
|
startTime: TimeRange
|
|
state: [JobState!]
|
|
flopsAnyAvg: FloatRange
|
|
memBwAvg: FloatRange
|
|
loadAvg: FloatRange
|
|
memUsedMax: FloatRange
|
|
|
|
exclusive: Int
|
|
node: StringInput
|
|
}
|
|
|
|
input OrderByInput {
|
|
field: String!
|
|
order: SortDirectionEnum! = ASC
|
|
}
|
|
|
|
enum SortDirectionEnum {
|
|
DESC
|
|
ASC
|
|
}
|
|
|
|
input StringInput {
|
|
eq: String
|
|
neq: String
|
|
contains: String
|
|
startsWith: String
|
|
endsWith: String
|
|
in: [String!]
|
|
}
|
|
|
|
input IntRange { from: Int!, to: Int! }
|
|
input FloatRange { from: Float!, to: Float! }
|
|
input TimeRange { from: Time, to: Time }
|
|
|
|
type JobResultList {
|
|
items: [Job!]!
|
|
offset: Int
|
|
limit: Int
|
|
count: Int
|
|
}
|
|
|
|
type JobLinkResultList {
|
|
listQuery: String
|
|
items: [JobLink!]!
|
|
count: Int
|
|
}
|
|
|
|
type HistoPoint {
|
|
count: Int!
|
|
value: Int!
|
|
}
|
|
|
|
type JobsStatistics {
|
|
id: ID! # If `groupBy` was used, ID of the user/project/cluster
|
|
name: String! # if User-Statistics: Given Name of Account (ID) Owner
|
|
totalJobs: Int! # Number of jobs
|
|
runningJobs: Int! # Number of running jobs
|
|
shortJobs: Int! # Number of jobs with a duration of less than duration
|
|
totalWalltime: Int! # Sum of the duration of all matched jobs in hours
|
|
totalNodeHours: Int! # Sum of the node hours of all matched jobs
|
|
totalCoreHours: Int! # Sum of the core hours of all matched jobs
|
|
totalAccHours: Int! # Sum of the gpu hours of all matched jobs
|
|
histDuration: [HistoPoint!]! # value: hour, count: number of jobs with a rounded duration of value
|
|
histNumNodes: [HistoPoint!]! # value: number of nodes, count: number of jobs with that number of nodes
|
|
}
|
|
|
|
input PageRequest {
|
|
itemsPerPage: Int!
|
|
page: Int!
|
|
}
|