Maowl Open Maowl

Network management: a data center inventory

A data center's whole infrastructure as tables, from its racks and routers down to the software running on each machine.

Open this model in Maowl The Network management sample model in Maowl, with the Layers tab open in the side panel

What the model shows

On the hardware side, the data center contains routers and racks. Racks hold switches and machines, and each machine has a type. On the network side, routers, switches, machines, and network zones all route to interfaces. Interfaces connect to zones and to each other, and they expose ports. A connection joins two ports. On the software side, machines run three kinds of process: operating system, application, and service. The application and service processes listen on ports. Operating systems, services, and other software each have a chain of versions. Applications depend on services, other software, and specific versions.

It's the larger of the two samples, and a good one for exploring layers: Hardware, Network, and Software each hold one part of the data center, and you can show or hide each part on its own. Some tables have two names, such as Router and Egress, some foreign keys point from a table to itself, such as from one Version to the one before it, and three different foreign keys run from Port to Interface.

Tables and columns

Application_Process

Connection

DataCenter

Interface

Machine

Network_Zone

Os_Process

Port

Rack

Router

Router_Egress

Service_Process

Software

Software_Application

Software_Os

Software_Service

Switch

Type

Version

Foreign keys

Layers

Design notes

SQL

Here's the PostgreSQL script Maowl exports for this model: one CREATE TABLE statement per table, with its primary key and foreign keys, then the indexes. Choose another database in the Export dialog, such as MySQL, SQL Server, or Snowflake, to get the same tables for it.

CREATE TABLE DataCenter (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name VARCHAR(100),
  location VARCHAR(100)
);

CREATE TABLE Type (
  id INTEGER PRIMARY KEY,
  name VARCHAR(100),
  type VARCHAR(100),
  cpu INTEGER,
  ram INTEGER,
  disk INTEGER
);

CREATE TABLE Rack (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name VARCHAR(100),
  rack INTEGER,
  zone INTEGER,
  dataCenterId INTEGER,
  CONSTRAINT CONTAINS_3 FOREIGN KEY (dataCenterId) REFERENCES DataCenter (id)
);

CREATE TABLE Switch (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  ip INET,
  rack INTEGER,
  rackId INTEGER,
  CONSTRAINT HOLDS FOREIGN KEY (rackId) REFERENCES Rack (id)
);

CREATE TABLE Router (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name VARCHAR(100),
  zone INTEGER,
  dataCenterId INTEGER,
  CONSTRAINT CONTAINS FOREIGN KEY (dataCenterId) REFERENCES DataCenter (id)
);

CREATE TABLE Router_Egress (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name VARCHAR(100),
  dataCenterId INTEGER,
  CONSTRAINT CONTAINS_2 FOREIGN KEY (dataCenterId) REFERENCES DataCenter (id)
);

CREATE TABLE Network_Zone (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  ip INET,
  "size" INTEGER,
  zone INTEGER
);

CREATE TABLE Software_Os (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name VARCHAR(100),
  versions TEXT[]
);

CREATE TABLE Software (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name VARCHAR(100)
);

CREATE TABLE Version (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name VARCHAR(100),
  softwareOsId INTEGER,
  softwareServiceId INTEGER,
  softwareId INTEGER,
  previousVersionId INTEGER,
  CONSTRAINT VERSION FOREIGN KEY (softwareOsId) REFERENCES Software_Os (id),
  CONSTRAINT VERSION_3 FOREIGN KEY (softwareId) REFERENCES Software (id),
  CONSTRAINT PREVIOUS FOREIGN KEY (previousVersionId) REFERENCES Version (id)
);

CREATE TABLE Machine (
  id INTEGER PRIMARY KEY,
  name VARCHAR(100),
  rackId INTEGER,
  typeId INTEGER,
  updateToVersionId INTEGER,
  updateRequestedAt TIMESTAMPTZ,
  CONSTRAINT HOLDS_2 FOREIGN KEY (rackId) REFERENCES Rack (id),
  CONSTRAINT TYPE FOREIGN KEY (typeId) REFERENCES Type (id),
  CONSTRAINT UPDATE_TO FOREIGN KEY (updateToVersionId) REFERENCES Version (id)
);

