Skip to content

Commit

Permalink
Add cluster view of ephemeral storage
Browse files Browse the repository at this point in the history
  • Loading branch information
akrzos committed Feb 13, 2021
1 parent 9cd6542 commit 8d51b18
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 37 deletions.
3 changes: 3 additions & 0 deletions .github/workflows/integration-kind.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ jobs:
- uses: actions/checkout@v2

- uses: engineerd/setup-kind@v0.5.0
with:
version: "v0.10.0"

- name: Check kind cluster
run: |
Expand All @@ -30,6 +32,7 @@ jobs:
- name: Run kubeSize commands
run: |
bin/kubectl-capacity c
bin/kubectl-capacity c -e
bin/kubectl-capacity nr
bin/kubectl-capacity no
bin/kubectl-capacity ns
16 changes: 15 additions & 1 deletion cmd/capacity/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,11 @@ var clusterCmd = &cobra.Command{
clusterCapacityData.TotalCapacityPods.Add(*node.Status.Capacity.Pods())
clusterCapacityData.TotalCapacityCPU.Add(*node.Status.Capacity.Cpu())
clusterCapacityData.TotalCapacityMemory.Add(*node.Status.Capacity.Memory())
clusterCapacityData.TotalCapacityEphemeralStorage.Add(*node.Status.Capacity.StorageEphemeral())
clusterCapacityData.TotalAllocatablePods.Add(*node.Status.Allocatable.Pods())
clusterCapacityData.TotalAllocatableCPU.Add(*node.Status.Allocatable.Cpu())
clusterCapacityData.TotalAllocatableMemory.Add(*node.Status.Allocatable.Memory())
clusterCapacityData.TotalAllocatableEphemeralStorage.Add(*node.Status.Allocatable.StorageEphemeral())
}
clusterCapacityData.TotalUnreadyNodeCount = clusterCapacityData.TotalNodeCount - clusterCapacityData.TotalReadyNodeCount

Expand All @@ -97,6 +99,8 @@ var clusterCmd = &cobra.Command{
clusterCapacityData.TotalLimitsCPU.Add(*container.Resources.Limits.Cpu())
clusterCapacityData.TotalRequestsMemory.Add(*container.Resources.Requests.Memory())
clusterCapacityData.TotalLimitsMemory.Add(*container.Resources.Limits.Memory())
clusterCapacityData.TotalRequestsEphemeralStorage.Add(*container.Resources.Requests.StorageEphemeral())
clusterCapacityData.TotalLimitsEphemeralStorage.Add(*container.Resources.Limits.StorageEphemeral())
}
}

