Skip to content

Commit d114b5e

Browse files
authored
Merge pull request kubernetes#92445 from cheftako/graph
Added script to generate module level dependency graph.
2 parents 897dc66 + 9e354b2 commit d114b5e

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

hack/module-graph.sh

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#!/usr/bin/env bash
2+
3+
# Copyright 2020 The Kubernetes Authors.
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License");
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
17+
# This script generates a jpg image of our internal dependency graph.
18+
# It relies on go mod and dot to do so and should be run from K8s root.
19+
# TODO: Containerize the script to remove dependency issues with go mod and dot.
20+
21+
# To generate graph with all Kubernetes modules run
22+
# ./hack/module-graph.sh
23+
# To generate graph with just staging modules run
24+
# ./hack/module-graph.sh staging
25+
26+
error_exit()
27+
{
28+
echo "$1" 1>&2
29+
exit 1
30+
}
31+
32+
staging_dependencies()
33+
{
34+
relevant_modules="(k8s.io/kubernetes|$(find staging/src/k8s.io -maxdepth 1 -mindepth 1 | sed -E 's|staging/src/k8s.io|k8s.io|g' | tr '\n' '|' | sed 's#|$##' ))"
35+
# Generating lines of the form " k8s_io_kubernetes -> k8s_io_api"
36+
# Use only the directories in staging
37+
# Trimming away version info
38+
# Replacing non DOT (graph description language) characters with underscores
39+
# Dedupe lines
40+
# Inserting needed arrow.
41+
# Indenting the line appropriately
42+
go mod graph | grep -E "^${relevant_modules}(@.*| )${relevant_modules}@.*$" | sed -E 's|@\S+ | |g' | sed -E 's|@\S+$||g' | sed -E 's/[\.\/\-]/_/g' | sort | uniq | sed -E 's| | -> |g' | sed -E 's|^| |g' >> _output/module-dependencies.dot || error_exit "Failed to generate staging dependencies in DOT file"
43+
}
44+
45+
kubernetes_dependencies()
46+
{
47+
# Generating lines of the form " k8s_io_kubernetes -> k8s_io_api"
48+
# Excluding all non Kubernetes dependencies
49+
# Trimming away version info
50+
# Replacing non DOT (graph description language) characters with underscores
51+
# Dedupe lines
52+
# Inserting needed arrow.
53+
# Indenting the line appropriately
54+
go mod graph | grep -E "^.*k8s.io.*k8s.io.*$" | sed -E 's|@\S+ | |g' | sed -E 's|@\S+$||g' | sed -E 's/[\.\/\-]/_/g' | sort | uniq | sed -E 's| | -> |g' | sed -E 's|^| |g' >> _output/module-dependencies.dot || error_exit "Failed to generate kubernetes dependencies in DOT file"
55+
}
56+
57+
echo "digraph module_dependencies {" > _output/module-dependencies.dot || error_exit "Failed to open DOT file"
58+
if [[ -n "$1" && $1 == "staging" ]]; then
59+
echo "Generating just staging modules"
60+
staging_dependencies
61+
else
62+
echo "Generating all Kubernetes modules"
63+
kubernetes_dependencies
64+
fi
65+
echo "}" >> _output/module-dependencies.dot || error_exit "Failed to close DOT file"
66+
dot -Gratio=1,1 -Nwidth=2 -Nheight=2 -Nfontsize=48 -Earrowsize=8 -Tjpg _output/module-dependencies.dot -o _output/module-dependencies.jpg || error_exit "Failed to generate graph from DOT file"

0 commit comments

Comments
 (0)