|
|
@@ -3,6 +3,7 @@ package costmodel
|
|
|
import (
|
|
|
"reflect"
|
|
|
"testing"
|
|
|
+ "time"
|
|
|
|
|
|
"github.com/davecgh/go-spew/spew"
|
|
|
)
|
|
|
@@ -176,6 +177,332 @@ func TestBuildNodeMap(t *testing.T) {
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
+ {
|
|
|
+ name: "just cpu cost with empty provider ID",
|
|
|
+ cpuCostMap: map[NodeIdentifier]float64{
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ }: 0.048,
|
|
|
+ },
|
|
|
+ clusterAndNameToType: map[nodeIdentifierNoProviderID]string{
|
|
|
+ nodeIdentifierNoProviderID{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ }: "type1",
|
|
|
+ },
|
|
|
+ expected: map[NodeIdentifier]*Node{
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ }: &Node{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ NodeType: "type1",
|
|
|
+ CPUCost: 0.048,
|
|
|
+ CPUBreakdown: &ClusterCostsBreakdown{},
|
|
|
+ RAMBreakdown: &ClusterCostsBreakdown{},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "cpu cost with overlapping node names",
|
|
|
+ cpuCostMap: map[NodeIdentifier]float64{
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_A",
|
|
|
+ }: 0.048,
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_B",
|
|
|
+ }: 0.087,
|
|
|
+ },
|
|
|
+ clusterAndNameToType: map[nodeIdentifierNoProviderID]string{
|
|
|
+ nodeIdentifierNoProviderID{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ }: "type1",
|
|
|
+ },
|
|
|
+ expected: map[NodeIdentifier]*Node{
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_A",
|
|
|
+ }: &Node{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_A",
|
|
|
+ NodeType: "type1",
|
|
|
+ CPUCost: 0.048,
|
|
|
+ CPUBreakdown: &ClusterCostsBreakdown{},
|
|
|
+ RAMBreakdown: &ClusterCostsBreakdown{},
|
|
|
+ },
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_B",
|
|
|
+ }: &Node{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_B",
|
|
|
+ NodeType: "type1",
|
|
|
+ CPUCost: 0.087,
|
|
|
+ CPUBreakdown: &ClusterCostsBreakdown{},
|
|
|
+ RAMBreakdown: &ClusterCostsBreakdown{},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "all fields + overlapping node names",
|
|
|
+ cpuCostMap: map[NodeIdentifier]float64{
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_A",
|
|
|
+ }: 0.048,
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_B",
|
|
|
+ }: 0.087,
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node2",
|
|
|
+ ProviderID: "prov_node2_A",
|
|
|
+ }: 0.033,
|
|
|
+ },
|
|
|
+ ramCostMap: map[NodeIdentifier]float64{
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_A",
|
|
|
+ }: 0.09,
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_B",
|
|
|
+ }: 0.3,
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node2",
|
|
|
+ ProviderID: "prov_node2_A",
|
|
|
+ }: 0.024,
|
|
|
+ },
|
|
|
+ gpuCostMap: map[NodeIdentifier]float64{
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_A",
|
|
|
+ }: 0.8,
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_B",
|
|
|
+ }: 1.4,
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node2",
|
|
|
+ ProviderID: "prov_node2_A",
|
|
|
+ }: 3.1,
|
|
|
+ },
|
|
|
+ cpuCoresMap: map[nodeIdentifierNoProviderID]float64{
|
|
|
+ nodeIdentifierNoProviderID{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ }: 2.0,
|
|
|
+ nodeIdentifierNoProviderID{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node2",
|
|
|
+ }: 5.0,
|
|
|
+ },
|
|
|
+ ramBytesMap: map[nodeIdentifierNoProviderID]float64{
|
|
|
+ nodeIdentifierNoProviderID{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ }: 2048.0,
|
|
|
+ nodeIdentifierNoProviderID{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node2",
|
|
|
+ }: 6303.0,
|
|
|
+ },
|
|
|
+ ramUserPctMap: map[nodeIdentifierNoProviderID]float64{
|
|
|
+ nodeIdentifierNoProviderID{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ }: 30.0,
|
|
|
+ nodeIdentifierNoProviderID{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node2",
|
|
|
+ }: 42.6,
|
|
|
+ },
|
|
|
+ ramSystemPctMap: map[nodeIdentifierNoProviderID]float64{
|
|
|
+ nodeIdentifierNoProviderID{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ }: 15.0,
|
|
|
+ nodeIdentifierNoProviderID{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node2",
|
|
|
+ }: 20.1,
|
|
|
+ },
|
|
|
+ cpuBreakdownMap: map[nodeIdentifierNoProviderID]*ClusterCostsBreakdown{
|
|
|
+ nodeIdentifierNoProviderID{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ }: &ClusterCostsBreakdown{
|
|
|
+ System: 20.2,
|
|
|
+ User: 68.0,
|
|
|
+ },
|
|
|
+ nodeIdentifierNoProviderID{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node2",
|
|
|
+ }: &ClusterCostsBreakdown{
|
|
|
+ System: 28.9,
|
|
|
+ User: 34.0,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ activeDataMap: map[NodeIdentifier]activeData{
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_A",
|
|
|
+ }: activeData{
|
|
|
+ start: time.Date(2020, 6, 16, 3, 45, 28, 0, time.UTC),
|
|
|
+ end: time.Date(2020, 6, 16, 9, 20, 39, 0, time.UTC),
|
|
|
+ minutes: 5*60 + 35 + (11.0 / 60.0),
|
|
|
+ },
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_B",
|
|
|
+ }: activeData{
|
|
|
+ start: time.Date(2020, 6, 16, 3, 45, 28, 0, time.UTC),
|
|
|
+ end: time.Date(2020, 6, 16, 9, 21, 39, 0, time.UTC),
|
|
|
+ minutes: 5*60 + 36 + (11.0 / 60.0),
|
|
|
+ },
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node2",
|
|
|
+ ProviderID: "prov_node2_A",
|
|
|
+ }: activeData{
|
|
|
+ start: time.Date(2020, 6, 16, 3, 45, 28, 0, time.UTC),
|
|
|
+ end: time.Date(2020, 6, 16, 9, 10, 39, 0, time.UTC),
|
|
|
+ minutes: 5*60 + 25 + (11.0 / 60.0),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ preemptibleMap: map[NodeIdentifier]bool{
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_A",
|
|
|
+ }: true,
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_B",
|
|
|
+ }: false,
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node2",
|
|
|
+ ProviderID: "prov_node2_A",
|
|
|
+ }: false,
|
|
|
+ },
|
|
|
+ clusterAndNameToType: map[nodeIdentifierNoProviderID]string{
|
|
|
+ nodeIdentifierNoProviderID{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ }: "type1",
|
|
|
+ nodeIdentifierNoProviderID{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node2",
|
|
|
+ }: "type2",
|
|
|
+ },
|
|
|
+ expected: map[NodeIdentifier]*Node{
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_A",
|
|
|
+ }: &Node{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_A",
|
|
|
+ NodeType: "type1",
|
|
|
+ CPUCost: 0.048,
|
|
|
+ RAMCost: 0.09,
|
|
|
+ GPUCost: 0.8,
|
|
|
+ CPUCores: 2.0,
|
|
|
+ RAMBytes: 2048.0,
|
|
|
+ RAMBreakdown: &ClusterCostsBreakdown{
|
|
|
+ User: 30.0,
|
|
|
+ System: 15.0,
|
|
|
+ },
|
|
|
+ CPUBreakdown: &ClusterCostsBreakdown{
|
|
|
+ System: 20.2,
|
|
|
+ User: 68.0,
|
|
|
+ },
|
|
|
+ Start: time.Date(2020, 6, 16, 3, 45, 28, 0, time.UTC),
|
|
|
+ End: time.Date(2020, 6, 16, 9, 20, 39, 0, time.UTC),
|
|
|
+ Minutes: 5*60 + 35 + (11.0 / 60.0),
|
|
|
+ Preemptible: true,
|
|
|
+ },
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_B",
|
|
|
+ }: &Node{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node1",
|
|
|
+ ProviderID: "prov_node1_B",
|
|
|
+ NodeType: "type1",
|
|
|
+ CPUCost: 0.087,
|
|
|
+ RAMCost: 0.3,
|
|
|
+ GPUCost: 1.4,
|
|
|
+ CPUCores: 2.0,
|
|
|
+ RAMBytes: 2048.0,
|
|
|
+ RAMBreakdown: &ClusterCostsBreakdown{
|
|
|
+ User: 30.0,
|
|
|
+ System: 15.0,
|
|
|
+ },
|
|
|
+ CPUBreakdown: &ClusterCostsBreakdown{
|
|
|
+ System: 20.2,
|
|
|
+ User: 68.0,
|
|
|
+ },
|
|
|
+ Start: time.Date(2020, 6, 16, 3, 45, 28, 0, time.UTC),
|
|
|
+ End: time.Date(2020, 6, 16, 9, 21, 39, 0, time.UTC),
|
|
|
+ Minutes: 5*60 + 36 + (11.0 / 60.0),
|
|
|
+ Preemptible: false,
|
|
|
+ },
|
|
|
+ NodeIdentifier{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node2",
|
|
|
+ ProviderID: "prov_node2_A",
|
|
|
+ }: &Node{
|
|
|
+ Cluster: "cluster1",
|
|
|
+ Name: "node2",
|
|
|
+ ProviderID: "prov_node2_A",
|
|
|
+ NodeType: "type2",
|
|
|
+ CPUCost: 0.033,
|
|
|
+ RAMCost: 0.024,
|
|
|
+ GPUCost: 3.1,
|
|
|
+ CPUCores: 5.0,
|
|
|
+ RAMBytes: 6303.0,
|
|
|
+ RAMBreakdown: &ClusterCostsBreakdown{
|
|
|
+ User: 42.6,
|
|
|
+ System: 20.1,
|
|
|
+ },
|
|
|
+ CPUBreakdown: &ClusterCostsBreakdown{
|
|
|
+ System: 28.9,
|
|
|
+ User: 34.0,
|
|
|
+ },
|
|
|
+ Start: time.Date(2020, 6, 16, 3, 45, 28, 0, time.UTC),
|
|
|
+ End: time.Date(2020, 6, 16, 9, 10, 39, 0, time.UTC),
|
|
|
+ Minutes: 5*60 + 25 + (11.0 / 60.0),
|
|
|
+ Preemptible: false,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
}
|
|
|
|
|
|
for _, testCase := range cases {
|