github.com/nak3/source-to-image@v1.1.10-0.20180319140719-2ed55639898d/pkg/api/describe/describer.go (about) 1 package describe 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "os" 8 "runtime" 9 "strings" 10 "text/tabwriter" 11 12 "github.com/openshift/source-to-image/pkg/api" 13 "github.com/openshift/source-to-image/pkg/build" 14 "github.com/openshift/source-to-image/pkg/docker" 15 ) 16 17 // Config returns the Config object in nice readable, tabbed format. 18 func Config(client docker.Client, config *api.Config) string { 19 out, err := tabbedString(func(out io.Writer) error { 20 if len(config.DisplayName) > 0 { 21 fmt.Fprintf(out, "Application Name:\t%s\n", config.DisplayName) 22 } 23 if len(config.Description) > 0 { 24 fmt.Fprintf(out, "Description:\t%s\n", config.Description) 25 } 26 describeBuilderImage(client, config, out) 27 describeRuntimeImage(config, out) 28 fmt.Fprintf(out, "Source:\t%s\n", config.Source) 29 if len(config.ContextDir) > 0 { 30 fmt.Fprintf(out, "Context Directory:\t%s\n", config.ContextDir) 31 } 32 fmt.Fprintf(out, "Output Image Tag:\t%s\n", config.Tag) 33 printEnv(out, config.Environment) 34 if len(config.EnvironmentFile) > 0 { 35 fmt.Fprintf(out, "Environment File:\t%s\n", config.EnvironmentFile) 36 } 37 printLabels(out, config.Labels) 38 fmt.Fprintf(out, "Incremental Build:\t%s\n", printBool(config.Incremental)) 39 if config.Incremental { 40 fmt.Fprintf(out, "Incremental Image Pull User:\t%s\n", config.IncrementalAuthentication.Username) 41 } 42 fmt.Fprintf(out, "Remove Old Build:\t%s\n", printBool(config.RemovePreviousImage)) 43 fmt.Fprintf(out, "Builder Pull Policy:\t%s\n", config.BuilderPullPolicy) 44 fmt.Fprintf(out, "Previous Image Pull Policy:\t%s\n", config.PreviousImagePullPolicy) 45 fmt.Fprintf(out, "Quiet:\t%s\n", printBool(config.Quiet)) 46 fmt.Fprintf(out, "Layered Build:\t%s\n", printBool(config.LayeredBuild)) 47 if len(config.Destination) > 0 { 48 fmt.Fprintf(out, "Artifacts Destination:\t%s\n", config.Destination) 49 } 50 if len(config.CallbackURL) > 0 { 51 fmt.Fprintf(out, "Callback URL:\t%s\n", config.CallbackURL) 52 } 53 if len(config.ScriptsURL) > 0 { 54 fmt.Fprintf(out, "S2I Scripts URL:\t%s\n", config.ScriptsURL) 55 } 56 if len(config.WorkingDir) > 0 { 57 fmt.Fprintf(out, "Workdir:\t%s\n", config.WorkingDir) 58 } 59 if config.DockerNetworkMode != "" { 60 fmt.Fprintf(out, "Docker NetworkMode:\t%s\n", config.DockerNetworkMode) 61 } 62 fmt.Fprintf(out, "Docker Endpoint:\t%s\n", config.DockerConfig.Endpoint) 63 64 if _, err := os.Open(config.DockerCfgPath); err == nil { 65 fmt.Fprintf(out, "Docker Pull Config:\t%s\n", config.DockerCfgPath) 66 fmt.Fprintf(out, "Docker Pull User:\t%s\n", config.PullAuthentication.Username) 67 } 68 69 if len(config.Injections) > 0 { 70 result := []string{} 71 for _, i := range config.Injections { 72 result = append(result, fmt.Sprintf("%s->%s", i.Source, i.Destination)) 73 } 74 fmt.Fprintf(out, "Injections:\t%s\n", strings.Join(result, ",")) 75 } 76 if len(config.BuildVolumes) > 0 { 77 result := []string{} 78 for _, i := range config.BuildVolumes { 79 if runtime.GOOS == "windows" { 80 // We need to avoid the colon in the Windows drive letter 81 result = append(result, i[0:2]+strings.Replace(i[3:], ":", "->", 1)) 82 } else { 83 result = append(result, strings.Replace(i, ":", "->", 1)) 84 } 85 } 86 fmt.Fprintf(out, "Bind mounts:\t%s\n", strings.Join(result, ",")) 87 } 88 return nil 89 }) 90 91 if err != nil { 92 fmt.Printf("error: %v", err) 93 } 94 return out 95 } 96 97 func describeBuilderImage(client docker.Client, config *api.Config, out io.Writer) { 98 c := &api.Config{ 99 DockerConfig: config.DockerConfig, 100 PullAuthentication: config.PullAuthentication, 101 BuilderImage: config.BuilderImage, 102 BuilderPullPolicy: config.BuilderPullPolicy, 103 Tag: config.Tag, 104 IncrementalAuthentication: config.IncrementalAuthentication, 105 } 106 pr, err := docker.GetBuilderImage(client, c) 107 if err == nil { 108 build.GenerateConfigFromLabels(c, pr) 109 if len(c.DisplayName) > 0 { 110 fmt.Fprintf(out, "Builder Name:\t%s\n", c.DisplayName) 111 } 112 fmt.Fprintf(out, "Builder Image:\t%s\n", config.BuilderImage) 113 if len(c.BuilderImageVersion) > 0 { 114 fmt.Fprintf(out, "Builder Image Version:\t%s\n", c.BuilderImageVersion) 115 } 116 if len(c.BuilderBaseImageVersion) > 0 { 117 fmt.Fprintf(out, "Builder Base Version:\t%s\n", c.BuilderBaseImageVersion) 118 } 119 } else { 120 fmt.Fprintf(out, "Error describing image:\t%s\n", err.Error()) 121 } 122 } 123 124 func describeRuntimeImage(config *api.Config, out io.Writer) { 125 if len(config.RuntimeImage) == 0 { 126 return 127 } 128 129 fmt.Fprintf(out, "Runtime Image:\t%s\n", config.RuntimeImage) 130 fmt.Fprintf(out, "Runtime Image Pull Policy:\t%s\n", config.RuntimeImagePullPolicy) 131 if len(config.RuntimeAuthentication.Username) > 0 { 132 fmt.Fprintf(out, "Runtime Image Pull User:\t%s\n", config.RuntimeAuthentication.Username) 133 } 134 } 135 136 func printEnv(out io.Writer, env api.EnvironmentList) { 137 result := []string{} 138 for _, e := range env { 139 result = append(result, strings.Join([]string{e.Name, e.Value}, "=")) 140 } 141 fmt.Fprintf(out, "Environment:\t%s\n", strings.Join(result, ",")) 142 } 143 144 func printLabels(out io.Writer, labels map[string]string) { 145 result := []string{} 146 for k, v := range labels { 147 result = append(result, fmt.Sprintf("%s=%q", k, v)) 148 } 149 fmt.Fprintf(out, "Labels:\t%s\n", strings.Join(result, ",")) 150 } 151 152 func printBool(b bool) string { 153 if b { 154 return "\033[1menabled\033[0m" 155 } 156 return "disabled" 157 } 158 159 func tabbedString(f func(io.Writer) error) (string, error) { 160 out := new(tabwriter.Writer) 161 buf := &bytes.Buffer{} 162 out.Init(buf, 0, 8, 1, '\t', 0) 163 164 err := f(out) 165 if err != nil { 166 return "", err 167 } 168 169 out.Flush() 170 str := string(buf.String()) 171 return str, nil 172 }