Skip to content

Commit

Permalink
fix(ordering): switch container_name_to_parents implementation to pre…
Browse files Browse the repository at this point in the history
…serve order (#36)

* fix(ordering): switch container_name_to_parents implementation to BTreeMap

* chore: remove unused code

* chore: minor tweaks

* feat: support color names

* fix: remove redundant components vector

* refactor: simplify dependency component

* fix: ordering to match the docker-compose.yaml
feat: add initial network support

* chore: apply clippy & fmt

* chore: create functions for alignment mode usage

* feat: add network horizontal and vertical modes support

* refactor: optimize the network drawing methods

* feat: add network command line parameter

* docs: add docs to the method

* chore: temporarily change the gh-action to create prerelease

* docs: update help output and roadmap

* chore: add skip-network flag support to the docker file, add usage examples

* chore: update version

* chore: small enhancements, restore service color, remove unused code
  • Loading branch information
etolbakov authored Jul 24, 2023
1 parent 8dc406a commit 181f647
Show file tree
Hide file tree
Showing 12 changed files with 510 additions and 56 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ on:

env:
RUST_TOOLCHAIN: nightly-2023-05-03
BUILD_VERSION_PREFIX: v0.1.7
BUILD_VERSION_PREFIX: v0.1.8
CARGO_PROFILE: release

permissions:
Expand Down Expand Up @@ -310,4 +310,4 @@ jobs:
tag: ${{ env.VERSION }}
generateReleaseNotes: true
artifacts: |
**/excalidocker-*
**/excalidocker-*
5 changes: 4 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "excalidocker"
version = "0.1.7"
version = "0.1.8"
edition = "2021"
authors = ["Evgeny Tolbakov <[email protected]>"]
description = "Utility to convert your docker-compose into excalidraw"
Expand All @@ -20,6 +20,9 @@ clap = {version = "4.3.8", features = ["derive", "cargo"]}
thiserror = "1.0.40"
rand = "0.8.5"
isahc = "1.7"
phf = { version = "0.11", features = ["macros"] }
# linked list to store the containers in the order they appear in the docker-compose.yaml
indexmap = { version = "2.0.0", features = ["serde"] }

# https://github.com/sfackler/rust-openssl/issues/1021
openssl = { version = "0.10", features = ["vendored"] }
Expand Down
5 changes: 4 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,11 @@ s:
check:
cargo check --all-features

fmtc:
cargo fmt --all --check

fmt:
cargo fmt -- --check
cargo fmt --all

clippy:
cargo clippy -- -D warnings
Expand Down
9 changes: 6 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,14 +117,15 @@ The output should be similar to:
Utility to convert docker-compose into excalidraw

Usage:
excalidocker 0.1.7
excalidocker 0.1.8
╰→ excalidocker --input-path <INPUT_PATH>
╰→ excalidocker --show-config

Options:
-C, --show-config show configuration file
-i, --input-path <INPUT_PATH> file path to the docker-compose.yaml
-s, --skip-dependencies display connecting lines between services; if `true` then only service without the lines are rendered
-N, --skip-network display network(s); if `true` then network are not rendered
-o, --output-path <OUTPUT_PATH> file path for the output excalidraw file. By default the file content is sent to console output
-c, --config-path <CONFIG_PATH> config file path for the excalidraw [default: excalidocker-config.yaml]
-h, --help Print help
Expand Down Expand Up @@ -155,9 +156,10 @@ At the moment it's possible to customize:
- alignment mode (`stepped`(default), `vertical`, `horizontal`)
- font size and type
- fill type (`hachure`, `cross-hatch`, `solid`)
- background colours for services and ports
- background colours for services and ports. Both hex / [colour names](https://github.com/etolbakov/excalidocker-rs/blob/main/src/color_utils.rs) are supported.
- edge type (`sharp`, `round`)
- enable/disable connections (has the same effect as `--skip-dependencies` cli option)
- enable/disable network (has the same effect as `--skip-network` cli option)
## Installation
To build `excalidocker` locally, please follow these steps:
Expand All @@ -175,7 +177,8 @@ There is the `make r` command available in the [Makefile](/Makefile) along with
## Roadmap
These are the features that I would like to add at some point:
- 📊 visualize more data from a docker-compose file - volumes, network, etc
- 📊 visualize more data from a docker-compose file - volumes, etc.
- 🎩 theoretically it's possible to compile the code for wasm target, so it makes sense creating a browser extension
- 🦀 various code improvements/enhancements. Feel free to review/suggest if anything could be done better!
- 👨‍💻 etc
Expand Down
50 changes: 50 additions & 0 deletions data/compose/docker-compose-networks-test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
services:
service_one:
build: ./service_one
networks:
- network_one
service_two:
build: ./service_two
networks:
- network_one
- network_two
proxy:
build: ./proxy
networks:
- network_two
- frontend
app:
build: ./app
networks:
- frontend
- backend
db:
image: postgres
networks:
- backend
- network_three
service_three:
build: ./service_three
networks:
- network_three
service_four:
build: ./service_four
networks:
- network_three

networks:
network_one:
driver: custom-driver-network_one
network_two:
driver: custom-driver-network_two
network_three:
driver: custom-driver-network_three
frontend:
# Use a custom driver
driver: custom-driver-1
backend:
# Use a custom driver which takes special options
driver: custom-driver-2
driver_opts:
foo: "1"
bar: "2"
29 changes: 23 additions & 6 deletions data/examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ docker run --rm --pull always \
> produced-by-image.excalidraw
```

2. Convert a remote file (conversion via github link)
2. Convert a remote file (conversion via a GitHub link)
Specify the url to the `docker-compose.yaml` as a `INPUT_PATH` environment variable for the docker image.
Both the github link and the link to the raw file work.
Both the GitHub link and the link to the raw file work.

```sh
docker run --rm --pull always \
Expand All @@ -64,7 +64,18 @@ docker run --rm --pull always \
> produced-by-image-no-deps.excalidraw
```

4. Convert a local file with the provided config
4. Convert a remote file and skip dependency links.
Set `SKIP_NETWORK=true` to switch off dependency arrows

```sh
docker run --rm --pull always \
-e INPUT_PATH=https://github.com/etolbakov/excalidocker-rs/blob/main/data/compose/docker-compose-networks.yaml \
-e SKIP_NETWORK=true \
etolbakov/excalidocker:latest \
> produced-by-image-no-network.excalidraw
```

5. Convert a local file with the provided config
Specify the path to the configuration file `excalidocker-config.yaml` as a `CONFIG_PATH` environment variable for the docker image.
```sh
docker run --rm --pull always \
Expand All @@ -76,7 +87,7 @@ Specify the path to the configuration file `excalidocker-config.yaml` as a `CON
> produced-by-image-config-deps.excalidraw
```

5. Show config
6. Show config
Specify the `SHOW_CONFIG` environment variable. This command can be handy to generate a config for further customization.
```sh
docker run --rm --pull always \
Expand Down Expand Up @@ -127,9 +138,15 @@ Specify `--skip-dependencies` command line argument.
excalidocker --skip-dependencies --input-path https://github.com/apache/pinot/blob/master/docker/images/pinot/docker-compose.yml
```

5. Convert a local file with the provided config
5. Convert a remote file and skip network.
Specify `--skip-network` command line argument.

```sh
excalidocker --skip-network --input-path https://github.com/etolbakov/excalidocker-rs/blob/main/data/compose/docker-compose-networks.yaml
```

6. Convert a local file with the provided config

```sh
excalidocker --config-path /tmp/excalidocker-config.yaml --input-path https://github.com/apache/pinot/blob/master/docker/images/pinot/docker-compose.yml
```

2 changes: 1 addition & 1 deletion docker/ci/entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
set -e

if [ -n "$INPUT_PATH" ]; then
exec excalidocker --input-path "$INPUT_PATH" ${SKIP_DEPS:+ --skip-dependencies} --config-path ${CONFIG_PATH:-/excalidocker/bin/excalidocker-config.yaml}
exec excalidocker --input-path "$INPUT_PATH" ${SKIP_DEPS:+ --skip-dependencies} ${SKIP_NETWORK:+ --skip-network} --config-path ${CONFIG_PATH:-/excalidocker/bin/excalidocker-config.yaml}
elif [ -n "$SHOW_CONFIG" ]; then
exec excalidocker -C --config-path /excalidocker/bin/excalidocker-config.yaml
else
Expand Down
4 changes: 3 additions & 1 deletion excalidocker-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ services: # rectangle
fill: "hachure" # "hachure", "cross-hatch", "solid"
edge: "round" # "sharp", "round"
ports: # ellipse
background_color: "#a5d8ff"
background_color: "lightblue"
fill: "hachure" # "hachure","cross-hatch", "solid"
connections: # arrow
visible: true # true / false
edge: "sharp" # "sharp", "round"
alignment:
mode: "stepped" # "stepped" (default), "vertical", "horizontal" ("grouped" to be supported)
network: # rectangle
visible: true # true / false
153 changes: 153 additions & 0 deletions src/color_utils.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
use phf::phf_map;

/// Taken from https://github.com/bahamas10/css-color-names/blob/master/getcolors.sh
pub static COLOR_TO_HEX: phf::Map<&str, &str> = phf_map! {
"aliceblue" => "#f0f8ff",
"antiquewhite" => "#faebd7",
"aqua" => "#00ffff",
"aquamarine" => "#7fffd4",
"azure" => "#f0ffff",
"beige" => "#f5f5dc",
"bisque" => "#ffe4c4",
"black" => "#000000",
"blanchedalmond" => "#ffebcd",
"blue" => "#0000ff",
"blueviolet" => "#8a2be2",
"brown" => "#a52a2a",
"burlywood" => "#deb887",
"cadetblue" => "#5f9ea0",
"chartreuse" => "#7fff00",
"chocolate" => "#d2691e",
"coral" => "#ff7f50",
"cornflowerblue" => "#6495ed",
"cornsilk" => "#fff8dc",
"crimson" => "#dc143c",
"cyan" => "#00ffff",
"darkblue" => "#00008b",
"darkcyan" => "#008b8b",
"darkgoldenrod" => "#b8860b",
"darkgray" => "#a9a9a9",
"darkgreen" => "#006400",
"darkgrey" => "#a9a9a9",
"darkkhaki" => "#bdb76b",
"darkmagenta" => "#8b008b",
"darkolivegreen" => "#556b2f",
"darkorange" => "#ff8c00",
"darkorchid" => "#9932cc",
"darkred" => "#8b0000",
"darksalmon" => "#e9967a",
"darkseagreen" => "#8fbc8f",
"darkslateblue" => "#483d8b",
"darkslategray" => "#2f4f4f",
"darkslategrey" => "#2f4f4f",
"darkturquoise" => "#00ced1",
"darkviolet" => "#9400d3",
"deeppink" => "#ff1493",
"deepskyblue" => "#00bfff",
"dimgray" => "#696969",
"dimgrey" => "#696969",
"dodgerblue" => "#1e90ff",
"firebrick" => "#b22222",
"floralwhite" => "#fffaf0",
"forestgreen" => "#228b22",
"fuchsia" => "#ff00ff",
"gainsboro" => "#dcdcdc",
"ghostwhite" => "#f8f8ff",
"gold" => "#ffd700",
"goldenrod" => "#daa520",
"gray" => "#808080",
"green" => "#008000",
"greenyellow" => "#adff2f",
"grey" => "#808080",
"honeydew" => "#f0fff0",
"hotpink" => "#ff69b4",
"indianred" => "#cd5c5c",
"indigo" => "#4b0082",
"ivory" => "#fffff0",
"khaki" => "#f0e68c",
"lavender" => "#e6e6fa",
"lavenderblush" => "#fff0f5",
"lawngreen" => "#7cfc00",
"lemonchiffon" => "#fffacd",
"lightblue" => "#add8e6",
"lightcoral" => "#f08080",
"lightcyan" => "#e0ffff",
"lightgoldenrodyellow" => "#fafad2",
"lightgray" => "#d3d3d3",
"lightgreen" => "#90ee90",
"lightgrey" => "#d3d3d3",
"lightpink" => "#ffb6c1",
"lightsalmon" => "#ffa07a",
"lightseagreen" => "#20b2aa",
"lightskyblue" => "#87cefa",
"lightslategray" => "#778899",
"lightslategrey" => "#778899",
"lightsteelblue" => "#b0c4de",
"lightyellow" => "#ffffe0",
"lime" => "#00ff00",
"limegreen" => "#32cd32",
"linen" => "#faf0e6",
"magenta" => "#ff00ff",
"maroon" => "#800000",
"mediumaquamarine" => "#66cdaa",
"mediumblue" => "#0000cd",
"mediumorchid" => "#ba55d3",
"mediumpurple" => "#9370db",
"mediumseagreen" => "#3cb371",
"mediumslateblue" => "#7b68ee",
"mediumspringgreen" => "#00fa9a",
"mediumturquoise" => "#48d1cc",
"mediumvioletred" => "#c71585",
"midnightblue" => "#191970",
"mintcream" => "#f5fffa",
"mistyrose" => "#ffe4e1",
"moccasin" => "#ffe4b5",
"navajowhite" => "#ffdead",
"navy" => "#000080",
"oldlace" => "#fdf5e6",
"olive" => "#808000",
"olivedrab" => "#6b8e23",
"orange" => "#ffa500",
"orangered" => "#ff4500",
"orchid" => "#da70d6",
"palegoldenrod" => "#eee8aa",
"palegreen" => "#98fb98",
"paleturquoise" => "#afeeee",
"palevioletred" => "#db7093",
"papayawhip" => "#ffefd5",
"peachpuff" => "#ffdab9",
"peru" => "#cd853f",
"pink" => "#ffc0cb",
"plum" => "#dda0dd",
"powderblue" => "#b0e0e6",
"purple" => "#800080",
"rebeccapurple" => "#663399",
"red" => "#ff0000",
"rosybrown" => "#bc8f8f",
"royalblue" => "#4169e1",
"saddlebrown" => "#8b4513",
"salmon" => "#fa8072",
"sandybrown" => "#f4a460",
"seagreen" => "#2e8b57",
"seashell" => "#fff5ee",
"sienna" => "#a0522d",
"silver" => "#c0c0c0",
"skyblue" => "#87ceeb",
"slateblue" => "#6a5acd",
"slategray" => "#708090",
"slategrey" => "#708090",
"snow" => "#fffafa",
"springgreen" => "#00ff7f",
"steelblue" => "#4682b4",
"tan" => "#d2b48c",
"teal" => "#008080",
"thistle" => "#d8bfd8",
"tomato" => "#ff6347",
"turquoise" => "#40e0d0",
"violet" => "#ee82ee",
"wheat" => "#f5deb3",
"white" => "#ffffff",
"whitesmoke" => "#f5f5f5",
"yellow" => "#ffff00",
"yellowgreen" => "#9acd32",
};
4 changes: 3 additions & 1 deletion src/exporters/excalidraw.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ pub enum Element {
pub mod elements {
pub const ANGLE: i32 = 0;
pub const STROKE_COLOR: &str = "#000000";
pub const NETWORK_COLOR: &str = "#f2f0e6";
pub const BACKGROUND_COLOR: &str = "transparent";
pub const FILL_STYLE: &str = "hachure";
pub const STROKE_WIDTH: i32 = 1;
Expand Down Expand Up @@ -408,6 +409,7 @@ impl Element {
bound_elements: Vec<BoundElement>,
background_color: String,
fill_style: String,
stroke_style: String,
edge: String,
) -> Self {
Self::rectangle(
Expand All @@ -423,7 +425,7 @@ impl Element {
background_color, //elements::BACKGROUND_COLOR.into(),
fill_style, //elements::FILL_STYLE.into(),
elements::STROKE_WIDTH,
elements::STROKE_STYLE.into(),
stroke_style,
roundness(edge),
elements::OPACITY,
elements::STROKE_SHARPNESS.into(),
Expand Down
Loading

0 comments on commit 181f647

Please sign in to comment.