diff --git a/client/src/components/chart.js b/client/src/components/chart.js
index 048f5b2..3d35ae2 100644
--- a/client/src/components/chart.js
+++ b/client/src/components/chart.js
@@ -10,7 +10,9 @@ const options = {
showLabel: false,
};
-export default function Chart({used = 0, usedSuffix, available = 0, availableSuffix, pending = 0, decimals = 1}) { // eslint-disable-line max-len
+export default function Chart(props) {
+ const {used = 0, usedSuffix, available = 0, availableSuffix, pending = 0, decimals = 1} = props;
+
const fixedUsed = _.round(used, decimals);
const fixedPending = _.round(pending, decimals);
const fixedAvailable = _.round(available, decimals);
diff --git a/client/src/components/cpuChart.js b/client/src/components/cpuChart.js
index b46f70a..5923493 100644
--- a/client/src/components/cpuChart.js
+++ b/client/src/components/cpuChart.js
@@ -6,15 +6,20 @@ import {parseCpu, TO_ONE_CPU} from '../utils/unitHelpers';
export default function CpuChart({items, metrics}) {
const totals = getPodCpuTotals(items, metrics);
+ const decimals = totals && totals.used > 10 ? 1 : 2;
return (
{totals ? (
-
+
) : (
)}
-
Requested Cpu Use
+
Cores Used
);
}
diff --git a/client/src/components/podsPanel.js b/client/src/components/podsPanel.js
index e94490b..1a1bf90 100644
--- a/client/src/components/podsPanel.js
+++ b/client/src/components/podsPanel.js
@@ -7,6 +7,24 @@ import Sorter from './sorter';
import {parseRam, unparseRam, parseCpu, unparseCpu} from '../utils/unitHelpers';
export default class PodsPanel extends Base {
+ constructor(props) {
+ super(props);
+ this.sortByCpu = this.sortByCpu.bind(this);
+ this.sortByRam = this.sortByRam.bind(this);
+ }
+
+ sortByCpu(item) {
+ const actual = getCpuUsage(item, this.props.metrics);
+ const requested = getCpuRequest(item);
+ return actual / requested;
+ }
+
+ sortByRam(item) {
+ const actual = getRamUsage(item, this.props.metrics);
+ const requested = getRamRequest(item);
+ return actual / requested;
+ }
+
render() {
const {items, metrics, sort, filter, skipNamespace, skipNodeName} = this.props;
const col = 8 + !skipNamespace + !skipNodeName;
@@ -23,19 +41,21 @@ export default class PodsPanel extends Base {
Status |
Containers |
Restarts |
-
- {/* TODO: support sorting by metrics */}
- Cpu
-
- actual vs. request
-
+
+ Cpu
+
+ actual vs. request
+
+
|
- Ram
-
- actual vs. request
-
+
+ Ram
+
+ actual vs. request
+
+
|
@@ -71,47 +91,37 @@ function getRestartCount({status}) {
}
function Cpu({item, metrics}) {
- if (!item || !metrics) return null;
-
- const {containers} = metrics[item.metadata.name] || {};
+ const containers = getContainerMetrics(item, metrics);
if (!containers) return null;
- const actual = _.sumBy(containers, x => parseCpu(x.usage.cpu));
- const podContainers = item.spec.containers.filter(x => x.resources && x.resources.requests);
- const requested = _.sumBy(podContainers, x => parseCpu(x.resources.requests.cpu));
+ const actual = getCpuUsage(item, metrics);
+ const requested = getCpuRequest(item);
+ return ;
+}
- const isWarning = requested && (actual > requested);
- const actualCpu = unparseCpu(actual);
- const requestedCpu = unparseCpu(requested);
- const percent = requested ? _.round(actual / requested * 100, 1) : 100;
+function getCpuUsage(item, metrics) {
+ const containers = getContainerMetrics(item, metrics);
+ return _.sumBy(containers, x => parseCpu(x.usage.cpu));
+}
- return (
-
-
{requested ? `${percent}%` : 'N/A'}
-
- {actualCpu.value}{actualCpu.unit}
- of
- {requestedCpu.value}{requestedCpu.unit}
-
-
- );
+function getCpuRequest(item) {
+ const podContainers = _.filter(item.spec.containers, x => x.resources && x.resources.requests);
+ return _.sumBy(podContainers, x => parseCpu(x.resources.requests.cpu));
}
function Ram({item, metrics}) {
- if (!item || !metrics) return null;
-
- const {containers} = metrics[item.metadata.name] || {};
+ const containers = getContainerMetrics(item, metrics);
if (!containers) return null;
- const actual = _.sumBy(containers, x => parseRam(x.usage.memory));
- const requested = _.sumBy(item.spec.containers, (x) => {
- if (!x.resources.requests) return 0;
- return parseRam(x.resources.requests.memory);
- });
+ const actual = getRamUsage(item, metrics);
+ const requested = getRamRequest(item);
+ return ;
+}
+function Chart({actual, requested, unparser}) {
const isWarning = requested && (actual > requested);
- const actualRam = unparseRam(actual);
- const requestedRam = unparseRam(requested);
+ const actualRam = unparser(actual);
+ const requestedRam = unparser(requested);
const percent = requested ? _.round(actual / requested * 100, 1) : 100;
return (
@@ -125,3 +135,21 @@ function Ram({item, metrics}) {
);
}
+
+function getRamUsage(item, metrics) {
+ const containers = getContainerMetrics(item, metrics);
+ return _.sumBy(containers, x => parseRam(x.usage.memory));
+}
+
+function getRamRequest(item) {
+ return _.sumBy(item.spec.containers, (x) => {
+ if (!x.resources.requests) return 0;
+ return parseRam(x.resources.requests.memory);
+ });
+}
+
+function getContainerMetrics(item, metrics) {
+ if (!item || !metrics) return null;
+ const metric = metrics[item.metadata.name] || {};
+ return metric.containers;
+}
diff --git a/client/src/components/ramChart.js b/client/src/components/ramChart.js
index ee8e08f..4b46c08 100644
--- a/client/src/components/ramChart.js
+++ b/client/src/components/ramChart.js
@@ -6,15 +6,22 @@ import {parseRam, TO_GB} from '../utils/unitHelpers';
export default function RamChart({items, metrics}) {
const totals = getPodRamTotals(items, metrics);
+ const decimals = totals && totals.used > 10 ? 1 : 2;
return (
{totals ? (
-
+
) : (
)}
-
Requested Ram Use
+
Ram Used
);
}
diff --git a/client/src/services/api.js b/client/src/services/api.js
index a2d7bbf..e01079e 100644
--- a/client/src/services/api.js
+++ b/client/src/services/api.js
@@ -1,5 +1,5 @@
import _ from 'lodash';
-import {request, stream, streamResult, streamResults, getToken} from './apiProxy';
+import {request, stream, streamResult, streamResults} from './apiProxy';
import log from '../utils/log';
const JSON_HEADERS = {Accept: 'application/json', 'Content-Type': 'application/json'};
@@ -40,15 +40,9 @@ const apis = {
roleBinding: apiFactoryWithNamespace('/apis/rbac.authorization.k8s.io/v1', 'rolebindings'),
};
-function testAuth() {
- const token = getToken();
- const body = {
- apiVerstion: 'authentication.k8s.io/v1',
- kind: 'TokenReview',
- spec: {token},
- };
-
- return post('/apis/authentication.k8s.io/v1/tokenreviews', body, false);
+async function testAuth() {
+ const spec = {resourceAttributes: {}};
+ return post('apis/authorization.k8s.io/v1/selfsubjectaccessreviews', {spec}, false);
}
async function apply(body) {
diff --git a/client/src/utils/unitHelpers.js b/client/src/utils/unitHelpers.js
index b519462..22565ed 100644
--- a/client/src/utils/unitHelpers.js
+++ b/client/src/utils/unitHelpers.js
@@ -52,6 +52,7 @@ export function parseCpu(value) {
const number = parseInt(value, 10);
if (value.endsWith('n')) return number;
+ if (value.endsWith('u')) return number * 1000;
if (value.endsWith('m')) return number * 1000 * 1000;
return number * 1000 * 1000 * 1000;
}
diff --git a/client/src/views/auth.js b/client/src/views/auth.js
index 317a65a..86a939d 100644
--- a/client/src/views/auth.js
+++ b/client/src/views/auth.js
@@ -14,6 +14,10 @@ const LOGIN_MESSAGE = 'Invalid credentials';
const ERROR_MESSAGE = 'Error occured attempting to login';
export default class Auth extends Base {
+ state = {
+ token: '',
+ };
+
async componentDidMount() {
const url = new URL(window.location.href);
const code = url.searchParams.get('code');
@@ -46,10 +50,10 @@ export default class Auth extends Base {
className='auth_input'
placeholder='Enter your auth token here...'
spellCheck='false'
- defaultValue={token}
+ value={token}
onChange={x => this.setState({token: x.target.value})}
/>
-