Skip to content

Architecture Diagrams ​

The diagrams of these docs live in docs/diagrams/. Each one is a pair: a .drawio file that is the editable source, and an .svg file that the page embeds. A change to a diagram updates both files in the same commit.

Inventory ​

DiagramShowsEmbedded in
brownfield-keystone-adoption-phasesThe four adoption phases: implemented identity-only management, followed by sketches for infrastructure attach, Keystone takeover, and steady stateBrownfield Keystone Adoption phase model
cobaltcore-overviewWhat CobaltCore does, as a layer stack from bare metal to the OpenStack clouds, and why it mattersOverview
cobaltcore-management-clusterThe implemented management cluster, from one ControlPlane CR to the running OpenStack services, with optional target clustersImplemented topology, Quick Start (ControlPlane), Core Components, ControlPlane Reconciler Architecture, ControlPlane CRD API Reference, Target Clusters, Architecture Overview
cobaltcore-stackThe stack layer by layer, with the project behind each layer (IronCore, Garden Linux, Gardener, CobaltCore, OpenStack)The multi-cluster target picture
cobaltcore-architectureThe five clusters (Operation and Monitoring, OpenStack Control Plane, Ceph Storage, OpenStack Compute, OpenStack Network) on Garden Linux, managed by Gardener, on bare metal managed by IronCoreThe multi-cluster target picture, Hypervisor Cluster, Storage Cluster, Management Cluster
cobaltcore-control-planesOne Operation and Monitoring cluster that creates and manages several OpenStack control planesSeveral control planes
cobaltcore-attached-clustersOne control plane with several storage, compute, and network clusters attachedAttached clusters, Connect a Compute Cluster
quickstart-mapThe five quick starts as a map: what each deploys and ends with, and the four ways they relateStart here, Quick Start, Quick Start (Extended), Quick Start (ControlPlane), Quick Start (metal-stack), Quick Start (Orders), One devstack per guide
quickstart-request-pathThe six hops of a request from the workstation to an OpenStack API on the kind devstack, and the two port-forwards that leave hops outAccess Keystone from your local machine, Quick Start, Service exposure, Step 7 of the Quick Start (ControlPlane)
secrets-flowThe read, write-back and dynamic paths between OpenBao, ESO, the operators and the services, with the cluster store and the tenant storeSecret flow, Architecture Overview, External Secrets Operator, Per-ControlPlane secret stores and OpenBao identities
secrets-db-credentialsStatic and dynamic database credentials side by side, with the refresh interval inside the two TTLssetup-database-tenant.sh, Migrate Keystone DB to Dynamic Credentials, Migrate Glance DB to Dynamic Credentials, Migrate Placement DB to Dynamic Credentials, Migrate Barbican DB to Dynamic Credentials, Migrate Cinder DB to Dynamic Credentials, Migrate Nova DB to Dynamic Credentials, Quick Start (ControlPlane), Quick Start (Orders), Order Resources from a ControlPlane
secrets-admin-credential-loopThe nine steps that bring the admin application credential from OpenBao to K-ORC and backK-ORC admin credential chain, Admin Credential Chain, AdminCredentialSpec
secrets-rotation-keysStaged rotation of Fernet and credential keys: CronJob, staging Secret, operator, podsKey Rotation RBAC Split, Background: Who Writes What, Rotate Fernet keys manually
secrets-rotation-admin-passwordScheduled and manual rotation of the admin password through OpenBao to the bootstrap JobSchedule Keystone Admin Password Rotation, Rotate the Keystone Admin Password, reconcilePasswordRotation
secrets-rotation-ordersGeneration N and N+1 of an ordered application credential or bus user over time, the grace period, the expiry, and the two kinds that rotate differentlyOrder an application credential, Step 7 of the Quick Start (Orders)
secrets-issuer-chainsThe self-signed issuer, the four CAs and their leaves as trust domainsSelf-Signed ClusterIssuer, TLS Configuration, Enable Keystone Database TLS/mTLS
secrets-rotation-key-projectionHow a rotated Fernet or credential key reaches the running pods without a rollout: the CronJob, the operator, the kubelet, the podsreconcileDeployment
secrets-openbao-bootstrap-orderThe order the five OpenBao bootstrap scripts run in, with what each doesScript Execution Order
controlplane-gate-graphThe twenty-one conditions of a ControlPlane as a gate graph: the blocking prefix, the tail group, and an arrow wherever one condition gates anotherReconciliation Flow, Status Conditions, Quick Start (ControlPlane), Quick Start (metal-stack), Conditions of a ControlPlane
controlplane-children-placementThe ControlPlane namespace, a dedicated service namespace and a target cluster, with the ownership model of eachControlPlane placement, Owner-ref / GC model, Ownership and garbage collection, Background: what a namespace assignment moves
controlplane-target-clusterA workload CR on a target cluster: the registration Secret, the access chart, the labelled children, and the routes that cross the cluster boundaryRegistering a target cluster, Deploy to a Target Cluster
controlplane-keystoneservice-registrationThe seven steps of a KeystoneService registration across two namespaces, from the consent to the consumer SecretChild Naming and Placement, Namespace consent, Background: what lands where
controlplane-order-flowAn order of one of the seven kinds, its children in the ControlPlane namespace, the backends and its delivered Secret, on the management cluster and on a target clusterQuick Start (Orders), Background: what lands where
controlplane-orders-target-pathThe six hops from a pod on a kind target cluster to the devstack's Keystone, database and bus, with the parts that exist on kind onlyThe path from the target, On a target cluster
controlplane-keystoneservice-flowThe reconciliation flow of the KeystoneService controller: the deletion branch, the finalizer, the gates with their reasons, and the three steps of a passReconciliation Flow
controlplane-keystoneuser-flowThe reconciliation flow of the KeystoneUser controller: the cluster and deletion branches, the admission gates, the finalizer, the credential gate, and the provision and delivery stepsReconciliation Flow
controlplane-mariadbdatabase-flowThe reconciliation flow of the MariaDBDatabase controller: the cluster and deletion branches, the admission gates, the finalizer, the dynamic-credentials gate, and the provision and delivery stepsReconciliation Flow
controlplane-rabbitmqvhost-flowThe reconciliation flow of the RabbitMQVhost controller: the cluster and deletion branches, the admission gates, the finalizer, the messaging gate, and the provision and delivery stepsReconciliation Flow
compute-node-anatomyOne hypervisor node: the four pods three resources put on it, their init containers, the host paths they share, and the three gates that order their startNode contract of a NovaCompute, Node contract of a NeutronMetadataAgent, Node contract of an OVNChassis, Label a Node as a Compute or Network Node
compute-cluster-wiringA control-plane cluster and a compute cluster: the Secrets that cross with their writers, and the address every component on the compute cluster dialsWhat the ControlPlane delivers, Namespaces on a compute cluster, reconcileNova, The remote contract
compute-ovn-control-planeWhat one OVNCentral runs, and which client reads or writes which databaseOVN Operator, Address computation, The two kinds, Drain a Chassis Node, Restore an OVN Database Snapshot, Repair OVN Drift with db-sync, Create a Provider Network
compute-nova-control-planeThe five Nova Deployments with the schemas and the bus each holds a connection toProcesses, Two cells per CR, Migrate Nova DB to Dynamic Credentials
compute-metadata-pathThe six hops of a metadata request from an instance to the Nova metadata API, and the shared secret at both endsThe path of a request, NovaMetadataSpec, Quick Start (metal-stack)
compute-node-phasesThe five phases of a node in a NovaCompute pool, with the trigger and the actor of every changeNode phases, Drain a Compute Node
compute-node-drainThe seven steps of a drain under the hypervisor operator across four lanes, with the point of no returnThe drain, On a compute cluster, Quick Start (metal-stack)
compute-metal-stack-labThe metal-stack lab after both parts of its quick start: cluster-wide parts, the pods of every worker, the traffic between workers, and the port-forwardQuick Start (metal-stack), Open questions, Metal-stack lab
compute-nova-pipelineThe sub-reconciler pipeline of the Nova operator: the lane, the parallel group of seven, the condition each step sets, the values handed on, and the exit to the status writePipeline
compute-novacompute-pipelineThe sub-reconciler pipeline of the NovaCompute controller: the lane, no parallel group, the condition each step sets, the values handed on, and the exit to the status writeNovaCompute pipeline
compute-neutronmetadataagent-pipelineThe sub-reconciler pipeline of the NeutronMetadataAgent controller: the lane, no parallel group, the condition each step sets, the values handed on, and the exit to the status writeNeutronMetadataAgent
compute-ovncentral-pipelineThe sub-reconciler pipeline of the OVNCentral controller: the lane, the parallel group, the condition each step sets, the values handed on, and the exit to the status writeOVNCentral
compute-ovnchassis-pipelineThe sub-reconciler pipeline of the OVNChassis controller: the lane, no parallel group, the condition each step sets, the values handed on, and the exit to the status writeOVNChassis
compute-nova-eventsThe event flow of the Nova operator: which sub-reconciler emits which event, with the condition, the type and the reasonEvent flow
compute-ovn-eventsThe event flow of the OVN operator: which sub-reconciler emits which event, with the condition, the type and the reasonEvent Flow
service-reconciler-pipelineThe sub-reconciler pipeline of the Keystone operator: the lane, the two parallel groups, the condition each step sets, the values handed on, and the exit to the status writeReconciliation Flow, Lifecycle and Reconciliation, Reconciler Integration Pattern
service-glance-pipelineThe sub-reconciler pipeline of the Glance operator: the lane, the parallel group, the condition each step sets, the values handed on, and the exit to the status writePipeline
service-barbican-pipelineThe sub-reconciler pipeline of the Barbican operator: the lane, the parallel group, the condition each step sets, the values handed on, and the exit to the status writePipeline
service-placement-pipelineThe sub-reconciler pipeline of the Placement operator: the lane, the parallel group, the condition each step sets, the values handed on, and the exit to the status writePipeline
service-horizon-pipelineThe sub-reconciler pipeline of the Horizon operator: the lane, the prune step and the parallel group, the condition each step sets, the values handed on, and the exit to the status writePipeline
service-cinder-pipelineThe sub-reconciler pipeline of the Cinder operator: the lane, the parallel group, the condition each step sets, the values handed on, and the exit to the status writePipeline
service-neutron-pipelineThe sub-reconciler pipeline of the Neutron operator: the lane, the parallel group, the condition each step sets, the values handed on, and the exit to the status writeNeutron
service-barbican-eventsThe event flow of the Barbican operator: which sub-reconciler emits which event, with the condition, the type and the reasonEvent Flow
service-cinder-eventsThe event flow of the Cinder operator: which sub-reconciler emits which event, with the condition, the type and the reasonEvent Flow
service-glance-eventsThe event flow of the Glance operator: which sub-reconciler emits which event, with the condition, the type and the reasonEvent Flow
service-keystone-eventsThe event flow of the Keystone operator: which sub-reconciler emits which event, with the condition, the type and the reasonEvent Flow
service-neutron-eventsThe event flow of the Neutron operator: which sub-reconciler emits which event, with the condition, the type and the reasonEvent Flow
service-placement-eventsThe event flow of the Placement operator: which sub-reconciler emits which event, with the condition, the type and the reasonEvent Flow
service-upgrade-phasesThe release upgrade as a state machine: the four phases with gate, failure states, the hold on a changed target and the abort, and the single pass of Barbican and PlacementPhase Transitions, Phases of a Cinder upgrade, Phases of a Glance upgrade, Phases of a Nova upgrade, Day 2 Operations
service-satellite-handshakeThe five steps in which a satellite resource and its service settle, and the read that must not existThe handshake, KeystoneIdentityBackendStatus, Conditions of a GlanceBackend, Conditions of a CinderBackend, Conditions of a CinderBackupBackend, Conditions of a BarbicanSecretStore, Attach an LDAP Domain Backend to Keystone, Attach an OIDC Federation Backend to Keystone, Attach a SAML Federation Backend to Keystone, Attach S3 Multi-Store Backends to Glance, Attach an NFS Backend to Cinder, Configure NFS Volume Backups, Attach an External OpenBao to Barbican, Run Barbican on a Dedicated OpenBao
service-owned-resourcesWhat one Keystone resource creates, in four groups with the objects it only reads, and who mounts whatOwned Resources, Owned resources of the Keystone operator
service-cinder-nfs-mountsThe four Cinder processes with the NFS export each mounts, the bus and the database they share, and nova-compute at the same exportProcesses, Config directories and mounts, Attach an NFS Backend to Cinder, Configure NFS Volume Backups, Quick Start (metal-stack)
service-glance-image-pathsUpload, web-download import and cached download as three paths through one glance-api pod, with the eviction threshold on its three volumesHow image bytes reach the store, What the conversion costs in staging, What the cache changes, Filter web-download Image Imports, StagingSpec
service-barbican-secret-storesThe dedicated and the external mode of a Barbican secret store side by side, with the management OpenBao as a separate server in bothOpenBaoStoreSpec, Run Barbican on a Dedicated OpenBao, Attach an External OpenBao to Barbican
service-federated-loginThe eight hops of a federated login through Horizon, with the hops the browser sends drawn apart from the calls between serversThe hops of a login, Browser (WebSSO), Step 7 — Log in via WebSSO, WebSSOSpec
service-keystone-parallel-mergeHow parallel group 1 of the Keystone operator merges its conditions: the three deep copies, the goroutines, errgroup.Wait() and the sequential merge back into the originalDeepCopy Condition Merge Pattern
service-keystone-deletion-branchHow the Keystone reconciler branches on the deletion timestamp: the two finalizer handlers on a terminating resource, AddFinalizer and the pipeline on a live oneReconcile Branching on DeletionTimestamp
service-keystone-config-pipelineThe eight stages reconcileConfig renders keystone.conf through, from the spec fields to the immutable ConfigMapreconcileConfig
service-keystone-schema-check-flowThe database step of the Keystone operator with the schema check: the MariaDB gate, the upgrade hand-off, the db_sync and schema-check Jobs with the condition each outcome sets, and the final status writeData Flow
service-keystone-upgrade-dispatchHow the two sub-reconcilers of the Keystone operator share a release upgrade: the active-upgrade and isUpgrade() branches of reconcileDatabase, the zero-value hand-off, and the RollingUpdate check of reconcileDeploymentData Flow
ci-stage-overviewThe jobs of the CI workflow grouped into stages, with the order of the stages on a pull request and on a pushJob Dependency DAG
ci-service-image-buildWhich file of the repository feeds which step of a service image build on the Nix path: the pins hack/nix-lock.sh turns into the committed lock, the nix build that reads the lock, and the nova-compute image beside itImage Hierarchy, build-service-images
ci-image-publishThe image build workflow on a pull request and on a push: what every run checks, where a pull request stops, and what a push merges, attests and signsPR vs Push Behavior, Service Images
ci-build-images-jobsThe jobs of the build-images workflow in three families, with an arrow from every job a job needsJobs
test-tempest-bedThe Tempest container on the runner, the port-forwards and host aliases that take it to the Services, and the seed Jobs inside the clusterData Flow (CI End-to-End), tempest
test-chaos-bedThe six steps of a chaos suite between the runner, the chaos resource, Chaos Mesh and the victim pods, and why a partition rule sits on the server podsOverview, e2e-chaos
test-tempest-image-chainFrom the Tempest version pins to the JUnit report: the lock, the image expression, the two workflows that consume it, the config directory, and the resultArchitecture
test-tempest-job-stepsThe commands of one tempest job in CI, in six steps from the lock to the uploaded artifactData Flow (CI End-to-End)
test-keystone-condition-progressionThe order the Keystone reconciler sets its conditions in, as the basic-deployment suite asserts themSub-Condition Progression
test-chaos-patternsThe six step patterns of the chaos suites, each a numbered chainTest Patterns
deploy-flux-dependenciesThe HelmReleases of the production base in four layers by dependsOn, the three Flux Kustomizations with the one dependsOn between them, and the two dependencies on a Flux Kustomization that no manifest declaresDependency Order, Layering, Dependency Chain
deploy-infra-runThe eight steps of make deploy-infra with the waits between them, the two cluster modes and the step each opt-in changesDeployment Sequence, Deployment, Step 3 of the Quick Start (Extended)
deploy-overlay-inheritanceWhich kustomize overlay under deploy/ takes which as its base, from production over kind to the lab, and who applies eachKustomize Overlay Structure, Lab overlay
deploy-keystone-operator-helmreleaseHow the Flux helm-controller installs the keystone-operator HelmRelease, in seven steps from the dependsOn check to the first reconcileData Flow
conventions-legendThe notation for frames, objects, arrows, sequences, state machines, markers, outside actors, nodes, browser hops and imagesNotation legend

