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  }