# Infrastructure Architecture - Final Design **Date:** 2025-10-23 **Decision:** Use dedicated infrastructure tables with hierarchical relationships --- ## Existing Schema (Already in Database!) ### IDFs (Intermediate Distribution Frames) ```sql idfs: - idfid INT(11) PK - idfname VARCHAR(100) - description VARCHAR(255) - maptop, mapleft INT(11) -- map coordinates - isactive BIT(1) ``` **No parent** - IDFs are top-level containers ### Cameras ```sql cameras: - cameraid INT(11) PK - modelid INT(11) → models.modelnumberid → vendors - idfid INT(11) → idfs.idfid Already has parent! - serialnumber VARCHAR(100) - macaddress VARCHAR(17) Camera-specific - ipaddress VARCHAR(45) - description VARCHAR(255) - maptop, mapleft INT(11) - isactive BIT(1) ``` ### Switches ```sql switches: - switchid INT(11) PK - modelid INT(11) → models.modelnumberid → vendors - serialnumber VARCHAR(100) - ipaddress VARCHAR(45) - description VARCHAR(255) - maptop, mapleft INT(11) - isactive BIT(1) ``` **Missing:** `idfid` (switches should belong to IDFs) ### Servers ```sql servers: - serverid INT(11) PK - modelid INT(11) → models.modelnumberid → vendors - serialnumber VARCHAR(100) - ipaddress VARCHAR(45) - description VARCHAR(255) - maptop, mapleft INT(11) - isactive BIT(1) ``` **Optional:** `idfid` (servers might be in IDFs) --- ## Hierarchical Relationships ``` IDFs (top level) ├─ Switches (belong to IDF) │ └─ Cameras (might connect to switch) └─ Cameras (belong to IDF) └─ Servers (might be in IDF) ``` --- ## Migration Needed ### Step 1: Add idfid to switches (Required) ```sql ALTER TABLE switches ADD COLUMN idfid INT(11) AFTER modelid, ADD INDEX idx_switches_idfid (idfid), ADD CONSTRAINT fk_switches_idf FOREIGN KEY (idfid) REFERENCES idfs(idfid) ON DELETE SET NULL; ``` ### Step 2: Add idfid to servers (Optional) ```sql ALTER TABLE servers ADD COLUMN idfid INT(11) AFTER modelid, ADD INDEX idx_servers_idfid (idfid), ADD CONSTRAINT fk_servers_idf FOREIGN KEY (idfid) REFERENCES idfs(idfid) ON DELETE SET NULL; ``` ### Step 3: Ensure modelid exists (migration script handles this) Run `add_infrastructure_vendor_model_support.sql` --- ## Page Architecture ### Unified List Page + Type-Specific Detail Pages **Why:** Different device types have different fields, so unified edit forms would be messy. ### Files (7 total): ``` network_devices.asp → Unified list with tabs/filter network_device_detail_idf.asp?id=5 → IDF detail/edit network_device_detail_server.asp?id=3 → Server detail/edit network_device_detail_switch.asp?id=2 → Switch detail/edit network_device_detail_camera.asp?id=1 → Camera detail/edit add_network_device.asp?type=idf → Add form (type selector) save_network_device.asp → Universal save (routes by type) ``` --- ## Page 1: network_devices.asp (Unified List) ### Features - **Tabs:** All | IDFs | Servers | Switches | Cameras - **Single table** showing all infrastructure - **Click device** → routes to appropriate detail page based on type ### Routing Logic ```vbscript Select Case rs("device_type") Case "IDF" detailUrl = "network_device_detail_idf.asp?id=" & rs("device_id") Case "Server" detailUrl = "network_device_detail_server.asp?id=" & rs("device_id") Case "Switch" detailUrl = "network_device_detail_switch.asp?id=" & rs("device_id") Case "Camera" detailUrl = "network_device_detail_camera.asp?id=" & rs("device_id") End Select ``` --- ## Page 2: network_device_detail_idf.asp ### Unique Fields - **idfname** (no model/vendor - IDFs are just locations) - **description** - **Map coordinates** ### Form Fields ```html ``` ### No Parent Selection IDFs are top-level, no parent dropdown needed. --- ## Page 3: network_device_detail_server.asp ### Fields - **Model/Vendor dropdown** (modelid) - **Serial number** - **IP address** - **Description** - **IDF dropdown** (optional - which IDF is this server in?) - **Map coordinates** ### IDF Dropdown ```vbscript
``` --- ## Page 4: network_device_detail_switch.asp ### Fields - **Model/Vendor dropdown** (modelid) - **Serial number** - **IP address** - **Description** - **IDF dropdown** (required - which IDF is this switch in?) - **Port count** (optional - could add this field) - **Map coordinates** ### IDF Dropdown (Required for switches) ```vbscript
Switches must be assigned to an IDF
``` --- ## Page 5: network_device_detail_camera.asp ### Fields - **Model/Vendor dropdown** (modelid) - **Serial number** - **MAC address** (cameras have this!) - **IP address** - **Description** - **IDF dropdown** (required - which IDF does this camera connect to?) - **Switch dropdown** (optional - which switch port?) - **Map coordinates** ### IDF Dropdown (Required) ```vbscript
``` ### MAC Address Field (Unique to cameras) ```vbscript
``` --- ## Page 6: add_network_device.asp ### Step 1: Device Type Selector Show cards for IDF, Server, Switch, Camera ### Step 2: Type-Specific Form Route to appropriate form based on selected type: - `add_network_device.asp?type=idf` → IDF form (no model) - `add_network_device.asp?type=server` → Server form (model + optional IDF) - `add_network_device.asp?type=switch` → Switch form (model + required IDF) - `add_network_device.asp?type=camera` → Camera form (model + required IDF + MAC) --- ## Page 7: save_network_device.asp ### Universal Save Endpoint ```vbscript <% Dim deviceType deviceType = Request.Form("type") ' Route to appropriate table Select Case deviceType Case "idf" tableName = "idfs" ' Save: idfname, description, maptop, mapleft ' No modelid Case "server" tableName = "servers" ' Save: modelid, idfid (optional), serialnumber, ipaddress, description, maptop, mapleft Case "switch" tableName = "switches" ' Save: modelid, idfid (required), serialnumber, ipaddress, description, maptop, mapleft Case "camera" tableName = "cameras" ' Save: modelid, idfid (required), serialnumber, macaddress, ipaddress, description, maptop, mapleft End Select %> ``` --- ## Navigation Menu ```html
  • Network Devices
  • Network Map
  • ``` --- ## network_map.asp Integration ### Current State Currently queries `machines` table filtering for infrastructure machine types. ### New Approach Query both machines AND infrastructure tables: ```vbscript <% ' Get infrastructure devices strSQL = "SELECT 'IDF' as type, idfid as id, idfname as name, NULL as model, NULL as vendor, " & _ "maptop, mapleft, 'IDF' as device_type " & _ "FROM idfs WHERE isactive = 1 AND maptop IS NOT NULL " & _ "UNION ALL " & _ "SELECT 'Server' as type, serverid as id, description as name, m.modelnumber as model, v.vendor, " & _ "s.maptop, s.mapleft, 'Server' as device_type " & _ "FROM servers s " & _ "LEFT JOIN models m ON s.modelid = m.modelnumberid " & _ "LEFT JOIN vendors v ON m.vendorid = v.vendorid " & _ "WHERE s.isactive = 1 AND s.maptop IS NOT NULL " & _ "UNION ALL " & _ "SELECT 'Switch' as type, switchid as id, description as name, m.modelnumber as model, v.vendor, " & _ "sw.maptop, sw.mapleft, 'Switch' as device_type " & _ "FROM switches sw " & _ "LEFT JOIN models m ON sw.modelid = m.modelnumberid " & _ "LEFT JOIN vendors v ON m.vendorid = v.vendorid " & _ "WHERE sw.isactive = 1 AND sw.maptop IS NOT NULL " & _ "UNION ALL " & _ "SELECT 'Camera' as type, cameraid as id, description as name, m.modelnumber as model, v.vendor, " & _ "c.maptop, c.mapleft, 'Camera' as device_type " & _ "FROM cameras c " & _ "LEFT JOIN models m ON c.modelid = m.modelnumberid " & _ "LEFT JOIN vendors v ON m.vendorid = v.vendorid " & _ "WHERE c.isactive = 1 AND c.maptop IS NOT NULL" Set rs = objConn.Execute(strSQL) ' Output JSON for map markers Response.Write("const devices = [") Do While Not rs.EOF Response.Write("{") Response.Write("type: '" & rs("device_type") & "', ") Response.Write("id: " & rs("id") & ", ") Response.Write("name: '" & Replace(rs("name") & "", "'", "\'") & "', ") Response.Write("model: '" & Replace(rs("model") & "", "'", "\'") & "', ") Response.Write("vendor: '" & Replace(rs("vendor") & "", "'", "\'") & "', ") Response.Write("x: " & rs("mapleft") & ", ") Response.Write("y: " & rs("maptop")) Response.Write("},") rs.MoveNext Loop Response.Write("];") %> ``` --- ## Summary: Why This Approach? **Hierarchical relationships** - Cameras/switches belong to IDFs **Type-specific fields** - MAC address for cameras, idfname for IDFs **Flexible** - Can add more fields per type later **Clean data model** - Proper normalization **Unified list view** - See all infrastructure in one place **Type-specific edit** - Appropriate fields per device type **Map integration** - All devices can be mapped **Total Files:** 7 ASP files (1 list + 4 detail + 1 add + 1 save) --- **Next Step:** Run enhanced migration script to add `idfid` to switches/servers, then create the 7 pages.