CREATE TABLE Interface (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  ip INET,
  routerId INTEGER,
  routerEgressId INTEGER,
  switchId INTEGER,
  machineId INTEGER,
  networkZoneId INTEGER,
  connectsNetworkZoneId INTEGER,
  connectsInterfaceId INTEGER,
  connectionsInterfaceId INTEGER,
  CONSTRAINT ROUTES FOREIGN KEY (routerId) REFERENCES Router (id),
  CONSTRAINT ROUTES_2 FOREIGN KEY (routerEgressId) REFERENCES Router_Egress (id),
  CONSTRAINT ROUTES_3 FOREIGN KEY (switchId) REFERENCES Switch (id),
  CONSTRAINT ROUTES_4 FOREIGN KEY (machineId) REFERENCES Machine (id),
  CONSTRAINT ROUTES_5 FOREIGN KEY (networkZoneId) REFERENCES Network_Zone (id),
  CONSTRAINT CONNECTS FOREIGN KEY (connectsNetworkZoneId) REFERENCES Network_Zone (id),
  CONSTRAINT CONNECTS_2 FOREIGN KEY (connectsInterfaceId) REFERENCES Interface (id),
  CONSTRAINT CONNECTIONS FOREIGN KEY (connectionsInterfaceId) REFERENCES Interface (id)
);

CREATE TABLE Port (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  port INTEGER,
  interfaceId INTEGER,
  opensInterfaceId INTEGER,
  listensInterfaceId INTEGER,
  CONSTRAINT EXPOSES FOREIGN KEY (interfaceId) REFERENCES Interface (id),
  CONSTRAINT OPENS FOREIGN KEY (opensInterfaceId) REFERENCES Interface (id),
  CONSTRAINT LISTENS FOREIGN KEY (listensInterfaceId) REFERENCES Interface (id)
);

CREATE TABLE Connection (
  id VARCHAR(64) PRIMARY KEY,
  source VARCHAR(100),
  target VARCHAR(100),
  "user" VARCHAR(100),
  time INTEGER,
  fromPortId INTEGER,
  toPortId INTEGER,
  CONSTRAINT "FROM" FOREIGN KEY (fromPortId) REFERENCES Port (id),
  CONSTRAINT "TO" FOREIGN KEY (toPortId) REFERENCES Port (id)
);

CREATE TABLE Os_Process (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name VARCHAR(100),
  startTime INTEGER,
  machineId INTEGER,
  versionId INTEGER,
  CONSTRAINT RUNS FOREIGN KEY (machineId) REFERENCES Machine (id),
  CONSTRAINT INSTANCE FOREIGN KEY (versionId) REFERENCES Version (id)
);

CREATE TABLE Software_Service (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name VARCHAR(100),
  versions TEXT[],
  ports INTEGER[],
  dependencies TEXT[],
  versionId INTEGER,
  CONSTRAINT DEPENDS_ON_2 FOREIGN KEY (versionId) REFERENCES Version (id)
);

CREATE TABLE Service_Process (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name VARCHAR(100),
  pid INTEGER,
  startTime INTEGER,
  machineId INTEGER,
  portId INTEGER,
  softwareServiceId INTEGER,
  versionId INTEGER,
  CONSTRAINT RUNS_3 FOREIGN KEY (machineId) REFERENCES Machine (id),
  CONSTRAINT LISTENS_3 FOREIGN KEY (portId) REFERENCES Port (id),
  CONSTRAINT INSTANCE_3 FOREIGN KEY (softwareServiceId) REFERENCES Software_Service (id),
  CONSTRAINT INSTANCE_4 FOREIGN KEY (versionId) REFERENCES Version (id)
);

CREATE TABLE Software_Application (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name VARCHAR(100),
  ports INTEGER[],
  dependencies TEXT[],
  versionId INTEGER,
  softwareServiceId INTEGER,
  softwareId INTEGER,
  CONSTRAINT DEPENDS_ON_3 FOREIGN KEY (versionId) REFERENCES Version (id),
  CONSTRAINT DEPENDS_ON_4 FOREIGN KEY (softwareServiceId) REFERENCES Software_Service (id),
  CONSTRAINT DEPENDS_ON_5 FOREIGN KEY (softwareId) REFERENCES Software (id)
);

CREATE TABLE Application_Process (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name VARCHAR(100),
  pid INTEGER,
  startTime INTEGER,
  machineId INTEGER,
  portId INTEGER,
  serviceProcessId INTEGER,
  softwareApplicationId INTEGER,
  CONSTRAINT RUNS_2 FOREIGN KEY (machineId) REFERENCES Machine (id),
  CONSTRAINT LISTENS_2 FOREIGN KEY (portId) REFERENCES Port (id),
  CONSTRAINT DEPENDS_ON FOREIGN KEY (serviceProcessId) REFERENCES Service_Process (id),
  CONSTRAINT INSTANCE_2 FOREIGN KEY (softwareApplicationId) REFERENCES Software_Application (id)
);

ALTER TABLE Version ADD CONSTRAINT VERSION_2 FOREIGN KEY (softwareServiceId) REFERENCES Software_Service (id);

CREATE INDEX idx_software_name ON Software (name);
CREATE INDEX idx_machine_name ON Machine (name);
CREATE UNIQUE INDEX idx_interface_ip ON Interface (ip);
CREATE INDEX idx_connection_time ON Connection (time);

Source

The model is based on neo4j-graph-examples/network-management on GitHub. Download the model as network-management.json.