| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830 |
- package opencost
- import (
- "fmt"
- "time"
- )
- const gb = 1024 * 1024 * 1024
- const day = 24 * time.Hour
- var disk = PVKey{
- Cluster: "cluster1",
- Name: "pv1",
- }
- // NewMockUnitAllocation creates an *Allocation with all of its float64 values set to 1 and generic properties if not provided in arg
- func NewMockUnitAllocation(name string, start time.Time, resolution time.Duration, props *AllocationProperties) *Allocation {
- if name == "" {
- name = "cluster1/namespace1/pod1/container1"
- }
- properties := &AllocationProperties{}
- if props == nil {
- properties.Cluster = "cluster1"
- properties.Node = "node1"
- properties.Namespace = "namespace1"
- properties.ControllerKind = "deployment"
- properties.Controller = "deployment1"
- properties.Pod = "pod1"
- properties.Container = "container1"
- } else {
- properties = props
- }
- end := start.Add(resolution)
- alloc := &Allocation{
- Name: name,
- Properties: properties,
- Window: NewWindow(&start, &end).Clone(),
- Start: start,
- End: end,
- CPUCoreHours: 1,
- CPUCost: 1,
- CPUCoreRequestAverage: 1,
- CPUCoreUsageAverage: 1,
- GPUHours: 1,
- GPUCost: 1,
- NetworkCost: 1,
- LoadBalancerCost: 1,
- PVs: PVAllocations{
- disk: {
- ByteHours: 1,
- Cost: 1,
- },
- },
- RAMByteHours: 1,
- RAMCost: 1,
- RAMBytesRequestAverage: 1,
- RAMBytesUsageAverage: 1,
- RawAllocationOnly: &RawAllocationOnlyData{
- CPUCoreUsageMax: 1,
- RAMBytesUsageMax: 1,
- },
- ProportionalAssetResourceCosts: nil,
- }
- // If idle allocation, remove non-idle costs, but maintain total cost
- if alloc.IsIdle() {
- alloc.PVs = nil
- alloc.NetworkCost = 0.0
- alloc.LoadBalancerCost = 0.0
- alloc.CPUCoreHours += 1.0
- alloc.CPUCost += 1.0
- alloc.RAMByteHours += 1.0
- alloc.RAMCost += 1.0
- }
- return alloc
- }
- // GenerateMockAllocationSetClusterIdle creates generic allocation set which includes an idle set broken down by cluster
- func GenerateMockAllocationSetClusterIdle(start time.Time) *AllocationSet {
- // Cluster Idle allocations
- a1i := NewMockUnitAllocation(fmt.Sprintf("cluster1/%s", IdleSuffix), start, day, &AllocationProperties{
- Cluster: "cluster1",
- })
- a1i.CPUCost = 5.0
- a1i.RAMCost = 15.0
- a1i.GPUCost = 0.0
- a2i := NewMockUnitAllocation(fmt.Sprintf("cluster2/%s", IdleSuffix), start, day, &AllocationProperties{
- Cluster: "cluster2",
- })
- a2i.CPUCost = 5.0
- a2i.RAMCost = 5.0
- a2i.GPUCost = 0.0
- as := GenerateMockAllocationSet(start)
- as.Insert(a1i)
- as.Insert(a2i)
- return as
- }
- // GenerateMockAllocationSetNodeIdle creates generic allocation set which includes an idle set broken down by node
- func GenerateMockAllocationSetNodeIdle(start time.Time) *AllocationSet {
- // Node Idle allocations
- a11i := NewMockUnitAllocation(fmt.Sprintf("c1nodes/%s", IdleSuffix), start, day, &AllocationProperties{
- Cluster: "cluster1",
- Node: "c1nodes",
- ProviderID: "c1nodes",
- })
- a11i.CPUCost = 5.0
- a11i.RAMCost = 15.0
- a11i.GPUCost = 0.0
- a21i := NewMockUnitAllocation(fmt.Sprintf("node1/%s", IdleSuffix), start, day, &AllocationProperties{
- Cluster: "cluster2",
- Node: "node1",
- ProviderID: "node1",
- })
- a21i.CPUCost = 1.666667
- a21i.RAMCost = 1.666667
- a21i.GPUCost = 0.0
- a22i := NewMockUnitAllocation(fmt.Sprintf("node2/%s", IdleSuffix), start, day, &AllocationProperties{
- Cluster: "cluster2",
- Node: "node2",
- ProviderID: "node2",
- })
- a22i.CPUCost = 1.666667
- a22i.RAMCost = 1.666667
- a22i.GPUCost = 0.0
- a23i := NewMockUnitAllocation(fmt.Sprintf("node3/%s", IdleSuffix), start, day, &AllocationProperties{
- Cluster: "cluster2",
- Node: "node3",
- ProviderID: "node3",
- Namespace: "",
- })
- a23i.CPUCost = 1.666667
- a23i.RAMCost = 1.666667
- a23i.GPUCost = 0.0
- as := GenerateMockAllocationSet(start)
- as.Insert(a11i)
- as.Insert(a21i)
- as.Insert(a22i)
- as.Insert(a23i)
- return as
- }
- // GenerateMockAllocationSet creates generic allocation set without idle allocations
- func GenerateMockAllocationSet(start time.Time) *AllocationSet {
- // Active allocations
- a1111 := NewMockUnitAllocation("cluster1/namespace1/pod1/container1", start, day, &AllocationProperties{
- Cluster: "cluster1",
- Namespace: "namespace1",
- Pod: "pod1",
- Container: "container1",
- ProviderID: "c1nodes",
- Node: "c1nodes",
- })
- a1111.RAMCost = 11.00
- a1111.PVs = PVAllocations{
- PVKey{Cluster: "cluster1", Name: "pv-a1111"}: {
- ByteHours: 1,
- Cost: 1,
- },
- }
- a11abc2 := NewMockUnitAllocation("cluster1/namespace1/pod-abc/container2", start, day, &AllocationProperties{
- Cluster: "cluster1",
- Namespace: "namespace1",
- Pod: "pod-abc",
- Container: "container2",
- ProviderID: "c1nodes",
- Node: "c1nodes",
- })
- a11abc2.PVs = PVAllocations{
- PVKey{Cluster: "cluster1", Name: "pv-a11abc2"}: {
- ByteHours: 1,
- Cost: 1,
- },
- }
- a11def3 := NewMockUnitAllocation("cluster1/namespace1/pod-def/container3", start, day, &AllocationProperties{
- Cluster: "cluster1",
- Namespace: "namespace1",
- Pod: "pod-def",
- Container: "container3",
- ProviderID: "c1nodes",
- Node: "c1nodes",
- })
- a11def3.PVs = PVAllocations{
- PVKey{Cluster: "cluster1", Name: "pv-a11def3"}: {
- ByteHours: 1,
- Cost: 1,
- },
- }
- a12ghi4 := NewMockUnitAllocation("cluster1/namespace2/pod-ghi/container4", start, day, &AllocationProperties{
- Cluster: "cluster1",
- Namespace: "namespace2",
- Pod: "pod-ghi",
- Container: "container4",
- ProviderID: "c1nodes",
- Node: "c1nodes",
- })
- a12ghi4.PVs = PVAllocations{
- PVKey{Cluster: "cluster1", Name: "pv-a12ghi4"}: {
- ByteHours: 1,
- Cost: 1,
- },
- }
- a12ghi5 := NewMockUnitAllocation("cluster1/namespace2/pod-ghi/container5", start, day, &AllocationProperties{
- Cluster: "cluster1",
- Namespace: "namespace2",
- Pod: "pod-ghi",
- Container: "container5",
- ProviderID: "c1nodes",
- Node: "c1nodes",
- })
- a12ghi5.PVs = PVAllocations{
- PVKey{Cluster: "cluster1", Name: "pv-a12ghi5"}: {
- ByteHours: 1,
- Cost: 1,
- },
- }
- a12jkl6 := NewMockUnitAllocation("cluster1/namespace2/pod-jkl/container6", start, day, &AllocationProperties{
- Cluster: "cluster1",
- Namespace: "namespace2",
- Pod: "pod-jkl",
- Container: "container6",
- ProviderID: "c1nodes",
- Node: "c1nodes",
- })
- a12jkl6.PVs = PVAllocations{
- PVKey{Cluster: "cluster1", Name: "pv-a12jkl6"}: {
- ByteHours: 1,
- Cost: 1,
- },
- }
- a22mno4 := NewMockUnitAllocation("cluster2/namespace2/pod-mno/container4", start, day, &AllocationProperties{
- Cluster: "cluster2",
- Namespace: "namespace2",
- Pod: "pod-mno",
- Container: "container4",
- ProviderID: "node1",
- Node: "node1",
- })
- a22mno4.PVs = PVAllocations{
- PVKey{Cluster: "cluster2", Name: "pv-a22mno4"}: {
- ByteHours: 1,
- Cost: 1,
- },
- }
- a22mno5 := NewMockUnitAllocation("cluster2/namespace2/pod-mno/container5", start, day, &AllocationProperties{
- Cluster: "cluster2",
- Namespace: "namespace2",
- Pod: "pod-mno",
- Container: "container5",
- ProviderID: "node1",
- Node: "node1",
- })
- a22mno5.PVs = PVAllocations{
- PVKey{Cluster: "cluster2", Name: "pv-a22mno5"}: {
- ByteHours: 1,
- Cost: 1,
- },
- }
- a22pqr6 := NewMockUnitAllocation("cluster2/namespace2/pod-pqr/container6", start, day, &AllocationProperties{
- Cluster: "cluster2",
- Namespace: "namespace2",
- Pod: "pod-pqr",
- Container: "container6",
- ProviderID: "node2",
- Node: "node2",
- })
- a22pqr6.PVs = PVAllocations{
- PVKey{Cluster: "cluster2", Name: "pv-a22pqr6"}: {
- ByteHours: 1,
- Cost: 1,
- },
- }
- a23stu7 := NewMockUnitAllocation("cluster2/namespace3/pod-stu/container7", start, day, &AllocationProperties{
- Cluster: "cluster2",
- Namespace: "namespace3",
- Pod: "pod-stu",
- Container: "container7",
- ProviderID: "node2",
- Node: "node2",
- })
- a23stu7.PVs = PVAllocations{
- PVKey{Cluster: "cluster2", Name: "pv-a23stu7"}: {
- ByteHours: 1,
- Cost: 1,
- },
- }
- a23vwx8 := NewMockUnitAllocation("cluster2/namespace3/pod-vwx/container8", start, day, &AllocationProperties{
- Cluster: "cluster2",
- Namespace: "namespace3",
- Pod: "pod-vwx",
- Container: "container8",
- ProviderID: "node3",
- Node: "node3",
- })
- a23vwx8.PVs = PVAllocations{
- PVKey{Cluster: "cluster2", Name: "pv-a23vwx8"}: {
- ByteHours: 1,
- Cost: 1,
- },
- }
- a23vwx9 := NewMockUnitAllocation("cluster2/namespace3/pod-vwx/container9", start, day, &AllocationProperties{
- Cluster: "cluster2",
- Namespace: "namespace3",
- Pod: "pod-vwx",
- Container: "container9",
- ProviderID: "node3",
- Node: "node3",
- })
- a23vwx9.PVs = PVAllocations{
- PVKey{Cluster: "cluster2", Name: "pv-a23vwx9"}: {
- ByteHours: 1,
- Cost: 1,
- },
- }
- // Controllers
- a11abc2.Properties.ControllerKind = "deployment"
- a11abc2.Properties.Controller = "deployment1"
- a11def3.Properties.ControllerKind = "deployment"
- a11def3.Properties.Controller = "deployment1"
- a12ghi4.Properties.ControllerKind = "deployment"
- a12ghi4.Properties.Controller = "deployment2"
- a12ghi5.Properties.ControllerKind = "deployment"
- a12ghi5.Properties.Controller = "deployment2"
- a22mno4.Properties.ControllerKind = "deployment"
- a22mno4.Properties.Controller = "deployment2"
- a22mno5.Properties.ControllerKind = "deployment"
- a22mno5.Properties.Controller = "deployment2"
- a23stu7.Properties.ControllerKind = "deployment"
- a23stu7.Properties.Controller = "deployment3"
- a12jkl6.Properties.ControllerKind = "daemonset"
- a12jkl6.Properties.Controller = "daemonset1"
- a22pqr6.Properties.ControllerKind = "daemonset"
- a22pqr6.Properties.Controller = "daemonset1"
- a23vwx8.Properties.ControllerKind = "statefulset"
- a23vwx8.Properties.Controller = "statefulset1"
- a23vwx9.Properties.ControllerKind = "statefulset"
- a23vwx9.Properties.Controller = "statefulset1"
- // Labels
- a1111.Properties.Labels = map[string]string{"app": "app1", "env": "env1"}
- a12ghi4.Properties.Labels = map[string]string{"app": "app2", "env": "env2"}
- a12ghi5.Properties.Labels = map[string]string{"app": "app2", "env": "env2"}
- a22mno4.Properties.Labels = map[string]string{"app": "app2"}
- a22mno5.Properties.Labels = map[string]string{"app": "app2"}
- //Annotations
- a23stu7.Properties.Annotations = map[string]string{"team": "team1"}
- a23vwx8.Properties.Annotations = map[string]string{"team": "team2"}
- a23vwx9.Properties.Annotations = map[string]string{"team": "team1"}
- // Services
- a12jkl6.Properties.Services = []string{"service1"}
- a22pqr6.Properties.Services = []string{"service1"}
- return NewAllocationSet(start, start.Add(day),
- // cluster 1, namespace1
- a1111, a11abc2, a11def3,
- // cluster 1, namespace 2
- a12ghi4, a12ghi5, a12jkl6,
- // cluster 2, namespace 2
- a22mno4, a22mno5, a22pqr6,
- // cluster 2, namespace 3
- a23stu7, a23vwx8, a23vwx9,
- )
- }
- // GenerateMockAllocationSetWithAssetProperties with no idle and connections to Assets in properties
- func GenerateMockAllocationSetWithAssetProperties(start time.Time) *AllocationSet {
- as := GenerateMockAllocationSet(start)
- disk1 := PVKey{
- Cluster: "cluster2",
- Name: "disk1",
- }
- disk2 := PVKey{
- Cluster: "cluster2",
- Name: "disk2",
- }
- for _, a := range as.Allocations {
- // add reconcilable pvs to pod-mno
- if a.Properties.Pod == "pod-mno" {
- a.PVs = a.PVs.Add(PVAllocations{
- disk1: {
- Cost: 2.5,
- ByteHours: 2.5 * gb,
- },
- disk2: {
- Cost: 5,
- ByteHours: 5 * gb,
- },
- })
- }
- // add loadBalancer service to allocations
- if a.Name == "cluster2/namespace2/pod-mno/container4" {
- a.Properties.Services = append(a.Properties.Services, "loadBalancer1")
- }
- if a.Name == "cluster2/namespace2/pod-mno/container5" {
- a.Properties.Services = append(a.Properties.Services, "loadBalancer2")
- }
- if a.Name == "cluster2/namespace2/pod-pqr/container6" {
- a.Properties.Services = append(a.Properties.Services, "loadBalancer1")
- a.Properties.Services = append(a.Properties.Services, "loadBalancer2")
- }
- }
- return as
- }
- // GenerateMockAssetSets creates generic AssetSets
- func GenerateMockAssetSets(start, end time.Time) []*AssetSet {
- var assetSets []*AssetSet
- // Create an AssetSet representing cluster costs for two clusters (cluster1
- // and cluster2). Include Nodes and Disks for both, even though only
- // Nodes will be counted. Whereas in practice, Assets should be aggregated
- // by type, here we will provide multiple Nodes for one of the clusters to
- // make sure the function still holds.
- // NOTE: we're re-using GenerateMockAllocationSet so this has to line up with
- // the allocated node costs from that function. See table above.
- // | Hierarchy | Cost | CPU | RAM | GPU | Adjustment |
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster1:
- // nodes 100.00 55.00 44.00 11.00 -10.00
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster1 subtotal (adjusted) 100.00 50.00 40.00 10.00 0.00
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster1 allocated 48.00 6.00 16.00 6.00 0.00
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster1 idle 72.00 44.00 24.00 4.00 0.00
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster2:
- // node1 35.00 20.00 15.00 0.00 0.00
- // node2 35.00 20.00 15.00 0.00 0.00
- // node3 30.00 10.00 10.00 10.00 0.00
- // (disks should not matter for idle)
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster2 subtotal 100.00 50.00 40.00 10.00 0.00
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster2 allocated 28.00 6.00 6.00 6.00 0.00
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster2 idle 82.00 44.00 34.00 4.00 0.00
- // +-----------------------------------------+------+------+------+------+------------+
- cluster1Nodes := NewNode("c1nodes", "cluster1", "c1nodes", start, end, NewWindow(&start, &end))
- cluster1Nodes.CPUCost = 55.0
- cluster1Nodes.RAMCost = 44.0
- cluster1Nodes.GPUCost = 11.0
- cluster1Nodes.Adjustment = -10.00
- cluster1Nodes.CPUCoreHours = 8
- cluster1Nodes.RAMByteHours = 6
- cluster1Nodes.GPUHours = 24
- cluster2Node1 := NewNode("node1", "cluster2", "node1", start, end, NewWindow(&start, &end))
- cluster2Node1.CPUCost = 20.0
- cluster2Node1.RAMCost = 15.0
- cluster2Node1.GPUCost = 0.0
- cluster2Node1.CPUCoreHours = 4
- cluster2Node1.RAMByteHours = 3
- cluster2Node1.GPUHours = 0
- cluster2Node2 := NewNode("node2", "cluster2", "node2", start, end, NewWindow(&start, &end))
- cluster2Node2.CPUCost = 20.0
- cluster2Node2.RAMCost = 15.0
- cluster2Node2.GPUCost = 0.0
- cluster2Node2.CPUCoreHours = 3
- cluster2Node2.RAMByteHours = 2
- cluster2Node2.GPUHours = 0
- cluster2Node3 := NewNode("node3", "cluster2", "node3", start, end, NewWindow(&start, &end))
- cluster2Node3.CPUCost = 10.0
- cluster2Node3.RAMCost = 10.0
- cluster2Node3.GPUCost = 10.0
- cluster2Node3.CPUCoreHours = 2
- cluster2Node3.RAMByteHours = 2
- cluster2Node3.GPUHours = 24
- // Add PVs
- cluster2Disk1 := NewDisk("disk1", "cluster2", "disk1", start, end, NewWindow(&start, &end))
- cluster2Disk1.Cost = 5.0
- cluster2Disk1.Adjustment = 1.0
- cluster2Disk1.ByteHours = 5 * gb
- cluster2Disk2 := NewDisk("disk2", "cluster2", "disk2", start, end, NewWindow(&start, &end))
- cluster2Disk2.Cost = 10.0
- cluster2Disk2.Adjustment = 3.0
- cluster2Disk2.ByteHours = 10 * gb
- cluster2Node1Disk := NewDisk("node1", "cluster2", "node1", start, end, NewWindow(&start, &end))
- cluster2Node1Disk.Cost = 1.0
- cluster2Node1Disk.ByteHours = 5 * gb
- // Add Attached Disks
- cluster2Node2Disk := NewDisk("node2", "cluster2", "node2", start, end, NewWindow(&start, &end))
- cluster2Node2Disk.Cost = 2.0
- cluster2Node2Disk.ByteHours = 5 * gb
- cluster2Node3Disk := NewDisk("node3", "cluster2", "node3", start, end, NewWindow(&start, &end))
- cluster2Node3Disk.Cost = 3.0
- cluster2Node3Disk.ByteHours = 5 * gb
- // Add Cluster Management
- cluster1ClusterManagement := NewClusterManagement("", "cluster1", NewWindow(&start, &end))
- cluster1ClusterManagement.Cost = 2.0
- cluster2ClusterManagement := NewClusterManagement("", "cluster2", NewWindow(&start, &end))
- cluster2ClusterManagement.Cost = 2.0
- // Add Networks
- c1Network := NewNetwork("", "cluster1", "c1nodes", start, end, NewWindow(&start, &end))
- c1Network.Cost = 3.0
- node1Network := NewNetwork("node1", "cluster2", "node1", start, end, NewWindow(&start, &end))
- node1Network.Cost = 4.0
- node2Network := NewNetwork("node2", "cluster2", "node2", start, end, NewWindow(&start, &end))
- node2Network.Cost = 5.0
- node3Network := NewNetwork("node3", "cluster2", "node3", start, end, NewWindow(&start, &end))
- node3Network.Cost = 2.0
- // Add LoadBalancers
- cluster2LoadBalancer1 := NewLoadBalancer("namespace2/loadBalancer1", "cluster2", "lb1", start, end, NewWindow(&start, &end), false, "127.0.0.1")
- cluster2LoadBalancer1.Cost = 10.0
- cluster2LoadBalancer2 := NewLoadBalancer("namespace2/loadBalancer2", "cluster2", "lb2", start, end, NewWindow(&start, &end), false, "127.0.0.1")
- cluster2LoadBalancer2.Cost = 15.0
- assetSet1 := NewAssetSet(start, end, cluster1Nodes, cluster2Node1, cluster2Node2, cluster2Node3, cluster2Disk1,
- cluster2Disk2, cluster2Node1Disk, cluster2Node2Disk, cluster2Node3Disk, cluster1ClusterManagement,
- cluster2ClusterManagement, c1Network, node1Network, node2Network, node3Network, cluster2LoadBalancer1, cluster2LoadBalancer2)
- assetSets = append(assetSets, assetSet1)
- // NOTE: we're re-using GenerateMockAllocationSet so this has to line up with
- // the allocated node costs from that function. See table above.
- // | Hierarchy | Cost | CPU | RAM | GPU | Adjustment |
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster1:
- // nodes 100.00 5.00 4.00 1.00 90.00
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster1 subtotal (adjusted) 100.00 50.00 40.00 10.00 0.00
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster1 allocated 48.00 6.00 16.00 6.00 0.00
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster1 idle 72.00 44.00 24.00 4.00 0.00
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster2:
- // node1 35.00 20.00 15.00 0.00 0.00
- // node2 35.00 20.00 15.00 0.00 0.00
- // node3 30.00 10.00 10.00 10.00 0.00
- // (disks should not matter for idle)
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster2 subtotal 100.00 50.00 40.00 10.00 0.00
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster2 allocated 28.00 6.00 6.00 6.00 0.00
- // +-----------------------------------------+------+------+------+------+------------+
- // cluster2 idle 82.00 44.00 34.00 4.00 0.00
- // +-----------------------------------------+------+------+------+------+------------+
- cluster1Nodes = NewNode("", "cluster1", "c1nodes", start, end, NewWindow(&start, &end))
- cluster1Nodes.CPUCost = 5.0
- cluster1Nodes.RAMCost = 4.0
- cluster1Nodes.GPUCost = 1.0
- cluster1Nodes.Adjustment = 90.00
- cluster1Nodes.CPUCoreHours = 8
- cluster1Nodes.RAMByteHours = 6
- cluster1Nodes.GPUHours = 24
- cluster2Node1 = NewNode("node1", "cluster2", "node1", start, end, NewWindow(&start, &end))
- cluster2Node1.CPUCost = 20.0
- cluster2Node1.RAMCost = 15.0
- cluster2Node1.GPUCost = 0.0
- cluster2Node1.CPUCoreHours = 4
- cluster2Node1.RAMByteHours = 3
- cluster2Node1.GPUHours = 0
- cluster2Node2 = NewNode("node2", "cluster2", "node2", start, end, NewWindow(&start, &end))
- cluster2Node2.CPUCost = 20.0
- cluster2Node2.RAMCost = 15.0
- cluster2Node2.GPUCost = 0.0
- cluster2Node2.CPUCoreHours = 3
- cluster2Node2.RAMByteHours = 2
- cluster2Node2.GPUHours = 0
- cluster2Node3 = NewNode("node3", "cluster2", "node3", start, end, NewWindow(&start, &end))
- cluster2Node3.CPUCost = 10.0
- cluster2Node3.RAMCost = 10.0
- cluster2Node3.GPUCost = 10.0
- cluster2Node3.CPUCoreHours = 2
- cluster2Node3.RAMByteHours = 2
- cluster2Node3.GPUHours = 24
- // Add PVs
- cluster2Disk1 = NewDisk("disk1", "cluster2", "disk1", start, end, NewWindow(&start, &end))
- cluster2Disk1.Cost = 5.0
- cluster2Disk1.Adjustment = 1.0
- cluster2Disk1.ByteHours = 5 * gb
- cluster2Disk2 = NewDisk("disk2", "cluster2", "disk2", start, end, NewWindow(&start, &end))
- cluster2Disk2.Cost = 12.0
- cluster2Disk2.Adjustment = 4.0
- cluster2Disk2.ByteHours = 20 * gb
- assetSet2 := NewAssetSet(start, end, cluster1Nodes, cluster2Node1, cluster2Node2, cluster2Node3, cluster2Disk1,
- cluster2Disk2, cluster2Node1Disk, cluster2Node2Disk, cluster2Node3Disk, cluster1ClusterManagement,
- cluster2ClusterManagement, c1Network, node1Network, node2Network, node3Network, cluster2LoadBalancer1, cluster2LoadBalancer2)
- assetSets = append(assetSets, assetSet2)
- return assetSets
- }
- // GenerateMockAssetSet generates the following topology:
- //
- // | Asset | Cost | Adj |
- // +------------------------------+------+------+
- //
- // cluster1:
- // node1: 6.00 1.00
- // node2: 4.00 1.50
- // node3: 7.00 -0.50
- // disk1: 2.50 0.00
- // disk2: 1.50 0.00
- // clusterManagement1: 3.00 0.00
- //
- // +------------------------------+------+------+
- //
- // cluster1 subtotal 24.00 2.00
- //
- // +------------------------------+------+------+
- //
- // cluster2:
- // node4: 12.00 -1.00
- // disk3: 2.50 0.00
- // disk4: 1.50 0.00
- // clusterManagement2: 0.00 0.00
- //
- // +------------------------------+------+------+
- //
- // cluster2 subtotal 16.00 -1.00
- //
- // +------------------------------+------+------+
- //
- // cluster3:
- // node5: 17.00 2.00
- //
- // +------------------------------+------+------+
- //
- // cluster3 subtotal 17.00 2.00
- //
- // +------------------------------+------+------+
- //
- // total 57.00 3.00
- //
- // +------------------------------+------+------+
- func GenerateMockAssetSet(start time.Time, duration time.Duration) *AssetSet {
- end := start.Add(duration)
- window := NewWindow(&start, &end)
- hours := window.Duration().Hours()
- node1 := NewNode("node1", "cluster1", "gcp-node1", *window.Clone().start, *window.Clone().end, window.Clone())
- node1.CPUCost = 4.0
- node1.RAMCost = 4.0
- node1.GPUCost = 2.0
- node1.Discount = 0.5
- node1.CPUCoreHours = 2.0 * hours
- node1.RAMByteHours = 4.0 * gb * hours
- node1.GPUHours = 1.0 * hours
- node1.SetAdjustment(1.0)
- node1.SetLabels(map[string]string{"test": "test"})
- node2 := NewNode("node2", "cluster1", "gcp-node2", *window.Clone().start, *window.Clone().end, window.Clone())
- node2.CPUCost = 4.0
- node2.RAMCost = 4.0
- node2.GPUCost = 0.0
- node2.Discount = 0.5
- node2.CPUCoreHours = 2.0 * hours
- node2.RAMByteHours = 4.0 * gb * hours
- node2.GPUHours = 0.0 * hours
- node2.SetAdjustment(1.5)
- node3 := NewNode("node3", "cluster1", "gcp-node3", *window.Clone().start, *window.Clone().end, window.Clone())
- node3.CPUCost = 4.0
- node3.RAMCost = 4.0
- node3.GPUCost = 3.0
- node3.Discount = 0.5
- node3.CPUCoreHours = 2.0 * hours
- node3.RAMByteHours = 4.0 * gb * hours
- node3.GPUHours = 2.0 * hours
- node3.SetAdjustment(-0.5)
- node4 := NewNode("node4", "cluster2", "gcp-node4", *window.Clone().start, *window.Clone().end, window.Clone())
- node4.CPUCost = 10.0
- node4.RAMCost = 6.0
- node4.GPUCost = 0.0
- node4.Discount = 0.25
- node4.CPUCoreHours = 4.0 * hours
- node4.RAMByteHours = 12.0 * gb * hours
- node4.GPUHours = 0.0 * hours
- node4.SetAdjustment(-1.0)
- node5 := NewNode("node5", "cluster3", "aws-node5", *window.Clone().start, *window.Clone().end, window.Clone())
- node5.CPUCost = 10.0
- node5.RAMCost = 7.0
- node5.GPUCost = 0.0
- node5.Discount = 0.0
- node5.CPUCoreHours = 8.0 * hours
- node5.RAMByteHours = 24.0 * gb * hours
- node5.GPUHours = 0.0 * hours
- node5.SetAdjustment(2.0)
- disk1 := NewDisk("disk1", "cluster1", "gcp-disk1", *window.Clone().start, *window.Clone().end, window.Clone())
- disk1.Cost = 2.5
- disk1.ByteHours = 100 * gb * hours
- disk2 := NewDisk("disk2", "cluster1", "gcp-disk2", *window.Clone().start, *window.Clone().end, window.Clone())
- disk2.Cost = 1.5
- disk2.ByteHours = 60 * gb * hours
- disk3 := NewDisk("disk3", "cluster2", "gcp-disk3", *window.Clone().start, *window.Clone().end, window.Clone())
- disk3.Cost = 2.5
- disk3.ByteHours = 100 * gb * hours
- disk4 := NewDisk("disk4", "cluster2", "gcp-disk4", *window.Clone().start, *window.Clone().end, window.Clone())
- disk4.Cost = 1.5
- disk4.ByteHours = 100 * gb * hours
- cm1 := NewClusterManagement(GCPProvider, "cluster1", window.Clone())
- cm1.Cost = 3.0
- cm2 := NewClusterManagement(GCPProvider, "cluster2", window.Clone())
- cm2.Cost = 0.0
- return NewAssetSet(
- start, end,
- // cluster 1
- node1, node2, node3, disk1, disk2, cm1,
- // cluster 2
- node4, disk3, disk4, cm2,
- // cluster 3
- node5,
- )
- }
- // NewMockUnitSummaryAllocation creates an *SummaryAllocation with all of its float64 values set to 1 and generic properties if not provided in arg
- func NewMockUnitSummaryAllocation(name string, start time.Time, resolution time.Duration, props *AllocationProperties) *SummaryAllocation {
- if name == "" {
- name = "cluster1/namespace1/pod1/container1"
- }
- properties := &AllocationProperties{}
- if props == nil {
- properties.Cluster = "cluster1"
- properties.Node = "node1"
- properties.Namespace = "namespace1"
- properties.ControllerKind = "deployment"
- properties.Controller = "deployment1"
- properties.Pod = "pod1"
- properties.Container = "container1"
- } else {
- properties = props
- }
- end := start.Add(resolution)
- alloc := &SummaryAllocation{
- Name: name,
- Properties: properties,
- Start: start,
- End: end,
- CPUCost: 1,
- CPUCoreRequestAverage: 1,
- CPUCoreUsageAverage: 1,
- GPUCost: 1,
- NetworkCost: 1,
- LoadBalancerCost: 1,
- RAMCost: 1,
- RAMBytesRequestAverage: 1,
- RAMBytesUsageAverage: 1,
- }
- // If idle allocation, remove non-idle costs, but maintain total cost
- if alloc.IsIdle() {
- alloc.NetworkCost = 0.0
- alloc.LoadBalancerCost = 0.0
- alloc.CPUCost += 1.0
- alloc.RAMCost += 1.0
- }
- return alloc
- }
- // NewMockUnitSummaryAllocationSet creates an *SummaryAllocationSet
- func NewMockUnitSummaryAllocationSet(start time.Time, resolution time.Duration) *SummaryAllocationSet {
- end := start.Add(resolution)
- sas := &SummaryAllocationSet{
- Window: NewWindow(&start, &end),
- }
- return sas
- }
|