Change a diagram ​

  1. Open the .drawio file in the draw.io desktop app, in diagrams.net, or in VS Code with the Draw.io Integration extension. The file is stored uncompressed, so a change shows up as a readable diff.
  2. Edit the diagram. Most arrows are attached to their boxes and follow when a box moves.
  3. Export with File › Export as › SVG and overwrite the .svg of the same name. Leave Transparent Background unchecked: on a transparent background the dark labels vanish in the dark theme of the docs. A Border Width of 40 keeps the margin the current files have.
  4. Run npm run docs:dev, open the page that embeds the diagram, and check it in the light and the dark theme.
  5. Commit the .drawio and the .svg together.

The figures that hack/docs-figures/ lists are generated: the pipeline, event-flow, order-flow and chain figures of the reference pages. A change to one of them is a change to its entry in the script that draws it (pipelines.py, events.py with the trees under events/, gate_trees.py or rest_figs.py), followed by a run of that script, which rewrites both files of every pair it owns. A hand edit to a generated pair is lost on the next run.

A new diagram follows the same pattern. Put the pair into docs/diagrams/ under a name from File names. On a page directly under docs/ the path is ./diagrams/<name>.svg. A page further down puts one ../ per directory level in front of diagrams/<name>.svg, so a page two levels down spells it ../../diagrams/<name>.svg. Give the image an alt text that states what the diagram shows, and add a row to the inventory that lists every page that embeds it. Every embed of a figure carries the same alt text, so a change to what a figure shows updates the alt text on every page its row lists. When a file, a row and an embed disagree, or two embeds of a figure carry different alt texts, tests/unit/docs/diagrams_inventory_test.sh fails, and a missing file also fails npm run docs:build.