Expand All @@ -106,31 +110,41 @@ var clusterCmd = &cobra.Command{
clusterCapacityData.TotalAvailableCPU.Sub(clusterCapacityData.TotalRequestsCPU)
clusterCapacityData.TotalAvailableMemory = clusterCapacityData.TotalAllocatableMemory
clusterCapacityData.TotalAvailableMemory.Sub(clusterCapacityData.TotalRequestsMemory)
clusterCapacityData.TotalAvailableEphemeralStorage = clusterCapacityData.TotalAllocatableEphemeralStorage
clusterCapacityData.TotalAvailableEphemeralStorage.Sub(clusterCapacityData.TotalRequestsEphemeralStorage)

// Populate "Human" readable capacity data values
clusterCapacityData.TotalCapacityCPUCores = capacity.ReadableCPU(clusterCapacityData.TotalCapacityCPU)
clusterCapacityData.TotalCapacityMemoryGiB = capacity.ReadableMem(clusterCapacityData.TotalCapacityMemory)
clusterCapacityData.TotalCapacityEphemeralStorageGB = capacity.ReadableStorage(clusterCapacityData.TotalCapacityEphemeralStorage)
clusterCapacityData.TotalAllocatableCPUCores = capacity.ReadableCPU(clusterCapacityData.TotalAllocatableCPU)
clusterCapacityData.TotalAllocatableMemoryGiB = capacity.ReadableMem(clusterCapacityData.TotalAllocatableMemory)
clusterCapacityData.TotalAllocatableEphemeralStorageGB = capacity.ReadableStorage(clusterCapacityData.TotalAllocatableEphemeralStorage)
clusterCapacityData.TotalAvailableCPUCores = capacity.ReadableCPU(clusterCapacityData.TotalAvailableCPU)
clusterCapacityData.TotalAvailableMemoryGiB = capacity.ReadableMem(clusterCapacityData.TotalAvailableMemory)
clusterCapacityData.TotalAvailableEphemeralStorageGB = capacity.ReadableStorage(clusterCapacityData.TotalAvailableEphemeralStorage)
clusterCapacityData.TotalRequestsCPUCores = capacity.ReadableCPU(clusterCapacityData.TotalRequestsCPU)
clusterCapacityData.TotalLimitsCPUCores = capacity.ReadableCPU(clusterCapacityData.TotalLimitsCPU)
clusterCapacityData.TotalRequestsMemoryGiB = capacity.ReadableMem(clusterCapacityData.TotalRequestsMemory)
clusterCapacityData.TotalLimitsMemoryGiB = capacity.ReadableMem(clusterCapacityData.TotalLimitsMemory)
clusterCapacityData.TotalRequestsEphemeralStorageGB = capacity.ReadableStorage(clusterCapacityData.TotalRequestsEphemeralStorage)
clusterCapacityData.TotalLimitsEphemeralStorageGB = capacity.ReadableStorage(clusterCapacityData.TotalLimitsEphemeralStorage)

displayDefault, _ := cmd.Flags().GetBool("default-format")

displayEphemeralStorage, _ := cmd.Flags().GetBool("ephemeral-storage")

displayNoHeaders, _ := cmd.Flags().GetBool("no-headers")

displayFormat, _ := cmd.Flags().GetString("output")

output.DisplayClusterData(*clusterCapacityData, displayDefault, !displayNoHeaders, displayFormat)
output.DisplayClusterData(*clusterCapacityData, displayDefault, !displayNoHeaders, displayEphemeralStorage, displayFormat)

return nil
},
}

func init() {
rootCmd.AddCommand(clusterCmd)
clusterCmd.Flags().BoolP("ephemeral-storage", "e", false, "Display ephemeral storage")
}
7 changes: 6 additions & 1 deletion internal/capacity/capacity.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ func ReadableCPU(cpu resource.Quantity) float64 {
}

func ReadableMem(mem resource.Quantity) float64 {
// Convert from KiB to GiB
// Convert from KiB to GiB (Gibibyte)
return float64(mem.Value()) / 1024 / 1024 / 1024
}

