// // Networks section. // const { Controller } = require("./Controller"); const { NetworkTreeItem } = require("../TreeItems/NetworkTreeItem"); const { ContainerCLI } = require("../../Interfaces/ContainerCLI"); const networks = require("../Models/Network"); const notify = require("../../Utilities/Notify"); const prompt = require("../../Utilities/Prompt"); class NetworksController extends Controller { constructor(sidebar) { super("apple_container.networks"); this.sidebar = sidebar; this.registerCommands(); } async fetch() { return networks.build(await ContainerCLI.listNetworks()); } getTreeItem(element) { return new NetworkTreeItem(element); } registerCommands() { this.register("apple_container.networks.reload", () => this.reload()); this.register("apple_container.networks.create", async () => { // A name on its own is the common case, but `container network // create` also takes --subnet, --internal and friends, so the whole // argument line is accepted here. let answer = await prompt.input("Network name, and any options", { placeholder: "backend --subnet 192.168.70.0/24" }); if (!answer) { return; } try { await ContainerCLI.createNetwork(answer.split(/\s+/)); } catch (error) { notify.failure("Unable to create network", error, "apple-container-network"); } this.reload(); }); this.register("apple_container.networks.inspect", async () => { for (let network of this.selection) { try { let output = await ContainerCLI.inspectNetwork(network.name); nova.workspace.openNewTextDocument({ content: output, syntax: "json" }); } catch (error) { notify.failure("Unable to inspect network", error, "apple-container-inspect"); } } }); this.register("apple_container.networks.copy", () => { let network = this.selection[0]; if (network) { nova.clipboard.writeText(network.subnet || network.name); } }); this.register("apple_container.networks.delete", async () => { let selected = this.selection; let builtin = selected.filter((network) => network.builtin); if (builtin.length > 0) { notify.info( "Built-in network", `${builtin.map((network) => network.name).join(", ")} is managed by Apple Container and cannot be deleted.`, "apple-container-network-builtin" ); return; } let names = selected.map((network) => network.name); if (names.length === 0 || !(await prompt.confirm(`Delete ${names.join(", ")}?`))) { return; } try { await ContainerCLI.deleteNetworks(names); } catch (error) { notify.failure("Unable to delete network", error, "apple-container-delete-network"); } this.reload(); }); this.register("apple_container.networks.prune", async () => { if (!(await prompt.confirm("Remove networks with no connected containers?", "Remove"))) { return; } try { await ContainerCLI.pruneNetworks(); } catch (error) { notify.failure("Unable to prune networks", error, "apple-container-prune-network"); } this.reload(); }); } } module.exports = { NetworksController };