File names ​

A file is named <prefix><subject>, lower case, words joined by hyphens.

PrefixFigures
cobaltcore-The product architecture: the six figures of the start page and the Architecture page
quickstart-Entry pages: the quick-start map and the request path
secrets-Secret and credential paths between OpenBao, ESO, the operators and the services
controlplane-ControlPlane orchestration, placement, target clusters and the orders
service-Service operator patterns and paths specific to one service
compute-Compute nodes, the compute cluster, Nova, OVN and the metadata path
deploy-Installation: Flux dependencies, the deploy run, overlays
ci-CI and image builds
test-Test beds
conventions-Figures about the figures: the legend

Visual conventions ​

The font is IBM Plex Sans from Google Fonts. A browser that does not have it installed falls back to Arial.

ElementStrokeTextFill
IronCore / bare-metal node#C9620F#A44E07#FBEFE3 (node: #FFF8F1)
Gardener#5E43A8#4B3592#EEEAF7
CobaltCore / Operation and Monitoring / c5c3-operator#2F8A57#1E6B40#E6F1EA
OpenStack Control Plane / API / services#2457C5#1D47A6#E7EDF9
Ceph Storage#0E7D89#0B5F69#E3F1F2
OpenStack Compute#C6343C#A3262E#F8E8E9
OpenStack Network / OVN#B38A00#6F5600#FAF3DA
Garden Linux#7D8794#2B3440#E9ECEF
Platform and infrastructure components#7D8794#2B3440#EEF0F3
Secret material#B0387F#8A2B63#F7E8F0
Backgroundnonenone#F6F5F1

