Skip to content

Commit

Permalink
feat: Initial attemp to display stopped/terminated pods in pods table…
Browse files Browse the repository at this point in the history
… when Show stopped pods is enabled
  • Loading branch information
tiithansen committed Jun 29, 2024
1 parent 7644581 commit 407d624
Show file tree
Hide file tree
Showing 15 changed files with 287 additions and 105 deletions.
199 changes: 139 additions & 60 deletions src/common/promql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,41 +73,6 @@ class PromQLBinaryExpression extends PromQLExpression {
}
}

export enum ComparisonOperators {
EQUALS = '==',
NOT_EQUALS = '!=',
GREATER_THAN = '>',
LESS_THAN = '<',
GREATER_THAN_OR_EQUALS = '>=',
LESS_THAN_OR_EQUALS = '<=',
}

class PromQLComparisonExpression extends PromQLExpression {

constructor(private operator: ComparisonOperators, private left: PromQLExpression, private right: PromQLExpression) {
super();
}

stringify() {
return `${this.left.stringify()} ${this.operator} ${this.right.stringify()} `;
}
}

enum LogicalOperators {
AND = 'and',
OR = 'or',
}

class PromQLLogicalExpression extends PromQLExpression {
constructor(private operator: LogicalOperators, private left: PromQLExpression, private right: PromQLExpression) {
super();
}

stringify() {
return `${this.left.stringify()} ${this.operator} (${this.right.stringify()}) `;
}
}


export abstract class PromQLVectorExpression extends PromQLExpression {

Expand Down Expand Up @@ -148,6 +113,41 @@ export abstract class PromQLVectorExpression extends PromQLExpression {
}
}

enum LogicalOperators {
AND = 'and',
OR = 'or',
}

class PromQLLogicalExpression extends PromQLVectorExpression {
constructor(private operator: LogicalOperators, private left: PromQLExpression, private right: PromQLExpression) {
super();
}

stringify() {
return `${this.left.stringify()} ${this.operator} (${this.right.stringify()}) `;
}
}

export enum ComparisonOperators {
EQUALS = '==',
NOT_EQUALS = '!=',
GREATER_THAN = '>',
LESS_THAN = '<',
GREATER_THAN_OR_EQUALS = '>=',
LESS_THAN_OR_EQUALS = '<=',
}

class PromQLComparisonExpression extends PromQLVectorExpression {

constructor(private operator: ComparisonOperators, private left: PromQLExpression, private right: PromQLExpression) {
super();
}

stringify() {
return `${this.left.stringify()} ${this.operator} ${this.right.stringify()} `;
}
}

