@@ -20,10 +20,9 @@ import (
20
20
"context"
21
21
"fmt"
22
22
"os"
23
- "strconv"
24
23
"strings"
25
24
26
- "github.com/compose-spec /compose-go/types "
25
+ "github.com/docker /compose/v2/pkg/api "
27
26
"github.com/spf13/cobra"
28
27
)
29
28
@@ -35,10 +34,7 @@ type vizOptions struct {
35
34
indentationStr string
36
35
}
37
36
38
- // maps a service with the services it depends on
39
- type vizGraph map [* types.ServiceConfig ][]* types.ServiceConfig
40
-
41
- func vizCommand (p * ProjectOptions ) * cobra.Command {
37
+ func vizCommand (p * ProjectOptions , backend api.Service ) * cobra.Command {
42
38
opts := vizOptions {
43
39
ProjectOptions : p ,
44
40
}
@@ -54,7 +50,7 @@ func vizCommand(p *ProjectOptions) *cobra.Command {
54
50
return err
55
51
}),
56
52
RunE : Adapt (func (ctx context.Context , args []string ) error {
57
- return runViz (ctx , & opts )
53
+ return runViz (ctx , backend , & opts )
58
54
}),
59
55
}
60
56
@@ -66,118 +62,26 @@ func vizCommand(p *ProjectOptions) *cobra.Command {
66
62
return cmd
67
63
}
68
64
69
- func runViz (_ context.Context , opts * vizOptions ) error {
65
+ func runViz (ctx context.Context , backend api. Service , opts * vizOptions ) error {
70
66
_ , _ = fmt .Fprintln (os .Stderr , "viz command is EXPERIMENTAL" )
71
67
project , err := opts .ToProject (nil )
72
68
if err != nil {
73
69
return err
74
70
}
75
71
76
72
// build graph
77
- graph := make (vizGraph )
78
- for i , serviceConfig := range project .Services {
79
- serviceConfigPtr := & project .Services [i ]
80
- graph [serviceConfigPtr ] = make ([]* types.ServiceConfig , 0 , len (serviceConfig .DependsOn ))
81
- for dependencyName := range serviceConfig .DependsOn {
82
- // no error should be returned since dependencyName should exist
83
- dependency , _ := project .GetService (dependencyName )
84
- graph [serviceConfigPtr ] = append (graph [serviceConfigPtr ], & dependency )
85
- }
86
- }
73
+ graphStr , _ := backend .Viz (ctx , project , api.VizOptions {
74
+ IncludeNetworks : opts .includeNetworks ,
75
+ IncludePorts : opts .includePorts ,
76
+ IncludeImageName : opts .includeImageName ,
77
+ Indentation : opts .indentationStr ,
78
+ })
87
79
88
- // build graphviz graph
89
- var graphBuilder strings.Builder
90
- graphBuilder .WriteString ("digraph " + project .Name + " {\n " )
91
- graphBuilder .WriteString (opts .indentationStr + "layout=dot;\n " )
92
- addNodes (& graphBuilder , graph , opts )
93
- graphBuilder .WriteByte ('\n' )
94
- addEdges (& graphBuilder , graph , opts )
95
- graphBuilder .WriteString ("}\n " )
96
-
97
- fmt .Println (graphBuilder .String ())
80
+ fmt .Println (graphStr )
98
81
99
82
return nil
100
83
}
101
84
102
- // addNodes adds the corresponding graphviz representation of all the nodes in the given graph to the graphBuilder
103
- // returns the same graphBuilder
104
- func addNodes (graphBuilder * strings.Builder , graph vizGraph , opts * vizOptions ) * strings.Builder {
105
- for serviceNode := range graph {
106
- // write:
107
- // "service name" [style="filled" label<<font point-size="15">service name</font>
108
- graphBuilder .WriteString (opts .indentationStr )
109
- writeQuoted (graphBuilder , serviceNode .Name )
110
- graphBuilder .WriteString (" [style=\" filled\" label=<<font point-size=\" 15\" >" )
111
- graphBuilder .WriteString (serviceNode .Name )
112
- graphBuilder .WriteString ("</font>" )
113
-
114
- if opts .includeNetworks && len (serviceNode .Networks ) > 0 {
115
- graphBuilder .WriteString ("<font point-size=\" 10\" >" )
116
- graphBuilder .WriteString ("<br/><br/><b>Networks:</b>" )
117
- for _ , networkName := range serviceNode .NetworksByPriority () {
118
- graphBuilder .WriteString ("<br/>" )
119
- graphBuilder .WriteString (networkName )
120
- }
121
- graphBuilder .WriteString ("</font>" )
122
- }
123
-
124
- if opts .includePorts && len (serviceNode .Ports ) > 0 {
125
- graphBuilder .WriteString ("<font point-size=\" 10\" >" )
126
- graphBuilder .WriteString ("<br/><br/><b>Ports:</b>" )
127
- for _ , portConfig := range serviceNode .Ports {
128
- graphBuilder .WriteString ("<br/>" )
129
- if len (portConfig .HostIP ) > 0 {
130
- graphBuilder .WriteString (portConfig .HostIP )
131
- graphBuilder .WriteByte (':' )
132
- }
133
- graphBuilder .WriteString (portConfig .Published )
134
- graphBuilder .WriteByte (':' )
135
- graphBuilder .WriteString (strconv .Itoa (int (portConfig .Target )))
136
- graphBuilder .WriteString (" (" )
137
- graphBuilder .WriteString (portConfig .Protocol )
138
- graphBuilder .WriteString (", " )
139
- graphBuilder .WriteString (portConfig .Mode )
140
- graphBuilder .WriteString (")" )
141
- }
142
- graphBuilder .WriteString ("</font>" )
143
- }
144
-
145
- if opts .includeImageName {
146
- graphBuilder .WriteString ("<font point-size=\" 10\" >" )
147
- graphBuilder .WriteString ("<br/><br/><b>Image:</b><br/>" )
148
- graphBuilder .WriteString (serviceNode .Image )
149
- graphBuilder .WriteString ("</font>" )
150
- }
151
-
152
- graphBuilder .WriteString (">];\n " )
153
- }
154
-
155
- return graphBuilder
156
- }
157
-
158
- // addEdges adds the corresponding graphviz representation of all edges in the given graph to the graphBuilder
159
- // returns the same graphBuilder
160
- func addEdges (graphBuilder * strings.Builder , graph vizGraph , opts * vizOptions ) * strings.Builder {
161
- for parent , children := range graph {
162
- for _ , child := range children {
163
- graphBuilder .WriteString (opts .indentationStr )
164
- writeQuoted (graphBuilder , parent .Name )
165
- graphBuilder .WriteString (" -> " )
166
- writeQuoted (graphBuilder , child .Name )
167
- graphBuilder .WriteString (";\n " )
168
- }
169
- }
170
-
171
- return graphBuilder
172
- }
173
-
174
- // writeQuoted writes "str" to builder
175
- func writeQuoted (builder * strings.Builder , str string ) {
176
- builder .WriteByte ('"' )
177
- builder .WriteString (str )
178
- builder .WriteByte ('"' )
179
- }
180
-
181
85
// preferredIndentationStr returns a single string given the indentation preference
182
86
func preferredIndentationStr (size int , useSpace bool ) (string , error ) {
183
87
if size < 0 {
0 commit comments