From f2bded7f944ff25387d7cde1b1aa8489191de0c1 Mon Sep 17 00:00:00 2001
From: Jeffrey Zhang <zhang.lei.fly@gmail.com>
Date: Thu, 3 Dec 2015 20:04:28 +0800
Subject: [PATCH] Gen the image dependency in the Graphviz dot format

By using

    ./tools/build.py --save-dependency a.dot

to gen the Graphviz dot dependency file. Later, you can use the `dot`
to draw the picture.

    dot -Tjpg -o a.jpg a.dot

Implements: blueprint images-dependency-tree
Depends-On: I8e07a1b69fab5f1c587470bfd2104aaba93f0050
Change-Id: If00f4f3fb9d0b10a07ab2abb7ffb1cd9d64902f2
---
 kolla/cmd/build.py     | 20 ++++++++++++++++++++
 kolla/common/config.py |  3 +++
 requirements.txt       |  1 +
 3 files changed, 24 insertions(+)

diff --git a/kolla/cmd/build.py b/kolla/cmd/build.py
index bf5e5ba4c4..5753bf02af 100755
--- a/kolla/cmd/build.py
+++ b/kolla/cmd/build.py
@@ -16,6 +16,7 @@
 
 import datetime
 import errno
+import graphviz
 import json
 import logging
 import os
@@ -558,6 +559,19 @@ class KollaWorker(object):
 
             self.images.append(image)
 
+    def save_dependency(self, to_file):
+        dot = graphviz.Digraph(comment='Docker Images Dependency')
+        dot.body.extend(['rankdir=LR'])
+        for image in self.images:
+            if image['status'] not in ['matched']:
+                continue
+            dot.node(image['name'])
+            if image['parent'] is not None:
+                dot.edge(image['parent']['name'], image['name'])
+
+        with open(to_file, 'w') as f:
+            f.write(dot.source)
+
     def find_parents(self):
         """Associate all images with parents and children"""
         sort_images = dict()
@@ -614,6 +628,12 @@ def main():
     queue = kolla.build_queue()
     push_queue = six.moves.queue.Queue()
 
+    if conf.save_dependency:
+        kolla.save_dependency(conf.save_dependency)
+        LOG.info('Docker images dependency is saved in %s',
+                 conf.save_dependency)
+        return
+
     for x in range(conf.threads):
         worker = WorkerThread(queue, push_queue, conf)
         worker.setDaemon(True)
diff --git a/kolla/common/config.py b/kolla/common/config.py
index 68e1f7e5ed..f5d8f48d75 100644
--- a/kolla/common/config.py
+++ b/kolla/common/config.py
@@ -107,6 +107,9 @@ _CLI_OPTS = [
     cfg.StrOpt('registry', deprecated_group='kolla-build',
                help=('The docker registry host. The default registry host'
                      ' is Docker Hub')),
+    cfg.StrOpt('save-dependency',
+               help=('Path to the file to store the docker image'
+                     ' dependency in Graphviz dot format')),
     cfg.StrOpt('type', short='t', default='binary',
                choices=INSTALL_TYPE_CHOICES,
                dest='install_type', deprecated_group='kolla-build',
diff --git a/requirements.txt b/requirements.txt
index 20f5c9851f..75ea869738 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -8,3 +8,4 @@ gitdb>=0.6.4 # BSD License (3 clause)
 GitPython>=1.0.1 # BSD License (3 clause)
 six>=1.9.0
 oslo.config>=2.7.0 # Apache-2.0
+graphviz>=0.4.0 # MIT License
-- 
GitLab