The shapes and arrows carry a fixed meaning:

  • Orange node frames: bare-metal servers that IronCore provisions and manages.
  • Solid orange arrows: IronCore manages the nodes out of band. Where a Gardener arrow crosses one, the orange line has a small gap.
  • A violet K8s chip and violet arrows mark a Kubernetes cluster that Gardener creates and manages through its IronCore provider extension.
  • A grey K8s chip marks a Kubernetes cluster whose management the diagram leaves open.
  • Blue arrows: OpenStack API and control-plane connections.
  • Dashed boxes: optional parts, or further instances of the same kind (+ more).
  • Green arrows: an operator creates or reconciles what the arrow points at.
  • Line patterns: solid is declared in an object or enforced in code, dashed (3 2) is optional or a further instance, and dotted (1 3) holds at run time and is declared nowhere.

The icons in cobaltcore-overview are plain line icons and can be replaced by another icon set.

Notation legend ​

The legend draws one sample of every element in the table below.

The notation of the docs figures in nine groups. Frames: a cluster frame with a K8s chip that contains a namespace frame with an ns chip. Objects: a custom resource as a filled pill, a workload as an outline pill, a Secret and a ConfigMap as sheets with a folded corner, a Job and a CronJob as boxes with a bar at each side. Arrows: green for creates, blue for the OpenStack API, magenta for secret material labelled ExternalSecret or PushSecret, dark for order (solid when declared, dotted at run time), a grey line with a filled diamond for an owner reference, a dotted grey line with an open diamond for ownership by label, and a dashed arrow for optional parts. Sequences: numbered step badges at the tail of each arrow. State machines: an initial marker, a state, a stuck state in grey, and a transition labelled with its trigger and who drives it. Markers and outside actors: the chips by hand, kind only, lab only and never, and the actors Workstation, CI runner and Identity provider. Nodes: a node frame with a node chip that contains a workload, a host path, an emptyDir or an NFS export as a grey box with square corners, a thin grey line for a mount, and a line with an arrowhead at each end for traffic between nodes. Browser hops: a blue arrow with an open arrowhead for a request the browser sends. Images: a container image as a hexagon.

