|
|
@@ -44,6 +44,29 @@ func (art *AllocationTotals) ClearAdjustments() {
|
|
|
art.RAMCostAdjustment = 0.0
|
|
|
}
|
|
|
|
|
|
+// Clone deep copies the AllocationTotals
|
|
|
+func (art *AllocationTotals) Clone() *AllocationTotals {
|
|
|
+ return &AllocationTotals{
|
|
|
+ Start: art.Start,
|
|
|
+ End: art.End,
|
|
|
+ Cluster: art.Cluster,
|
|
|
+ Node: art.Node,
|
|
|
+ Count: art.Count,
|
|
|
+ CPUCost: art.CPUCost,
|
|
|
+ CPUCostAdjustment: art.CPUCostAdjustment,
|
|
|
+ GPUCost: art.GPUCost,
|
|
|
+ GPUCostAdjustment: art.GPUCostAdjustment,
|
|
|
+ LoadBalancerCost: art.LoadBalancerCost,
|
|
|
+ LoadBalancerCostAdjustment: art.LoadBalancerCostAdjustment,
|
|
|
+ NetworkCost: art.NetworkCost,
|
|
|
+ NetworkCostAdjustment: art.NetworkCostAdjustment,
|
|
|
+ PersistentVolumeCost: art.PersistentVolumeCost,
|
|
|
+ PersistentVolumeCostAdjustment: art.PersistentVolumeCostAdjustment,
|
|
|
+ RAMCost: art.RAMCost,
|
|
|
+ RAMCostAdjustment: art.RAMCostAdjustment,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// TotalCPUCost returns CPU cost with adjustment.
|
|
|
func (art *AllocationTotals) TotalCPUCost() float64 {
|
|
|
return art.CPUCost + art.CPUCostAdjustment
|
|
|
@@ -181,6 +204,31 @@ func (art *AssetTotals) ClearAdjustments() {
|
|
|
art.RAMCostAdjustment = 0.0
|
|
|
}
|
|
|
|
|
|
+// Clone deep copies the AssetTotals
|
|
|
+func (art *AssetTotals) Clone() *AssetTotals {
|
|
|
+ return &AssetTotals{
|
|
|
+ Start: art.Start,
|
|
|
+ End: art.End,
|
|
|
+ Cluster: art.Cluster,
|
|
|
+ Node: art.Node,
|
|
|
+ Count: art.Count,
|
|
|
+ AttachedVolumeCost: art.AttachedVolumeCost,
|
|
|
+ AttachedVolumeCostAdjustment: art.AttachedVolumeCostAdjustment,
|
|
|
+ ClusterManagementCost: art.ClusterManagementCost,
|
|
|
+ ClusterManagementCostAdjustment: art.ClusterManagementCostAdjustment,
|
|
|
+ CPUCost: art.CPUCost,
|
|
|
+ CPUCostAdjustment: art.CPUCostAdjustment,
|
|
|
+ GPUCost: art.GPUCost,
|
|
|
+ GPUCostAdjustment: art.GPUCostAdjustment,
|
|
|
+ LoadBalancerCost: art.LoadBalancerCost,
|
|
|
+ LoadBalancerCostAdjustment: art.LoadBalancerCostAdjustment,
|
|
|
+ PersistentVolumeCost: art.PersistentVolumeCost,
|
|
|
+ PersistentVolumeCostAdjustment: art.PersistentVolumeCostAdjustment,
|
|
|
+ RAMCost: art.RAMCost,
|
|
|
+ RAMCostAdjustment: art.RAMCostAdjustment,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// TotalAttachedVolumeCost returns CPU cost with adjustment.
|
|
|
func (art *AssetTotals) TotalAttachedVolumeCost() float64 {
|
|
|
return art.AttachedVolumeCost + art.AttachedVolumeCostAdjustment
|
|
|
@@ -554,10 +602,15 @@ func NewMemoryTotalsStore() *MemoryTotalsStore {
|
|
|
// by cluster for the given start and end times.
|
|
|
func (mts *MemoryTotalsStore) GetAllocationTotalsByCluster(start time.Time, end time.Time) (map[string]*AllocationTotals, bool) {
|
|
|
k := storeKey(start, end)
|
|
|
- if raw, ok := mts.allocTotalsByCluster.Get(k); ok {
|
|
|
- return raw.(map[string]*AllocationTotals), true
|
|
|
- } else {
|
|
|
+ if raw, ok := mts.allocTotalsByCluster.Get(k); !ok {
|
|
|
return map[string]*AllocationTotals{}, false
|
|
|
+ } else {
|
|
|
+ original := raw.(map[string]*AllocationTotals)
|
|
|
+ totals := make(map[string]*AllocationTotals, len(original))
|
|
|
+ for k, v := range original {
|
|
|
+ totals[k] = v.Clone()
|
|
|
+ }
|
|
|
+ return totals, true
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -566,9 +619,14 @@ func (mts *MemoryTotalsStore) GetAllocationTotalsByCluster(start time.Time, end
|
|
|
func (mts *MemoryTotalsStore) GetAllocationTotalsByNode(start time.Time, end time.Time) (map[string]*AllocationTotals, bool) {
|
|
|
k := storeKey(start, end)
|
|
|
if raw, ok := mts.allocTotalsByNode.Get(k); ok {
|
|
|
- return raw.(map[string]*AllocationTotals), true
|
|
|
- } else {
|
|
|
return map[string]*AllocationTotals{}, false
|
|
|
+ } else {
|
|
|
+ original := raw.(map[string]*AllocationTotals)
|
|
|
+ totals := make(map[string]*AllocationTotals, len(original))
|
|
|
+ for k, v := range original {
|
|
|
+ totals[k] = v.Clone()
|
|
|
+ }
|
|
|
+ return totals, true
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -591,9 +649,14 @@ func (mts *MemoryTotalsStore) SetAllocationTotalsByNode(start time.Time, end tim
|
|
|
func (mts *MemoryTotalsStore) GetAssetTotalsByCluster(start time.Time, end time.Time) (map[string]*AssetTotals, bool) {
|
|
|
k := storeKey(start, end)
|
|
|
if raw, ok := mts.assetTotalsByCluster.Get(k); ok {
|
|
|
- return raw.(map[string]*AssetTotals), true
|
|
|
- } else {
|
|
|
return map[string]*AssetTotals{}, false
|
|
|
+ } else {
|
|
|
+ original := raw.(map[string]*AssetTotals)
|
|
|
+ totals := make(map[string]*AssetTotals, len(original))
|
|
|
+ for k, v := range original {
|
|
|
+ totals[k] = v.Clone()
|
|
|
+ }
|
|
|
+ return totals, true
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -602,9 +665,14 @@ func (mts *MemoryTotalsStore) GetAssetTotalsByCluster(start time.Time, end time.
|
|
|
func (mts *MemoryTotalsStore) GetAssetTotalsByNode(start time.Time, end time.Time) (map[string]*AssetTotals, bool) {
|
|
|
k := storeKey(start, end)
|
|
|
if raw, ok := mts.assetTotalsByNode.Get(k); ok {
|
|
|
- return raw.(map[string]*AssetTotals), true
|
|
|
- } else {
|
|
|
return map[string]*AssetTotals{}, false
|
|
|
+ } else {
|
|
|
+ original := raw.(map[string]*AssetTotals)
|
|
|
+ totals := make(map[string]*AssetTotals, len(original))
|
|
|
+ for k, v := range original {
|
|
|
+ totals[k] = v.Clone()
|
|
|
+ }
|
|
|
+ return totals, true
|
|
|
}
|
|
|
}
|
|
|
|