summaryrefslogtreecommitdiff
path: root/doc/uml
diff options
context:
space:
mode:
Diffstat (limited to 'doc/uml')
-rw-r--r--doc/uml/.gitignore6
-rw-r--r--doc/uml/actor.pngbin0 -> 308 bytes
-rw-r--r--doc/uml/computer.pngbin0 -> 3147 bytes
-rw-r--r--doc/uml/drive-removable-media.pngbin0 -> 1934 bytes
-rw-r--r--doc/uml/hardware_install_activity_diagram.dot209
-rw-r--r--doc/uml/middleware-stack-mtce.dot200
-rw-r--r--doc/uml/middleware-stack-prod-birmingham.dot200
-rw-r--r--doc/uml/network-wired.pngbin0 -> 5783 bytes
-rw-r--r--doc/uml/security_use_case_diagram.dot153
-rw-r--r--doc/uml/security_use_case_diagram.pdfbin0 -> 32843 bytes
-rw-r--r--doc/uml/use_case_diagram.dot72
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
new file mode 100644
index 0000000..5fa3808
--- /dev/null
+++ b/doc/uml/actor.png
Binary files differ
diff --git a/doc/uml/computer.png b/doc/uml/computer.png
new file mode 100644
index 0000000..36f5cdb
--- /dev/null
+++ b/doc/uml/computer.png
Binary files differ
diff --git a/doc/uml/drive-removable-media.png b/doc/uml/drive-removable-media.png
new file mode 100644
index 0000000..673284c
--- /dev/null
+++ b/doc/uml/drive-removable-media.png
Binary files differ
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
new file mode 100644
index 0000000..6417065
--- /dev/null
+++ b/doc/uml/network-wired.png
Binary files differ
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
new file mode 100644
index 0000000..2a5bfc0
--- /dev/null
+++ b/doc/uml/security_use_case_diagram.pdf
Binary files differ
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;
+ }
+}