oss
This commit is contained in:
commit
cd47fc8dd7
15 changed files with 638 additions and 0 deletions
1
LICENSE
Normal file
1
LICENSE
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
TALA is currently closed-source. For more information on licensing, please visit https://terrastruct.com/tala.
|
||||||
120
README.md
Normal file
120
README.md
Normal file
|
|
@ -0,0 +1,120 @@
|
||||||
|
# TALA
|
||||||
|
|
||||||
|
TALA is a diagram layout engine designed specifically for software architecture diagrams,
|
||||||
|
though it works well in other domains too. TALA is closed-source (for now). This
|
||||||
|
repository is primarily for installation instructions. You can also use this repository to
|
||||||
|
report issues, ask questions, and request features.
|
||||||
|
|
||||||
|
To learn more about TALA, please visit
|
||||||
|
[https://terrastruct.com/tala](https://terrastruct.com/tala).
|
||||||
|
|
||||||
|
To compare TALA with other layout engines, please visit
|
||||||
|
[https://text-to-diagram.com](https://text-to-diagram.com/?a=d2&layout_a=tala&b=d2&layout_b=dagre&example=chess).
|
||||||
|
|
||||||
|
## Rendering samples
|
||||||
|
|
||||||
|
You can see the `.d2` text for these in [./docs/d2](./docs/d2). Samples are
|
||||||
|
[generated](./ci/generate_samples.sh) through the CLI.
|
||||||
|
|
||||||
|
|<img src="./docs/assets/sample_1.svg" />|<img src="./docs/assets/sample_2.svg" />|<img src="./docs/assets/sample_3.svg" />|
|
||||||
|
|:-------------------------:|:-------------------------:|:-------------------------:|
|
||||||
|
|<img src="./docs/assets/sample_4.svg" />|<img src="./docs/assets/sample_5.svg" />|<img src="./docs/assets/sample_6.svg" />|
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl -fsSL https://d2lang.com/install.sh | sh -s -- --tala --dryrun
|
||||||
|
# If things look good, install for real.
|
||||||
|
curl -fsSL https://d2lang.com/install.sh | sh -s -- --tala
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also find binaries
|
||||||
|
[Releases](https://github.com/terarstruct/TALA/releases) page for Linux and MacOS, for
|
||||||
|
both AMD and ARM. Download the appropriate one for your OS to a directory
|
||||||
|
in your path. Windows coming soon.
|
||||||
|
|
||||||
|
### Post-install
|
||||||
|
|
||||||
|
Check that it was installed properly:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
d2 layout tala
|
||||||
|
```
|
||||||
|
|
||||||
|
It should print out information about TALA. If not, please see troubleshooting steps.
|
||||||
|
|
||||||
|
### Use TALA
|
||||||
|
|
||||||
|
You are now ready to use TALA to layout your diagrams! Specify that D2 should use TALA by
|
||||||
|
setting the environment variable `D2_LAYOUT`.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
D2_LAYOUT=tala d2 in.d2 out.svg
|
||||||
|
```
|
||||||
|
|
||||||
|
### Add API token (optional)
|
||||||
|
|
||||||
|
You may skip this step if you are just evaluating.
|
||||||
|
|
||||||
|
If you have an API token, copy and paste it into your environment variables. E.g.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export TSTRUCT_TOKEN = "tstruct_..."
|
||||||
|
```
|
||||||
|
|
||||||
|
## License keys
|
||||||
|
|
||||||
|
TALA is freely installable and locally runnable for evaluation. You'll need an API token
|
||||||
|
from your Terrastruct account to run it out of evaluation mode. Alternatively, if you
|
||||||
|
don't want to create an account, you can purchase a personal license key for TALA that
|
||||||
|
allows you to run TALA forever with access to updates for 12 months
|
||||||
|
[here](https://buy.stripe.com/bIYeXL3cT2Lr23e5ko). If you'd like to get the benefits of a
|
||||||
|
paid Terrastruct account at any time after, your license key will allow that.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### TALA not found
|
||||||
|
|
||||||
|
```sh
|
||||||
|
which d2plugin-tala
|
||||||
|
```
|
||||||
|
|
||||||
|
If this does not return a directory, then `d2plugin-tala` is not in your path.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
echo $PATH
|
||||||
|
```
|
||||||
|
|
||||||
|
Please move the downloaded binary to one of those locations.
|
||||||
|
|
||||||
|
### License warning prints even with API token
|
||||||
|
|
||||||
|
In the same terminal that you're running `d2` on, run
|
||||||
|
|
||||||
|
```sh
|
||||||
|
echo $TSTRUCT_TOKEN
|
||||||
|
```
|
||||||
|
|
||||||
|
If it is not found, then your environment variable has not been set in your shell. Make
|
||||||
|
sure you add it to the appropriate shell config file and `source` it in the running
|
||||||
|
terminal.
|
||||||
|
|
||||||
|
### Other
|
||||||
|
|
||||||
|
Please open an Issue describing what you're running into and we're happy to help. If you'd
|
||||||
|
like to remain anonymous/private, feel free to email us at info@terrastruct.com
|
||||||
|
|
||||||
|
## FAQ
|
||||||
|
|
||||||
|
### Does TALA use the internet?
|
||||||
|
|
||||||
|
The TALA plugin do not collect telemetry or use the internet in any way except to ping to
|
||||||
|
check the status of a license. This is only done when necessary, e.g. if you purchased a
|
||||||
|
month subscription, TALA will ping at the start of the next month and renew automatically
|
||||||
|
if the subscription is ongoing. If you purchased a year, it won't ping for a year. The
|
||||||
|
only data that's sent in these pings is the API token itself. No diagrams or anything
|
||||||
|
else leaves your computer.
|
||||||
|
|
||||||
|
### Others
|
||||||
|
|
||||||
|
Full FAQ at [https://terrastruct.com/tala](https://terrastruct.com/tala).
|
||||||
18
ci/generate_samples.sh
Executable file
18
ci/generate_samples.sh
Executable file
|
|
@ -0,0 +1,18 @@
|
||||||
|
#!/bin/sh
|
||||||
|
set -eu
|
||||||
|
cd -- "$(dirname "$0")/.."
|
||||||
|
|
||||||
|
THEME_INDEX=0
|
||||||
|
|
||||||
|
# alternate between cool and warm
|
||||||
|
themes=(0 100 1 102 4 104 5 105 6)
|
||||||
|
|
||||||
|
for f in ./docs/d2/*.d2
|
||||||
|
do
|
||||||
|
echo "Processing $f"
|
||||||
|
filename=$(basename -- "$f")
|
||||||
|
filename="${filename%.*}"
|
||||||
|
D2_LAYOUT=tala d2 --theme=${themes[$THEME_INDEX]} --debug $f ./docs/assets/${filename}.svg
|
||||||
|
|
||||||
|
let THEME_INDEX=${THEME_INDEX}+1
|
||||||
|
done
|
||||||
66
docs/assets/sample_1.svg
Normal file
66
docs/assets/sample_1.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 799 KiB |
31
docs/assets/sample_2.svg
Normal file
31
docs/assets/sample_2.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 476 KiB |
31
docs/assets/sample_3.svg
Normal file
31
docs/assets/sample_3.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 472 KiB |
24
docs/assets/sample_4.svg
Normal file
24
docs/assets/sample_4.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 331 KiB |
39
docs/assets/sample_5.svg
Normal file
39
docs/assets/sample_5.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 477 KiB |
24
docs/assets/sample_6.svg
Normal file
24
docs/assets/sample_6.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 331 KiB |
39
docs/d2/sample_1.d2
Normal file
39
docs/d2/sample_1.d2
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
runner: JobRunner {
|
||||||
|
shape: class
|
||||||
|
|
||||||
|
-start: datetime
|
||||||
|
-end: datetime
|
||||||
|
-running_server: string
|
||||||
|
-threads: int
|
||||||
|
-manager: JobsManager
|
||||||
|
+pipeline: Pipeline
|
||||||
|
|
||||||
|
+setPipeline(Pipeline p): void
|
||||||
|
+kickoff(threads int): bool
|
||||||
|
}
|
||||||
|
|
||||||
|
jobsUI: JobRunner UI {
|
||||||
|
kickoff
|
||||||
|
halt
|
||||||
|
}
|
||||||
|
|
||||||
|
batch: Batch {
|
||||||
|
manager: BatchManager {
|
||||||
|
shape: class
|
||||||
|
-num: int
|
||||||
|
-timeout: int
|
||||||
|
-pid
|
||||||
|
|
||||||
|
+getStatus(): Enum
|
||||||
|
+getJobs(): "Job[]"
|
||||||
|
+setTimeout(seconds int)
|
||||||
|
}
|
||||||
|
systemd: Systemd
|
||||||
|
selenium: Selenium
|
||||||
|
|
||||||
|
systemd -> manager: Ensure alive
|
||||||
|
manager -> selenium: Run job
|
||||||
|
}
|
||||||
|
|
||||||
|
jobsUI -> runner: Kick off
|
||||||
|
runner -> batch.manager: Queue jobs
|
||||||
44
docs/d2/sample_2.d2
Normal file
44
docs/d2/sample_2.d2
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
logs: {
|
||||||
|
shape: page
|
||||||
|
style.multiple: true
|
||||||
|
}
|
||||||
|
user: AT&T Customer {shape: person}
|
||||||
|
network: Network {
|
||||||
|
tower: Cell Tower {
|
||||||
|
satellites: {
|
||||||
|
shape: stored_data
|
||||||
|
style.multiple: true
|
||||||
|
}
|
||||||
|
transmitter
|
||||||
|
|
||||||
|
satellites -> transmitter
|
||||||
|
satellites -> transmitter
|
||||||
|
satellites -> transmitter
|
||||||
|
}
|
||||||
|
processor: Data Processor {
|
||||||
|
storage: Storage {
|
||||||
|
shape: cylinder
|
||||||
|
style.multiple: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
portal: Online Portal {
|
||||||
|
UI
|
||||||
|
}
|
||||||
|
|
||||||
|
tower.transmitter -> processor: phone logs
|
||||||
|
}
|
||||||
|
server: API Server
|
||||||
|
|
||||||
|
user -> network.tower: Make call
|
||||||
|
network.processor -> server
|
||||||
|
network.processor -> server
|
||||||
|
network.processor -> server
|
||||||
|
|
||||||
|
server -> logs
|
||||||
|
server -> logs
|
||||||
|
server -> logs: persist
|
||||||
|
|
||||||
|
server -> network.portal.UI: display
|
||||||
|
user -> network.portal.UI: access {
|
||||||
|
style.stroke-dash: 3
|
||||||
|
}
|
||||||
31
docs/d2/sample_3.d2
Normal file
31
docs/d2/sample_3.d2
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
SSR: Server side render {
|
||||||
|
templates: User defined templates
|
||||||
|
|
||||||
|
tests: Validation tests
|
||||||
|
|
||||||
|
engine: Rendering Engine\n API {
|
||||||
|
ingestion: Ingestion module {
|
||||||
|
shape: hexagon
|
||||||
|
}
|
||||||
|
fetch: Data fetching module {
|
||||||
|
shape: hexagon
|
||||||
|
}
|
||||||
|
schema: Schema version module {
|
||||||
|
shape: hexagon
|
||||||
|
}
|
||||||
|
}
|
||||||
|
next: NextJS
|
||||||
|
db: Data
|
||||||
|
|
||||||
|
templates -> engine.ingestion
|
||||||
|
engine.fetch <-> db: Integrate user data
|
||||||
|
engine.schema <-> db: Get version
|
||||||
|
|
||||||
|
engine <-> tests
|
||||||
|
}
|
||||||
|
|
||||||
|
build: Final build {
|
||||||
|
html: Rendered HTML
|
||||||
|
}
|
||||||
|
|
||||||
|
SSR.engine -> SSR.next -> build.html
|
||||||
48
docs/d2/sample_4.d2
Normal file
48
docs/d2/sample_4.d2
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
payment
|
||||||
|
|
||||||
|
AWS {
|
||||||
|
orchestrator: Orchestrator
|
||||||
|
airflow: Apache Airflow {
|
||||||
|
queue1: Queue 1 {
|
||||||
|
shape: queue
|
||||||
|
}
|
||||||
|
queue2: Queue 2 {
|
||||||
|
shape: queue
|
||||||
|
}
|
||||||
|
queue3: Queue 3 {
|
||||||
|
shape: queue
|
||||||
|
}
|
||||||
|
queue4: Queue 4 {
|
||||||
|
shape: queue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
orchestrator -> airflow.queue1
|
||||||
|
orchestrator -> airflow.queue2
|
||||||
|
orchestrator -> airflow.queue3
|
||||||
|
orchestrator -> airflow.queue4
|
||||||
|
}
|
||||||
|
|
||||||
|
payment -> AWS.orchestrator
|
||||||
|
|
||||||
|
backup: Data backup
|
||||||
|
|
||||||
|
AWS.airflow.queue3 -> backup
|
||||||
|
AWS.airflow.queue4 -> backup
|
||||||
|
|
||||||
|
data: Data warehouse
|
||||||
|
|
||||||
|
AWS.airflow.queue1 -> data
|
||||||
|
AWS.airflow.queue2 -> data
|
||||||
|
|
||||||
|
local: On-prem backups {
|
||||||
|
queue1: Queue 1 {
|
||||||
|
shape: queue
|
||||||
|
}
|
||||||
|
queue2: Queue 2 {
|
||||||
|
shape: queue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
backup -> local.queue1
|
||||||
|
backup -> local.queue2
|
||||||
73
docs/d2/sample_5.d2
Normal file
73
docs/d2/sample_5.d2
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
tenant: Offsite Tenant {
|
||||||
|
style.shadow: true
|
||||||
|
|
||||||
|
accountant: Accountant
|
||||||
|
security: Security
|
||||||
|
janitor: Janitor
|
||||||
|
}
|
||||||
|
|
||||||
|
tenant.accountant -> Quickbooks
|
||||||
|
|
||||||
|
auditors: Auditors
|
||||||
|
|
||||||
|
auditors -> Quickbooks
|
||||||
|
auditors -> IRS
|
||||||
|
Quickbooks -> Clients
|
||||||
|
|
||||||
|
dataroom: E335 Data Room {
|
||||||
|
style.shadow: true
|
||||||
|
style.fill: "#e9edef"
|
||||||
|
style.stroke-width: 2
|
||||||
|
|
||||||
|
whitelist: Whitelisted Server {
|
||||||
|
shape: rectangle
|
||||||
|
style.stroke-dash: 10
|
||||||
|
style.stroke: "#000E3D"
|
||||||
|
|
||||||
|
routing: Routing blocker
|
||||||
|
headers: Add header tokens
|
||||||
|
}
|
||||||
|
|
||||||
|
platform: Microsoft Windows Fleet {
|
||||||
|
style.stroke-dash: 4
|
||||||
|
style.stroke: "#000E3D"
|
||||||
|
build
|
||||||
|
}
|
||||||
|
whitelist <-> platform: Maintain connection {style.stroke-width: 4}
|
||||||
|
}
|
||||||
|
|
||||||
|
auditors -> dataroom.platform.build
|
||||||
|
auditors -> dataroom.whitelist.routing
|
||||||
|
tenant.accountants -> dataroom
|
||||||
|
|
||||||
|
logging: Web based logger
|
||||||
|
|
||||||
|
production: Data for prod {
|
||||||
|
style.shadow: true
|
||||||
|
|
||||||
|
network: Network availability {
|
||||||
|
style.stroke-dash: 10
|
||||||
|
style.stroke: "#000E3D"
|
||||||
|
|
||||||
|
instances: App instances {
|
||||||
|
style.multiple: true
|
||||||
|
}
|
||||||
|
|
||||||
|
db: App DBs {
|
||||||
|
shape: cylinder
|
||||||
|
}
|
||||||
|
|
||||||
|
secrets: AWS Secrets
|
||||||
|
|
||||||
|
containers: Docker containers
|
||||||
|
|
||||||
|
instances -> db
|
||||||
|
instances -> secrets
|
||||||
|
containers -> db
|
||||||
|
containers -> secrets
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dataroom.whitelist.routing -> production.network.instances
|
||||||
|
dataroom.whitelist.headers -> production.network.instances
|
||||||
|
production.network.instances -> backups
|
||||||
49
docs/d2/sample_6.d2
Normal file
49
docs/d2/sample_6.d2
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
ibm: IBM "Espresso" CPU {
|
||||||
|
core0: IBM PowerPC "Broadway" Core 0
|
||||||
|
core1: IBM PowerPC "Broadway" Core 1
|
||||||
|
core2: IBM PowerPC "Broadway" Core 2
|
||||||
|
|
||||||
|
rom: 16 KB ROM
|
||||||
|
|
||||||
|
core0 -- core2
|
||||||
|
|
||||||
|
rom -> core2
|
||||||
|
}
|
||||||
|
|
||||||
|
amd: AMD "Latte" GPU {
|
||||||
|
mem: Memory & I/O Bridge
|
||||||
|
dram: DRAM Controller
|
||||||
|
edram: 32 MB EDRAM "MEM1"
|
||||||
|
rom: 512 B SEEPROM
|
||||||
|
|
||||||
|
sata: SATA IF
|
||||||
|
exi: EXI (Efficient XML Interchange)
|
||||||
|
|
||||||
|
gx: GX {
|
||||||
|
3 MB 1T-SRAM
|
||||||
|
}
|
||||||
|
|
||||||
|
radeon: AMD Radeon R7xx "GX2"
|
||||||
|
|
||||||
|
mem -- gx
|
||||||
|
mem -- radeon
|
||||||
|
|
||||||
|
|
||||||
|
rom -- mem
|
||||||
|
|
||||||
|
mem -- sata
|
||||||
|
mem -- exi
|
||||||
|
|
||||||
|
dram -- sata
|
||||||
|
dram -- exi
|
||||||
|
}
|
||||||
|
|
||||||
|
ddr3: 2 GB DDR3 RAM "MEM2"
|
||||||
|
|
||||||
|
amd.mem -- ddr3
|
||||||
|
amd.dram -- ddr3
|
||||||
|
amd.edram -- ddr3
|
||||||
|
|
||||||
|
ibm.core1 -- amd.mem
|
||||||
|
|
||||||
|
amd.exi -- RTC
|
||||||
Loading…
Reference in a new issue