k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/hack/module-graph.sh (about)

     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  mkdir -p _output
    58  echo "digraph module_dependencies {" > _output/module-dependencies.dot || error_exit "Failed to open DOT file"
    59  if [[ -n "$1" && $1 == "staging" ]]; then
    60  	echo "Generating just staging modules"
    61  	staging_dependencies
    62  else
    63  	echo "Generating all Kubernetes modules"
    64  	kubernetes_dependencies
    65  fi
    66  echo "}" >> _output/module-dependencies.dot || error_exit "Failed to close DOT file"
    67  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"