class PromQLScalarExpression extends PromQLVectorExpression {
constructor(private scalar: number, private left?: PromQLExpression) {
super();
Expand Down Expand Up @@ -260,20 +260,58 @@ class PromQLWithoutExpression extends PromQLExpression {
}
}

class PromQLRangeVectorExpression extends PromQLVectorExpression {

constructor(private vectorExpression: PromQLVectorExpression, private range: string) {
super()
}

stringify(): string {
return `${this.vectorExpression.stringify()}[${this.range}]`
}
}

abstract class PromQLFunctionArg {
abstract stringify(): string
}

class PromQLVectorExpressionFunctionArg extends PromQLFunctionArg {
constructor(private arg: PromQLVectorExpression) {
super()
}

stringify(): string {
return this.arg.stringify()
}
}

class PromQLStringFunctionArg extends PromQLFunctionArg {
constructor(private arg: string) {
super()
}

stringify(): string {
return `"${this.arg}"`
}
}

class PromQLFunction extends PromQLVectorExpression {

constructor(private name: string, private subExpression: PromQLExpression) {
constructor(private name: string, private args: PromQLFunctionArg[]) {
super();
}

stringify() {
return `${this.name}(
${this.subExpression.stringify()}${this.stringifyInner()}
${this.serializeArgs()}
)`;
}

stringifyInner() {
return ''
private serializeArgs() {
return this.args.map(
arg => arg.stringify()
)
.join(', ')
}
}

Expand All @@ -298,46 +336,75 @@ class PromQLAggregationFunction extends PromQLFunction {

class PromQLSumFunction extends PromQLAggregationFunction {

constructor(subExpression: PromQLExpression) {
super('sum', subExpression);
constructor(subExpression: PromQLVectorExpression) {
super('sum', [
new PromQLVectorExpressionFunctionArg(subExpression)
]);
}
}

class PromQLMaxFunction extends PromQLAggregationFunction {

constructor(subExpression: PromQLExpression) {
super('max', subExpression);
constructor(subExpression: PromQLVectorExpression) {
super('max', [
new PromQLVectorExpressionFunctionArg(subExpression)
]);
}
}

class PromQLGroupFunction extends PromQLAggregationFunction {

constructor(subExpression: PromQLExpression) {
super('group', subExpression);
constructor(subExpression: PromQLVectorExpression) {
super('group', [
new PromQLVectorExpressionFunctionArg(subExpression)
])
}
}

class PromQLCountFunction extends PromQLAggregationFunction {

constructor(subExpression: PromQLExpression) {
super('count', subExpression);
constructor(subExpression: PromQLVectorExpression) {
super('count', [
new PromQLVectorExpressionFunctionArg(subExpression)
])
}
}

class PromQLSortFunction extends PromQLFunction {

constructor(direction: 'asc' | 'desc', subExpression: PromQLExpression) {
super(`sort${direction === 'desc' ? '_desc' : ''}`, subExpression);
constructor(direction: 'asc' | 'desc', subExpression: PromQLVectorExpression) {
super(`sort${direction === 'desc' ? '_desc' : ''}`, [
new PromQLVectorExpressionFunctionArg(subExpression)
])
}
}

class PromQLRateFunction extends PromQLFunction {
constructor(private range: string, subExpression: PromQLExpression) {
super('rate', subExpression);
constructor(subExpression: PromQLRangeVectorExpression) {
super('rate', [
new PromQLVectorExpressionFunctionArg(subExpression)
])
}
}

class PromQLPresentOverTimeFunction extends PromQLFunction {

constructor(subExpression: PromQLRangeVectorExpression) {
super('present_over_time', [
new PromQLVectorExpressionFunctionArg(subExpression)
])
}
}

stringifyInner() {
return `[${this.range}]`;
class PromQLLabelReplaceFunction extends PromQLFunction {
constructor(exp: PromQLVectorExpression, dest: string, sourceLabel: string, replacement: string, regex: string) {
super('label_replace', [
new PromQLVectorExpressionFunctionArg(exp),
new PromQLStringFunctionArg(dest),
new PromQLStringFunctionArg(sourceLabel),
new PromQLStringFunctionArg(replacement),
new PromQLStringFunctionArg(regex),
])
}
}

Expand All @@ -346,27 +413,39 @@ export class PromQL {
return new PromQLMetric(name);
}

static sum(subExpression: PromQLExpression) {
static withRange(subExpression: PromQLVectorExpression, range: string) {
return new PromQLRangeVectorExpression(subExpression, range)
}

static sum(subExpression: PromQLVectorExpression) {
return new PromQLSumFunction(subExpression);
}

static sort(direction: 'asc' | 'desc', subExpression: PromQLExpression) {
static sort(direction: 'asc' | 'desc', subExpression: PromQLVectorExpression) {
return new PromQLSortFunction(direction, subExpression);
}

static rate(subExpression: PromQLExpression, range: string) {
return new PromQLRateFunction(range, subExpression);
static rate(subExpression: PromQLRangeVectorExpression) {
return new PromQLRateFunction(subExpression);
}

static max(subExpression: PromQLExpression) {
static max(subExpression: PromQLVectorExpression) {
return new PromQLMaxFunction(subExpression);
}

static group(subExpression: PromQLExpression) {
static group(subExpression: PromQLVectorExpression) {
return new PromQLGroupFunction(subExpression);
}

static count(subExpression: PromQLExpression) {
static count(subExpression: PromQLVectorExpression) {
return new PromQLCountFunction(subExpression);
}

static presentOverTime(subExpression: PromQLRangeVectorExpression) {
return new PromQLPresentOverTimeFunction(subExpression);
}

static labelReplace(exp: PromQLVectorExpression, dest: string, sourceLabel: string, replacement: string, regex: string) {
return new PromQLLabelReplaceFunction(exp, dest, sourceLabel, replacement, regex);
}
}
3 changes: 2 additions & 1 deletion src/components/AlertsTable/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,8 @@ export function AlertsTable(labelFilters?: LabelFilters, showVariableControls =
asyncDataRowMapper: rowMapper,
$data: queryBuilder.rootQueryBuilder(variables, defaultSorting),
queryBuilder: queryBuilder,
expandedRowBuilder: expandedRowSceneBuilder(createRowId)
expandedRowBuilder: expandedRowSceneBuilder(createRowId),
sorting: defaultSorting,
}),
}),
],
Expand Down
15 changes: 14 additions & 1 deletion src/components/AsyncTable/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ interface TableState<TableRow> extends SceneObjectState {
expandedRows?: SceneObject[];
asyncRowData?: Map<string, number[]>;
visibleRowIds?: string;
sorting?: SortingState;
sorting: SortingState;
columns: Array<Column<TableRow>>;
createRowId: (row: TableRow) => string;
asyncDataRowMapper: (row: TableRow, asyncRowData: any) => void;
Expand Down Expand Up @@ -231,7 +231,20 @@ export class AsyncTable<TableRow> extends SceneObjectBase<TableState<TableRow>>
}
}

public rebuildQuery() {
const sortingConfig = this.getColumnById(this.state.sorting!.columnId)?.sortingConfig;
this.setState({
...this.state,
$data: this.state.queryBuilder.rootQueryBuilder(sceneGraph.getVariables(this), this.state.sorting!, sortingConfig)
});
}

static Component = (props: SceneComponentProps<AsyncTable<any>>) => {

useEffect(() => {
props.model.rebuildQuery();
}, [props.model]);

const { data } = sceneGraph.getData(props.model).useState();
const { asyncRowData, sorting, columns, asyncDataRowMapper } = props.model.useState();
const sortingConfig = sorting ? props.model.getColumnById(sorting.columnId)?.sortingConfig : undefined;
Expand Down
3 changes: 2 additions & 1 deletion src/components/ResourceBreakdownTable/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,8 @@ export const ResourceBreakdownTable = () => {
queryBuilder: {
rowQueryBuilder: createRowQueries,
rootQueryBuilder: createRootQuery,
}
},
sorting: defaultSorting,
}),
}),
],
Expand Down
8 changes: 3 additions & 5 deletions src/components/ToggleVariable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,8 @@ export class ToggleVariable extends SceneObjectBase<ToggleVariableState> impleme
this.setValue(event.target.checked);
}

public setValue(newValue: boolean) {
console.log(newValue, this.state.value)
if (newValue !== this.state.value) {
public setValue(newValue: boolean, forceUpdate = false) {
if (newValue !== this.state.value || forceUpdate) {
this.setState({ value: newValue });
this.publishEvent(new SceneVariableValueChangedEvent(this), true);
}
Expand All @@ -60,7 +59,6 @@ export class ToggleVariable extends SceneObjectBase<ToggleVariableState> impleme
const update: Partial<ToggleVariableState> = {};
const val = values[this.getKey()];
update.value = val === 'true';

this.setState(update);
}

Expand All @@ -70,7 +68,7 @@ export class ToggleVariable extends SceneObjectBase<ToggleVariableState> impleme

return (
<span className={cx(styles.switchWrap)}>
<Switch value={value} onChange={model.onChangeFn} />;
<Switch value={value} onChange={model.onChangeFn} />
</span>
);
};
Expand Down
1 change: 1 addition & 0 deletions src/metrics/metrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export const Metrics = {
labels:{
namespace: 'namespace',
pod: 'pod',
uid: 'uid'
}
},
kubePodContainerInfo: {
Expand Down
1 change: 1 addition & 0 deletions src/pages/Clusters/tabs/Nodes/Nodes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,7 @@ export const getNodesScene = () => {
queryBuilder,
createRowId: (row) => row.internal_ip,
expandedRowBuilder: buildExpandedRowScene,
sorting: defaultSorting,
}),
}),
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,5 +250,6 @@ export const getContainersScene = (staticLabelFilters: LabelFilters, showVariabl
asyncDataRowMapper: asyncDataRowMapper,
createRowId: (row: TableRow) => row.container,
queryBuilder,
sorting: defaultSorting,
})
}
1 change: 1 addition & 0 deletions src/pages/Workloads/tabs/CronJobs/CronJobs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ export const getCronJobsScene = () => {
createRowId: (row: TableRow) => `${row.namespace}/${row.cronjob}`,
queryBuilder: queryBuilder,
asyncDataRowMapper: asyncDataRowMapper,
sorting: defaultSorting,
}),
}),
],
Expand Down
Loading

0 comments on commit 407d624

Please sign in to comment.