github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/cmd/juju/status/output_oneline.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package status 5 6 import ( 7 "fmt" 8 "io" 9 "strings" 10 11 "github.com/juju/errors" 12 "github.com/juju/utils" 13 ) 14 15 // FormatOneline writes a brief list of units and their subordinates. 16 // Subordinates will be indented 2 spaces and listed under their 17 // superiors. This format works with version 2 of the CLI. 18 func FormatOneline(writer io.Writer, value interface{}) error { 19 return formatOneline(writer, value, func(out io.Writer, format, uName string, u unitStatus, level int) { 20 status := fmt.Sprintf( 21 "agent:%s, workload:%s", 22 u.JujuStatusInfo.Current, 23 u.WorkloadStatusInfo.Current, 24 ) 25 fmt.Fprintf(out, format, 26 uName, 27 u.PublicAddress, 28 status, 29 ) 30 }) 31 } 32 33 type onelinePrintf func(out io.Writer, format, uName string, u unitStatus, level int) 34 35 func formatOneline(writer io.Writer, value interface{}, printf onelinePrintf) error { 36 fs, valueConverted := value.(formattedStatus) 37 if !valueConverted { 38 return errors.Errorf("expected value of type %T, got %T", fs, value) 39 } 40 41 pprint := func(uName string, u unitStatus, level int) { 42 var fmtPorts string 43 if len(u.OpenedPorts) > 0 { 44 fmtPorts = fmt.Sprintf(" %s", strings.Join(u.OpenedPorts, ", ")) 45 } 46 format := indent("\n", level*2, "- %s: %s (%v)"+fmtPorts) 47 printf(writer, format, uName, u, level) 48 } 49 50 for _, svcName := range utils.SortStringsNaturally(stringKeysFromMap(fs.Applications)) { 51 svc := fs.Applications[svcName] 52 for _, uName := range utils.SortStringsNaturally(stringKeysFromMap(svc.Units)) { 53 unit := svc.Units[uName] 54 pprint(uName, unit, 0) 55 recurseUnits(unit, 1, pprint) 56 } 57 } 58 59 return nil 60 }