diff options
Diffstat (limited to 'doc/uml')
| -rw-r--r-- | doc/uml/.gitignore | 6 | ||||
| -rw-r--r-- | doc/uml/actor.png | bin | 0 -> 308 bytes | |||
| -rw-r--r-- | doc/uml/computer.png | bin | 0 -> 3147 bytes | |||
| -rw-r--r-- | doc/uml/drive-removable-media.png | bin | 0 -> 1934 bytes | |||
| -rw-r--r-- | doc/uml/hardware_install_activity_diagram.dot | 209 | ||||
| -rw-r--r-- | doc/uml/middleware-stack-mtce.dot | 200 | ||||
| -rw-r--r-- | doc/uml/middleware-stack-prod-birmingham.dot | 200 | ||||
| -rw-r--r-- | doc/uml/network-wired.png | bin | 0 -> 5783 bytes | |||
| -rw-r--r-- | doc/uml/security_use_case_diagram.dot | 153 | ||||
| -rw-r--r-- | doc/uml/security_use_case_diagram.pdf | bin | 0 -> 32843 bytes | |||
| -rw-r--r-- | doc/uml/use_case_diagram.dot | 72 |
11 files changed, 840 insertions, 0 deletions
diff --git a/doc/uml/.gitignore b/doc/uml/.gitignore new file mode 100644 index 0000000..fb59d0f --- /dev/null +++ b/doc/uml/.gitignore @@ -0,0 +1,6 @@ +hardware_install_activity_diagram.png +wr_install_schedule_activity_diagram.png +use_case_diagram.png +security_use_case_diagram.png +middleware-stack-prod-birmingham.png +middleware-stack-mtce.png diff --git a/doc/uml/actor.png b/doc/uml/actor.png Binary files differnew file mode 100644 index 0000000..5fa3808 --- /dev/null +++ b/doc/uml/actor.png diff --git a/doc/uml/computer.png b/doc/uml/computer.png Binary files differnew file mode 100644 index 0000000..36f5cdb --- /dev/null +++ b/doc/uml/computer.png diff --git a/doc/uml/drive-removable-media.png b/doc/uml/drive-removable-media.png Binary files differnew file mode 100644 index 0000000..673284c --- /dev/null +++ b/doc/uml/drive-removable-media.png diff --git a/doc/uml/hardware_install_activity_diagram.dot b/doc/uml/hardware_install_activity_diagram.dot new file mode 100644 index 0000000..446773f --- /dev/null +++ b/doc/uml/hardware_install_activity_diagram.dot @@ -0,0 +1,209 @@ +// This is a graphviz file. To generate a diagram from this source, +// you must first install graphviz (available from homebrew). Then run +// the following command: +// +// dot -Tpng -o hardware_install_activity_diagram.png hardware_install_activity_diagram.dot + +digraph G { + graph [fontsize = 14, penwidth = 0, rankdir = LR]; + node [shape = "rect"]; + edge [fontzize = 9, arrowhead = "empty"]; + + subgraph cluster_activity { + label = "CaaS/PaaS Hardware Installation"; + color = black; + start_automation [shape = "circle", style = "filled", color = "grey", label = "Start\nautomation"]; + start_server_install [shape = "circle", style = "filled", color = "grey", label = "Start\nphysical server\ninstallation"]; + start_monitoring [shape = "circle", style = "filled", color = "grey", label = "Start\nmonitoring"]; + end_monitoring_fail [shape = "doublecircle", style = "filled", color = "brown1", label = "Monitoring\nCRIT"]; + start_firmware_upgrade [shape = "circle", style = "filled", color = "grey", label = "Schedule\nIntel NIC\nfirmware\nupgrade"]; + start_wr_install [shape = "circle", style = "filled", color = "grey", label = "Schedule\nWind River\ninstallation"]; + end_schedulewr_fail [shape = "doublecircle", style = "filled", color = "brown1", label = "Wind River\ninstallation\nfailed"]; + end_schedulefirmware_fail [shape = "doublecircle", style = "filled", color = "brown1", label = "NIC\nfirmware\nupgrade\nfailed"]; + start_orchestration [shape = "doublecircle", style = "filled", color = "grey", label = "Start\norchestration"]; + + subgraph cluster_hardwareinstall { + label = "Install hardware"; + penwidth = 1; + color = "chocolate1"; + + subgraph cluster_dataimport { + label = "Data import"; + dataimport_password_import [label = "Import HP passwords"]; + dataimport_ciq_import [label = "Import CIQ"]; + dataimport_icinga_batch [label = "Icinga job is sent to ansible-queue"]; + } + + subgraph cluster_serialnumber { + label = "Link serial numbers/passwords to CIQ"; + serialnumber_server_hostalive_p [shape = "diamond", label = "Server pingble\nfrom model_check?"]; + serialnumber_collect_vendor [label = "Icinga passes vendor,\nserial number and\nBMC IP to middleware"]; + serialnumber_link_blade [label = "Middleware links\nblade to server"]; + } + + subgraph cluster_biosconfig { + label = "Configure passwords, DNS, icinga and BIOS"; + biosconfig_generate_password [label = "Middleware generates\nunique BMC passwords"]; + biosconfig_bmc_batch [label = "BMC job is sent\nto ansible-queue"]; + biosconfig_dns_batch [label = "DNS job is sent\nto ansible-queue"]; + } + } + + subgraph cluster_icingamonitoring { + label = "Monitor hardware"; + penwidth = 1; + color = "deepskyblue"; + + subgraph cluster_macnic { + label = "Collect BMC MAC and NIC firmware version"; + macnic_bmc_push_pxe_mac [label = "BMC playbook pushes\nMAC address and\nNIC firmware version\nto middleware"]; + macnic_icinga_monitoring [label = "icinga job is sent\nto ansible-queue"]; + macnic_poll_monitoring [label = "icinga_poll job is sent\nto ansible-queue"]; + } + + subgraph cluster_nicfirmware { + label = "Intel NIC firmware version"; + firmware_upgrade_p [shape = "diamond", label = "Is\nan Intel NIC\nfirmware upgrade\nneeded?"]; + } + } + + subgraph cluster_firmwarescheduler { + label = "Intel NIC firmware upgrade"; + penwidth = 1; + color = "darkorchid1"; + + subgraph cluster_schedulefirmwareschedule { + label = "Schedule"; + schedulefirmwareschedule_schedule [label = "Schedule firmware\nupgrade"]; + } + + subgraph cluster_schedulefirmwarerun { + label = "Run"; + schedulefirmwarerun_run [label = "firmware upgrade\njob is sent\nto ansible-queue"]; + } + + subgraph cluster_schedulefirmwareresults { + label = "Results"; + schedulefirmwareresults_p [shape = "diamond", label = "Did firmware\ninstall successfully?"]; + } + } + + subgraph cluster_wrscheduler { + label = "Schedule Wind River installation"; + penwidth = 1; + color = "darkolivegreen4"; + + subgraph cluster_schedulewrschedule { + label = "Schedule"; + schedulewrschedule_schedule [label = "Schedule Wind\nRiver install"]; + } + + subgraph cluster_schedulewrrun { + label = "Run"; + schedulewrrun_run [label = "Wind River\ninstall job is sent\nto ansible-queue"]; + } + + subgraph cluster_schedulewrresults { + label = "Results"; + schedulewrresults_p [shape = "diamond", label = "Did Wind River\ninstall successfully?"]; + } + + subgraph cluster_schedulewrorchestration { + label = "Orchestration"; + schedulewrorchestration_orch [label = "Call\norchestration\nendpoint"]; + } + } + + subgraph cluster_ansiblequeue { + label = "ansible-queue"; + penwidth = 1; + color = "yellow3"; + + subgraph cluster_icingaplaybook { + label = "Icinga queue"; + icingaplaybook_run [label = "Manage ansible host_vars\nand run playbook"]; + } + + subgraph cluster_icingapollplaybook { + label = "Icinga Poll queue"; + icingapollplaybook_run [label = "Manage ansible host_vars\nand run playbook"]; + icingapollplaybook_report [label = "Playbook informs\nmiddleware of result"]; + } + + subgraph cluster_bmcplaybook { + label = "BMC queue"; + bmcplaybook_run_1 [label = "Manage ansible host_vars\nand run playbook"]; + bmcplaybook_run_2 [label = "Manage ansible host_vars\nand run playbook"]; + } + + subgraph cluster_dnsplaybook { + label = "DNS queue"; + dnsplaybook_run [label = "Manage ansible host_vars\nand run playbook"]; + } + + subgraph cluster_firmwareplaybook { + label = "NIC queue"; + firmwareplaybook_run [label = "Manage ansible host_vars\nand run playbook"]; + firmwareplaybook_report [label = "Playbook informs\nmiddleware of result"]; + } + + subgraph cluster_wrplaybook { + label = "Wind River queue"; + wrplaybook_run [label = "Manage ansible host_vars\nand run playbook"]; + wrplaybook_report [label = "Playbook informs\nmiddleware of result"]; + } + } + + subgraph cluster_legend { + label = "Legend"; + penwidth = 1; + node [shape = "rect", style = "filled"]; + legend_hardware [label = "Hardware", fillcolor = "chocolate1"]; + legend_monitoring [label = "Monitoring", fillcolor = "deepskyblue"]; + legend_firmware [label = "NIC firmware", fillcolor = "darkorchid1"]; + legend_wr [label = "Wind River", fillcolor = "darkolivegreen4"]; + legend_ansible [label = "ansible-queue", fillcolor = "yellow3"]; + } + + start_automation -> dataimport_password_import [color = "chocolate1"]; + dataimport_password_import -> dataimport_ciq_import [color = "chocolate1"]; + dataimport_ciq_import -> dataimport_icinga_batch [color = "chocolate1"]; + dataimport_icinga_batch -> icingaplaybook_run [color = "chocolate1"]; + dataimport_icinga_batch -> serialnumber_server_hostalive_p [color = "chocolate1"]; + start_server_install -> serialnumber_server_hostalive_p [color = "chocolate1"]; + serialnumber_server_hostalive_p -> serialnumber_server_hostalive_p [color = "chocolate1", label = "No"]; + serialnumber_server_hostalive_p -> serialnumber_collect_vendor [color = "chocolate1", label = "Yes"]; + serialnumber_collect_vendor -> serialnumber_link_blade [color = "chocolate1"]; + serialnumber_link_blade -> biosconfig_generate_password [color = "chocolate1"]; + biosconfig_generate_password -> biosconfig_dns_batch [color = "chocolate1"]; + biosconfig_generate_password -> biosconfig_bmc_batch [color = "chocolate1"]; + schedulefirmwareschedule_schedule -> schedulefirmwarerun_run [color = "darkorchid1"]; + schedulefirmwarerun_run -> firmwareplaybook_run [color = "darkorchid1"]; + firmwareplaybook_run -> firmwareplaybook_report [color = "yellow3"]; + firmwareplaybook_report -> schedulefirmwareresults_p [color = "darkorchid1"]; + schedulefirmwareresults_p -> end_schedulefirmware_fail [color = "darkorchid1", label = "No"]; + schedulefirmwareresults_p -> start_wr_install [color = "darkorchid1", label = "Yes"]; + biosconfig_bmc_batch -> bmcplaybook_run_1 [color = "chocolate1"]; + biosconfig_dns_batch -> dnsplaybook_run [color = "chocolate1"]; + bmcplaybook_run_1 -> start_monitoring [color = "deepskyblue"]; + start_monitoring -> macnic_bmc_push_pxe_mac [color = "deepskyblue"]; + macnic_bmc_push_pxe_mac -> macnic_icinga_monitoring [color = "deepskyblue"]; + macnic_bmc_push_pxe_mac -> macnic_poll_monitoring [color = "deepskyblue"]; + macnic_icinga_monitoring -> icingaplaybook_run [color = "deepskyblue"]; + macnic_poll_monitoring -> icingapollplaybook_run [color = "deepskyblue"]; + icingapollplaybook_run -> icingapollplaybook_report [color = "yellow3"]; + icingapollplaybook_report -> firmware_upgrade_p [color = "deepskyblue", label = "Cleared"]; + icingapollplaybook_report -> end_monitoring_fail [color = "deepskyblue", label = "Not cleared"]; + firmware_upgrade_p -> start_firmware_upgrade [color = "deepskyblue", label = "Yes"]; + firmware_upgrade_p -> start_wr_install [color = "deepskyblue", label = "No"]; + start_firmware_upgrade -> schedulefirmwareschedule_schedule [color = "darkorchid1"]; + start_wr_install -> schedulewrschedule_schedule [color = "darkolivegreen4"]; + schedulewrschedule_schedule -> schedulewrrun_run [color = "darkolivegreen4"]; + schedulewrrun_run -> wrplaybook_run [color = "darkolivegreen4"]; + wrplaybook_run -> wrplaybook_report [color = "yellow3"]; + wrplaybook_report -> schedulewrresults_p [color = "darkolivegreen4"]; + schedulewrresults_p -> end_schedulewr_fail [color = "darkolivegreen4", label = "No"]; + schedulewrresults_p -> schedulewrorchestration_orch [color = "darkolivegreen4", label = "Yes"]; + schedulewrorchestration_orch -> start_orchestration [color = "darkolivegreen4"]; + } +} diff --git a/doc/uml/middleware-stack-mtce.dot b/doc/uml/middleware-stack-mtce.dot new file mode 100644 index 0000000..3bde052 --- /dev/null +++ b/doc/uml/middleware-stack-mtce.dot @@ -0,0 +1,200 @@ +// This is a graphviz file. To generate a diagram from this source, +// you must first install graphviz (available from homebrew). Then run +// the following command: +// +// dot -Tpng -o security_use_case_diagram.png security_use_case_diagram.dot + +digraph G { + graph [fontsize = 14, penwidth = 0, rankdir = LR]; + node [shape = "plaintext"]; + edge [color = "deepskyblue", fontsize = 9, dir = none]; + + subgraph cluster_vm { + label = "Nova instances"; + penwidth = 1; + + subgraph cluster_vmmiddleware { + label = ""; + penwidth = 0; + + subgraph cluster_vmmiddlewareapp1 { + label = "Django/icinga host 1\nSOLKTX01VZBvVFE-Y-WR-X-00-MW-001"; + penwidth = 0; + vmmiddlewareapp1_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_vmmiddlewareapp2 { + label = "Django/icinga host 2\nSOLKTX01VZBvVFE-Y-WR-X-00-MW-002"; + penwidth = 0; + vmmiddlewareapp2_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_vmmiddlewaredatabase1 { + label = "Database host 1\nSOLKTX01VZBvVFE-Y-WR-X-00-DB-001"; + penwidth = 0; + vmmiddlewaredatabase1_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_vmmiddlewaredatabase2 { + label = "Database host 2\nSOLKTX01VZBvVFE-Y-WR-X-00-DB-002"; + penwidth = 0; + vmmiddlewaredatabase2_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_vmmiddlewaredatabase3 { + label = "Database host 3\nSOLKTX01VZBvVFE-Y-WR-X-00-DB-003"; + penwidth = 0; + vmmiddlewaredatabase3_icon [label = "", image = "computer.png"]; + } + } + + subgraph cluster_vmservices { + label = ""; + penwidth = 0; + + subgraph cluster_vmservices1 { + label = "ansible-queue/dns-admin host 1\nSOLKTX01VZBvVFE-Y-WR-X-00-CM-001"; + penwidth = 0; + vmservices1_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_vmservices2 { + label = "ansible-queue/dns-admin host 2\nSOLKTX01VZBvVFE-Y-WR-X-00-CM-002"; + penwidth = 0; + vmservices2_icon [label = "", image = "computer.png"]; + } + } + + subgraph cluster_vmlb { + label = ""; + penwidth = 0; + + subgraph cluster_vmlb1 { + label = "Load balancer host 1\nSOLKTX01VZBvVFE-Y-WR-X-00-LB-001"; + penwidth = 0; + vmlb1_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_vmlb2 { + label = "Load balancer host 2\nSOLKTX01VZBvVFE-Y-WR-X-00-LB-002"; + penwidth = 0; + vmlb2_icon [label = "", image = "computer.png"]; + } + } + } + + subgraph cluster_port { + label = "Neutron ports"; + penwidth = 1; + + subgraph cluster_portmiddleware { + label = ""; + penwidth = 0; + + subgraph cluster_portmiddlewareapp1 { + label = "Django/icinga host 1\nSOLKTX01VZBvVFE-Y-WR-X-00-MW-001\n2607:f160:b:10f1::6"; + penwidth = 0; + portmiddlewareapp1_icon [label = "", image = "network-wired.png"]; + } + + subgraph cluster_portmiddlewareapp2 { + label = "Django/icinga host 2\nSOLKTX01VZBvVFE-Y-WR-X-00-MW-002\n2607:f160:b:10f1::5"; + penwidth = 0; + portmiddlewareapp2_icon [label = "", image = "network-wired.png"]; + } + + subgraph cluster_portmiddlewaredatabase1 { + label = "Database host 1\nSOLKTX01VZBvVFE-Y-WR-X-00-DB-001\n2607:f160:b:10f1::b"; + penwidth = 0; + portmiddlewaredatabase1_icon [label = "", image = "network-wired.png"]; + } + + subgraph cluster_portmiddlewaredatabase2 { + label = "Database host 2\nSOLKTX01VZBvVFE-Y-WR-X-00-DB-002\n2607:f160:b:10f1::3"; + penwidth = 0; + portmiddlewaredatabase2_icon [label = "", image = "network-wired.png"]; + } + + subgraph cluster_portmiddlewaredatabase3 { + label = "Database host 3\nSOLKTX01VZBvVFE-Y-WR-X-00-DB-003\n2607:f160:b:10f1::c"; + penwidth = 0; + portmiddlewaredatabase3_icon [label = "", image = "network-wired.png"]; + } + } + + subgraph cluster_portservices { + label = ""; + penwidth = 0; + + subgraph cluster_portservices1 { + label = "ansible-queue/\ndns-admin host 1\nSOLKTX01VZBvVFE-Y-WR-X-00-CM-001\n2607:f160:b:10f1::7"; + penwidth = 0; + portservices1_icon [label = "", image = "network-wired.png"]; + } + + subgraph cluster_portservices2 { + label = "ansible-queue/\ndns-admin host 2\nSOLKTX01VZBvVFE-Y-WR-X-00-CM-002\n2607:f160:b:10f1::8"; + penwidth = 0; + portservices2_icon [label = "", image = "network-wired.png"]; + } + } + + subgraph cluster_portlb { + label = ""; + penwidth = 0; + + subgraph cluster_portlb1 { + label = "Load balancer host 1\nSOLKTX01VZBvVFE-Y-WR-X-00-LB-001\n2607:f160:b:10f1::e"; + penwidth = 0; + portlb1_icon [label = "", image = "network-wired.png"]; + } + + subgraph cluster_portlb2 { + label = "Load balancer host 2\nSOLKTX01VZBvVFE-Y-WR-X-00-LB-002\n2607:f160:b:10f1::d"; + penwidth = 0; + portlb2_icon [label = "", image = "network-wired.png"]; + } + } + } + + subgraph cluster_volume { + label = "Cinder volumes"; + penwidth = 1; + + subgraph cluster_volumemiddleware { + label = ""; + penwidth = 0; + + subgraph cluster_volumemiddlewaredatabase1 { + label = "Database host 1\nSOLKTX01VZBvVFE-Y-WR-X-00-DB-01"; + penwidth = 0; + volumemiddlewaredatabase1_icon [label = "", image = "drive-removable-media.png"]; + } + + subgraph cluster_volumemiddlewaredatabase2 { + label = "Database host 2\nSOLKTX01VZBvVFE-Y-WR-X-00-DB-02"; + penwidth = 0; + volumemiddlewaredatabase2_icon [label = "", image = "drive-removable-media.png"]; + } + + subgraph cluster_volumemiddlewaredatabase3 { + label = "Database host 3\nSOLKTX01VZBvVFE-Y-WR-X-00-DB-03"; + penwidth = 0; + volumemiddlewaredatabase3_icon [label = "", image = "drive-removable-media.png"]; + } + } + } + + vmmiddlewareapp1_icon -> portmiddlewareapp1_icon; + vmmiddlewareapp2_icon -> portmiddlewareapp2_icon; + vmmiddlewaredatabase1_icon -> portmiddlewaredatabase1_icon; + vmmiddlewaredatabase2_icon -> portmiddlewaredatabase2_icon; + vmmiddlewaredatabase3_icon -> portmiddlewaredatabase3_icon; + vmservices1_icon -> portservices1_icon; + vmservices2_icon -> portservices2_icon; + vmlb1_icon -> portlb1_icon; + vmlb2_icon -> portlb2_icon; + vmmiddlewaredatabase1_icon -> volumemiddlewaredatabase1_icon; + vmmiddlewaredatabase2_icon -> volumemiddlewaredatabase2_icon; + vmmiddlewaredatabase3_icon -> volumemiddlewaredatabase3_icon; +} diff --git a/doc/uml/middleware-stack-prod-birmingham.dot b/doc/uml/middleware-stack-prod-birmingham.dot new file mode 100644 index 0000000..5250381 --- /dev/null +++ b/doc/uml/middleware-stack-prod-birmingham.dot @@ -0,0 +1,200 @@ +// This is a graphviz file. To generate a diagram from this source, +// you must first install graphviz (available from homebrew). Then run +// the following command: +// +// dot -Tpng -o security_use_case_diagram.png security_use_case_diagram.dot + +digraph G { + graph [fontsize = 14, penwidth = 0, rankdir = LR]; + node [shape = "plaintext"]; + edge [color = "deepskyblue", fontsize = 9, dir = none]; + + subgraph cluster_vm { + label = "Nova instances"; + penwidth = 1; + + subgraph cluster_vmmiddleware { + label = ""; + penwidth = 0; + + subgraph cluster_vmmiddlewareapp1 { + label = "Django/icinga host 1\nBRHOALTBVZBvVFE-Y-WR-X-00-MW-001"; + penwidth = 0; + vmmiddlewareapp1_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_vmmiddlewareapp2 { + label = "Django/icinga host 2\nBRHOALTBVZBvVFE-Y-WR-X-00-MW-002"; + penwidth = 0; + vmmiddlewareapp2_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_vmmiddlewaredatabase1 { + label = "Database host 1\nBRHOALTBVZBvVFE-Y-WR-X-00-DB-001"; + penwidth = 0; + vmmiddlewaredatabase1_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_vmmiddlewaredatabase2 { + label = "Database host 2\nBRHOALTBVZBvVFE-Y-WR-X-00-DB-002"; + penwidth = 0; + vmmiddlewaredatabase2_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_vmmiddlewaredatabase3 { + label = "Database host 3\nBRHOALTBVZBvVFE-Y-WR-X-00-DB-003"; + penwidth = 0; + vmmiddlewaredatabase3_icon [label = "", image = "computer.png"]; + } + } + + subgraph cluster_vmservices { + label = ""; + penwidth = 0; + + subgraph cluster_vmservices1 { + label = "ansible-queue/dns-admin host 1\nBRHOALTBVZBvVFE-Y-WR-X-00-CM-001"; + penwidth = 0; + vmservices1_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_vmservices2 { + label = "ansible-queue/dns-admin host 2\nBRHOALTBVZBvVFE-Y-WR-X-00-CM-002"; + penwidth = 0; + vmservices2_icon [label = "", image = "computer.png"]; + } + } + + subgraph cluster_vmlb { + label = ""; + penwidth = 0; + + subgraph cluster_vmlb1 { + label = "Load balancer host 1\nBRHOALTBVZBvVFE-Y-WR-X-00-LB-001"; + penwidth = 0; + vmlb1_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_vmlb2 { + label = "Load balancer host 2\nBRHOALTBVZBvVFE-Y-WR-X-00-LB-002"; + penwidth = 0; + vmlb2_icon [label = "", image = "computer.png"]; + } + } + } + + subgraph cluster_port { + label = "Neutron ports"; + penwidth = 1; + + subgraph cluster_portmiddleware { + label = ""; + penwidth = 0; + + subgraph cluster_portmiddlewareapp1 { + label = "Django/icinga host 1\nBRHOALTBVZBvVFE-Y-WR-X-00-MW-001\n2001:4888:a21:3102:245:29::"; + penwidth = 0; + portmiddlewareapp1_icon [label = "", image = "network-wired.png"]; + } + + subgraph cluster_portmiddlewareapp2 { + label = "Django/icinga host 2\nBRHOALTBVZBvVFE-Y-WR-X-00-MW-002\n2001:4888:a21:3102:245:29:0:a"; + penwidth = 0; + portmiddlewareapp2_icon [label = "", image = "network-wired.png"]; + } + + subgraph cluster_portmiddlewaredatabase1 { + label = "Database host 1\nBRHOALTBVZBvVFE-Y-WR-X-00-DB-001\n2001:4888:a21:3102:245:29:0:1"; + penwidth = 0; + portmiddlewaredatabase1_icon [label = "", image = "network-wired.png"]; + } + + subgraph cluster_portmiddlewaredatabase2 { + label = "Database host 2\nBRHOALTBVZBvVFE-Y-WR-X-00-DB-002\n2001:4888:a21:3102:245:29:0:7"; + penwidth = 0; + portmiddlewaredatabase2_icon [label = "", image = "network-wired.png"]; + } + + subgraph cluster_portmiddlewaredatabase3 { + label = "Database host 3\nBRHOALTBVZBvVFE-Y-WR-X-00-DB-003\n2001:4888:a21:3102:245:29:0:2"; + penwidth = 0; + portmiddlewaredatabase3_icon [label = "", image = "network-wired.png"]; + } + } + + subgraph cluster_portservices { + label = ""; + penwidth = 0; + + subgraph cluster_portservices1 { + label = "ansible-queue/\ndns-admin host 1\nBRHOALTBVZBvVFE-Y-WR-X-00-CM-001\n2001:4888:a21:3102:245:29:0:b"; + penwidth = 0; + portservices1_icon [label = "", image = "network-wired.png"]; + } + + subgraph cluster_portservices2 { + label = "ansible-queue/\ndns-admin host 2\nBRHOALTBVZBvVFE-Y-WR-X-00-CM-002\n2001:4888:a21:3102:245:29:0:10"; + penwidth = 0; + portservices2_icon [label = "", image = "network-wired.png"]; + } + } + + subgraph cluster_portlb { + label = ""; + penwidth = 0; + + subgraph cluster_portlb1 { + label = "Load balancer host 1\nBRHOALTBVZBvVFE-Y-WR-X-00-LB-001\n2001:4888:a21:3102:245:29:0:11"; + penwidth = 0; + portlb1_icon [label = "", image = "network-wired.png"]; + } + + subgraph cluster_portlb2 { + label = "Load balancer host 2\nBRHOALTBVZBvVFE-Y-WR-X-00-LB-002\n2001:4888:a21:3102:245:29:0:8"; + penwidth = 0; + portlb2_icon [label = "", image = "network-wired.png"]; + } + } + } + + subgraph cluster_volume { + label = "Cinder volumes"; + penwidth = 1; + + subgraph cluster_volumemiddleware { + label = ""; + penwidth = 0; + + subgraph cluster_volumemiddlewaredatabase1 { + label = "Database host 1\nBRHOALTBVZBvVFE-Y-WR-X-00-DB-01"; + penwidth = 0; + volumemiddlewaredatabase1_icon [label = "", image = "drive-removable-media.png"]; + } + + subgraph cluster_volumemiddlewaredatabase2 { + label = "Database host 2\nBRHOALTBVZBvVFE-Y-WR-X-00-DB-02"; + penwidth = 0; + volumemiddlewaredatabase2_icon [label = "", image = "drive-removable-media.png"]; + } + + subgraph cluster_volumemiddlewaredatabase3 { + label = "Database host 3\nBRHOALTBVZBvVFE-Y-WR-X-00-DB-03"; + penwidth = 0; + volumemiddlewaredatabase3_icon [label = "", image = "drive-removable-media.png"]; + } + } + } + + vmmiddlewareapp1_icon -> portmiddlewareapp1_icon; + vmmiddlewareapp2_icon -> portmiddlewareapp2_icon; + vmmiddlewaredatabase1_icon -> portmiddlewaredatabase1_icon; + vmmiddlewaredatabase2_icon -> portmiddlewaredatabase2_icon; + vmmiddlewaredatabase3_icon -> portmiddlewaredatabase3_icon; + vmservices1_icon -> portservices1_icon; + vmservices2_icon -> portservices2_icon; + vmlb1_icon -> portlb1_icon; + vmlb2_icon -> portlb2_icon; + vmmiddlewaredatabase1_icon -> volumemiddlewaredatabase1_icon; + vmmiddlewaredatabase2_icon -> volumemiddlewaredatabase2_icon; + vmmiddlewaredatabase3_icon -> volumemiddlewaredatabase3_icon; +} diff --git a/doc/uml/network-wired.png b/doc/uml/network-wired.png Binary files differnew file mode 100644 index 0000000..6417065 --- /dev/null +++ b/doc/uml/network-wired.png diff --git a/doc/uml/security_use_case_diagram.dot b/doc/uml/security_use_case_diagram.dot new file mode 100644 index 0000000..c939cc6 --- /dev/null +++ b/doc/uml/security_use_case_diagram.dot @@ -0,0 +1,153 @@ +// This is a graphviz file. To generate a diagram from this source, +// you must first install graphviz (available from homebrew). Then run +// the following command: +// +// dot -Tpng -o security_use_case_diagram.png security_use_case_diagram.dot + +digraph G { + graph [fontsize = 14, penwidth = 0, rankdir = UD]; + node [shape = "plaintext"]; + edge [fontsize = 9, style = dotted, arrowhead = empty]; + + subgraph cluster_external { + label = "External systems"; + penwidth = 1; + + subgraph cluster_externalbrowser { + label = "EDN-attached web browser"; + penwidth = 0; + externalbrowser_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_externalorchestration { + label = "ATLAS/Orchestration"; + penwidth = 0; + externalorchestration_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_externalvmb{ + label = "VMB"; + penwidth = 0; + externalvmb_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_externalgitlab { + label = "GitLab"; + penwidth = 0; + externalgitlab_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_externalartifactory { + label = "Artifactory"; + penwidth = 0; + externalartifactory_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_externalinfoblox { + label = "CDS Infoblox"; + penwidth = 0; + externalinfoblox_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_externalldap { + label = "USWIN LDAP"; + penwidth = 0; + externalldap_icon [label = "", image = "computer.png"]; + } + } + + subgraph cluster_middlewarestack { + label = "Automation stack"; + penwidth = 1; + + subgraph cluster_middlewarestackansible { + label = "Ansible/DNS hosts"; + penwidth = 0; + middlewarestackansible_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_middlewarestackapp { + label = "Middleware/Icinga hosts"; + penwidth = 0; + middlewarestackapp_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_middlewarestackdatabase { + label = "Database hosts"; + penwidth = 0; + middlewarestackdatabase_icon [label = "", image = "drive-removable-media.png"]; + } + + subgraph cluster_middlewarestacklb { + label = "Load balancer hosts"; + penwidth = 0; + middlewarestacklb_icon [label = "", image = "computer.png"]; + } + } + + subgraph cluster_wr { + label = "Wind River platform"; + penwidth = 1; + + subgraph cluster_wrcentral { + label = "Central controller cluster"; + + subgraph cluster_wrcentralhosts { + label = "Central controller hosts"; + penwidth = 0; + wrcentralhosts_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_wrcentralbmc { + label = "Central controller BMC"; + penwidth = 0; + wrcentralbmc_icon [label = "", image = "network-wired.png"]; + } + } + + subgraph cluster_wrremote { + label = "Remote subcloud cluster"; + + subgraph cluster_wrremotehosts { + label = "Remote subcloud hosts"; + penwidth = 0; + wrremotehosts_icon [label = "", image = "computer.png"]; + } + + subgraph cluster_wrremotebmc { + label = "Remote subcloud BMC"; + penwidth = 0; + wrremotebmc_icon [label = "", image = "network-wired.png"]; + } + } + } + + subgraph cluster_legend { + label = "Legend"; + penwidth = 1; + node [shape = "rect", style = filled]; + legend_external [label = "Connections\nto external\nsystems", fillcolor = "chocolate1"]; + legend_wr [label = "Connections\nto Wind River\nplatform", fillcolor = "darkolivegreen3"]; + legend_middleware_external [label = "Connections\nto middleware", fillcolor = "deepskyblue"]; + } + + externalbrowser_icon -> middlewarestacklb_icon [color = "deepskyblue", headlabel = "TCP *:443"]; + externalorchestration_icon -> middlewarestacklb_icon [color = "deepskyblue"]; + middlewarestackapp_icon -> externalvmb_icon [color = "chocolate1", headlabel = "TCP *:6651"]; + externalgitlab_icon -> middlewarestacklb_icon [color = "deepskyblue"]; + middlewarestackansible_icon -> externalartifactory_icon [color = "chocolate1", headlabel = "TCP *:443"]; + middlewarestackapp_icon -> externalgitlab_icon [color = "chocolate1", headlabel = "TCP *:22"]; + middlewarestackansible_icon -> externalgitlab_icon [color = "chocolate1"]; + middlewarestackansible_icon -> wrcentralhosts_icon [color = "darkolivegreen3", headlabel = "TCP *:22"]; + middlewarestackansible_icon -> wrremotehosts_icon [color = "darkolivegreen3", headlabel = "TCP *:22"]; + middlewarestackapp_icon -> middlewarestackansible_icon [color = "deepskyblue", headlabel = "TCP *:80, *:5555-5561"]; + middlewarestacklb_icon -> externalldap_icon [color = "chocolate1", headlabel = "TCP *:636"]; + middlewarestackansible_icon -> externalinfoblox_icon [color = "chocolate1", headlabel = "TCP *:443"]; + middlewarestackapp_icon -> wrcentralbmc_icon [color = "darkolivegreen3", headlabel = "TCP *:443"]; + middlewarestackapp_icon -> wrremotebmc_icon [color = "darkolivegreen3", headlabel = "TCP *:443"]; + middlewarestacklb_icon -> middlewarestackapp_icon [color = "deepskyblue", headlabel = "TCP *:80"]; + middlewarestackapp_icon -> middlewarestackdatabase_icon [color = "deepskyblue", headlabel = "TCP *:5432"]; + middlewarestacklb_icon -> middlewarestackansible_icon [color = "deepskyblue"]; + wrcentralhosts_icon -> externalartifactory_icon [color = "chocolate1"]; + wrcentralhosts_icon -> wrremotehosts_icon [color = "darkolivegreen3"]; +} diff --git a/doc/uml/security_use_case_diagram.pdf b/doc/uml/security_use_case_diagram.pdf Binary files differnew file mode 100644 index 0000000..2a5bfc0 --- /dev/null +++ b/doc/uml/security_use_case_diagram.pdf diff --git a/doc/uml/use_case_diagram.dot b/doc/uml/use_case_diagram.dot new file mode 100644 index 0000000..dfa7692 --- /dev/null +++ b/doc/uml/use_case_diagram.dot @@ -0,0 +1,72 @@ +// This is a graphviz file. To generate a diagram from this source, +// you must first install graphviz (available from homebrew). Then run +// the following command: +// +// dot -Tpng -o use_case_diagram.png use_case_diagram.dot + +digraph G { + fontname = "Bitstream Vera Sans"; + fontsize = 12; + + node [ + fontname = "Bitstream Vera Sans"; + fontsize = 12; + shape = "ellipse"; + ] + + edge [ + fontname = "Bitstream Vera Sans"; + fontsize = 12; + ] + + edge [ + arrowhead = "empty"; + ] + + subgraph cluster_actors { + color = white; + node [ + shape = custom; + shapefile = "actor.png"; + width = 0.352; + height = 0.77; + fixedsize = true; + color = "#ffffff"; + ] + ciq [label = "CIQ"]; + cron [label = "cron"] + technician [label = "Technician"]; + } + + subgraph cluster_processes { + style = filled; + color = azure2; + populate_database [label = "Populate database"]; + monitor_hardware [label = "Monitor hardware"]; + install_caas [label = "Install CaaS"]; + } + + { + edge [color = red;] + ciq -> populate_database [label = "Populates"]; + } + + { + edge [color = chocolate4;] + cron -> install_caas [label = "Starts"]; + } + + { + edge [color = blue;] + technician -> monitor_hardware [label = "Waits for"]; + } + + { + edge [ + label = "Uses"; + color = green4; + ] + install_caas -> monitor_hardware; + monitor_hardware -> populate_database; + } +} |
