Skip to content

Commit f25779f

Browse files
feat: list running programs (#129)
Closes #114 This PR shows a list of running programs when a host is selected, allowing to stop programs as needed. Known issues: - When starting a program, the selected program resets to "Send ICMP echo" (will be fixed in another PR) --------- Co-authored-by: Pedro Gallino <[email protected]>
1 parent e41fc1a commit f25779f

File tree

8 files changed

+200
-144
lines changed

8 files changed

+200
-144
lines changed

src/graphics/renderables/device_info.ts

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
import { ProgramRunner } from "../../programs";
1+
import { ProgramRunner, RunningProgram } from "../../programs";
22
import { Device } from "../../types/devices";
33
import { DeviceType } from "../../types/devices/device";
44
import { ViewGraph } from "../../types/graphs/viewgraph";
55
import { RemoveDeviceMove } from "../../types/undo-redo";
6-
import { urManager } from "../../types/viewportManager";
6+
import { refreshElement, urManager } from "../../types/viewportManager";
77
import {
88
createDropdown,
9-
createToggleTable,
109
createRightBarButton,
10+
createTable,
11+
createRoutingTable,
1112
} from "../right_bar";
1213
import { ProgramInfo } from "./program_info";
1314
import { StyledInfo } from "./styled_info";
@@ -58,7 +59,7 @@ export class DeviceInfo extends StyledInfo {
5859
}
5960

6061
// First argument is to avoid a circular dependency
61-
addProgramList(runner: ProgramRunner, programs: ProgramInfo[]) {
62+
addProgramRunner(runner: ProgramRunner, programs: ProgramInfo[]) {
6263
const programOptions = programs.map(({ name }, i) => {
6364
return { value: i.toString(), text: name };
6465
});
@@ -78,10 +79,22 @@ export class DeviceInfo extends StyledInfo {
7879
console.log("Started program: ", name);
7980
const inputs = selectedProgram.getInputValues();
8081
runner.addRunningProgram(name, inputs);
82+
refreshElement();
8183
}),
8284
);
8385
}
8486

87+
addRunningProgramsList(
88+
runner: ProgramRunner,
89+
runningPrograms: RunningProgram[],
90+
) {
91+
if (runningPrograms.length === 0) {
92+
return;
93+
}
94+
const table = createProgramsTable(runner, runningPrograms);
95+
this.inputFields.push(table);
96+
}
97+
8598
addRoutingTable(viewgraph: ViewGraph, deviceId: number) {
8699
const entries = viewgraph.getRoutingTable(deviceId);
87100

@@ -91,7 +104,7 @@ export class DeviceInfo extends StyledInfo {
91104
`eth${entry.iface}`,
92105
]);
93106

94-
const dynamicTable = createToggleTable(
107+
const dynamicTable = createRoutingTable(
95108
"Routing Table",
96109
["IP", "Mask", "Interface"],
97110
rows,
@@ -121,3 +134,26 @@ function getTypeName(device: Device): string {
121134
return "Switch";
122135
}
123136
}
137+
138+
function createProgramsTable(
139+
runner: ProgramRunner,
140+
runningPrograms: RunningProgram[],
141+
) {
142+
const onDelete = (row: number) => {
143+
const { pid } = runningPrograms[row];
144+
runner.removeRunningProgram(pid);
145+
refreshElement();
146+
return true;
147+
};
148+
const rows = runningPrograms.map((program) => [
149+
program.pid.toString(),
150+
program.name,
151+
JSON.stringify(program.inputs),
152+
]);
153+
const headers = ["PID", "Name", "Inputs"];
154+
// TODO: make table editable?
155+
const table = createTable(headers, rows, { onDelete });
156+
table.id = "running-programs-table";
157+
table.classList.add("right-bar-table");
158+
return table;
159+
}

0 commit comments

Comments
 (0)