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  }