114 lines
3.2 KiB
Go
114 lines
3.2 KiB
Go
// Copyright 2021 The Kubernetes Authors.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package api
|
|
|
|
import (
|
|
"sort"
|
|
|
|
v1 "k8s.io/api/core/v1"
|
|
metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
"k8s.io/metrics/pkg/apis/metrics"
|
|
)
|
|
|
|
func addPodMetricsToTable(table *metav1beta1.Table, pods ...metrics.PodMetrics) {
|
|
usage := make(v1.ResourceList, 3)
|
|
var names []string
|
|
for i, pod := range pods {
|
|
for k := range usage {
|
|
delete(usage, k)
|
|
}
|
|
for _, container := range pod.Containers {
|
|
for k, v := range container.Usage {
|
|
u := usage[k]
|
|
u.Add(v)
|
|
usage[k] = u
|
|
}
|
|
}
|
|
if names == nil {
|
|
for k := range usage {
|
|
names = append(names, string(k))
|
|
}
|
|
sort.Strings(names)
|
|
|
|
table.ColumnDefinitions = []metav1beta1.TableColumnDefinition{
|
|
{Name: "Name", Type: "string", Format: "name", Description: "Name of the resource"},
|
|
}
|
|
for _, name := range names {
|
|
table.ColumnDefinitions = append(table.ColumnDefinitions, metav1beta1.TableColumnDefinition{
|
|
Name: name,
|
|
Type: "string",
|
|
Format: "quantity",
|
|
})
|
|
}
|
|
table.ColumnDefinitions = append(table.ColumnDefinitions, metav1beta1.TableColumnDefinition{
|
|
Name: "Window",
|
|
Type: "string",
|
|
Format: "duration",
|
|
})
|
|
}
|
|
row := make([]interface{}, 0, len(names)+1)
|
|
row = append(row, pod.Name)
|
|
for _, name := range names {
|
|
v := usage[v1.ResourceName(name)]
|
|
row = append(row, v.String())
|
|
}
|
|
row = append(row, pod.Window.Duration.String())
|
|
table.Rows = append(table.Rows, metav1beta1.TableRow{
|
|
Cells: row,
|
|
Object: runtime.RawExtension{Object: &pods[i]},
|
|
})
|
|
}
|
|
}
|
|
|
|
func addNodeMetricsToTable(table *metav1beta1.Table, nodes ...metrics.NodeMetrics) {
|
|
var names []string
|
|
for i, node := range nodes {
|
|
if names == nil {
|
|
for k := range node.Usage {
|
|
names = append(names, string(k))
|
|
}
|
|
sort.Strings(names)
|
|
|
|
table.ColumnDefinitions = []metav1beta1.TableColumnDefinition{
|
|
{Name: "Name", Type: "string", Format: "name", Description: "Name of the resource"},
|
|
}
|
|
for _, name := range names {
|
|
table.ColumnDefinitions = append(table.ColumnDefinitions, metav1beta1.TableColumnDefinition{
|
|
Name: name,
|
|
Type: "string",
|
|
Format: "quantity",
|
|
})
|
|
}
|
|
table.ColumnDefinitions = append(table.ColumnDefinitions, metav1beta1.TableColumnDefinition{
|
|
Name: "Window",
|
|
Type: "string",
|
|
Format: "duration",
|
|
})
|
|
}
|
|
row := make([]interface{}, 0, len(names)+1)
|
|
row = append(row, node.Name)
|
|
for _, name := range names {
|
|
v := node.Usage[v1.ResourceName(name)]
|
|
row = append(row, v.String())
|
|
}
|
|
row = append(row, node.Window.Duration.String())
|
|
table.Rows = append(table.Rows, metav1beta1.TableRow{
|
|
Cells: row,
|
|
Object: runtime.RawExtension{Object: &nodes[i]},
|
|
})
|
|
}
|
|
}
|