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