Files
Sankofa/scripts/infrastructure/generate-topology-data.ts
defiQUG 9daf1fd378 Apply Composer changes: comprehensive API updates, migrations, middleware, and infrastructure improvements
- Add comprehensive database migrations (001-024) for schema evolution
- Enhance API schema with expanded type definitions and resolvers
- Add new middleware: audit logging, rate limiting, MFA enforcement, security, tenant auth
- Implement new services: AI optimization, billing, blockchain, compliance, marketplace
- Add adapter layer for cloud integrations (Cloudflare, Kubernetes, Proxmox, storage)
- Update Crossplane provider with enhanced VM management capabilities
- Add comprehensive test suite for API endpoints and services
- Update frontend components with improved GraphQL subscriptions and real-time updates
- Enhance security configurations and headers (CSP, CORS, etc.)
- Update documentation and configuration files
- Add new CI/CD workflows and validation scripts
- Implement design system improvements and UI enhancements
2025-12-12 18:01:35 -08:00

186 lines
5.2 KiB
TypeScript

#!/usr/bin/env tsx
/**
* Generate network topology JSON from entity registry
* Usage: tsx scripts/infrastructure/generate-topology-data.ts
*/
import * as fs from 'fs'
import * as path from 'path'
import type { NetworkTopology, TopologyNode, TopologyEdge } from '../../src/lib/types/infrastructure'
const PROJECT_ROOT = path.resolve(__dirname, '../..')
const DATA_DIR = path.join(PROJECT_ROOT, 'docs/infrastructure/data')
const ENTITY_REGISTRY = path.join(PROJECT_ROOT, 'docs/infrastructure/ENTITY_REGISTRY.md')
// Generate topology data based on entity registry structure
function generateTopologyData(): NetworkTopology[] {
const topologies: NetworkTopology[] = []
// Cloudflare as root node
const cloudflareNode: TopologyNode = {
id: 'cloudflare',
type: 'region',
label: 'Cloudflare Global Network',
region: 'Global',
entity: 'Cloudflare',
position: { x: 400, y: 50 },
metadata: {
asn: 'AS13335',
dataCenters: 300,
},
}
// VM 137 - Cloudflare Tunnel
const vm137Node: TopologyNode = {
id: 'vm-137',
type: 'vm',
label: 'VM 137 (cloudflare-tunnel-vm)',
region: 'Site 2',
entity: 'Sankofa Phoenix',
position: { x: 300, y: 200 },
metadata: {
vmid: 137,
host: 'r630-01',
ip: '192.168.11.11',
function: 'Cloudflare Tunnel Agent',
},
}
// VM 136 - Nginx Proxy
const vm136Node: TopologyNode = {
id: 'vm-136',
type: 'vm',
label: 'VM 136 (nginx-proxy-vm)',
region: 'Site 1',
entity: 'Sankofa Phoenix',
position: { x: 500, y: 200 },
metadata: {
vmid: 136,
host: 'ml110-01',
ip: '192.168.11.10',
function: 'Reverse Proxy, SSL Termination',
},
}
// Regional topologies for SMOM
const smomRegions = [
{ name: 'Europe', x: 400, y: 350, countries: 35 },
{ name: 'Americas', x: 200, y: 350, countries: 26 },
{ name: 'Asia-Pacific', x: 600, y: 350, countries: 14 },
{ name: 'Africa', x: 400, y: 500, countries: 36 },
{ name: 'Middle East', x: 500, y: 500, countries: 4 },
]
smomRegions.forEach((region, index) => {
const regionNode: TopologyNode = {
id: `region-${region.name.toLowerCase()}`,
type: 'region',
label: `${region.name} Region`,
region: region.name,
entity: 'Sovereign Order of Hospitallers',
position: { x: region.x, y: region.y },
metadata: {
countries: region.countries,
priority: index < 2 ? 'High' : 'Medium',
},
}
const datacenterNode: TopologyNode = {
id: `dc-${region.name.toLowerCase()}`,
type: 'datacenter',
label: `${region.name} Datacenter`,
region: region.name,
entity: 'Sovereign Order of Hospitallers',
position: { x: region.x, y: region.y + 100 },
metadata: {
tier: index < 2 ? 'Tier 1' : 'Tier 2',
},
}
const tunnelNode: TopologyNode = {
id: `tunnel-${region.name.toLowerCase()}`,
type: 'tunnel',
label: `${region.name} Tunnel`,
region: region.name,
entity: 'Sovereign Order of Hospitallers',
position: { x: region.x + 100, y: region.y },
metadata: {
tunnelId: `hospitallers-${region.name.toLowerCase()}-tunnel`,
networkRoute: `10.${10 + index}.0.0/16`,
},
}
const edges: TopologyEdge[] = [
{
id: `edge-cloudflare-${region.name.toLowerCase()}`,
source: 'cloudflare',
target: regionNode.id,
type: 'tunnel',
metadata: { bandwidth: '10Gbps' },
},
{
id: `edge-${region.name.toLowerCase()}-dc`,
source: regionNode.id,
target: datacenterNode.id,
type: 'network-route',
metadata: {},
},
{
id: `edge-${region.name.toLowerCase()}-tunnel`,
source: regionNode.id,
target: tunnelNode.id,
type: 'tunnel',
metadata: {},
},
]
topologies.push({
nodes: [cloudflareNode, vm137Node, vm136Node, regionNode, datacenterNode, tunnelNode],
edges: [
{
id: 'edge-cloudflare-vm137',
source: 'cloudflare',
target: 'vm-137',
type: 'tunnel',
metadata: {},
},
{
id: 'edge-vm137-vm136',
source: 'vm-137',
target: 'vm-136',
type: 'network-route',
metadata: {},
},
...edges,
],
region: region.name,
entity: 'Sovereign Order of Hospitallers',
lastUpdated: new Date().toISOString(),
})
})
return topologies
}
function main() {
const topologies = generateTopologyData()
// Write individual topology files
topologies.forEach(topology => {
const filename = `topology-${topology.region.toLowerCase().replace(/\s+/g, '-')}.json`
const filepath = path.join(DATA_DIR, filename)
fs.writeFileSync(filepath, JSON.stringify(topology, null, 2))
console.log(`✓ Created ${filename}`)
})
// Write combined topology file
const combinedFile = path.join(DATA_DIR, 'network_topology.json')
fs.writeFileSync(combinedFile, JSON.stringify(topologies, null, 2))
console.log(`✓ Created network_topology.json with ${topologies.length} regional topologies`)
}
if (require.main === module) {
main()
}