mirror of
				https://github.com/ClusterCockpit/cc-backend
				synced 2025-11-04 09:35:07 +01:00 
			
		
		
		
	Refactor schema
* Remove redundant scope * Change Series Id type to string * Adopt golang structs to schema
This commit is contained in:
		@@ -41,7 +41,6 @@ type Cluster {
 | 
				
			|||||||
type SubCluster {
 | 
					type SubCluster {
 | 
				
			||||||
  name:            String!
 | 
					  name:            String!
 | 
				
			||||||
  nodes:           String!
 | 
					  nodes:           String!
 | 
				
			||||||
  numberOfNodes:   Int!
 | 
					 | 
				
			||||||
  processorType:   String!
 | 
					  processorType:   String!
 | 
				
			||||||
  socketsPerNode:  Int!
 | 
					  socketsPerNode:  Int!
 | 
				
			||||||
  coresPerSocket:  Int!
 | 
					  coresPerSocket:  Int!
 | 
				
			||||||
@@ -114,7 +113,6 @@ type JobMetricWithName {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type JobMetric {
 | 
					type JobMetric {
 | 
				
			||||||
  unit:             Unit
 | 
					  unit:             Unit
 | 
				
			||||||
  scope:            MetricScope!
 | 
					 | 
				
			||||||
  timestep:         Int!
 | 
					  timestep:         Int!
 | 
				
			||||||
  series:           [Series!]
 | 
					  series:           [Series!]
 | 
				
			||||||
  statisticsSeries: StatsSeries
 | 
					  statisticsSeries: StatsSeries
 | 
				
			||||||
@@ -122,7 +120,7 @@ type JobMetric {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type Series {
 | 
					type Series {
 | 
				
			||||||
  hostname:   String!
 | 
					  hostname:   String!
 | 
				
			||||||
  id:         Int
 | 
					  id:         String
 | 
				
			||||||
  statistics: MetricStatistics
 | 
					  statistics: MetricStatistics
 | 
				
			||||||
  data:       [NullableFloat!]!
 | 
					  data:       [NullableFloat!]!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -107,7 +107,6 @@ type ComplexityRoot struct {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	JobMetric struct {
 | 
						JobMetric struct {
 | 
				
			||||||
		Scope            func(childComplexity int) int
 | 
					 | 
				
			||||||
		Series           func(childComplexity int) int
 | 
							Series           func(childComplexity int) int
 | 
				
			||||||
		StatisticsSeries func(childComplexity int) int
 | 
							StatisticsSeries func(childComplexity int) int
 | 
				
			||||||
		Timestep         func(childComplexity int) int
 | 
							Timestep         func(childComplexity int) int
 | 
				
			||||||
@@ -221,7 +220,6 @@ type ComplexityRoot struct {
 | 
				
			|||||||
		MemoryBandwidth func(childComplexity int) int
 | 
							MemoryBandwidth func(childComplexity int) int
 | 
				
			||||||
		Name            func(childComplexity int) int
 | 
							Name            func(childComplexity int) int
 | 
				
			||||||
		Nodes           func(childComplexity int) int
 | 
							Nodes           func(childComplexity int) int
 | 
				
			||||||
		NumberOfNodes   func(childComplexity int) int
 | 
					 | 
				
			||||||
		ProcessorType   func(childComplexity int) int
 | 
							ProcessorType   func(childComplexity int) int
 | 
				
			||||||
		SocketsPerNode  func(childComplexity int) int
 | 
							SocketsPerNode  func(childComplexity int) int
 | 
				
			||||||
		ThreadsPerCore  func(childComplexity int) int
 | 
							ThreadsPerCore  func(childComplexity int) int
 | 
				
			||||||
@@ -574,13 +572,6 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		return e.complexity.Job.Walltime(childComplexity), true
 | 
							return e.complexity.Job.Walltime(childComplexity), true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case "JobMetric.scope":
 | 
					 | 
				
			||||||
		if e.complexity.JobMetric.Scope == nil {
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return e.complexity.JobMetric.Scope(childComplexity), true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case "JobMetric.series":
 | 
						case "JobMetric.series":
 | 
				
			||||||
		if e.complexity.JobMetric.Series == nil {
 | 
							if e.complexity.JobMetric.Series == nil {
 | 
				
			||||||
			break
 | 
								break
 | 
				
			||||||
@@ -1153,13 +1144,6 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		return e.complexity.SubCluster.Nodes(childComplexity), true
 | 
							return e.complexity.SubCluster.Nodes(childComplexity), true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case "SubCluster.numberOfNodes":
 | 
					 | 
				
			||||||
		if e.complexity.SubCluster.NumberOfNodes == nil {
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return e.complexity.SubCluster.NumberOfNodes(childComplexity), true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case "SubCluster.processorType":
 | 
						case "SubCluster.processorType":
 | 
				
			||||||
		if e.complexity.SubCluster.ProcessorType == nil {
 | 
							if e.complexity.SubCluster.ProcessorType == nil {
 | 
				
			||||||
			break
 | 
								break
 | 
				
			||||||
@@ -1460,7 +1444,6 @@ type Cluster {
 | 
				
			|||||||
type SubCluster {
 | 
					type SubCluster {
 | 
				
			||||||
  name:            String!
 | 
					  name:            String!
 | 
				
			||||||
  nodes:           String!
 | 
					  nodes:           String!
 | 
				
			||||||
  numberOfNodes:   Int!
 | 
					 | 
				
			||||||
  processorType:   String!
 | 
					  processorType:   String!
 | 
				
			||||||
  socketsPerNode:  Int!
 | 
					  socketsPerNode:  Int!
 | 
				
			||||||
  coresPerSocket:  Int!
 | 
					  coresPerSocket:  Int!
 | 
				
			||||||
@@ -1533,7 +1516,6 @@ type JobMetricWithName {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type JobMetric {
 | 
					type JobMetric {
 | 
				
			||||||
  unit:             Unit
 | 
					  unit:             Unit
 | 
				
			||||||
  scope:            MetricScope!
 | 
					 | 
				
			||||||
  timestep:         Int!
 | 
					  timestep:         Int!
 | 
				
			||||||
  series:           [Series!]
 | 
					  series:           [Series!]
 | 
				
			||||||
  statisticsSeries: StatsSeries
 | 
					  statisticsSeries: StatsSeries
 | 
				
			||||||
@@ -1541,7 +1523,7 @@ type JobMetric {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type Series {
 | 
					type Series {
 | 
				
			||||||
  hostname:   String!
 | 
					  hostname:   String!
 | 
				
			||||||
  id:         Int
 | 
					  id:         String
 | 
				
			||||||
  statistics: MetricStatistics
 | 
					  statistics: MetricStatistics
 | 
				
			||||||
  data:       [NullableFloat!]!
 | 
					  data:       [NullableFloat!]!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -2527,8 +2509,6 @@ func (ec *executionContext) fieldContext_Cluster_subClusters(ctx context.Context
 | 
				
			|||||||
				return ec.fieldContext_SubCluster_name(ctx, field)
 | 
									return ec.fieldContext_SubCluster_name(ctx, field)
 | 
				
			||||||
			case "nodes":
 | 
								case "nodes":
 | 
				
			||||||
				return ec.fieldContext_SubCluster_nodes(ctx, field)
 | 
									return ec.fieldContext_SubCluster_nodes(ctx, field)
 | 
				
			||||||
			case "numberOfNodes":
 | 
					 | 
				
			||||||
				return ec.fieldContext_SubCluster_numberOfNodes(ctx, field)
 | 
					 | 
				
			||||||
			case "processorType":
 | 
								case "processorType":
 | 
				
			||||||
				return ec.fieldContext_SubCluster_processorType(ctx, field)
 | 
									return ec.fieldContext_SubCluster_processorType(ctx, field)
 | 
				
			||||||
			case "socketsPerNode":
 | 
								case "socketsPerNode":
 | 
				
			||||||
@@ -3945,50 +3925,6 @@ func (ec *executionContext) fieldContext_JobMetric_unit(ctx context.Context, fie
 | 
				
			|||||||
	return fc, nil
 | 
						return fc, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) _JobMetric_scope(ctx context.Context, field graphql.CollectedField, obj *schema.JobMetric) (ret graphql.Marshaler) {
 | 
					 | 
				
			||||||
	fc, err := ec.fieldContext_JobMetric_scope(ctx, field)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return graphql.Null
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ctx = graphql.WithFieldContext(ctx, fc)
 | 
					 | 
				
			||||||
	defer func() {
 | 
					 | 
				
			||||||
		if r := recover(); r != nil {
 | 
					 | 
				
			||||||
			ec.Error(ctx, ec.Recover(ctx, r))
 | 
					 | 
				
			||||||
			ret = graphql.Null
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
	resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
 | 
					 | 
				
			||||||
		ctx = rctx // use context from middleware stack in children
 | 
					 | 
				
			||||||
		return obj.Scope, nil
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		ec.Error(ctx, err)
 | 
					 | 
				
			||||||
		return graphql.Null
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if resTmp == nil {
 | 
					 | 
				
			||||||
		if !graphql.HasFieldError(ctx, fc) {
 | 
					 | 
				
			||||||
			ec.Errorf(ctx, "must not be null")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return graphql.Null
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	res := resTmp.(schema.MetricScope)
 | 
					 | 
				
			||||||
	fc.Result = res
 | 
					 | 
				
			||||||
	return ec.marshalNMetricScope2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐMetricScope(ctx, field.Selections, res)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (ec *executionContext) fieldContext_JobMetric_scope(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
					 | 
				
			||||||
	fc = &graphql.FieldContext{
 | 
					 | 
				
			||||||
		Object:     "JobMetric",
 | 
					 | 
				
			||||||
		Field:      field,
 | 
					 | 
				
			||||||
		IsMethod:   false,
 | 
					 | 
				
			||||||
		IsResolver: false,
 | 
					 | 
				
			||||||
		Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
 | 
					 | 
				
			||||||
			return nil, errors.New("field of type MetricScope does not have child fields")
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return fc, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (ec *executionContext) _JobMetric_timestep(ctx context.Context, field graphql.CollectedField, obj *schema.JobMetric) (ret graphql.Marshaler) {
 | 
					func (ec *executionContext) _JobMetric_timestep(ctx context.Context, field graphql.CollectedField, obj *schema.JobMetric) (ret graphql.Marshaler) {
 | 
				
			||||||
	fc, err := ec.fieldContext_JobMetric_timestep(ctx, field)
 | 
						fc, err := ec.fieldContext_JobMetric_timestep(ctx, field)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -4218,8 +4154,6 @@ func (ec *executionContext) fieldContext_JobMetricWithName_metric(ctx context.Co
 | 
				
			|||||||
			switch field.Name {
 | 
								switch field.Name {
 | 
				
			||||||
			case "unit":
 | 
								case "unit":
 | 
				
			||||||
				return ec.fieldContext_JobMetric_unit(ctx, field)
 | 
									return ec.fieldContext_JobMetric_unit(ctx, field)
 | 
				
			||||||
			case "scope":
 | 
					 | 
				
			||||||
				return ec.fieldContext_JobMetric_scope(ctx, field)
 | 
					 | 
				
			||||||
			case "timestep":
 | 
								case "timestep":
 | 
				
			||||||
				return ec.fieldContext_JobMetric_timestep(ctx, field)
 | 
									return ec.fieldContext_JobMetric_timestep(ctx, field)
 | 
				
			||||||
			case "series":
 | 
								case "series":
 | 
				
			||||||
@@ -4930,9 +4864,9 @@ func (ec *executionContext) _MetricConfig_aggregation(ctx context.Context, field
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		return graphql.Null
 | 
							return graphql.Null
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res := resTmp.(*string)
 | 
						res := resTmp.(string)
 | 
				
			||||||
	fc.Result = res
 | 
						fc.Result = res
 | 
				
			||||||
	return ec.marshalNString2ᚖstring(ctx, field.Selections, res)
 | 
						return ec.marshalNString2string(ctx, field.Selections, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) fieldContext_MetricConfig_aggregation(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
					func (ec *executionContext) fieldContext_MetricConfig_aggregation(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
				
			||||||
@@ -5018,9 +4952,9 @@ func (ec *executionContext) _MetricConfig_peak(ctx context.Context, field graphq
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		return graphql.Null
 | 
							return graphql.Null
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res := resTmp.(*float64)
 | 
						res := resTmp.(float64)
 | 
				
			||||||
	fc.Result = res
 | 
						fc.Result = res
 | 
				
			||||||
	return ec.marshalNFloat2ᚖfloat64(ctx, field.Selections, res)
 | 
						return ec.marshalNFloat2float64(ctx, field.Selections, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) fieldContext_MetricConfig_peak(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
					func (ec *executionContext) fieldContext_MetricConfig_peak(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
				
			||||||
@@ -5059,9 +4993,9 @@ func (ec *executionContext) _MetricConfig_normal(ctx context.Context, field grap
 | 
				
			|||||||
	if resTmp == nil {
 | 
						if resTmp == nil {
 | 
				
			||||||
		return graphql.Null
 | 
							return graphql.Null
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res := resTmp.(*float64)
 | 
						res := resTmp.(float64)
 | 
				
			||||||
	fc.Result = res
 | 
						fc.Result = res
 | 
				
			||||||
	return ec.marshalOFloat2ᚖfloat64(ctx, field.Selections, res)
 | 
						return ec.marshalOFloat2float64(ctx, field.Selections, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) fieldContext_MetricConfig_normal(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
					func (ec *executionContext) fieldContext_MetricConfig_normal(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
				
			||||||
@@ -5103,9 +5037,9 @@ func (ec *executionContext) _MetricConfig_caution(ctx context.Context, field gra
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		return graphql.Null
 | 
							return graphql.Null
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res := resTmp.(*float64)
 | 
						res := resTmp.(float64)
 | 
				
			||||||
	fc.Result = res
 | 
						fc.Result = res
 | 
				
			||||||
	return ec.marshalNFloat2ᚖfloat64(ctx, field.Selections, res)
 | 
						return ec.marshalNFloat2float64(ctx, field.Selections, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) fieldContext_MetricConfig_caution(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
					func (ec *executionContext) fieldContext_MetricConfig_caution(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
				
			||||||
@@ -5147,9 +5081,9 @@ func (ec *executionContext) _MetricConfig_alert(ctx context.Context, field graph
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		return graphql.Null
 | 
							return graphql.Null
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res := resTmp.(*float64)
 | 
						res := resTmp.(float64)
 | 
				
			||||||
	fc.Result = res
 | 
						fc.Result = res
 | 
				
			||||||
	return ec.marshalNFloat2ᚖfloat64(ctx, field.Selections, res)
 | 
						return ec.marshalNFloat2float64(ctx, field.Selections, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) fieldContext_MetricConfig_alert(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
					func (ec *executionContext) fieldContext_MetricConfig_alert(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
				
			||||||
@@ -7093,9 +7027,9 @@ func (ec *executionContext) _Series_id(ctx context.Context, field graphql.Collec
 | 
				
			|||||||
	if resTmp == nil {
 | 
						if resTmp == nil {
 | 
				
			||||||
		return graphql.Null
 | 
							return graphql.Null
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res := resTmp.(*int)
 | 
						res := resTmp.(*string)
 | 
				
			||||||
	fc.Result = res
 | 
						fc.Result = res
 | 
				
			||||||
	return ec.marshalOInt2ᚖint(ctx, field.Selections, res)
 | 
						return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) fieldContext_Series_id(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
					func (ec *executionContext) fieldContext_Series_id(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
				
			||||||
@@ -7105,7 +7039,7 @@ func (ec *executionContext) fieldContext_Series_id(ctx context.Context, field gr
 | 
				
			|||||||
		IsMethod:   false,
 | 
							IsMethod:   false,
 | 
				
			||||||
		IsResolver: false,
 | 
							IsResolver: false,
 | 
				
			||||||
		Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
 | 
							Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
 | 
				
			||||||
			return nil, errors.New("field of type Int does not have child fields")
 | 
								return nil, errors.New("field of type String does not have child fields")
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return fc, nil
 | 
						return fc, nil
 | 
				
			||||||
@@ -7134,9 +7068,9 @@ func (ec *executionContext) _Series_statistics(ctx context.Context, field graphq
 | 
				
			|||||||
	if resTmp == nil {
 | 
						if resTmp == nil {
 | 
				
			||||||
		return graphql.Null
 | 
							return graphql.Null
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res := resTmp.(*schema.MetricStatistics)
 | 
						res := resTmp.(schema.MetricStatistics)
 | 
				
			||||||
	fc.Result = res
 | 
						fc.Result = res
 | 
				
			||||||
	return ec.marshalOMetricStatistics2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐMetricStatistics(ctx, field.Selections, res)
 | 
						return ec.marshalOMetricStatistics2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐMetricStatistics(ctx, field.Selections, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) fieldContext_Series_statistics(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
					func (ec *executionContext) fieldContext_Series_statistics(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
				
			||||||
@@ -7424,50 +7358,6 @@ func (ec *executionContext) fieldContext_SubCluster_nodes(ctx context.Context, f
 | 
				
			|||||||
	return fc, nil
 | 
						return fc, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) _SubCluster_numberOfNodes(ctx context.Context, field graphql.CollectedField, obj *schema.SubCluster) (ret graphql.Marshaler) {
 | 
					 | 
				
			||||||
	fc, err := ec.fieldContext_SubCluster_numberOfNodes(ctx, field)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return graphql.Null
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ctx = graphql.WithFieldContext(ctx, fc)
 | 
					 | 
				
			||||||
	defer func() {
 | 
					 | 
				
			||||||
		if r := recover(); r != nil {
 | 
					 | 
				
			||||||
			ec.Error(ctx, ec.Recover(ctx, r))
 | 
					 | 
				
			||||||
			ret = graphql.Null
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
	resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
 | 
					 | 
				
			||||||
		ctx = rctx // use context from middleware stack in children
 | 
					 | 
				
			||||||
		return obj.NumberOfNodes, nil
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		ec.Error(ctx, err)
 | 
					 | 
				
			||||||
		return graphql.Null
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if resTmp == nil {
 | 
					 | 
				
			||||||
		if !graphql.HasFieldError(ctx, fc) {
 | 
					 | 
				
			||||||
			ec.Errorf(ctx, "must not be null")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return graphql.Null
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	res := resTmp.(int)
 | 
					 | 
				
			||||||
	fc.Result = res
 | 
					 | 
				
			||||||
	return ec.marshalNInt2int(ctx, field.Selections, res)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (ec *executionContext) fieldContext_SubCluster_numberOfNodes(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
					 | 
				
			||||||
	fc = &graphql.FieldContext{
 | 
					 | 
				
			||||||
		Object:     "SubCluster",
 | 
					 | 
				
			||||||
		Field:      field,
 | 
					 | 
				
			||||||
		IsMethod:   false,
 | 
					 | 
				
			||||||
		IsResolver: false,
 | 
					 | 
				
			||||||
		Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
 | 
					 | 
				
			||||||
			return nil, errors.New("field of type Int does not have child fields")
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return fc, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (ec *executionContext) _SubCluster_processorType(ctx context.Context, field graphql.CollectedField, obj *schema.SubCluster) (ret graphql.Marshaler) {
 | 
					func (ec *executionContext) _SubCluster_processorType(ctx context.Context, field graphql.CollectedField, obj *schema.SubCluster) (ret graphql.Marshaler) {
 | 
				
			||||||
	fc, err := ec.fieldContext_SubCluster_processorType(ctx, field)
 | 
						fc, err := ec.fieldContext_SubCluster_processorType(ctx, field)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -7670,9 +7560,9 @@ func (ec *executionContext) _SubCluster_flopRateScalar(ctx context.Context, fiel
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		return graphql.Null
 | 
							return graphql.Null
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res := resTmp.(*schema.MetricValue)
 | 
						res := resTmp.(schema.MetricValue)
 | 
				
			||||||
	fc.Result = res
 | 
						fc.Result = res
 | 
				
			||||||
	return ec.marshalNMetricValue2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐMetricValue(ctx, field.Selections, res)
 | 
						return ec.marshalNMetricValue2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐMetricValue(ctx, field.Selections, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) fieldContext_SubCluster_flopRateScalar(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
					func (ec *executionContext) fieldContext_SubCluster_flopRateScalar(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
				
			||||||
@@ -7720,9 +7610,9 @@ func (ec *executionContext) _SubCluster_flopRateSimd(ctx context.Context, field
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		return graphql.Null
 | 
							return graphql.Null
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res := resTmp.(*schema.MetricValue)
 | 
						res := resTmp.(schema.MetricValue)
 | 
				
			||||||
	fc.Result = res
 | 
						fc.Result = res
 | 
				
			||||||
	return ec.marshalNMetricValue2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐMetricValue(ctx, field.Selections, res)
 | 
						return ec.marshalNMetricValue2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐMetricValue(ctx, field.Selections, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) fieldContext_SubCluster_flopRateSimd(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
					func (ec *executionContext) fieldContext_SubCluster_flopRateSimd(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
				
			||||||
@@ -7770,9 +7660,9 @@ func (ec *executionContext) _SubCluster_memoryBandwidth(ctx context.Context, fie
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		return graphql.Null
 | 
							return graphql.Null
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res := resTmp.(*schema.MetricValue)
 | 
						res := resTmp.(schema.MetricValue)
 | 
				
			||||||
	fc.Result = res
 | 
						fc.Result = res
 | 
				
			||||||
	return ec.marshalNMetricValue2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐMetricValue(ctx, field.Selections, res)
 | 
						return ec.marshalNMetricValue2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐMetricValue(ctx, field.Selections, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) fieldContext_SubCluster_memoryBandwidth(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
					func (ec *executionContext) fieldContext_SubCluster_memoryBandwidth(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
				
			||||||
@@ -7820,9 +7710,9 @@ func (ec *executionContext) _SubCluster_topology(ctx context.Context, field grap
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		return graphql.Null
 | 
							return graphql.Null
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res := resTmp.(*schema.Topology)
 | 
						res := resTmp.(schema.Topology)
 | 
				
			||||||
	fc.Result = res
 | 
						fc.Result = res
 | 
				
			||||||
	return ec.marshalNTopology2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐTopology(ctx, field.Selections, res)
 | 
						return ec.marshalNTopology2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐTopology(ctx, field.Selections, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) fieldContext_SubCluster_topology(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
					func (ec *executionContext) fieldContext_SubCluster_topology(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
				
			||||||
@@ -8467,9 +8357,9 @@ func (ec *executionContext) _Topology_die(ctx context.Context, field graphql.Col
 | 
				
			|||||||
	if resTmp == nil {
 | 
						if resTmp == nil {
 | 
				
			||||||
		return graphql.Null
 | 
							return graphql.Null
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res := resTmp.([][]int)
 | 
						res := resTmp.([][]*int)
 | 
				
			||||||
	fc.Result = res
 | 
						fc.Result = res
 | 
				
			||||||
	return ec.marshalOInt2ᚕᚕintᚄ(ctx, field.Selections, res)
 | 
						return ec.marshalOInt2ᚕᚕᚖintᚄ(ctx, field.Selections, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) fieldContext_Topology_die(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
					func (ec *executionContext) fieldContext_Topology_die(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
				
			||||||
@@ -8642,9 +8532,9 @@ func (ec *executionContext) _Unit_prefix(ctx context.Context, field graphql.Coll
 | 
				
			|||||||
	if resTmp == nil {
 | 
						if resTmp == nil {
 | 
				
			||||||
		return graphql.Null
 | 
							return graphql.Null
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res := resTmp.(string)
 | 
						res := resTmp.(*string)
 | 
				
			||||||
	fc.Result = res
 | 
						fc.Result = res
 | 
				
			||||||
	return ec.marshalOString2string(ctx, field.Selections, res)
 | 
						return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) fieldContext_Unit_prefix(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
					func (ec *executionContext) fieldContext_Unit_prefix(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
 | 
				
			||||||
@@ -11439,13 +11329,6 @@ func (ec *executionContext) _JobMetric(ctx context.Context, sel ast.SelectionSet
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			out.Values[i] = ec._JobMetric_unit(ctx, field, obj)
 | 
								out.Values[i] = ec._JobMetric_unit(ctx, field, obj)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case "scope":
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			out.Values[i] = ec._JobMetric_scope(ctx, field, obj)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if out.Values[i] == graphql.Null {
 | 
					 | 
				
			||||||
				invalids++
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		case "timestep":
 | 
							case "timestep":
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			out.Values[i] = ec._JobMetric_timestep(ctx, field, obj)
 | 
								out.Values[i] = ec._JobMetric_timestep(ctx, field, obj)
 | 
				
			||||||
@@ -12386,13 +12269,6 @@ func (ec *executionContext) _SubCluster(ctx context.Context, sel ast.SelectionSe
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			out.Values[i] = ec._SubCluster_nodes(ctx, field, obj)
 | 
								out.Values[i] = ec._SubCluster_nodes(ctx, field, obj)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if out.Values[i] == graphql.Null {
 | 
					 | 
				
			||||||
				invalids++
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		case "numberOfNodes":
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			out.Values[i] = ec._SubCluster_numberOfNodes(ctx, field, obj)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if out.Values[i] == graphql.Null {
 | 
								if out.Values[i] == graphql.Null {
 | 
				
			||||||
				invalids++
 | 
									invalids++
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -13247,27 +13123,6 @@ func (ec *executionContext) marshalNFloat2ᚕᚕfloat64ᚄ(ctx context.Context,
 | 
				
			|||||||
	return ret
 | 
						return ret
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) unmarshalNFloat2ᚖfloat64(ctx context.Context, v interface{}) (*float64, error) {
 | 
					 | 
				
			||||||
	res, err := graphql.UnmarshalFloatContext(ctx, v)
 | 
					 | 
				
			||||||
	return &res, graphql.ErrorOnPath(ctx, err)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (ec *executionContext) marshalNFloat2ᚖfloat64(ctx context.Context, sel ast.SelectionSet, v *float64) graphql.Marshaler {
 | 
					 | 
				
			||||||
	if v == nil {
 | 
					 | 
				
			||||||
		if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
 | 
					 | 
				
			||||||
			ec.Errorf(ctx, "the requested element is null which the schema does not allow")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return graphql.Null
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	res := graphql.MarshalFloatContext(*v)
 | 
					 | 
				
			||||||
	if res == graphql.Null {
 | 
					 | 
				
			||||||
		if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
 | 
					 | 
				
			||||||
			ec.Errorf(ctx, "the requested element is null which the schema does not allow")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return graphql.WrapContextMarshaler(ctx, res)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (ec *executionContext) marshalNHistoPoint2ᚕᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐHistoPointᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.HistoPoint) graphql.Marshaler {
 | 
					func (ec *executionContext) marshalNHistoPoint2ᚕᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐHistoPointᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.HistoPoint) graphql.Marshaler {
 | 
				
			||||||
	ret := make(graphql.Array, len(v))
 | 
						ret := make(graphql.Array, len(v))
 | 
				
			||||||
	var wg sync.WaitGroup
 | 
						var wg sync.WaitGroup
 | 
				
			||||||
@@ -13461,6 +13316,59 @@ func (ec *executionContext) marshalNInt2ᚕintᚄ(ctx context.Context, sel ast.S
 | 
				
			|||||||
	return ret
 | 
						return ret
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (ec *executionContext) unmarshalNInt2ᚕᚖintᚄ(ctx context.Context, v interface{}) ([]*int, error) {
 | 
				
			||||||
 | 
						var vSlice []interface{}
 | 
				
			||||||
 | 
						if v != nil {
 | 
				
			||||||
 | 
							vSlice = graphql.CoerceList(v)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
						res := make([]*int, len(vSlice))
 | 
				
			||||||
 | 
						for i := range vSlice {
 | 
				
			||||||
 | 
							ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))
 | 
				
			||||||
 | 
							res[i], err = ec.unmarshalNInt2ᚖint(ctx, vSlice[i])
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return res, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (ec *executionContext) marshalNInt2ᚕᚖintᚄ(ctx context.Context, sel ast.SelectionSet, v []*int) graphql.Marshaler {
 | 
				
			||||||
 | 
						ret := make(graphql.Array, len(v))
 | 
				
			||||||
 | 
						for i := range v {
 | 
				
			||||||
 | 
							ret[i] = ec.marshalNInt2ᚖint(ctx, sel, v[i])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, e := range ret {
 | 
				
			||||||
 | 
							if e == graphql.Null {
 | 
				
			||||||
 | 
								return graphql.Null
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ret
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (ec *executionContext) unmarshalNInt2ᚖint(ctx context.Context, v interface{}) (*int, error) {
 | 
				
			||||||
 | 
						res, err := graphql.UnmarshalInt(v)
 | 
				
			||||||
 | 
						return &res, graphql.ErrorOnPath(ctx, err)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (ec *executionContext) marshalNInt2ᚖint(ctx context.Context, sel ast.SelectionSet, v *int) graphql.Marshaler {
 | 
				
			||||||
 | 
						if v == nil {
 | 
				
			||||||
 | 
							if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
 | 
				
			||||||
 | 
								ec.Errorf(ctx, "the requested element is null which the schema does not allow")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return graphql.Null
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						res := graphql.MarshalInt(*v)
 | 
				
			||||||
 | 
						if res == graphql.Null {
 | 
				
			||||||
 | 
							if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
 | 
				
			||||||
 | 
								ec.Errorf(ctx, "the requested element is null which the schema does not allow")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return res
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) marshalNJob2ᚕᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐJobᚄ(ctx context.Context, sel ast.SelectionSet, v []*schema.Job) graphql.Marshaler {
 | 
					func (ec *executionContext) marshalNJob2ᚕᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐJobᚄ(ctx context.Context, sel ast.SelectionSet, v []*schema.Job) graphql.Marshaler {
 | 
				
			||||||
	ret := make(graphql.Array, len(v))
 | 
						ret := make(graphql.Array, len(v))
 | 
				
			||||||
	var wg sync.WaitGroup
 | 
						var wg sync.WaitGroup
 | 
				
			||||||
@@ -13814,14 +13722,8 @@ func (ec *executionContext) marshalNMetricScope2githubᚗcomᚋClusterCockpitᚋ
 | 
				
			|||||||
	return v
 | 
						return v
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) marshalNMetricValue2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐMetricValue(ctx context.Context, sel ast.SelectionSet, v *schema.MetricValue) graphql.Marshaler {
 | 
					func (ec *executionContext) marshalNMetricValue2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐMetricValue(ctx context.Context, sel ast.SelectionSet, v schema.MetricValue) graphql.Marshaler {
 | 
				
			||||||
	if v == nil {
 | 
						return ec._MetricValue(ctx, sel, &v)
 | 
				
			||||||
		if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
 | 
					 | 
				
			||||||
			ec.Errorf(ctx, "the requested element is null which the schema does not allow")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return graphql.Null
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return ec._MetricValue(ctx, sel, v)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) marshalNNodeMetrics2ᚕᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐNodeMetricsᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.NodeMetrics) graphql.Marshaler {
 | 
					func (ec *executionContext) marshalNNodeMetrics2ᚕᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐNodeMetricsᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.NodeMetrics) graphql.Marshaler {
 | 
				
			||||||
@@ -14035,27 +13937,6 @@ func (ec *executionContext) marshalNString2ᚕstringᚄ(ctx context.Context, sel
 | 
				
			|||||||
	return ret
 | 
						return ret
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) unmarshalNString2ᚖstring(ctx context.Context, v interface{}) (*string, error) {
 | 
					 | 
				
			||||||
	res, err := graphql.UnmarshalString(v)
 | 
					 | 
				
			||||||
	return &res, graphql.ErrorOnPath(ctx, err)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (ec *executionContext) marshalNString2ᚖstring(ctx context.Context, sel ast.SelectionSet, v *string) graphql.Marshaler {
 | 
					 | 
				
			||||||
	if v == nil {
 | 
					 | 
				
			||||||
		if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
 | 
					 | 
				
			||||||
			ec.Errorf(ctx, "the requested element is null which the schema does not allow")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return graphql.Null
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	res := graphql.MarshalString(*v)
 | 
					 | 
				
			||||||
	if res == graphql.Null {
 | 
					 | 
				
			||||||
		if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
 | 
					 | 
				
			||||||
			ec.Errorf(ctx, "the requested element is null which the schema does not allow")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return res
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (ec *executionContext) marshalNSubCluster2ᚕᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐSubClusterᚄ(ctx context.Context, sel ast.SelectionSet, v []*schema.SubCluster) graphql.Marshaler {
 | 
					func (ec *executionContext) marshalNSubCluster2ᚕᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐSubClusterᚄ(ctx context.Context, sel ast.SelectionSet, v []*schema.SubCluster) graphql.Marshaler {
 | 
				
			||||||
	ret := make(graphql.Array, len(v))
 | 
						ret := make(graphql.Array, len(v))
 | 
				
			||||||
	var wg sync.WaitGroup
 | 
						var wg sync.WaitGroup
 | 
				
			||||||
@@ -14237,14 +14118,8 @@ func (ec *executionContext) marshalNTime2timeᚐTime(ctx context.Context, sel as
 | 
				
			|||||||
	return res
 | 
						return res
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) marshalNTopology2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐTopology(ctx context.Context, sel ast.SelectionSet, v *schema.Topology) graphql.Marshaler {
 | 
					func (ec *executionContext) marshalNTopology2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐTopology(ctx context.Context, sel ast.SelectionSet, v schema.Topology) graphql.Marshaler {
 | 
				
			||||||
	if v == nil {
 | 
						return ec._Topology(ctx, sel, &v)
 | 
				
			||||||
		if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
 | 
					 | 
				
			||||||
			ec.Errorf(ctx, "the requested element is null which the schema does not allow")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return graphql.Null
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return ec._Topology(ctx, sel, v)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) marshalNUnit2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐUnit(ctx context.Context, sel ast.SelectionSet, v schema.Unit) graphql.Marshaler {
 | 
					func (ec *executionContext) marshalNUnit2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐUnit(ctx context.Context, sel ast.SelectionSet, v schema.Unit) graphql.Marshaler {
 | 
				
			||||||
@@ -14619,22 +14494,6 @@ func (ec *executionContext) marshalOFloat2float64(ctx context.Context, sel ast.S
 | 
				
			|||||||
	return graphql.WrapContextMarshaler(ctx, res)
 | 
						return graphql.WrapContextMarshaler(ctx, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) unmarshalOFloat2ᚖfloat64(ctx context.Context, v interface{}) (*float64, error) {
 | 
					 | 
				
			||||||
	if v == nil {
 | 
					 | 
				
			||||||
		return nil, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	res, err := graphql.UnmarshalFloatContext(ctx, v)
 | 
					 | 
				
			||||||
	return &res, graphql.ErrorOnPath(ctx, err)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (ec *executionContext) marshalOFloat2ᚖfloat64(ctx context.Context, sel ast.SelectionSet, v *float64) graphql.Marshaler {
 | 
					 | 
				
			||||||
	if v == nil {
 | 
					 | 
				
			||||||
		return graphql.Null
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	res := graphql.MarshalFloatContext(*v)
 | 
					 | 
				
			||||||
	return graphql.WrapContextMarshaler(ctx, res)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (ec *executionContext) unmarshalOFloatRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐFloatRange(ctx context.Context, v interface{}) (*model.FloatRange, error) {
 | 
					func (ec *executionContext) unmarshalOFloatRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐFloatRange(ctx context.Context, v interface{}) (*model.FloatRange, error) {
 | 
				
			||||||
	if v == nil {
 | 
						if v == nil {
 | 
				
			||||||
		return nil, nil
 | 
							return nil, nil
 | 
				
			||||||
@@ -14764,6 +14623,44 @@ func (ec *executionContext) marshalOInt2ᚕᚕintᚄ(ctx context.Context, sel as
 | 
				
			|||||||
	return ret
 | 
						return ret
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (ec *executionContext) unmarshalOInt2ᚕᚕᚖintᚄ(ctx context.Context, v interface{}) ([][]*int, error) {
 | 
				
			||||||
 | 
						if v == nil {
 | 
				
			||||||
 | 
							return nil, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var vSlice []interface{}
 | 
				
			||||||
 | 
						if v != nil {
 | 
				
			||||||
 | 
							vSlice = graphql.CoerceList(v)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
						res := make([][]*int, len(vSlice))
 | 
				
			||||||
 | 
						for i := range vSlice {
 | 
				
			||||||
 | 
							ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))
 | 
				
			||||||
 | 
							res[i], err = ec.unmarshalNInt2ᚕᚖintᚄ(ctx, vSlice[i])
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return res, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (ec *executionContext) marshalOInt2ᚕᚕᚖintᚄ(ctx context.Context, sel ast.SelectionSet, v [][]*int) graphql.Marshaler {
 | 
				
			||||||
 | 
						if v == nil {
 | 
				
			||||||
 | 
							return graphql.Null
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ret := make(graphql.Array, len(v))
 | 
				
			||||||
 | 
						for i := range v {
 | 
				
			||||||
 | 
							ret[i] = ec.marshalNInt2ᚕᚖintᚄ(ctx, sel, v[i])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, e := range ret {
 | 
				
			||||||
 | 
							if e == graphql.Null {
 | 
				
			||||||
 | 
								return graphql.Null
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ret
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) unmarshalOInt2ᚖint(ctx context.Context, v interface{}) (*int, error) {
 | 
					func (ec *executionContext) unmarshalOInt2ᚖint(ctx context.Context, v interface{}) (*int, error) {
 | 
				
			||||||
	if v == nil {
 | 
						if v == nil {
 | 
				
			||||||
		return nil, nil
 | 
							return nil, nil
 | 
				
			||||||
@@ -14899,11 +14796,8 @@ func (ec *executionContext) marshalOMetricScope2ᚕgithubᚗcomᚋClusterCockpit
 | 
				
			|||||||
	return ret
 | 
						return ret
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) marshalOMetricStatistics2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐMetricStatistics(ctx context.Context, sel ast.SelectionSet, v *schema.MetricStatistics) graphql.Marshaler {
 | 
					func (ec *executionContext) marshalOMetricStatistics2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐMetricStatistics(ctx context.Context, sel ast.SelectionSet, v schema.MetricStatistics) graphql.Marshaler {
 | 
				
			||||||
	if v == nil {
 | 
						return ec._MetricStatistics(ctx, sel, &v)
 | 
				
			||||||
		return graphql.Null
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return ec._MetricStatistics(ctx, sel, v)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ec *executionContext) unmarshalOOrderByInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐOrderByInput(ctx context.Context, v interface{}) (*model.OrderByInput, error) {
 | 
					func (ec *executionContext) unmarshalOOrderByInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐOrderByInput(ctx context.Context, v interface{}) (*model.OrderByInput, error) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -173,11 +173,7 @@ func (r *queryResolver) JobMetrics(ctx context.Context, id string, metrics []str
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	res := []*model.JobMetricWithName{}
 | 
						res := []*model.JobMetricWithName{}
 | 
				
			||||||
	for name, md := range data {
 | 
						for name, md := range data {
 | 
				
			||||||
		for scope, metric := range md {
 | 
							for _, metric := range md {
 | 
				
			||||||
			if metric.Scope != schema.MetricScope(scope) {
 | 
					 | 
				
			||||||
				panic("WTF?")
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			res = append(res, &model.JobMetricWithName{
 | 
								res = append(res, &model.JobMetricWithName{
 | 
				
			||||||
				Name:   name,
 | 
									Name:   name,
 | 
				
			||||||
				Metric: metric,
 | 
									Metric: metric,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -158,7 +158,6 @@ func (ccms *CCMetricStore) LoadData(
 | 
				
			|||||||
	scopes []schema.MetricScope,
 | 
						scopes []schema.MetricScope,
 | 
				
			||||||
	ctx context.Context) (schema.JobData, error) {
 | 
						ctx context.Context) (schema.JobData, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	topology := archive.GetSubCluster(job.Cluster, job.SubCluster).Topology
 | 
					 | 
				
			||||||
	queries, assignedScope, err := ccms.buildQueries(job, metrics, scopes)
 | 
						queries, assignedScope, err := ccms.buildQueries(job, metrics, scopes)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -193,7 +192,6 @@ func (ccms *CCMetricStore) LoadData(
 | 
				
			|||||||
		if !ok {
 | 
							if !ok {
 | 
				
			||||||
			jobMetric = &schema.JobMetric{
 | 
								jobMetric = &schema.JobMetric{
 | 
				
			||||||
				Unit:     mc.Unit,
 | 
									Unit:     mc.Unit,
 | 
				
			||||||
				Scope:    scope,
 | 
					 | 
				
			||||||
				Timestep: mc.Timestep,
 | 
									Timestep: mc.Timestep,
 | 
				
			||||||
				Series:   make([]schema.Series, 0),
 | 
									Series:   make([]schema.Series, 0),
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -206,13 +204,10 @@ func (ccms *CCMetricStore) LoadData(
 | 
				
			|||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			id := (*int)(nil)
 | 
								id := (*string)(nil)
 | 
				
			||||||
			if query.Type != nil {
 | 
								if query.Type != nil {
 | 
				
			||||||
				id = new(int)
 | 
									id = new(string)
 | 
				
			||||||
				*id, err = strconv.Atoi(query.TypeIds[0])
 | 
									*id = query.TypeIds[0]
 | 
				
			||||||
				if err != nil || *query.Type == acceleratorString {
 | 
					 | 
				
			||||||
					*id, _ = topology.GetAcceleratorIndex(query.TypeIds[0])
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if res.Avg.IsNaN() || res.Min.IsNaN() || res.Max.IsNaN() {
 | 
								if res.Avg.IsNaN() || res.Min.IsNaN() || res.Max.IsNaN() {
 | 
				
			||||||
@@ -226,7 +221,7 @@ func (ccms *CCMetricStore) LoadData(
 | 
				
			|||||||
			jobMetric.Series = append(jobMetric.Series, schema.Series{
 | 
								jobMetric.Series = append(jobMetric.Series, schema.Series{
 | 
				
			||||||
				Hostname: query.Hostname,
 | 
									Hostname: query.Hostname,
 | 
				
			||||||
				Id:       id,
 | 
									Id:       id,
 | 
				
			||||||
				Statistics: &schema.MetricStatistics{
 | 
									Statistics: schema.MetricStatistics{
 | 
				
			||||||
					Avg: float64(res.Avg),
 | 
										Avg: float64(res.Avg),
 | 
				
			||||||
					Min: float64(res.Min),
 | 
										Min: float64(res.Min),
 | 
				
			||||||
					Max: float64(res.Max),
 | 
										Max: float64(res.Max),
 | 
				
			||||||
@@ -610,13 +605,12 @@ func (ccms *CCMetricStore) LoadNodeData(
 | 
				
			|||||||
		mc := archive.GetMetricConfig(cluster, metric)
 | 
							mc := archive.GetMetricConfig(cluster, metric)
 | 
				
			||||||
		hostdata[metric] = append(hostdata[metric], &schema.JobMetric{
 | 
							hostdata[metric] = append(hostdata[metric], &schema.JobMetric{
 | 
				
			||||||
			Unit:     mc.Unit,
 | 
								Unit:     mc.Unit,
 | 
				
			||||||
			Scope:    schema.MetricScopeNode,
 | 
					 | 
				
			||||||
			Timestep: mc.Timestep,
 | 
								Timestep: mc.Timestep,
 | 
				
			||||||
			Series: []schema.Series{
 | 
								Series: []schema.Series{
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					Hostname: query.Hostname,
 | 
										Hostname: query.Hostname,
 | 
				
			||||||
					Data:     qdata.Data,
 | 
										Data:     qdata.Data,
 | 
				
			||||||
					Statistics: &schema.MetricStatistics{
 | 
										Statistics: schema.MetricStatistics{
 | 
				
			||||||
						Avg: float64(qdata.Avg),
 | 
											Avg: float64(qdata.Avg),
 | 
				
			||||||
						Min: float64(qdata.Min),
 | 
											Min: float64(qdata.Min),
 | 
				
			||||||
						Max: float64(qdata.Max),
 | 
											Max: float64(qdata.Max),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -132,7 +132,6 @@ func (idb *InfluxDBv2DataRepository) LoadData(
 | 
				
			|||||||
				jobMetric = map[schema.MetricScope]*schema.JobMetric{
 | 
									jobMetric = map[schema.MetricScope]*schema.JobMetric{
 | 
				
			||||||
					scope: { // uses scope var from above!
 | 
										scope: { // uses scope var from above!
 | 
				
			||||||
						Unit:             mc.Unit,
 | 
											Unit:             mc.Unit,
 | 
				
			||||||
						Scope:            scope,
 | 
					 | 
				
			||||||
						Timestep:         mc.Timestep,
 | 
											Timestep:         mc.Timestep,
 | 
				
			||||||
						Series:           make([]schema.Series, 0, len(job.Resources)),
 | 
											Series:           make([]schema.Series, 0, len(job.Resources)),
 | 
				
			||||||
						StatisticsSeries: nil, // Should be: &schema.StatsSeries{},
 | 
											StatisticsSeries: nil, // Should be: &schema.StatsSeries{},
 | 
				
			||||||
@@ -157,7 +156,7 @@ func (idb *InfluxDBv2DataRepository) LoadData(
 | 
				
			|||||||
					field, host = row.Measurement(), row.ValueByKey("hostname").(string)
 | 
										field, host = row.Measurement(), row.ValueByKey("hostname").(string)
 | 
				
			||||||
					hostSeries = schema.Series{
 | 
										hostSeries = schema.Series{
 | 
				
			||||||
						Hostname:   host,
 | 
											Hostname:   host,
 | 
				
			||||||
						Statistics: nil,
 | 
											Statistics: schema.MetricStatistics{}, //TODO Add Statistics
 | 
				
			||||||
						Data:       make([]schema.Float, 0),
 | 
											Data:       make([]schema.Float, 0),
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -215,7 +214,7 @@ func (idb *InfluxDBv2DataRepository) LoadData(
 | 
				
			|||||||
						// log.Println(fmt.Sprintf("<< Try to add Stats to Series in Position %d >>", index))
 | 
											// log.Println(fmt.Sprintf("<< Try to add Stats to Series in Position %d >>", index))
 | 
				
			||||||
						if jobData[metric][scope].Series[index].Hostname == node {
 | 
											if jobData[metric][scope].Series[index].Hostname == node {
 | 
				
			||||||
							// log.Println(fmt.Sprintf("<< Match for Series in Position %d : Host %s >>", index, jobData[metric][scope].Series[index].Hostname))
 | 
												// log.Println(fmt.Sprintf("<< Match for Series in Position %d : Host %s >>", index, jobData[metric][scope].Series[index].Hostname))
 | 
				
			||||||
							jobData[metric][scope].Series[index].Statistics = &schema.MetricStatistics{Avg: stats.Avg, Min: stats.Min, Max: stats.Max}
 | 
												jobData[metric][scope].Series[index].Statistics = schema.MetricStatistics{Avg: stats.Avg, Min: stats.Min, Max: stats.Max}
 | 
				
			||||||
							// log.Println(fmt.Sprintf("<< Result Inner: Min %.2f, Max %.2f, Avg %.2f >>", jobData[metric][scope].Series[index].Statistics.Min, jobData[metric][scope].Series[index].Statistics.Max, jobData[metric][scope].Series[index].Statistics.Avg))
 | 
												// log.Println(fmt.Sprintf("<< Result Inner: Min %.2f, Max %.2f, Avg %.2f >>", jobData[metric][scope].Series[index].Statistics.Min, jobData[metric][scope].Series[index].Statistics.Max, jobData[metric][scope].Series[index].Statistics.Avg))
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,9 +16,9 @@ type Topology struct {
 | 
				
			|||||||
	Node         []int          `json:"node"`
 | 
						Node         []int          `json:"node"`
 | 
				
			||||||
	Socket       [][]int        `json:"socket"`
 | 
						Socket       [][]int        `json:"socket"`
 | 
				
			||||||
	MemoryDomain [][]int        `json:"memoryDomain"`
 | 
						MemoryDomain [][]int        `json:"memoryDomain"`
 | 
				
			||||||
	Die          [][]int        `json:"die"`
 | 
						Die          [][]*int       `json:"die,omitempty"`
 | 
				
			||||||
	Core         [][]int        `json:"core"`
 | 
						Core         [][]int        `json:"core"`
 | 
				
			||||||
	Accelerators []*Accelerator `json:"accelerators"`
 | 
						Accelerators []*Accelerator `json:"accelerators,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type MetricValue struct {
 | 
					type MetricValue struct {
 | 
				
			||||||
@@ -27,17 +27,16 @@ type MetricValue struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type SubCluster struct {
 | 
					type SubCluster struct {
 | 
				
			||||||
	Name            string       `json:"name"`
 | 
						Name            string      `json:"name"`
 | 
				
			||||||
	Nodes           string       `json:"nodes"`
 | 
						Nodes           string      `json:"nodes"`
 | 
				
			||||||
	NumberOfNodes   int          `json:"numberOfNodes"`
 | 
						ProcessorType   string      `json:"processorType"`
 | 
				
			||||||
	ProcessorType   string       `json:"processorType"`
 | 
						SocketsPerNode  int         `json:"socketsPerNode"`
 | 
				
			||||||
	SocketsPerNode  int          `json:"socketsPerNode"`
 | 
						CoresPerSocket  int         `json:"coresPerSocket"`
 | 
				
			||||||
	CoresPerSocket  int          `json:"coresPerSocket"`
 | 
						ThreadsPerCore  int         `json:"threadsPerCore"`
 | 
				
			||||||
	ThreadsPerCore  int          `json:"threadsPerCore"`
 | 
						FlopRateScalar  MetricValue `json:"flopRateScalar"`
 | 
				
			||||||
	FlopRateScalar  *MetricValue `json:"flopRateScalar"`
 | 
						FlopRateSimd    MetricValue `json:"flopRateSimd"`
 | 
				
			||||||
	FlopRateSimd    *MetricValue `json:"flopRateSimd"`
 | 
						MemoryBandwidth MetricValue `json:"memoryBandwidth"`
 | 
				
			||||||
	MemoryBandwidth *MetricValue `json:"memoryBandwidth"`
 | 
						Topology        Topology    `json:"topology"`
 | 
				
			||||||
	Topology        *Topology    `json:"topology"`
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type SubClusterConfig struct {
 | 
					type SubClusterConfig struct {
 | 
				
			||||||
@@ -53,13 +52,13 @@ type MetricConfig struct {
 | 
				
			|||||||
	Name        string              `json:"name"`
 | 
						Name        string              `json:"name"`
 | 
				
			||||||
	Unit        Unit                `json:"unit"`
 | 
						Unit        Unit                `json:"unit"`
 | 
				
			||||||
	Scope       MetricScope         `json:"scope"`
 | 
						Scope       MetricScope         `json:"scope"`
 | 
				
			||||||
	Aggregation *string             `json:"aggregation"`
 | 
						Aggregation string              `json:"aggregation"`
 | 
				
			||||||
	Timestep    int                 `json:"timestep"`
 | 
						Timestep    int                 `json:"timestep"`
 | 
				
			||||||
	Peak        *float64            `json:"peak"`
 | 
						Peak        float64             `json:"peak"`
 | 
				
			||||||
	Normal      *float64            `json:"normal"`
 | 
						Normal      float64             `json:"normal"`
 | 
				
			||||||
	Caution     *float64            `json:"caution"`
 | 
						Caution     float64             `json:"caution"`
 | 
				
			||||||
	Alert       *float64            `json:"alert"`
 | 
						Alert       float64             `json:"alert"`
 | 
				
			||||||
	SubClusters []*SubClusterConfig `json:"subClusters"`
 | 
						SubClusters []*SubClusterConfig `json:"subClusters,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Cluster struct {
 | 
					type Cluster struct {
 | 
				
			||||||
@@ -169,12 +168,3 @@ func (topo *Topology) GetAcceleratorIDs() ([]int, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return accels, nil
 | 
						return accels, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
func (topo *Topology) GetAcceleratorIndex(id string) (int, bool) {
 | 
					 | 
				
			||||||
	for idx, accel := range topo.Accelerators {
 | 
					 | 
				
			||||||
		if accel.ID == id {
 | 
					 | 
				
			||||||
			return idx, true
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return -1, false
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -80,18 +80,17 @@ func (s *Series) MarshalJSON() ([]byte, error) {
 | 
				
			|||||||
	buf = append(buf, s.Hostname...)
 | 
						buf = append(buf, s.Hostname...)
 | 
				
			||||||
	buf = append(buf, '"')
 | 
						buf = append(buf, '"')
 | 
				
			||||||
	if s.Id != nil {
 | 
						if s.Id != nil {
 | 
				
			||||||
		buf = append(buf, `,"id":`...)
 | 
							buf = append(buf, `,"id":"`...)
 | 
				
			||||||
		buf = strconv.AppendInt(buf, int64(*s.Id), 10)
 | 
							buf = append(buf, *s.Id...)
 | 
				
			||||||
	}
 | 
							buf = append(buf, '"')
 | 
				
			||||||
	if s.Statistics != nil {
 | 
					 | 
				
			||||||
		buf = append(buf, `,"statistics":{"min":`...)
 | 
					 | 
				
			||||||
		buf = strconv.AppendFloat(buf, s.Statistics.Min, 'f', 2, 64)
 | 
					 | 
				
			||||||
		buf = append(buf, `,"avg":`...)
 | 
					 | 
				
			||||||
		buf = strconv.AppendFloat(buf, s.Statistics.Avg, 'f', 2, 64)
 | 
					 | 
				
			||||||
		buf = append(buf, `,"max":`...)
 | 
					 | 
				
			||||||
		buf = strconv.AppendFloat(buf, s.Statistics.Max, 'f', 2, 64)
 | 
					 | 
				
			||||||
		buf = append(buf, '}')
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						buf = append(buf, `,"statistics":{"min":`...)
 | 
				
			||||||
 | 
						buf = strconv.AppendFloat(buf, s.Statistics.Min, 'f', 2, 64)
 | 
				
			||||||
 | 
						buf = append(buf, `,"avg":`...)
 | 
				
			||||||
 | 
						buf = strconv.AppendFloat(buf, s.Statistics.Avg, 'f', 2, 64)
 | 
				
			||||||
 | 
						buf = append(buf, `,"max":`...)
 | 
				
			||||||
 | 
						buf = strconv.AppendFloat(buf, s.Statistics.Max, 'f', 2, 64)
 | 
				
			||||||
 | 
						buf = append(buf, '}')
 | 
				
			||||||
	buf = append(buf, `,"data":[`...)
 | 
						buf = append(buf, `,"data":[`...)
 | 
				
			||||||
	for i := 0; i < len(s.Data); i++ {
 | 
						for i := 0; i < len(s.Data); i++ {
 | 
				
			||||||
		if i != 0 {
 | 
							if i != 0 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -90,8 +90,8 @@ var JobDefaults BaseJob = BaseJob{
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Unit struct {
 | 
					type Unit struct {
 | 
				
			||||||
	Base   string `json:"base"`
 | 
						Base   string  `json:"base"`
 | 
				
			||||||
	Prefix string `json:"prefix"`
 | 
						Prefix *string `json:"prefix,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// JobStatistics model
 | 
					// JobStatistics model
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,17 +16,16 @@ type JobData map[string]map[MetricScope]*JobMetric
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type JobMetric struct {
 | 
					type JobMetric struct {
 | 
				
			||||||
	Unit             Unit         `json:"unit"`
 | 
						Unit             Unit         `json:"unit"`
 | 
				
			||||||
	Scope            MetricScope  `json:"scope"`
 | 
					 | 
				
			||||||
	Timestep         int          `json:"timestep"`
 | 
						Timestep         int          `json:"timestep"`
 | 
				
			||||||
	Series           []Series     `json:"series"`
 | 
						Series           []Series     `json:"series"`
 | 
				
			||||||
	StatisticsSeries *StatsSeries `json:"statisticsSeries"`
 | 
						StatisticsSeries *StatsSeries `json:"statisticsSeries,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Series struct {
 | 
					type Series struct {
 | 
				
			||||||
	Hostname   string            `json:"hostname"`
 | 
						Hostname   string           `json:"hostname"`
 | 
				
			||||||
	Id         *int              `json:"id,omitempty"`
 | 
						Id         *string          `json:"id,omitempty"`
 | 
				
			||||||
	Statistics *MetricStatistics `json:"statistics"`
 | 
						Statistics MetricStatistics `json:"statistics"`
 | 
				
			||||||
	Data       []Float           `json:"data"`
 | 
						Data       []Float          `json:"data"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type MetricStatistics struct {
 | 
					type MetricStatistics struct {
 | 
				
			||||||
@@ -218,17 +217,12 @@ func (jd *JobData) AddNodeScope(metric string) bool {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	nodeJm := &JobMetric{
 | 
						nodeJm := &JobMetric{
 | 
				
			||||||
		Unit:     jm.Unit,
 | 
							Unit:     jm.Unit,
 | 
				
			||||||
		Scope:    MetricScopeNode,
 | 
					 | 
				
			||||||
		Timestep: jm.Timestep,
 | 
							Timestep: jm.Timestep,
 | 
				
			||||||
		Series:   make([]Series, 0, len(hosts)),
 | 
							Series:   make([]Series, 0, len(hosts)),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for hostname, series := range hosts {
 | 
						for hostname, series := range hosts {
 | 
				
			||||||
		min, sum, max := math.MaxFloat32, 0.0, -math.MaxFloat32
 | 
							min, sum, max := math.MaxFloat32, 0.0, -math.MaxFloat32
 | 
				
			||||||
		for _, series := range series {
 | 
							for _, series := range series {
 | 
				
			||||||
			if series.Statistics == nil {
 | 
					 | 
				
			||||||
				min, sum, max = math.NaN(), math.NaN(), math.NaN()
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			sum += series.Statistics.Avg
 | 
								sum += series.Statistics.Avg
 | 
				
			||||||
			min = math.Min(min, series.Statistics.Min)
 | 
								min = math.Min(min, series.Statistics.Min)
 | 
				
			||||||
			max = math.Max(max, series.Statistics.Max)
 | 
								max = math.Max(max, series.Statistics.Max)
 | 
				
			||||||
@@ -259,7 +253,7 @@ func (jd *JobData) AddNodeScope(metric string) bool {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		nodeJm.Series = append(nodeJm.Series, Series{
 | 
							nodeJm.Series = append(nodeJm.Series, Series{
 | 
				
			||||||
			Hostname:   hostname,
 | 
								Hostname:   hostname,
 | 
				
			||||||
			Statistics: &MetricStatistics{Min: min, Avg: sum / float64(len(series)), Max: max},
 | 
								Statistics: MetricStatistics{Min: min, Avg: sum / float64(len(series)), Max: max},
 | 
				
			||||||
			Data:       data,
 | 
								Data:       data,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -94,6 +94,7 @@
 | 
				
			|||||||
                    "timestep",
 | 
					                    "timestep",
 | 
				
			||||||
                    "aggregation",
 | 
					                    "aggregation",
 | 
				
			||||||
                    "peak",
 | 
					                    "peak",
 | 
				
			||||||
 | 
					                    "normal",
 | 
				
			||||||
                    "caution",
 | 
					                    "caution",
 | 
				
			||||||
                    "alert"
 | 
					                    "alert"
 | 
				
			||||||
                ]
 | 
					                ]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -146,7 +146,8 @@ func ConvertUnitString(us string) schema.Unit {
 | 
				
			|||||||
	u := NewUnit(us)
 | 
						u := NewUnit(us)
 | 
				
			||||||
	p := u.getPrefix()
 | 
						p := u.getPrefix()
 | 
				
			||||||
	if p.Prefix() != "" {
 | 
						if p.Prefix() != "" {
 | 
				
			||||||
		nu.Prefix = p.Prefix()
 | 
							prefix := p.Prefix()
 | 
				
			||||||
 | 
							nu.Prefix = &prefix
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	m := u.getMeasure()
 | 
						m := u.getMeasure()
 | 
				
			||||||
	d := u.getUnitDenominator()
 | 
						d := u.getUnitDenominator()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -369,12 +369,11 @@ func TestRestApi(t *testing.T) {
 | 
				
			|||||||
		"load_one": map[schema.MetricScope]*schema.JobMetric{
 | 
							"load_one": map[schema.MetricScope]*schema.JobMetric{
 | 
				
			||||||
			schema.MetricScopeNode: {
 | 
								schema.MetricScopeNode: {
 | 
				
			||||||
				Unit:     schema.Unit{Base: "load"},
 | 
									Unit:     schema.Unit{Base: "load"},
 | 
				
			||||||
				Scope:    schema.MetricScopeNode,
 | 
					 | 
				
			||||||
				Timestep: 60,
 | 
									Timestep: 60,
 | 
				
			||||||
				Series: []schema.Series{
 | 
									Series: []schema.Series{
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						Hostname:   "host123",
 | 
											Hostname:   "host123",
 | 
				
			||||||
						Statistics: &schema.MetricStatistics{Min: 0.1, Avg: 0.2, Max: 0.3},
 | 
											Statistics: schema.MetricStatistics{Min: 0.1, Avg: 0.2, Max: 0.3},
 | 
				
			||||||
						Data:       []schema.Float{0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.3, 0.3, 0.3},
 | 
											Data:       []schema.Float{0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.3, 0.3, 0.3},
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,19 +23,19 @@ import (
 | 
				
			|||||||
// 	Accelerators []*Accelerator `json:"accelerators"`
 | 
					// 	Accelerators []*Accelerator `json:"accelerators"`
 | 
				
			||||||
// }
 | 
					// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// type SubCluster struct {
 | 
					type SubCluster struct {
 | 
				
			||||||
// 	Name            string    `json:"name"`
 | 
						Name            string           `json:"name"`
 | 
				
			||||||
// 	Nodes           string    `json:"nodes"`
 | 
						Nodes           string           `json:"nodes"`
 | 
				
			||||||
// 	NumberOfNodes   int       `json:"numberOfNodes"`
 | 
						NumberOfNodes   int              `json:"numberOfNodes"`
 | 
				
			||||||
// 	ProcessorType   string    `json:"processorType"`
 | 
						ProcessorType   string           `json:"processorType"`
 | 
				
			||||||
// 	SocketsPerNode  int       `json:"socketsPerNode"`
 | 
						SocketsPerNode  int              `json:"socketsPerNode"`
 | 
				
			||||||
// 	CoresPerSocket  int       `json:"coresPerSocket"`
 | 
						CoresPerSocket  int              `json:"coresPerSocket"`
 | 
				
			||||||
// 	ThreadsPerCore  int       `json:"threadsPerCore"`
 | 
						ThreadsPerCore  int              `json:"threadsPerCore"`
 | 
				
			||||||
// 	FlopRateScalar  int       `json:"flopRateScalar"`
 | 
						FlopRateScalar  int              `json:"flopRateScalar"`
 | 
				
			||||||
// 	FlopRateSimd    int       `json:"flopRateSimd"`
 | 
						FlopRateSimd    int              `json:"flopRateSimd"`
 | 
				
			||||||
// 	MemoryBandwidth int       `json:"memoryBandwidth"`
 | 
						MemoryBandwidth int              `json:"memoryBandwidth"`
 | 
				
			||||||
// 	Topology        *Topology `json:"topology"`
 | 
						Topology        *schema.Topology `json:"topology"`
 | 
				
			||||||
// }
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// type SubClusterConfig struct {
 | 
					// type SubClusterConfig struct {
 | 
				
			||||||
// 	Name    string  `json:"name"`
 | 
					// 	Name    string  `json:"name"`
 | 
				
			||||||
@@ -49,17 +49,17 @@ type MetricConfig struct {
 | 
				
			|||||||
	Name        string                     `json:"name"`
 | 
						Name        string                     `json:"name"`
 | 
				
			||||||
	Unit        string                     `json:"unit"`
 | 
						Unit        string                     `json:"unit"`
 | 
				
			||||||
	Scope       schema.MetricScope         `json:"scope"`
 | 
						Scope       schema.MetricScope         `json:"scope"`
 | 
				
			||||||
	Aggregation *string                    `json:"aggregation"`
 | 
						Aggregation string                     `json:"aggregation"`
 | 
				
			||||||
	Timestep    int                        `json:"timestep"`
 | 
						Timestep    int                        `json:"timestep"`
 | 
				
			||||||
	Peak        *float64                   `json:"peak"`
 | 
						Peak        float64                    `json:"peak"`
 | 
				
			||||||
	Normal      *float64                   `json:"normal"`
 | 
						Normal      float64                    `json:"normal"`
 | 
				
			||||||
	Caution     *float64                   `json:"caution"`
 | 
						Caution     float64                    `json:"caution"`
 | 
				
			||||||
	Alert       *float64                   `json:"alert"`
 | 
						Alert       float64                    `json:"alert"`
 | 
				
			||||||
	SubClusters []*schema.SubClusterConfig `json:"subClusters"`
 | 
						SubClusters []*schema.SubClusterConfig `json:"subClusters"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Cluster struct {
 | 
					type Cluster struct {
 | 
				
			||||||
	Name         string               `json:"name"`
 | 
						Name         string          `json:"name"`
 | 
				
			||||||
	MetricConfig []*MetricConfig      `json:"metricConfig"`
 | 
						MetricConfig []*MetricConfig `json:"metricConfig"`
 | 
				
			||||||
	SubClusters  []*schema.SubCluster `json:"subClusters"`
 | 
						SubClusters  []*SubCluster   `json:"subClusters"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -79,7 +79,7 @@ func GetCluster(cluster string) *Cluster {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func GetSubCluster(cluster, subcluster string) *schema.SubCluster {
 | 
					func GetSubCluster(cluster, subcluster string) *SubCluster {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, c := range Clusters {
 | 
						for _, c := range Clusters {
 | 
				
			||||||
		if c.Name == cluster {
 | 
							if c.Name == cluster {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,7 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"log"
 | 
						"log"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/ClusterCockpit/cc-backend/pkg/schema"
 | 
						"github.com/ClusterCockpit/cc-backend/pkg/schema"
 | 
				
			||||||
	"github.com/ClusterCockpit/cc-backend/pkg/units"
 | 
						"github.com/ClusterCockpit/cc-backend/pkg/units"
 | 
				
			||||||
@@ -71,20 +72,21 @@ func deepCopyJobMeta(j *JobMeta) schema.JobMeta {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func deepCopyJobData(d *JobData) schema.JobData {
 | 
					func deepCopyJobData(d *JobData) schema.JobData {
 | 
				
			||||||
	var dn schema.JobData
 | 
						var dn schema.JobData = make(schema.JobData)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for k, v := range *d {
 | 
						for k, v := range *d {
 | 
				
			||||||
		for mk, mv := range v {
 | 
							for mk, mv := range v {
 | 
				
			||||||
			var mn schema.JobMetric
 | 
								var mn schema.JobMetric
 | 
				
			||||||
			mn.Unit = units.ConvertUnitString(mv.Unit)
 | 
								mn.Unit = units.ConvertUnitString(mv.Unit)
 | 
				
			||||||
			mn.Scope = mv.Scope
 | 
					 | 
				
			||||||
			mn.Timestep = mv.Timestep
 | 
								mn.Timestep = mv.Timestep
 | 
				
			||||||
 | 
								mn.Series = make([]schema.Series, len(mv.Series))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for _, v := range mv.Series {
 | 
								for _, v := range mv.Series {
 | 
				
			||||||
				var sn schema.Series
 | 
									var sn schema.Series
 | 
				
			||||||
				sn.Hostname = v.Hostname
 | 
									sn.Hostname = v.Hostname
 | 
				
			||||||
				sn.Id = v.Id
 | 
									id := fmt.Sprint(*v.Id)
 | 
				
			||||||
				sn.Statistics = &schema.MetricStatistics{
 | 
									sn.Id = &id
 | 
				
			||||||
 | 
									sn.Statistics = schema.MetricStatistics{
 | 
				
			||||||
					Avg: v.Statistics.Avg,
 | 
										Avg: v.Statistics.Avg,
 | 
				
			||||||
					Min: v.Statistics.Min,
 | 
										Min: v.Statistics.Min,
 | 
				
			||||||
					Max: v.Statistics.Max}
 | 
										Max: v.Statistics.Max}
 | 
				
			||||||
@@ -94,6 +96,7 @@ func deepCopyJobData(d *JobData) schema.JobData {
 | 
				
			|||||||
				mn.Series = append(mn.Series, sn)
 | 
									mn.Series = append(mn.Series, sn)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								dn[k] = make(map[schema.MetricScope]*schema.JobMetric)
 | 
				
			||||||
			dn[k][mk] = &mn
 | 
								dn[k][mk] = &mn
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -105,15 +108,49 @@ func deepCopyClusterConfig(co *Cluster) schema.Cluster {
 | 
				
			|||||||
	var cn schema.Cluster
 | 
						var cn schema.Cluster
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cn.Name = co.Name
 | 
						cn.Name = co.Name
 | 
				
			||||||
	cn.SubClusters = co.SubClusters
 | 
						for _, sco := range co.SubClusters {
 | 
				
			||||||
 | 
							var scn schema.SubCluster
 | 
				
			||||||
 | 
							scn.Name = sco.Name
 | 
				
			||||||
 | 
							if sco.Nodes == "" {
 | 
				
			||||||
 | 
								scn.Nodes = "*"
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								scn.Nodes = sco.Nodes
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							scn.ProcessorType = sco.ProcessorType
 | 
				
			||||||
 | 
							scn.SocketsPerNode = sco.SocketsPerNode
 | 
				
			||||||
 | 
							scn.CoresPerSocket = sco.CoresPerSocket
 | 
				
			||||||
 | 
							scn.ThreadsPerCore = sco.ThreadsPerCore
 | 
				
			||||||
 | 
							prefix := "G"
 | 
				
			||||||
 | 
							scn.FlopRateScalar = schema.MetricValue{
 | 
				
			||||||
 | 
								Unit:  schema.Unit{Base: "F/s", Prefix: &prefix},
 | 
				
			||||||
 | 
								Value: float64(sco.FlopRateScalar)}
 | 
				
			||||||
 | 
							scn.FlopRateSimd = schema.MetricValue{
 | 
				
			||||||
 | 
								Unit:  schema.Unit{Base: "F/s", Prefix: &prefix},
 | 
				
			||||||
 | 
								Value: float64(sco.FlopRateSimd)}
 | 
				
			||||||
 | 
							scn.MemoryBandwidth = schema.MetricValue{
 | 
				
			||||||
 | 
								Unit:  schema.Unit{Base: "B/s", Prefix: &prefix},
 | 
				
			||||||
 | 
								Value: float64(sco.MemoryBandwidth)}
 | 
				
			||||||
 | 
							scn.Topology = *sco.Topology
 | 
				
			||||||
 | 
							cn.SubClusters = append(cn.SubClusters, &scn)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, mco := range co.MetricConfig {
 | 
						for _, mco := range co.MetricConfig {
 | 
				
			||||||
		var mcn schema.MetricConfig
 | 
							var mcn schema.MetricConfig
 | 
				
			||||||
		mcn.Name = mco.Name
 | 
							mcn.Name = mco.Name
 | 
				
			||||||
		mcn.Scope = mco.Scope
 | 
							mcn.Scope = mco.Scope
 | 
				
			||||||
		mcn.Aggregation = mco.Aggregation
 | 
							if mco.Aggregation == "" {
 | 
				
			||||||
 | 
								fmt.Println("Property aggregation missing! Please review file!")
 | 
				
			||||||
 | 
								mcn.Aggregation = "sum"
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								mcn.Aggregation = mco.Aggregation
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		mcn.Timestep = mco.Timestep
 | 
							mcn.Timestep = mco.Timestep
 | 
				
			||||||
		mcn.Unit = units.ConvertUnitString(mco.Unit)
 | 
							mcn.Unit = units.ConvertUnitString(mco.Unit)
 | 
				
			||||||
 | 
							mcn.Peak = mco.Peak
 | 
				
			||||||
 | 
							mcn.Normal = mco.Normal
 | 
				
			||||||
 | 
							mcn.Caution = mco.Caution
 | 
				
			||||||
 | 
							mcn.Alert = mco.Alert
 | 
				
			||||||
 | 
							mcn.SubClusters = mco.SubClusters
 | 
				
			||||||
		cn.MetricConfig = append(cn.MetricConfig, &mcn)
 | 
							cn.MetricConfig = append(cn.MetricConfig, &mcn)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -167,8 +204,12 @@ func main() {
 | 
				
			|||||||
	for job := range ar.Iter() {
 | 
						for job := range ar.Iter() {
 | 
				
			||||||
		fmt.Printf("Job %d\n", job.JobID)
 | 
							fmt.Printf("Job %d\n", job.JobID)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		root := fmt.Sprintf("%s/%s/", dstPath, job.Cluster)
 | 
							path := getPath(job, dstPath, "meta.json")
 | 
				
			||||||
		f, err := os.Create(getPath(job, root, "meta.json"))
 | 
							err = os.MkdirAll(filepath.Dir(path), 0750)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								log.Fatal(err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							f, err := os.Create(path)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			log.Fatal(err)
 | 
								log.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -181,14 +222,13 @@ func main() {
 | 
				
			|||||||
			log.Fatal(err)
 | 
								log.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		f, err = os.Create(getPath(job, root, "data.json"))
 | 
							f, err = os.Create(getPath(job, dstPath, "data.json"))
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			log.Fatal(err)
 | 
								log.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sroot := fmt.Sprintf("%s/%s/", srcPath, job.Cluster)
 | 
					 | 
				
			||||||
		var jd *JobData
 | 
							var jd *JobData
 | 
				
			||||||
		jd, err = loadJobData(getPath(job, sroot, "data.json"))
 | 
							jd, err = loadJobData(getPath(job, srcPath, "data.json"))
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			log.Fatal(err)
 | 
								log.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user