github.com/filecoin-project/bacalhau@v0.3.23-0.20230228154132-45c989550ace/pkg/compute/capacity/calculators.go (about) 1 package capacity 2 3 import ( 4 "context" 5 6 "github.com/filecoin-project/bacalhau/pkg/model" 7 ) 8 9 type DefaultsUsageCalculatorParams struct { 10 Defaults model.ResourceUsageData 11 } 12 13 type DefaultsUsageCalculator struct { 14 defaults model.ResourceUsageData 15 } 16 17 func NewDefaultsUsageCalculator(params DefaultsUsageCalculatorParams) *DefaultsUsageCalculator { 18 return &DefaultsUsageCalculator{ 19 defaults: params.Defaults, 20 } 21 } 22 23 func (c *DefaultsUsageCalculator) Calculate( 24 ctx context.Context, job model.Job, parsedUsage model.ResourceUsageData) (model.ResourceUsageData, error) { 25 return parsedUsage.Intersect(c.defaults), nil 26 } 27 28 type ChainedUsageCalculatorParams struct { 29 Calculators []UsageCalculator 30 } 31 32 type ChainedUsageCalculator struct { 33 calculators []UsageCalculator 34 } 35 36 func NewChainedUsageCalculator(params ChainedUsageCalculatorParams) *ChainedUsageCalculator { 37 return &ChainedUsageCalculator{ 38 calculators: params.Calculators, 39 } 40 } 41 42 func (c *ChainedUsageCalculator) Calculate( 43 ctx context.Context, job model.Job, parsedUsage model.ResourceUsageData) (model.ResourceUsageData, error) { 44 aggregatedUsage := parsedUsage 45 for _, calculator := range c.calculators { 46 calculatedUsage, err := calculator.Calculate(ctx, job, parsedUsage) 47 if err != nil { 48 return model.ResourceUsageData{}, err 49 } 50 aggregatedUsage = aggregatedUsage.Max(calculatedUsage) 51 } 52 return aggregatedUsage, nil 53 } 54 55 // Compile-time check to ensure UsageCalculator interface implementation 56 var _ UsageCalculator = (*DefaultsUsageCalculator)(nil) 57 var _ UsageCalculator = (*ChainedUsageCalculator)(nil)