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  }