func ReadableStorage(storage resource.Quantity) float64 {
// Convert from KiB to GB (Gigabyte)
return float64(storage.Value()) / 1000 / 1000 / 1000
}
103 changes: 68 additions & 35 deletions internal/output/output.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,35 +37,45 @@ const (

// Available = allocatable - (scheduled aka non-term pod or requests.cpu/memory)
type ClusterCapacityData struct {
TotalNodeCount int
TotalReadyNodeCount int
TotalUnreadyNodeCount int
TotalUnschedulableNodeCount int
TotalPodCount int
TotalNonTermPodCount int
TotalCapacityPods resource.Quantity
TotalCapacityCPU resource.Quantity
TotalCapacityCPUCores float64
TotalCapacityMemory resource.Quantity
TotalCapacityMemoryGiB float64
TotalAllocatablePods resource.Quantity
TotalAllocatableCPU resource.Quantity
TotalAllocatableCPUCores float64
TotalAllocatableMemory resource.Quantity
TotalAllocatableMemoryGiB float64
TotalAvailablePods int
TotalRequestsCPU resource.Quantity
TotalRequestsCPUCores float64
TotalLimitsCPU resource.Quantity
TotalLimitsCPUCores float64
TotalAvailableCPU resource.Quantity
TotalAvailableCPUCores float64
TotalRequestsMemory resource.Quantity
TotalRequestsMemoryGiB float64
TotalLimitsMemory resource.Quantity
TotalLimitsMemoryGiB float64
TotalAvailableMemory resource.Quantity
TotalAvailableMemoryGiB float64
TotalNodeCount int
TotalReadyNodeCount int
TotalUnreadyNodeCount int
TotalUnschedulableNodeCount int
TotalPodCount int
TotalNonTermPodCount int
TotalCapacityPods resource.Quantity
TotalCapacityCPU resource.Quantity
TotalCapacityCPUCores float64
TotalCapacityMemory resource.Quantity
TotalCapacityMemoryGiB float64
TotalCapacityEphemeralStorage resource.Quantity
TotalCapacityEphemeralStorageGB float64
TotalAllocatablePods resource.Quantity
TotalAllocatableCPU resource.Quantity
TotalAllocatableCPUCores float64
TotalAllocatableMemory resource.Quantity
TotalAllocatableMemoryGiB float64
TotalAllocatableEphemeralStorage resource.Quantity
TotalAllocatableEphemeralStorageGB float64
TotalAvailablePods int
TotalRequestsCPU resource.Quantity
TotalRequestsCPUCores float64
TotalLimitsCPU resource.Quantity
TotalLimitsCPUCores float64
TotalAvailableCPU resource.Quantity
TotalAvailableCPUCores float64
TotalRequestsMemory resource.Quantity
TotalRequestsMemoryGiB float64
TotalLimitsMemory resource.Quantity
TotalLimitsMemoryGiB float64
TotalAvailableMemory resource.Quantity
TotalAvailableMemoryGiB float64
TotalRequestsEphemeralStorage resource.Quantity
TotalRequestsEphemeralStorageGB float64
TotalLimitsEphemeralStorage resource.Quantity
TotalLimitsEphemeralStorageGB float64
TotalAvailableEphemeralStorage resource.Quantity
TotalAvailableEphemeralStorageGB float64
}

type NodeCapacityData struct {
Expand Down Expand Up @@ -113,7 +123,7 @@ type NamespaceCapacityData struct {
TotalLimitsMemoryGiB float64
}

func DisplayClusterData(clusterCapacityData ClusterCapacityData, displayDefault bool, displayHeaders bool, displayFormat string) {
func DisplayClusterData(clusterCapacityData ClusterCapacityData, displayDefault bool, displayHeaders bool, displayEphemeralStorage bool, displayFormat string) {
switch displayFormat {
case jsonDisplay:
jsonClusterData, err := json.MarshalIndent(&clusterCapacityData, "", " ")
Expand All @@ -134,11 +144,24 @@ func DisplayClusterData(clusterCapacityData ClusterCapacityData, displayDefault
w.Init(os.Stdout, 0, 5, 1, ' ', 0)
if displayHeaders {
if displayDefault {
fmt.Fprintln(w, "NODES\t\t\t\tPODS\t\t\t\t\tCPU\t\t\t\t\tMEMORY\t\t\t")
fmt.Fprintf(w, "NODES\t\t\t\tPODS\t\t\t\t\tCPU\t\t\t\t\tMEMORY\t\t\t\t\t")
if displayEphemeralStorage {
fmt.Fprintf(w, "EPHEMERAL STORAGE")
}
fmt.Fprintln(w, "")
} else {
fmt.Fprintf(w, "NODES\t\t\t\tPODS\t\t\t\t\tCPU (cores)\t\t\t\t\tMEMORY (GiB)\t\t\t\t\t")
if displayEphemeralStorage {
fmt.Fprintf(w, "EPHEMERAL STORAGE (GB)")
}
fmt.Fprintln(w, "")
}
fmt.Fprintf(w, "Total\tReady\tUnready\tUnsch\tCapacity\tAllocatable\tTotal\tNon-Term\tAvail\tCapacity\tAllocatable\tRequests\tLimits\tAvail\tCapacity\tAllocatable\tRequests\tLimits\tAvail\t")
if displayEphemeralStorage {
fmt.Fprintln(w, "Capacity\tAllocatable\tRequests\tLimits\tAvail")
} else {
fmt.Fprintln(w, "NODES\t\t\t\tPODS\t\t\t\t\tCPU (cores)\t\t\t\t\tMEMORY (GiB)\t\t\t")
fmt.Fprintln(w, "")
}
fmt.Fprintln(w, "Total\tReady\tUnready\tUnsch\tCapacity\tAllocatable\tTotal\tNon-Term\tAvail\tCapacity\tAllocatable\tRequests\tLimits\tAvail\tCapacity\tAllocatable\tRequests\tLimits\tAvail")
}
fmt.Fprintf(w, "%d\t%d\t%d\t%d\t", clusterCapacityData.TotalNodeCount, clusterCapacityData.TotalReadyNodeCount, clusterCapacityData.TotalUnreadyNodeCount, clusterCapacityData.TotalUnschedulableNodeCount)
fmt.Fprintf(w, "%s\t%s\t", &clusterCapacityData.TotalCapacityPods, &clusterCapacityData.TotalAllocatablePods)
Expand All @@ -150,14 +173,24 @@ func DisplayClusterData(clusterCapacityData ClusterCapacityData, displayDefault
fmt.Fprintf(w, "%s\t", &clusterCapacityData.TotalAvailableCPU)
fmt.Fprintf(w, "%s\t%s\t", &clusterCapacityData.TotalCapacityMemory, &clusterCapacityData.TotalAllocatableMemory)
fmt.Fprintf(w, "%s\t%s\t", &clusterCapacityData.TotalRequestsMemory, &clusterCapacityData.TotalLimitsMemory)
fmt.Fprintf(w, "%s\t\n", &clusterCapacityData.TotalAvailableMemory)
if displayEphemeralStorage {
fmt.Fprintf(w, "%s\t%s\t%s\t", &clusterCapacityData.TotalAvailableMemory, &clusterCapacityData.TotalCapacityEphemeralStorage, &clusterCapacityData.TotalAllocatableEphemeralStorage)
fmt.Fprintf(w, "%s\t%s\t%s\t\n", &clusterCapacityData.TotalRequestsEphemeralStorage, &clusterCapacityData.TotalLimitsEphemeralStorage, &clusterCapacityData.TotalAvailableEphemeralStorage)
} else {
fmt.Fprintf(w, "%s\t\n", &clusterCapacityData.TotalAvailableMemory)
}
} else {
fmt.Fprintf(w, "%.1f\t%.1f\t", clusterCapacityData.TotalCapacityCPUCores, clusterCapacityData.TotalAllocatableCPUCores)
fmt.Fprintf(w, "%.1f\t%.1f\t", clusterCapacityData.TotalRequestsCPUCores, clusterCapacityData.TotalLimitsCPUCores)
fmt.Fprintf(w, "%.1f\t", clusterCapacityData.TotalAvailableCPUCores)
fmt.Fprintf(w, "%.1f\t%.1f\t", clusterCapacityData.TotalCapacityMemoryGiB, clusterCapacityData.TotalAllocatableMemoryGiB)
fmt.Fprintf(w, "%.1f\t%.1f\t", clusterCapacityData.TotalRequestsMemoryGiB, clusterCapacityData.TotalLimitsMemoryGiB)
fmt.Fprintf(w, "%.1f\t\n", clusterCapacityData.TotalAvailableMemoryGiB)
if displayEphemeralStorage {
fmt.Fprintf(w, "%.1f\t%.1f\t%.1f\t", clusterCapacityData.TotalAvailableMemoryGiB, clusterCapacityData.TotalCapacityEphemeralStorageGB, clusterCapacityData.TotalAllocatableEphemeralStorageGB)
fmt.Fprintf(w, "%.1f\t%.1f\t%.1f\t\n", clusterCapacityData.TotalRequestsEphemeralStorageGB, clusterCapacityData.TotalLimitsEphemeralStorageGB, clusterCapacityData.TotalAvailableEphemeralStorageGB)
} else {
fmt.Fprintf(w, "%.1f\t\n", clusterCapacityData.TotalAvailableMemoryGiB)
}
}
w.Flush()
}
Expand Down

0 comments on commit 8d51b18

Please sign in to comment.