// Structrizr DSL for Solutions Architecture workspace = workspace "MSI Control Tower" { !docs docs/omnibus model { ownerUser = person "Owner User" "Represents the owner of a construction project" { tags "Customer User", "P1" perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } projectAdmin = person "Project Admin User" "Manages project-level configuration and access" { tags "Internal or External User", "P1" perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } dataScientist = person "MSI Data Scientist/Analyst" "Analyzes data and develops models and generates actionable insights for the owner." { tags "Internal User", "P2" perspectives { "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } opAdmin = person "Operational Administrator" "Manages data flows, integrations, and ensures data quality and integrity." { tags "Internal User", "P2" perspectives { "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } sysAdmin = person "System Administrator" "Manages system access, security, backups, and overall system health." { tags "Internal User", "P1" perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } softwareSystem = softwareSystem "MSI Control Tower Application" { description "Provides insights and analytics for Owners of construction projects as well as a management layer for Project Admins" tags "Internal System", "P1" # This works, but commented out for now. It will import all docs within the folder specified and display them one after the other in alphabetical order. #!docs docs/softwareSystem-test perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } endUserApp = container "End-User Application" { tags "P1" perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } // These need work description "Provides a web-based interface for owners to view insights and project admins to configure users and projects." component "Dashboard" "Displays interactive dashboards and visualizations" component "Reporting Engine" "Generates reports on demand" component "Alerting System" "Displays real-time alerts and notifications" component "User Management" "Manages user accounts and permissions" component "CIP Viewer" "Provides access to and navigation of the CIP" component "Third-Party Linking" "Enables integration and SSO to authorized third-party applications." } appDB = container "Application Database" { description "Stores Control Tower application data, standardized analytics, and configuration data." tags "Database", "P1" perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } backEndApp = container "Back-End Application" { description "Interfaces with the front-end, handles background tasks, integrations, security, and data management." tags "P1" perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } serviceApi = component "Service API" { description "Provides RESTful API for the front-end End-User Application" tags "P1" perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } idProvider = component "Identity Provider" { description "Manages user authentication and authorization" tags "P1" perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } thirdPartyProxy = component "Third-Party Application Proxy" { description "Manages secure access to third-party applications" tags "P1" perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } sysMonitoring = component "System Monitoring Service" { description "Monitors system health and performance" tags "P2" perspectives { "Development Phase 3" "Development Phase 3" 3 "Development Phase 2" "Development Phase 2" 2 } } backupRestore = component "Backup & Restore Service" { description "Manages backups and data restoration for databases and file systems" tags "P1" perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } credentialStore = component "Credential Store" { description "Securely stores credentials for third-party applications" tags "P1" perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } component "Health Daemon" { description "Monitors the liveliness, readiness and performance of the back-end components" tags "Monitoring", "Daemon", "P2" perspectives { "Development Phase 3" "Development Phase 3" 3 "Development Phase 2" "Development Phase 2" 2 } } } wikiService = container "Wiki Service" { tags "P1" description "Hosts and manages the Comprehensive Implementation Plan (CIP)" perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } } dataPlatform = softwareSystem "Data Platform" { tags "Internal System", "P2" perspectives { "Development Phase 3" "Development Phase 3" 3 "Development Phase 2" "Development Phase 2" 2 } description "Houses ingested construction project data and provides data processing and analysis tooling and capabilities" dataIngestion = container "Data Ingestion" { description "Ingests data from various construction applications and file systems" tags "P2" perspectives { "Development Phase 3" "Development Phase 3" 3 "Development Phase 2" "Development Phase 2" 2 } component "Data Ingest Trigger" "Triggers the data ingestion process" component "API Connector" "Connects to and extracts data from source application APIs" component "File Ingestor" "Reads and processes data from source application files" component "Data Validator" "Performs data validation and quality checks" component "Data Cleanser" "Cleans and standardizes ingested data" component "Health Daemon" { description "Monitors the liveliness, readiness and performance of the data ingestion process" tags "Monitoring", "Daemon", "P2" perspectives { "Development Phase 3" "Development Phase 3" 3 "Development Phase 2" "Development Phase 2" 2 } } } dataLake = container "Data Lake" { description "Central repository for raw and processed construction data" component "Raw Data Storage" "Stores ingested data in its original format" component "Processed Data Storage" "Stores transformed and enriched data" component "Health Daemon" { description "Monitors the liveliness, readiness and performance of the data lake" tags "Monitoring", "Daemon", "P2" perspectives { "Development Phase 3" "Development Phase 3" 3 "Development Phase 2" "Development Phase 2" 2 } } tags "Database", "P2" perspectives { "Development Phase 3" "Development Phase 3" 3 "Development Phase 2" "Development Phase 2" 2 } } dataScienceDB = container "Data Science DB" { description "Stores processed data and model outputs from the Data Science Workbench and data processing/analysis jobs" tags "Database", "P2" perspectives { "Development Phase 3" "Development Phase 3" 3 "Development Phase 2" "Development Phase 2" 2 } component "Health Daemon" { description "Monitors the liveliness, readiness and performance of the data science database" tags "Monitoring", "Daemon", "P2" perspectives { "Development Phase 3" "Development Phase 3" 3 "Development Phase 2" "Development Phase 2" 2 } } } dataScienceWorkbench = container "Data Science Workbench" { description "Provides an environment for data scientists to analyze data and develop ML models" tags "P2" perspectives { "Development Phase 3" "Development Phase 3" 3 "Development Phase 2" "Development Phase 2" 2 } component "Notebook Environment" "Provides interactive notebooks for data exploration and analysis" component "Model Training Engine" "Trains and evaluates machine learning models" component "Model Registry" "Stores and manages trained machine learning models" visualisationTools = component "Visualization Tools" "Provides tools and dashboards for visualizing data and model outputs" component "Health Daemon" { description "Monitors the liveliness, readiness and performance of the data science workbench" tags "Monitoring", "Daemon", "P2" perspectives { "Development Phase 3" "Development Phase 3" 3 "Development Phase 2" "Development Phase 2" 2 } } } # dataTransformationPipeline = container "Data Transformation Pipeline" { # description "Transforms and enriches raw data from the Data Lake and delivers it to the Control Tower Application" # component "Data Extractor" "Extracts data from the Data Lake" # component "Data Transformer" "Applies transformations and business rules" # component "Data Loader" "Loads transformed data into the Application Database" # } mlops = container "MLOps/Data Pipelines" { tags "Pipeline", "P3" perspectives { "Development Phase 3" "Development Phase 3" 3 } description "Processes newly ingested data, manages data pipelines and integrations, as well as monitoring and alerting capabilities" monitoringAnalysisJob = component "Monitoring Analysis Job" { description "Based on defined rules, runs monitoring analysis and triggers alerts" tags "P3" perspectives { "Development Phase 3" "Development Phase 3" 3 } } dataScienceJobQueue = component "Data Science Job Processor" { description "Manages and processes data science jobs" tags "P3" perspectives { "Development Phase 3" "Development Phase 3" 3 } } dataMovementJobQueue = component "Data Movement Job Processor" { description "Manages jobs for moving data between databases" tags "P3" perspectives { "Development Phase 3" "Development Phase 3" 3 } } component "Health Daemon" { description "Monitors the liveliness, readiness and performance of the MLOps components" tags "Monitoring", "Daemon", "P3" perspectives { "Development Phase 3" "Development Phase 3" 3 } } } performanceMonitor = container "Performance Monitor" { description "Monitors the performance of the data platform and its components through Health Daemons" tags "Monitoring", "P2" perspectives { "Development Phase 3" "Development Phase 3" 3 "Development Phase 2" "Development Phase 2" 2 } } } dataSources = softwareSystem "External Data Sources" { tags "External System", "P2" perspectives { "Development Phase 3" "Development Phase 3" 3 "Development Phase 2" "Development Phase 2" 2 } dataTypes = container "Data Types" { sourceAPIs = component "Source Application APIs" { description "External APIs of source applications (e.g., P6, Northspyre, Touchplan, Revit, dRofus)" } sourceFiles = component "Source Application File Systems" { description "External file systems of source applications" } } } externalApp = softwareSystem "Third Party Apps" "Applications that the Owner User may also have credentials for." { tags "External System", "Multiple Apps", "P1" perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } // ********************************************* // *************** Relationships between People and Containers // ********************************************* ownerUser -> endUserApp "Views insights and dashboards within the application" { perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } projectAdmin -> endUserApp "Manages users and configures projects" { perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } sysAdmin -> backupRestore "Initiates and monitors backups" { perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } sysAdmin -> sysMonitoring "Monitors system health and performance" { perspectives { "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } opAdmin -> dataPlatform "Manages data pipelines and integrations" { perspectives { "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } opAdmin -> dataIngestion "Configures data ingestion" { perspectives { "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } sysAdmin -> dataPlatform "Administers" { perspectives { "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } dataScientist -> dataScienceWorkbench "Uses for data analysis and modeling" { perspectives { "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } // ********************************************* // *************** Relationships within Data Platform // ********************************************* dataIngestion -> dataLake "Loads raw data into" { perspectives { "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } # dataScienceDB -> mlops "Data copied from Data Science DB is analyzed against monitoring rules" dataScienceWorkbench -> dataLake "Reads data from" { perspectives { "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } dataScienceWorkbench -> dataScienceDB "Writes data to" { perspectives { "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } # dataLake -> dataTransformationPipeline "Provides raw data to" # dataTransformationPipeline -> softwareSystem "Delivers transformed data to" # "Data Extractor" -> "Data Transformation Service" "Sends extracted data to" # "Data Transformation Service" -> "Data Loader" "Sends transformed data to" mlops -> softwareSystem "Writes the latest analysis data and outputs to" { perspectives { "Development Phase 3" "Development Phase 3" 3 } } dataScienceWorkbench -> mlops "Defines analyses, models and monitoring rules used in" { perspectives { "Development Phase 3" "Development Phase 3" 3 } } // ********************************************* // *************** ML Ops Relationships // ********************************************* dataScienceWorkbench -> monitoringAnalysisJob "Data Scientists define monitoring rules in" { perspectives { "Development Phase 3" "Development Phase 3" 3 } } dataScienceWorkbench -> dataScienceJobQueue "Data Scientists define analyses in" { perspectives { "Development Phase 3" "Development Phase 3" 3 } } # monitoringRules -> monitoringAnalysisJob "Triggers alerts based on defined rules" monitoringAnalysisJob -> dataLake "Reads new data from" { perspectives { "Development Phase 3" "Development Phase 3" 3 } } monitoringAnalysisJob -> serviceApi "Alerts are sent to" { perspectives { "Development Phase 3" "Development Phase 3" 3 } } dataMovementJobQueue -> appDB "Copies analysis output data to" { perspectives { "Development Phase 3" "Development Phase 3" 3 } } dataScienceJobQueue -> dataLake "Reads new data from" { perspectives { "Development Phase 3" "Development Phase 3" 3 } } dataScienceJobQueue -> dataScienceDB "Writes output to" { perspectives { "Development Phase 3" "Development Phase 3" 3 } } dataScienceJobQueue -> dataMovementJobQueue "Analysis Complete trigger" { perspectives { "Development Phase 3" "Development Phase 3" 3 } } dataMovementJobQueue -> dataScienceDB "Reads data from" { perspectives { "Development Phase 3" "Development Phase 3" 3 } } // ********************************************* // *************** Relationships within MSI Control Tower Application // ********************************************* backEndApp -> appDB "Reads application data and analytics from. Writes application data to." { perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } endUserApp -> wikiService "Fetches CIP content" { perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } wikiService -> appDB "Writes CIP content" { perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } endUserApp -> thirdPartyProxy "Requests access to third-party applications" { perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } endUserApp -> backEndApp "Reads and writes data via HTTP requests to" { perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } endUserApp -> idProvider "Authenticates users" { perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } thirdPartyProxy -> credentialStore "Retrieves credentials from" { perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } endUserApp -> serviceApi "Sends requests to" { perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } serviceApi -> appDB "Reads and writes data from" { perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } performanceMonitor -> sysMonitoring "Sends health and performance data to" { perspectives { "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } // Relationships between Data Sources and Data Platform dataSources -> dataPlatform "Provides data to" { perspectives { "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } // Relationships for third-party system linking endUserApp -> externalApp "Provides access to" { perspectives { "Development Phase 1" "Development Phase 1" 1 "Development Phase 2" "Development Phase 2" 2 "Development Phase 3" "Development Phase 3" 3 } } } views { systemLandscape "System_Landscape" { include * autolayout } container softwareSystem "Control_Tower_Containers" { include * autolayout } container dataPlatform "Data_Platform_Containers" { include * autolayout } component backEndApp "Back_End_Components" { include * autolayout } component mlops "MLOps_Components" { include * autolayout } # systemLandscape "System_Landscape_Phase_1" { # include "element.tag==P1" # autolayout # } # container softwareSystem "Control_Tower_Containers_Phase_1" { # include "element.tag==P1" # autolayout # } # component backEndApp "Back_End_Components_Phase_1" { # include "element.tag==P1" # autolayout # } # filtered System_Landscape include "Element, Relationship" "System_Landscape_Whole" # filtered System_Landscape include "P1" "System_Landscape_Phase_1" styles { element "Software System" { background "#90CAF9" color #ffffff shape RoundedBox } element "Container" { background #1168bd color #ffffff shape RoundedBox } element "Component" { background darkblue color #ffffff shape RoundedBox } element "Person" { shape Person } element "Database" { background #1168bd color #ffffff shape cylinder } # element "Internal System" { # } element "External System" { background grey color "#ffffff" } element "Internal User" { background "#4CAF50" color "#ffffff" } element "Customer User" { background "#FFC107" color "#000000" } element "Internal or External User" { background purple color "#ffffff" } # element "Multiple Apps" { # } element "Pipeline" { shape pipe } element "Daemon" { shape box background white stroke black color black } } branding { logo img/branding/logo.png } } }