Every draw.io style also carries whiteSpace=wrap;html=1; and the font settings of the existing files. <stroke> and <text> are the palette colors of the role that owns the object.

ElementMeaningLooks likedraw.io style
Cluster frameOne Kubernetes clusterLight frame, dark K8s chip and bold name at the top leftrounded=1;absoluteArcSize=1;arcSize=37;fillColor=#FDFCF9;strokeColor=#3A4452;strokeWidth=3;
Namespace frameOne namespace inside a cluster frameRecessed frame, grey ns chip and bold name at the top leftrounded=1;absoluteArcSize=1;arcSize=24;fillColor=#F6F5F1;strokeColor=#7D8794;strokeWidth=2; and for the chip fillColor=#7D8794;strokeColor=none;
Custom resourceA CR a person or an operator applies, or another API object that is no workload, Secret, ConfigMap, Job or CronJobFilled pill, bold light textrounded=1;absoluteArcSize=1;arcSize=40;fillColor=<text>;strokeColor=none;
WorkloadDeployment, StatefulSet, DaemonSet or pod, or the Service in front of one. In a test bed figure also a container that docker run starts on the runnerOutline pillrounded=1;absoluteArcSize=1;arcSize=34;fillColor=#FDFCF9;strokeColor=<stroke>;strokeWidth=2;
SecretA Kubernetes SecretSheet with a folded corner in the Secret colorsshape=note;size=16;fillColor=#F7E8F0;strokeColor=#B0387F;strokeWidth=2;
ConfigMapA ConfigMapSheet with a folded corner, greyshape=note;size=16;fillColor=#FDFCF9;strokeColor=#7D8794;strokeWidth=2;
Job, CronJobA workload that runs to completion. The label starts with the kindBox with a bar at each sideshape=process;size=0.08;fillColor=#FDFCF9;strokeColor=<stroke>;strokeWidth=2;
CreatesAn operator creates or reconciles what the arrow points atGreen arrowstrokeColor=#2F8A57;strokeWidth=3;endArrow=block;endFill=1;
OpenStack APIAn OpenStack API or control-plane connectionBlue arrowstrokeColor=#2457C5;strokeWidth=3;endArrow=block;endFill=1;
Secret materialA secret value travels in the arrow's direction. The label names the resource that moves it: ExternalSecret out of OpenBao, PushSecret into itMagenta arrow, label in font size 20strokeColor=#B0387F;strokeWidth=3;endArrow=block;endFill=1;
OrderWhat must be ready first points at what waits for it. In the overlay figure the directory an overlay lists under resources points at that overlayDark arrow, solid when declared or enforced, dotted when it holds only at run timestrokeColor=#3A4452;strokeWidth=3;endArrow=block;endFill=1; plus dashed=1;dashPattern=1 3;
Owner referenceThe owner garbage-collects the objectGrey line, filled diamond at the ownerstrokeColor=#7D8794;strokeWidth=2;endArrow=none;startArrow=diamondThin;startFill=1;startSize=14;
Ownership by labelOwned through labels, because no owner reference can cross the namespace or clusterDotted grey line, open diamond at the ownerstrokeColor=#7D8794;strokeWidth=2;endArrow=none;startArrow=diamondThin;startFill=0;startSize=14;dashed=1;dashPattern=1 3;
OptionalAn optional part or a further instance of the same kindDashed arrow in the color of its kindthe style of its kind plus dashed=1;dashPattern=3 2;
Step badgeStep n of a sequence. One page lists the steps under the same numbers, and the other pages that embed the figure link to that listDark circle with a light number at the tail of the arrow, or at the top left of the box where the step is a boxellipse;aspect=fixed;fillColor=#17202B;strokeColor=none;fontColor=#FDFCF9;fontStyle=1;fontSize=20; at 36 by 36
StateA state of a state machine, a status condition in a gate graph, a quick start in the quick-start map, or a step of a pipelineBox with slightly rounded corners, bold namerounded=1;absoluteArcSize=1;arcSize=12;fillColor=#FDFCF9;strokeColor=#3A4452;strokeWidth=2;
Stuck stateA state the machine leaves only after someone intervenesThe same box, greyrounded=1;absoluteArcSize=1;arcSize=12;fillColor=#E9ECEF;strokeColor=#7D8794;strokeWidth=2;
Initial markerWhere the machine, or a pass of a pipeline, startsSmall dark dot with an Order arrow into the first stateellipse;aspect=fixed;fillColor=#17202B;strokeColor=none; at 20 by 20
TransitionA change of state. First label line: the trigger. Second line, font size 20 in #55606E: who drives it. In the quick-start map the first line says how two quick starts relate and the second what changes for the readerOrder arrow with a two-line labelthe Order style
By handA person does this step, no controllerOutlined dark chip by hand at the top right of the partrounded=1;arcSize=50;fillColor=#FDFCF9;strokeColor=#17202B;strokeWidth=2;fontColor=#17202B;fontStyle=1;fontSize=18;
kind only, lab onlyThe part exists on that devstack only. The part itself is drawn solid, since dashed means optionalOutlined grey chip kind only or lab onlyrounded=1;arcSize=50;fillColor=#FDFCF9;strokeColor=#7D8794;strokeWidth=2;fontColor=#55606E;fontStyle=1;fontSize=18;
Outside actorA workstation, a CI runner or an identity provider. It sits on the canvas, outside every cluster frameBox with a bold name and a second line, font size 20 in #55606E, that says what actsrounded=1;absoluteArcSize=1;arcSize=16;fillColor=#FDFCF9;strokeColor=#3A4452;strokeWidth=2;
Node frameOne Kubernetes node. A pod on it is a group box named after its DaemonSet; inside, a container is a Workload pill and an init container a Job box whose label starts with initLight frame with a grey outline, dark node chip and bold name at the top leftrounded=1;absoluteArcSize=1;arcSize=24;fillColor=#FDFCF9;strokeColor=#7D8794;strokeWidth=3; and for the chip fillColor=#3A4452;strokeColor=none;
Host pathA directory or socket in the node's file system that pods mount. An emptyDir and an NFS export are drawn the same way; the label then starts with emptyDir or NFS export. In a build figure a file or a directory of the repository is drawn the same way, with its path as the labelGrey box with square corners, the path as its labelrounded=0;fillColor=#E9ECEF;strokeColor=#7D8794;strokeWidth=2;
MountThe pod at one end mounts the host path, the emptyDir, the NFS export or the ConfigMap at the otherThin grey line without an arrowheadstrokeColor=#7D8794;strokeWidth=2;endArrow=none;
Node-to-node trafficTraffic of instances, or of their memory and disks, between two nodes. The label names protocol and portLine with an arrowhead at each end, in the colour of the role that owns the trafficstrokeColor=<stroke>;strokeWidth=3;endArrow=block;endFill=1;startArrow=block;startFill=1;
Browser hopA request the browser sends because a link, a redirect or a form told it to. It starts at the browser, and its label says what the browser opens. A call one server makes to another keeps the OpenStack API arrowBlue arrow with an open arrowheadstrokeColor=#2457C5;strokeWidth=3;endArrow=open;endSize=14;
NeverThe arrow under the chip must not exist: a read or a dependency the code leaves out on purpose. A caption says what would breakAn arrow of its kind in red, #C6343C, with an outlined red chip never on its middlerounded=1;arcSize=50;fillColor=#FDFCF9;strokeColor=#C6343C;strokeWidth=2;fontColor=#A3262E;fontStyle=1;fontSize=18; for the chip
Container imageAn image in a registry or in the Docker daemon of a runner. The label is the repository name without the registry; a caption gives the tag where it mattersHexagon with a grey outlineshape=hexagon;perimeter=hexagonPerimeter2;fixedSize=1;size=16;fillColor=#FDFCF9;strokeColor=#7D8794;strokeWidth=2;