From 1f6f07445b931ee13c90021fe124ed1ba6d9a2c9 Mon Sep 17 00:00:00 2001 From: Catherine Chan-Tse Date: Tue, 10 Jun 2025 08:19:16 -0400 Subject: [PATCH] Update render graph docs --- .../Reference/images/full-upgrade-graph.png | Bin 0 -> 71469 bytes .../Reference/upgrade-graph-visualization.md | 142 ++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 content/en/docs/Reference/images/full-upgrade-graph.png create mode 100644 content/en/docs/Reference/upgrade-graph-visualization.md diff --git a/content/en/docs/Reference/images/full-upgrade-graph.png b/content/en/docs/Reference/images/full-upgrade-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..5bd0ec1e1fc8bfa374acc78f4fa3e0d2f336ebfd GIT binary patch literal 71469 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 z zMApmk7MS(YJh=II6+S;RE~5j}I33a6zscxI88*OKfns%H1Dw^EtX$auX9bGYi4Aa8 zW3qB(1Dq8oRwp*VS&hlcl?`xKpje&Q0B1EOD_1taS%G48VgsDjn5N*|Cqi23+Tx z)pRA5?OPA*ib7b&J1ML!DY}kFc&1o( z7vfriddqx5209?NN3-hdb=1vxHurhhvHUSRRr6)mc-em8$^t?XCNb77BnM1ZKh?{> z3Y%3bGROg+vuph~REo$T&~U3eHu3%RO|AYl#Z)|cyLBwBjK#ER*>0%ZHrj*!q6RB1} z+$_MpDkCddKpKK5EFfH5`O`AC@_#D{I=sWK)$Q!(mH18WsrZ?D)6HtWg)XEr*vlo* zE;+)Y)IJl)Sa<2h%5zpH;&t3pX$VYH@hn{=i?ihnB+x3#LRZdx2x?)r7_6nbENeRtIT*Lt>v^qc(oP7XOM3N#%L}sCwti{E5nA8sZ}7 z3`PAfne<|<~)ZS@B)xQ+`FF$}FG@KB{pdw-KsDXpf%=^^oU60Ba7Xixv` zjzJp}#65v&6UFvz1fj`H92jrcDCyTp>ar+=HixKf@*UTsmKHiE%WOjiE2;xS7OK#N z4!w;oB(m!s=~RK)9g>L}_-;kytOK!7>FVk(yo*IJA>v{Fy6AmJ+O-e+FMO}A zmbX6IRX6y-un%)=(adARfV}g$zjGiIh=b*c`9pq-&rj& z^8l(eBleCx=V^M&tQ(qx2WhG$FkFLaY7--E59>xR7QPZvShJ{e67H|+Mm6I7|1e5W zLZk#NRH9#_#895TAAW9|`(E8p6cV-Gl(`To!?$?;mh*<5ZQ+iGGVLQe#L8Ca&{lsu(*V zzj2MPPbu2+BN?w@{^;e-rl)uLF1VH&xGwM}E3gx$FeG*zu0v~^`D7w5L>|X@IVK1r z9+_E{B!Bm;Fe(^(+cGzMW3vB2@$J2ZGvissr~3W8b$!cwub-|zuvR6cWFvWt&JIHC z%*$9PM?#1{Dosv!Oc6-UN;UEz9QtXW}N@BPI28;sLRMbst%v`d$xq8dl9w~ zy2eg89AC4Q-Y<6B^7aYBJKwic>5Qk8Q~hKL3bp~3R;@FD9j>EnLD+j!bUoBF!DOY$ zKlzJIbk$IF2I9X9{;smFS1TF%ZPhC0_1@$I{kG3pzjd8sTwtAM6o^>o`({uDRHE~` ziMrD0Xd;Q%_3`bKhz95Ix)jlb2kU%EBHh#CQO5#a*D2Q`H?6zu7_G%jjZ14b?8EO* zxHk??O`x8a_f`t}!^Q)i>ly1f$Zp-BvO3s5@9gTJ^yK5W;dfO;R@pov)2zhWfVlSq z^8GP1>rCb7;$hoJvqR9@9S}_Basc`D%T7H6J$$EY5fPP#xc)MqIXoOCcZY4g$=Ffyo@N#M7o1 zsZk$K*^Cp#AJ>f@916d@PE`ypZm6@!+`-7egl9Y)B)j%6Wo{`z0I}d)lXXT6x|6UQ e=>M_DxOeC9D5;tkvCwUTKbPec&!@=VdhkDikbP4C literal 0 HcmV?d00001 diff --git a/content/en/docs/Reference/upgrade-graph-visualization.md b/content/en/docs/Reference/upgrade-graph-visualization.md new file mode 100644 index 00000000..f1836a13 --- /dev/null +++ b/content/en/docs/Reference/upgrade-graph-visualization.md @@ -0,0 +1,142 @@ +--- +title: "Upgrade Graph Visualization" +linkTitle: "Upgrade Graph Visualization (alpha)" +weight: 5 +date: 2024-11-18 +--- + +>Note: `upgrade graph visualization` is **ALPHA** functionality and may adopt breaking changes + + +## Concept + +File-Based Catalogs (FBC) are a major improvement to the imperative update graph approaches of previous versions. FBCs give operator authors a [declarative and deterministic approach to defining their update graph](https://olm.operatorframework.io/docs/concepts/olm-architecture/operator-catalog/creating-an-update-graph/). However, FBCs can get complex, especially as the number of releases and dependencies scale. The upgrade graphs, in particular, for an operator can be difficult to reason about abstractly. Having an easy way to understand and quickly troubleshoot issues such as orphaned or stranded versions where there is no upgrade path forward from the orphaned or stranded version. To support understanding the upgrade graphs of operators in an index, we introduce a tool to generate a mermaid-formatted visualization through the `render-graph` command. + +## Visualizing Upgrade Graphs + +The `render-graph` command generates the upgrade graphs of operators for a given index in mermaid-format. The resulting output can then be viewed in online services such as [mermaid.live](https://mermaid.live) or converted to an image using a tool such as [mermaid-cli](https://github.com/mermaid-js/mermaid-cli). + +### Usage + +```sh +opm alpha render-graph [index-image | fbc-dir] [flags] +``` + +| Flag | Description | +| ------------------------- | ----------------------------------------------------------------------------------------- | +| -h, --help | prints help/usage information | +| --minimum-edge string | the channel edge to use as the lower bound of the set of edges composing the upgrade graph; default is to include all edges | +| -p, --package-name string | a specific package name to filter output; default is to include all packages in reference | +| --skip-tls-verify | skip TLS certificate verification for container image registries while pulling bundles | +| --use-http | use plain HTTP for container image registries while pulling bundles | + +`--skip-tls-verify` and `--use-http` are mutually exclusive flags. + +### Examples +For the following examples, we define a catalog with the following FBC directory structure: +``` +example_catalog/ +└── testoperator + └── index.yaml +``` + +The index.yaml file contains the following: +```yaml +--- +defaultChannel: stable-v1 +name: testoperator +schema: olm.package +--- +entries: +- name: testoperator.v0.1.0 +- name: testoperator.v0.1.1 +- name: testoperator.v0.1.2 +- name: testoperator.v0.1.3 + skips: + - testoperator.v0.1.0 + - testoperator.v0.1.1 + - testoperator.v0.1.2 +- name: testoperator.v0.2.0 +- name: testoperator.v0.2.1 +- name: testoperator.v0.2.2 + replaces: testoperator.v0.1.3 + skips: + - testoperator.v0.2.0 + - testoperator.v0.2.1 +- name: testoperator.v0.2.3 + skips: + - testoperator.v0.2.2 +- name: testoperator.v0.3.0 + replaces: testoperator.v0.2.2 +name: candidate-v0 +package: testoperator +schema: olm.channel +--- +entries: +- name: testoperator.v0.2.1 +- name: testoperator.v0.2.2 + skips: + - testoperator.v0.2.1 +- name: testoperator.v0.3.0 + replaces: testoperator.v0.2.2 +name: fast-v0 +package: testoperator +schema: olm.channel +--- +entries: +- name: testoperator.v0.2.2 +name: stable-v0 +package: testoperator +schema: olm.channel +``` + +#### Generating a channel graph +To generate the upgrade graphs of each channel, run the following: + +`opm alpha render-graph example_catalog/` + +This will output a mermaid graph that looks like this when rendered into an image: + +![Full Upgrade Graph](/content/en/docs/Reference/images/full-upgrade-graph.png) + +#### Generating a scaled vector graphic (SVG) +To generate a scaled vector graphic (SVG) directly from the output results of the `render-graph` command, use the following: + +``` +opm alpha render-graph example_catalog | \ + docker run --rm -i -v "$PWD":/data ghcr.io/mermaid-js/mermaid-cli/mermaid-cli -o /data/example_catalog.svg +``` + +#### Generating a channel graph for a single operator in a catalog +Say we now have multiple operators in our example_catalog: +``` +example_catalog/ +└── testoperator + └── index.yaml +└── anotheroperator + └── index.yaml +└── yetanotheroperator + └── index.yaml +``` +Running the `render-graph` command on the `example_catalog/` directory would now generate upgrade graphs for all of these operators. To limit the generated graph to only the testoperator, we would use the following: +`opm alpha render-graph -p testoperator example_catalog/` + +### Advanced Examples +The following examples expand on advanced topics related to upgrade graphs that can be understood more easily via visualizations generated by the `render-graph` command. + +#### Visualizing skipRanges +Consistently using skipRanges allows for a given version to be upgraded to any other newer versions. A real-world example of this can be seen in the security-profiles-operator upgrade graph: + +#TODO Show full graph of security-profiles-operator + +#### Limiting the upgrade graph to a particular version context +Say we are only interested in the upgrade graph after version v0.8.0. We can limit the upgrade graph to the v0.8.0+ context using the following: +`opm alpha render-graph -p security-profiles-operator --minimum-edge security-profiles-operator.v0.8.0 quay.io/operatorhubio/catalog:latest` + +#TODO Show limited graph of security-profiles-operator + +#### Visualizing orphaned or stranded versions +Orphaned or stranded versions are versions that are not the latest version and do not have an update path available. +This can happen, for example, by not providing an upgrade version for a version and also via graph truncation. + +A real-world scenario that can necessitate graph truncation would be to restrict installable operator version ranges.