Merge pull request #43044 from ncdc/NewPrefixWriter

Automatic merge from submit-queue (batch tested with PRs 42900, 43044, 42896, 43308, 43621)

Convert PrefixWriter to an interface

Convert PrefixWriter to an interface to allow other packages to create instances. This is needed for downstream projects such as OpenShift.

cc @sttts @smarterclayton @oulinbao @deads2k @liggitt @kargakis @soltysh @kubernetes/sig-cli-pr-reviews
pull/6/head
Kubernetes Submit Queue 2017-03-27 08:32:25 -07:00 committed by GitHub
commit 9c62733b1f
4 changed files with 116 additions and 98 deletions

View File

@ -105,7 +105,8 @@ func (h *DeploymentHistoryViewer) ViewHistory(namespace, name string, revision i
if err := v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(template, internalTemplate, nil); err != nil {
return "", fmt.Errorf("failed to convert podtemplate, %v", err)
}
printersinternal.DescribePodTemplate(internalTemplate, buf)
w := printersinternal.NewPrefixWriter(buf)
printersinternal.DescribePodTemplate(internalTemplate, w)
return buf.String(), nil
}

View File

@ -172,7 +172,8 @@ func simpleDryRun(deployment *extensions.Deployment, c clientset.Interface, toRe
if err := v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(template, internalTemplate, nil); err != nil {
return "", fmt.Errorf("failed to convert podtemplate, %v", err)
}
printersinternal.DescribePodTemplate(internalTemplate, buf)
w := printersinternal.NewPrefixWriter(buf)
printersinternal.DescribePodTemplate(internalTemplate, w)
return buf.String(), nil
}
@ -190,6 +191,7 @@ func simpleDryRun(deployment *extensions.Deployment, c clientset.Interface, toRe
if err := v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(template, internalTemplate, nil); err != nil {
return "", fmt.Errorf("failed to convert podtemplate, %v", err)
}
printersinternal.DescribePodTemplate(internalTemplate, buf)
w := printersinternal.NewPrefixWriter(buf)
printersinternal.DescribePodTemplate(internalTemplate, w)
return buf.String(), nil
}

View File

@ -76,11 +76,27 @@ const (
LEVEL_3
)
type PrefixWriter struct {
// PrefixWriter can write text at various indentation levels.
type PrefixWriter interface {
// Write writes text with the specified indentation level.
Write(level int, format string, a ...interface{})
// WriteLine writes an entire line with no indentation level.
WriteLine(a ...interface{})
}
// prefixWriter implements PrefixWriter
type prefixWriter struct {
out io.Writer
}
func (pw *PrefixWriter) Write(level int, format string, a ...interface{}) {
var _ PrefixWriter = &prefixWriter{}
// NewPrefixWriter creates a new PrefixWriter.
func NewPrefixWriter(out io.Writer) PrefixWriter {
return &prefixWriter{out: out}
}
func (pw *prefixWriter) Write(level int, format string, a ...interface{}) {
levelSpace := " "
prefix := ""
for i := 0; i < level; i++ {
@ -89,7 +105,7 @@ func (pw *PrefixWriter) Write(level int, format string, a ...interface{}) {
fmt.Fprintf(pw.out, prefix+format, a...)
}
func (pw *PrefixWriter) WriteLine(a ...interface{}) {
func (pw *prefixWriter) WriteLine(a ...interface{}) {
fmt.Fprintln(pw.out, a...)
}
@ -174,7 +190,7 @@ func (g *genericDescriber) Describe(namespace, name string, describerSettings pr
}
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", obj.GetName())
w.Write(LEVEL_0, "Namespace:\t%s\n", obj.GetNamespace())
printLabelsMultiline(w, "Labels", obj.GetLabels())
@ -241,7 +257,7 @@ func (d *NamespaceDescriber) Describe(namespace, name string, describerSettings
func describeNamespace(namespace *api.Namespace, resourceQuotaList *api.ResourceQuotaList, limitRangeList *api.LimitRangeList) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", namespace.Name)
printLabelsMultiline(w, "Labels", namespace.Labels)
printAnnotationsMultiline(w, "Annotations", namespace.Annotations)
@ -258,7 +274,7 @@ func describeNamespace(namespace *api.Namespace, resourceQuotaList *api.Resource
})
}
func describeLimitRangeSpec(spec api.LimitRangeSpec, prefix string, w *PrefixWriter) {
func describeLimitRangeSpec(spec api.LimitRangeSpec, prefix string, w PrefixWriter) {
for i := range spec.Limits {
item := spec.Limits[i]
maxResources := item.Max
@ -324,7 +340,7 @@ func describeLimitRangeSpec(spec api.LimitRangeSpec, prefix string, w *PrefixWri
}
// DescribeLimitRanges merges a set of limit range items into a single tabular description
func DescribeLimitRanges(limitRanges *api.LimitRangeList, w *PrefixWriter) {
func DescribeLimitRanges(limitRanges *api.LimitRangeList, w PrefixWriter) {
if len(limitRanges.Items) == 0 {
w.Write(LEVEL_0, "No resource limits.\n")
return
@ -337,7 +353,7 @@ func DescribeLimitRanges(limitRanges *api.LimitRangeList, w *PrefixWriter) {
}
// DescribeResourceQuotas merges a set of quota items into a single tabular description of all quotas
func DescribeResourceQuotas(quotas *api.ResourceQuotaList, w *PrefixWriter) {
func DescribeResourceQuotas(quotas *api.ResourceQuotaList, w PrefixWriter) {
if len(quotas.Items) == 0 {
w.Write(LEVEL_0, "No resource quota.\n")
return
@ -396,7 +412,7 @@ func (d *LimitRangeDescriber) Describe(namespace, name string, describerSettings
func describeLimitRange(limitRange *api.LimitRange) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", limitRange.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", limitRange.Namespace)
w.Write(LEVEL_0, "Type\tResource\tMin\tMax\tDefault Request\tDefault Limit\tMax Limit/Request Ratio\n")
@ -438,7 +454,7 @@ func helpTextForResourceQuotaScope(scope api.ResourceQuotaScope) string {
}
func describeQuota(resourceQuota *api.ResourceQuota) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", resourceQuota.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", resourceQuota.Namespace)
if len(resourceQuota.Spec.Scopes) > 0 {
@ -491,7 +507,7 @@ func (d *PodDescriber) Describe(namespace, name string, describerSettings printe
events, err2 := eventsInterface.List(options)
if describerSettings.ShowEvents && err2 == nil && len(events.Items) > 0 {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Pod '%v': error '%v', but found events.\n", name, err)
DescribeEvents(events, w)
return nil
@ -516,7 +532,7 @@ func (d *PodDescriber) Describe(namespace, name string, describerSettings printe
func describePod(pod *api.Pod, events *api.EventList) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", pod.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", pod.Namespace)
w.Write(LEVEL_0, "Node:\t%s\n", pod.Spec.NodeName+"/"+pod.Status.HostIP)
@ -579,7 +595,7 @@ func printControllers(annotation map[string]string) string {
return "<none>"
}
func describeVolumes(volumes []api.Volume, w *PrefixWriter, space string) {
func describeVolumes(volumes []api.Volume, w PrefixWriter, space string) {
if volumes == nil || len(volumes) == 0 {
w.Write(LEVEL_0, "%sVolumes:\t<none>\n", space)
return
@ -638,17 +654,17 @@ func describeVolumes(volumes []api.Volume, w *PrefixWriter, space string) {
}
}
func printHostPathVolumeSource(hostPath *api.HostPathVolumeSource, w *PrefixWriter) {
func printHostPathVolumeSource(hostPath *api.HostPathVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tHostPath (bare host directory volume)\n"+
" Path:\t%v\n", hostPath.Path)
}
func printEmptyDirVolumeSource(emptyDir *api.EmptyDirVolumeSource, w *PrefixWriter) {
func printEmptyDirVolumeSource(emptyDir *api.EmptyDirVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tEmptyDir (a temporary directory that shares a pod's lifetime)\n"+
" Medium:\t%v\n", emptyDir.Medium)
}
func printGCEPersistentDiskVolumeSource(gce *api.GCEPersistentDiskVolumeSource, w *PrefixWriter) {
func printGCEPersistentDiskVolumeSource(gce *api.GCEPersistentDiskVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tGCEPersistentDisk (a Persistent Disk resource in Google Compute Engine)\n"+
" PDName:\t%v\n"+
" FSType:\t%v\n"+
@ -657,7 +673,7 @@ func printGCEPersistentDiskVolumeSource(gce *api.GCEPersistentDiskVolumeSource,
gce.PDName, gce.FSType, gce.Partition, gce.ReadOnly)
}
func printAWSElasticBlockStoreVolumeSource(aws *api.AWSElasticBlockStoreVolumeSource, w *PrefixWriter) {
func printAWSElasticBlockStoreVolumeSource(aws *api.AWSElasticBlockStoreVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tAWSElasticBlockStore (a Persistent Disk resource in AWS)\n"+
" VolumeID:\t%v\n"+
" FSType:\t%v\n"+
@ -666,14 +682,14 @@ func printAWSElasticBlockStoreVolumeSource(aws *api.AWSElasticBlockStoreVolumeSo
aws.VolumeID, aws.FSType, aws.Partition, aws.ReadOnly)
}
func printGitRepoVolumeSource(git *api.GitRepoVolumeSource, w *PrefixWriter) {
func printGitRepoVolumeSource(git *api.GitRepoVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tGitRepo (a volume that is pulled from git when the pod is created)\n"+
" Repository:\t%v\n"+
" Revision:\t%v\n",
git.Repository, git.Revision)
}
func printSecretVolumeSource(secret *api.SecretVolumeSource, w *PrefixWriter) {
func printSecretVolumeSource(secret *api.SecretVolumeSource, w PrefixWriter) {
optional := secret.Optional != nil && *secret.Optional
w.Write(LEVEL_2, "Type:\tSecret (a volume populated by a Secret)\n"+
" SecretName:\t%v\n"+
@ -681,7 +697,7 @@ func printSecretVolumeSource(secret *api.SecretVolumeSource, w *PrefixWriter) {
secret.SecretName, optional)
}
func printConfigMapVolumeSource(configMap *api.ConfigMapVolumeSource, w *PrefixWriter) {
func printConfigMapVolumeSource(configMap *api.ConfigMapVolumeSource, w PrefixWriter) {
optional := configMap.Optional != nil && *configMap.Optional
w.Write(LEVEL_2, "Type:\tConfigMap (a volume populated by a ConfigMap)\n"+
" Name:\t%v\n"+
@ -689,7 +705,7 @@ func printConfigMapVolumeSource(configMap *api.ConfigMapVolumeSource, w *PrefixW
configMap.Name, optional)
}
func printNFSVolumeSource(nfs *api.NFSVolumeSource, w *PrefixWriter) {
func printNFSVolumeSource(nfs *api.NFSVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tNFS (an NFS mount that lasts the lifetime of a pod)\n"+
" Server:\t%v\n"+
" Path:\t%v\n"+
@ -697,7 +713,7 @@ func printNFSVolumeSource(nfs *api.NFSVolumeSource, w *PrefixWriter) {
nfs.Server, nfs.Path, nfs.ReadOnly)
}
func printQuobyteVolumeSource(quobyte *api.QuobyteVolumeSource, w *PrefixWriter) {
func printQuobyteVolumeSource(quobyte *api.QuobyteVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tQuobyte (a Quobyte mount on the host that shares a pod's lifetime)\n"+
" Registry:\t%v\n"+
" Volume:\t%v\n"+
@ -705,13 +721,13 @@ func printQuobyteVolumeSource(quobyte *api.QuobyteVolumeSource, w *PrefixWriter)
quobyte.Registry, quobyte.Volume, quobyte.ReadOnly)
}
func printPortworxVolumeSource(pwxVolume *api.PortworxVolumeSource, w *PrefixWriter) {
func printPortworxVolumeSource(pwxVolume *api.PortworxVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tPortworxVolume (a Portworx Volume resource)\n"+
" VolumeID:\t%v\n",
pwxVolume.VolumeID)
}
func printISCSIVolumeSource(iscsi *api.ISCSIVolumeSource, w *PrefixWriter) {
func printISCSIVolumeSource(iscsi *api.ISCSIVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tISCSI (an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod)\n"+
" TargetPortal:\t%v\n"+
" IQN:\t%v\n"+
@ -722,7 +738,7 @@ func printISCSIVolumeSource(iscsi *api.ISCSIVolumeSource, w *PrefixWriter) {
iscsi.TargetPortal, iscsi.IQN, iscsi.Lun, iscsi.ISCSIInterface, iscsi.FSType, iscsi.ReadOnly)
}
func printGlusterfsVolumeSource(glusterfs *api.GlusterfsVolumeSource, w *PrefixWriter) {
func printGlusterfsVolumeSource(glusterfs *api.GlusterfsVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tGlusterfs (a Glusterfs mount on the host that shares a pod's lifetime)\n"+
" EndpointsName:\t%v\n"+
" Path:\t%v\n"+
@ -730,14 +746,14 @@ func printGlusterfsVolumeSource(glusterfs *api.GlusterfsVolumeSource, w *PrefixW
glusterfs.EndpointsName, glusterfs.Path, glusterfs.ReadOnly)
}
func printPersistentVolumeClaimVolumeSource(claim *api.PersistentVolumeClaimVolumeSource, w *PrefixWriter) {
func printPersistentVolumeClaimVolumeSource(claim *api.PersistentVolumeClaimVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tPersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)\n"+
" ClaimName:\t%v\n"+
" ReadOnly:\t%v\n",
claim.ClaimName, claim.ReadOnly)
}
func printRBDVolumeSource(rbd *api.RBDVolumeSource, w *PrefixWriter) {
func printRBDVolumeSource(rbd *api.RBDVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tRBD (a Rados Block Device mount on the host that shares a pod's lifetime)\n"+
" CephMonitors:\t%v\n"+
" RBDImage:\t%v\n"+
@ -750,7 +766,7 @@ func printRBDVolumeSource(rbd *api.RBDVolumeSource, w *PrefixWriter) {
rbd.CephMonitors, rbd.RBDImage, rbd.FSType, rbd.RBDPool, rbd.RadosUser, rbd.Keyring, rbd.SecretRef, rbd.ReadOnly)
}
func printDownwardAPIVolumeSource(d *api.DownwardAPIVolumeSource, w *PrefixWriter) {
func printDownwardAPIVolumeSource(d *api.DownwardAPIVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tDownwardAPI (a volume populated by information about the pod)\n Items:\n")
for _, mapping := range d.Items {
if mapping.FieldRef != nil {
@ -762,7 +778,7 @@ func printDownwardAPIVolumeSource(d *api.DownwardAPIVolumeSource, w *PrefixWrite
}
}
func printAzureDiskVolumeSource(d *api.AzureDiskVolumeSource, w *PrefixWriter) {
func printAzureDiskVolumeSource(d *api.AzureDiskVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tAzureDisk (an Azure Data Disk mount on the host and bind mount to the pod)\n"+
" DiskName:\t%v\n"+
" DiskURI:\t%v\n"+
@ -772,21 +788,21 @@ func printAzureDiskVolumeSource(d *api.AzureDiskVolumeSource, w *PrefixWriter) {
d.DiskName, d.DataDiskURI, *d.FSType, *d.CachingMode, *d.ReadOnly)
}
func printVsphereVolumeSource(vsphere *api.VsphereVirtualDiskVolumeSource, w *PrefixWriter) {
func printVsphereVolumeSource(vsphere *api.VsphereVirtualDiskVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tvSphereVolume (a Persistent Disk resource in vSphere)\n"+
" VolumePath:\t%v\n"+
" FSType:\t%v\n",
vsphere.VolumePath, vsphere.FSType)
}
func printPhotonPersistentDiskVolumeSource(photon *api.PhotonPersistentDiskVolumeSource, w *PrefixWriter) {
func printPhotonPersistentDiskVolumeSource(photon *api.PhotonPersistentDiskVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tPhotonPersistentDisk (a Persistent Disk resource in photon platform)\n"+
" PdID:\t%v\n"+
" FSType:\t%v\n",
photon.PdID, photon.FSType)
}
func printCinderVolumeSource(cinder *api.CinderVolumeSource, w *PrefixWriter) {
func printCinderVolumeSource(cinder *api.CinderVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tCinder (a Persistent Disk resource in OpenStack)\n"+
" VolumeID:\t%v\n"+
" FSType:\t%v\n"+
@ -794,7 +810,7 @@ func printCinderVolumeSource(cinder *api.CinderVolumeSource, w *PrefixWriter) {
cinder.VolumeID, cinder.FSType, cinder.ReadOnly)
}
func printScaleIOVolumeSource(sio *api.ScaleIOVolumeSource, w *PrefixWriter) {
func printScaleIOVolumeSource(sio *api.ScaleIOVolumeSource, w PrefixWriter) {
w.Write(LEVEL_2, "Type:\tScaleIO (a persistent volume backed by a block device in ScaleIO)\n"+
" Gateway:\t%v\n"+
" System:\t%v\n"+
@ -827,7 +843,7 @@ func (d *PersistentVolumeDescriber) Describe(namespace, name string, describerSe
}
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", pv.Name)
printLabelsMultiline(w, "Labels", pv.Labels)
printAnnotationsMultiline(w, "Annotations", pv.Annotations)
@ -907,7 +923,7 @@ func (d *PersistentVolumeClaimDescriber) Describe(namespace, name string, descri
events, _ := d.Core().Events(namespace).Search(api.Scheme, pvc)
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", pvc.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", pvc.Namespace)
w.Write(LEVEL_0, "StorageClass:\t%s\n", api.GetPersistentVolumeClaimClass(pvc))
@ -926,7 +942,7 @@ func (d *PersistentVolumeClaimDescriber) Describe(namespace, name string, descri
}
func describeContainers(label string, containers []api.Container, containerStatuses []api.ContainerStatus,
resolverFn EnvVarResolverFunc, w *PrefixWriter, space string) {
resolverFn EnvVarResolverFunc, w PrefixWriter, space string) {
statuses := map[string]api.ContainerStatus{}
for _, status := range containerStatuses {
statuses[status.Name] = status
@ -951,7 +967,7 @@ func describeContainers(label string, containers []api.Container, containerStatu
}
}
func describeContainersLabel(containers []api.Container, label, space string, w *PrefixWriter) {
func describeContainersLabel(containers []api.Container, label, space string, w PrefixWriter) {
none := ""
if len(containers) == 0 {
none = " <none>"
@ -959,7 +975,7 @@ func describeContainersLabel(containers []api.Container, label, space string, w
w.Write(LEVEL_0, "%s%s:%s\n", space, label, none)
}
func describeContainerBasicInfo(container api.Container, status api.ContainerStatus, ok bool, space string, w *PrefixWriter) {
func describeContainerBasicInfo(container api.Container, status api.ContainerStatus, ok bool, space string, w PrefixWriter) {
nameIndent := ""
if len(space) > 0 {
nameIndent = " "
@ -988,7 +1004,7 @@ func describeContainerPorts(cPorts []api.ContainerPort) string {
return strings.Join(ports, ", ")
}
func describeContainerCommand(container api.Container, w *PrefixWriter) {
func describeContainerCommand(container api.Container, w PrefixWriter) {
if len(container.Command) > 0 {
w.Write(LEVEL_2, "Command:\n")
for _, c := range container.Command {
@ -1003,7 +1019,7 @@ func describeContainerCommand(container api.Container, w *PrefixWriter) {
}
}
func describeContainerResource(container api.Container, w *PrefixWriter) {
func describeContainerResource(container api.Container, w PrefixWriter) {
resources := container.Resources
if len(resources.Limits) > 0 {
w.Write(LEVEL_2, "Limits:\n")
@ -1022,7 +1038,7 @@ func describeContainerResource(container api.Container, w *PrefixWriter) {
}
}
func describeContainerState(status api.ContainerStatus, w *PrefixWriter) {
func describeContainerState(status api.ContainerStatus, w PrefixWriter) {
describeStatus("State", status.State, w)
if status.LastTerminationState.Terminated != nil {
describeStatus("Last State", status.LastTerminationState, w)
@ -1031,7 +1047,7 @@ func describeContainerState(status api.ContainerStatus, w *PrefixWriter) {
w.Write(LEVEL_2, "Restart Count:\t%d\n", status.RestartCount)
}
func describeContainerProbe(container api.Container, w *PrefixWriter) {
func describeContainerProbe(container api.Container, w PrefixWriter) {
if container.LivenessProbe != nil {
probe := DescribeProbe(container.LivenessProbe)
w.Write(LEVEL_2, "Liveness:\t%s\n", probe)
@ -1042,7 +1058,7 @@ func describeContainerProbe(container api.Container, w *PrefixWriter) {
}
}
func describeContainerVolumes(container api.Container, w *PrefixWriter) {
func describeContainerVolumes(container api.Container, w PrefixWriter) {
none := ""
if len(container.VolumeMounts) == 0 {
none = "\t<none>"
@ -1063,7 +1079,7 @@ func describeContainerVolumes(container api.Container, w *PrefixWriter) {
}
}
func describeContainerEnvVars(container api.Container, resolverFn EnvVarResolverFunc, w *PrefixWriter) {
func describeContainerEnvVars(container api.Container, resolverFn EnvVarResolverFunc, w PrefixWriter) {
none := ""
if len(container.Env) == 0 {
none = "\t<none>"
@ -1103,7 +1119,7 @@ func describeContainerEnvVars(container api.Container, resolverFn EnvVarResolver
}
}
func describeContainerEnvFrom(container api.Container, resolverFn EnvVarResolverFunc, w *PrefixWriter) {
func describeContainerEnvFrom(container api.Container, resolverFn EnvVarResolverFunc, w PrefixWriter) {
none := ""
if len(container.EnvFrom) == 0 {
none = "\t<none>"
@ -1172,7 +1188,7 @@ func EnvValueRetriever(pod *api.Pod) EnvVarResolverFunc {
}
}
func describeStatus(stateName string, state api.ContainerState, w *PrefixWriter) {
func describeStatus(stateName string, state api.ContainerState, w PrefixWriter) {
switch {
case state.Running != nil:
w.Write(LEVEL_2, "%s:\tRunning\n", stateName)
@ -1201,7 +1217,7 @@ func describeStatus(stateName string, state api.ContainerState, w *PrefixWriter)
}
}
func describeVolumeClaimTemplates(templates []api.PersistentVolumeClaim, w *PrefixWriter) {
func describeVolumeClaimTemplates(templates []api.PersistentVolumeClaim, w PrefixWriter) {
if len(templates) == 0 {
w.Write(LEVEL_0, "Volume Claims:\t<none>\n")
return
@ -1267,7 +1283,7 @@ func (d *ReplicationControllerDescriber) Describe(namespace, name string, descri
func describeReplicationController(controller *api.ReplicationController, events *api.EventList, running, waiting, succeeded, failed int) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", controller.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", controller.Namespace)
w.Write(LEVEL_0, "Selector:\t%s\n", labels.FormatLabels(controller.Spec.Selector))
@ -1276,7 +1292,7 @@ func describeReplicationController(controller *api.ReplicationController, events
w.Write(LEVEL_0, "Replicas:\t%d current / %d desired\n", controller.Status.Replicas, controller.Spec.Replicas)
w.Write(LEVEL_0, "Pods Status:\t%d Running / %d Waiting / %d Succeeded / %d Failed\n", running, waiting, succeeded, failed)
DescribePodTemplate(controller.Spec.Template, out)
DescribePodTemplate(controller.Spec.Template, w)
if events != nil {
DescribeEvents(events, w)
}
@ -1284,8 +1300,7 @@ func describeReplicationController(controller *api.ReplicationController, events
})
}
func DescribePodTemplate(template *api.PodTemplateSpec, out io.Writer) {
w := &PrefixWriter{out}
func DescribePodTemplate(template *api.PodTemplateSpec, w PrefixWriter) {
w.Write(LEVEL_0, "Pod Template:\n")
if template == nil {
w.Write(LEVEL_1, "<unset>")
@ -1336,7 +1351,7 @@ func (d *ReplicaSetDescriber) Describe(namespace, name string, describerSettings
func describeReplicaSet(rs *extensions.ReplicaSet, events *api.EventList, running, waiting, succeeded, failed int, getPodErr error) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", rs.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", rs.Namespace)
w.Write(LEVEL_0, "Selector:\t%s\n", metav1.FormatLabelSelector(rs.Spec.Selector))
@ -1349,7 +1364,7 @@ func describeReplicaSet(rs *extensions.ReplicaSet, events *api.EventList, runnin
} else {
w.Write(LEVEL_0, "%d Running / %d Waiting / %d Succeeded / %d Failed\n", running, waiting, succeeded, failed)
}
DescribePodTemplate(&rs.Spec.Template, out)
DescribePodTemplate(&rs.Spec.Template, w)
if events != nil {
DescribeEvents(events, w)
}
@ -1378,7 +1393,7 @@ func (d *JobDescriber) Describe(namespace, name string, describerSettings printe
func describeJob(job *batch.Job, events *api.EventList) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", job.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", job.Namespace)
selector, _ := metav1.LabelSelectorAsSelector(job.Spec.Selector)
@ -1398,7 +1413,7 @@ func describeJob(job *batch.Job, events *api.EventList) (string, error) {
w.Write(LEVEL_0, "Active Deadline Seconds:\t%ds\n", *job.Spec.ActiveDeadlineSeconds)
}
w.Write(LEVEL_0, "Pods Statuses:\t%d Running / %d Succeeded / %d Failed\n", job.Status.Active, job.Status.Succeeded, job.Status.Failed)
DescribePodTemplate(&job.Spec.Template, out)
DescribePodTemplate(&job.Spec.Template, w)
if events != nil {
DescribeEvents(events, w)
}
@ -1427,7 +1442,7 @@ func (d *CronJobDescriber) Describe(namespace, name string, describerSettings pr
func describeCronJob(scheduledJob *batch.CronJob, events *api.EventList) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", scheduledJob.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", scheduledJob.Namespace)
printLabelsMultiline(w, "Labels", scheduledJob.Labels)
@ -1454,7 +1469,7 @@ func describeCronJob(scheduledJob *batch.CronJob, events *api.EventList) (string
})
}
func describeJobTemplate(jobTemplate batch.JobTemplateSpec, w *PrefixWriter) {
func describeJobTemplate(jobTemplate batch.JobTemplateSpec, w PrefixWriter) {
if jobTemplate.Spec.Selector != nil {
selector, _ := metav1.LabelSelectorAsSelector(jobTemplate.Spec.Selector)
w.Write(LEVEL_0, "Selector:\t%s\n", selector)
@ -1474,10 +1489,10 @@ func describeJobTemplate(jobTemplate batch.JobTemplateSpec, w *PrefixWriter) {
if jobTemplate.Spec.ActiveDeadlineSeconds != nil {
w.Write(LEVEL_0, "Active Deadline Seconds:\t%ds\n", *jobTemplate.Spec.ActiveDeadlineSeconds)
}
DescribePodTemplate(&jobTemplate.Spec.Template, w.out)
DescribePodTemplate(&jobTemplate.Spec.Template, w)
}
func printActiveJobs(w *PrefixWriter, title string, jobs []api.ObjectReference) {
func printActiveJobs(w PrefixWriter, title string, jobs []api.ObjectReference) {
w.Write(LEVEL_0, "%s:\t", title)
if len(jobs) == 0 {
w.WriteLine("<none>")
@ -1526,7 +1541,7 @@ func (d *DaemonSetDescriber) Describe(namespace, name string, describerSettings
func describeDaemonSet(daemon *extensions.DaemonSet, events *api.EventList, running, waiting, succeeded, failed int) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", daemon.Name)
selector, err := metav1.LabelSelectorAsSelector(daemon.Spec.Selector)
if err != nil {
@ -1543,7 +1558,7 @@ func describeDaemonSet(daemon *extensions.DaemonSet, events *api.EventList, runn
w.Write(LEVEL_0, "Number of Nodes Scheduled with Available Pods: %d\n", daemon.Status.NumberAvailable)
w.Write(LEVEL_0, "Number of Nodes Misscheduled: %d\n", daemon.Status.NumberMisscheduled)
w.Write(LEVEL_0, "Pods Status:\t%d Running / %d Waiting / %d Succeeded / %d Failed\n", running, waiting, succeeded, failed)
DescribePodTemplate(&daemon.Spec.Template, out)
DescribePodTemplate(&daemon.Spec.Template, w)
if events != nil {
DescribeEvents(events, w)
}
@ -1569,7 +1584,7 @@ func (d *SecretDescriber) Describe(namespace, name string, describerSettings pri
func describeSecret(secret *api.Secret) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", secret.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", secret.Namespace)
printLabelsMultiline(w, "Labels", secret.Labels)
@ -1627,7 +1642,7 @@ func (i *IngressDescriber) describeBackend(ns string, backend *extensions.Ingres
func (i *IngressDescriber) describeIngress(ing *extensions.Ingress, describerSettings printers.DescriberSettings) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%v\n", ing.Name)
w.Write(LEVEL_0, "Namespace:\t%v\n", ing.Namespace)
w.Write(LEVEL_0, "Address:\t%v\n", loadBalancerStatusStringer(ing.Status.LoadBalancer, true))
@ -1678,7 +1693,7 @@ func (i *IngressDescriber) describeIngress(ing *extensions.Ingress, describerSet
})
}
func describeIngressTLS(w *PrefixWriter, ingTLS []extensions.IngressTLS) {
func describeIngressTLS(w PrefixWriter, ingTLS []extensions.IngressTLS) {
w.Write(LEVEL_0, "TLS:\n")
for _, t := range ingTLS {
if t.SecretName == "" {
@ -1691,7 +1706,7 @@ func describeIngressTLS(w *PrefixWriter, ingTLS []extensions.IngressTLS) {
}
// TODO: Move from annotations into Ingress status.
func describeIngressAnnotations(w *PrefixWriter, annotations map[string]string) {
func describeIngressAnnotations(w PrefixWriter, annotations map[string]string) {
w.Write(LEVEL_0, "Annotations:\n")
for k, v := range annotations {
if !strings.HasPrefix(k, "ingress") {
@ -1746,7 +1761,7 @@ func describeService(service *api.Service, endpoints *api.Endpoints, events *api
endpoints = &api.Endpoints{}
}
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", service.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", service.Namespace)
printLabelsMultiline(w, "Labels", service.Labels)
@ -1808,7 +1823,7 @@ func (d *EndpointsDescriber) Describe(namespace, name string, describerSettings
func describeEndpoints(ep *api.Endpoints, events *api.EventList) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", ep.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", ep.Namespace)
printLabelsMultiline(w, "Labels", ep.Labels)
@ -1915,7 +1930,7 @@ func (d *ServiceAccountDescriber) Describe(namespace, name string, describerSett
func describeServiceAccount(serviceAccount *api.ServiceAccount, tokens []api.Secret, missingSecrets sets.String) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", serviceAccount.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", serviceAccount.Namespace)
printLabelsMultiline(w, "Labels", serviceAccount.Labels)
@ -2012,7 +2027,7 @@ func (d *NodeDescriber) Describe(namespace, name string, describerSettings print
func describeNode(node *api.Node, nodeNonTerminatedPodsList *api.PodList, events *api.EventList, canViewPods bool) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", node.Name)
w.Write(LEVEL_0, "Role:\t%s\n", findNodeRole(node))
printLabelsMultiline(w, "Labels", node.Labels)
@ -2114,7 +2129,7 @@ func (p *StatefulSetDescriber) Describe(namespace, name string, describerSetting
}
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", ps.ObjectMeta.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", ps.ObjectMeta.Namespace)
w.Write(LEVEL_0, "CreationTimestamp:\t%s\n", ps.CreationTimestamp.Time.Format(time.RFC1123Z))
@ -2123,7 +2138,7 @@ func (p *StatefulSetDescriber) Describe(namespace, name string, describerSetting
printAnnotationsMultiline(w, "Annotations", ps.Annotations)
w.Write(LEVEL_0, "Replicas:\t%d desired | %d total\n", ps.Spec.Replicas, ps.Status.Replicas)
w.Write(LEVEL_0, "Pods Status:\t%d Running / %d Waiting / %d Succeeded / %d Failed\n", running, waiting, succeeded, failed)
DescribePodTemplate(&ps.Spec.Template, out)
DescribePodTemplate(&ps.Spec.Template, w)
describeVolumeClaimTemplates(ps.Spec.VolumeClaimTemplates, w)
if describerSettings.ShowEvents {
events, _ := p.client.Core().Events(namespace).Search(api.Scheme, ps)
@ -2154,7 +2169,7 @@ func (p *CertificateSigningRequestDescriber) Describe(namespace, name string, de
return "", err
}
printListHelper := func(w *PrefixWriter, prefix, name string, values []string) {
printListHelper := func(w PrefixWriter, prefix, name string, values []string) {
if len(values) == 0 {
return
}
@ -2164,7 +2179,7 @@ func (p *CertificateSigningRequestDescriber) Describe(namespace, name string, de
}
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", csr.Name)
w.Write(LEVEL_0, "Labels:\t%s\n", labels.FormatLabels(csr.Labels))
w.Write(LEVEL_0, "Annotations:\t%s\n", labels.FormatLabels(csr.Annotations))
@ -2215,7 +2230,7 @@ func (d *HorizontalPodAutoscalerDescriber) Describe(namespace, name string, desc
return "", err
}
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", hpa.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", hpa.Namespace)
printLabelsMultiline(w, "Labels", hpa.Labels)
@ -2291,7 +2306,7 @@ func (d *HorizontalPodAutoscalerDescriber) Describe(namespace, name string, desc
})
}
func describeNodeResource(nodeNonTerminatedPodsList *api.PodList, node *api.Node, w *PrefixWriter) error {
func describeNodeResource(nodeNonTerminatedPodsList *api.PodList, node *api.Node, w PrefixWriter) error {
w.Write(LEVEL_0, "Non-terminated Pods:\t(%d in total)\n", len(nodeNonTerminatedPodsList.Items))
w.Write(LEVEL_1, "Namespace\tName\t\tCPU Requests\tCPU Limits\tMemory Requests\tMemory Limits\n")
w.Write(LEVEL_1, "---------\t----\t\t------------\t----------\t---------------\t-------------\n")
@ -2373,7 +2388,7 @@ func getPodsTotalRequestsAndLimits(podList *api.PodList) (reqs map[api.ResourceN
return
}
func DescribeEvents(el *api.EventList, w *PrefixWriter) {
func DescribeEvents(el *api.EventList, w PrefixWriter) {
if len(el.Items) == 0 {
w.Write(LEVEL_0, "Events:\t<none>\n")
return
@ -2414,7 +2429,7 @@ func (dd *DeploymentDescriber) Describe(namespace, name string, describerSetting
return "", err
}
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", d.ObjectMeta.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", d.ObjectMeta.Namespace)
w.Write(LEVEL_0, "CreationTimestamp:\t%s\n", d.CreationTimestamp.Time.Format(time.RFC1123Z))
@ -2428,7 +2443,7 @@ func (dd *DeploymentDescriber) Describe(namespace, name string, describerSetting
ru := d.Spec.Strategy.RollingUpdate
w.Write(LEVEL_0, "RollingUpdateStrategy:\t%s max unavailable, %s max surge\n", ru.MaxUnavailable.String(), ru.MaxSurge.String())
}
DescribePodTemplate(&internalDeployment.Spec.Template, out)
DescribePodTemplate(&internalDeployment.Spec.Template, w)
if len(d.Status.Conditions) > 0 {
w.Write(LEVEL_0, "Conditions:\n Type\tStatus\tReason\n")
w.Write(LEVEL_1, "----\t------\t------\n")
@ -2554,7 +2569,7 @@ func (d *ConfigMapDescriber) Describe(namespace, name string, describerSettings
func describeConfigMap(configMap *api.ConfigMap) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", configMap.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", configMap.Namespace)
printLabelsMultiline(w, "Labels", configMap.Labels)
@ -2584,7 +2599,7 @@ func (d *ClusterDescriber) Describe(namespace, name string, describerSettings pr
func describeCluster(cluster *federation.Cluster) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", cluster.Name)
w.Write(LEVEL_0, "Labels:\t%s\n", labels.FormatLabels(cluster.Labels))
@ -2629,7 +2644,7 @@ func (d *NetworkPolicyDescriber) Describe(namespace, name string, describerSetti
func describeNetworkPolicy(networkPolicy *extensions.NetworkPolicy) (string, error) {
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", networkPolicy.Name)
w.Write(LEVEL_0, "Namespace:\t%s\n", networkPolicy.Namespace)
printLabelsMultiline(w, "Labels", networkPolicy.Labels)
@ -2649,7 +2664,7 @@ func (s *StorageClassDescriber) Describe(namespace, name string, describerSettin
return "", err
}
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", sc.Name)
w.Write(LEVEL_0, "IsDefaultClass:\t%s\n", storageutil.IsDefaultAnnotationText(sc.ObjectMeta))
w.Write(LEVEL_0, "Annotations:\t%s\n", labels.FormatLabels(sc.Annotations))
@ -2678,7 +2693,7 @@ func (p *PodDisruptionBudgetDescriber) Describe(namespace, name string, describe
return "", err
}
return tabbedString(func(out io.Writer) error {
w := &PrefixWriter{out}
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", pdb.Name)
w.Write(LEVEL_0, "Min available:\t%s\n", pdb.Spec.MinAvailable.String())
if pdb.Spec.Selector != nil {
@ -2846,17 +2861,17 @@ func (fn typeFunc) Describe(exact interface{}, extra ...interface{}) (string, er
}
// printLabelsMultilineWithFilter prints filtered multiple labels with a proper alignment.
func printLabelsMultilineWithFilter(w *PrefixWriter, title string, labels map[string]string, skip sets.String) {
func printLabelsMultilineWithFilter(w PrefixWriter, title string, labels map[string]string, skip sets.String) {
printLabelsMultilineWithIndent(w, "", title, "\t", labels, skip)
}
// printLabelsMultiline prints multiple labels with a proper alignment.
func printLabelsMultiline(w *PrefixWriter, title string, labels map[string]string) {
func printLabelsMultiline(w PrefixWriter, title string, labels map[string]string) {
printLabelsMultilineWithIndent(w, "", title, "\t", labels, sets.NewString())
}
// printLabelsMultiline prints multiple labels with a user-defined alignment.
func printLabelsMultilineWithIndent(w *PrefixWriter, initialIndent, title, innerIndent string, labels map[string]string, skip sets.String) {
func printLabelsMultilineWithIndent(w PrefixWriter, initialIndent, title, innerIndent string, labels map[string]string, skip sets.String) {
w.Write(LEVEL_0, "%s%s:%s", initialIndent, title, innerIndent)
@ -2890,12 +2905,12 @@ func printLabelsMultilineWithIndent(w *PrefixWriter, initialIndent, title, inner
}
// printTaintsMultiline prints multiple taints with a proper alignment.
func printNodeTaintsMultiline(w *PrefixWriter, title string, taints []api.Taint) {
func printNodeTaintsMultiline(w PrefixWriter, title string, taints []api.Taint) {
printTaintsMultilineWithIndent(w, "", title, "\t", taints)
}
// printTaintsMultilineWithIndent prints multiple taints with a user-defined alignment.
func printTaintsMultilineWithIndent(w *PrefixWriter, initialIndent, title, innerIndent string, taints []api.Taint) {
func printTaintsMultilineWithIndent(w PrefixWriter, initialIndent, title, innerIndent string, taints []api.Taint) {
w.Write(LEVEL_0, "%s%s:%s", initialIndent, title, innerIndent)
if taints == nil || len(taints) == 0 {
@ -2925,12 +2940,12 @@ func printTaintsMultilineWithIndent(w *PrefixWriter, initialIndent, title, inner
}
// printPodTolerationsMultiline prints multiple tolerations with a proper alignment.
func printPodTolerationsMultiline(w *PrefixWriter, title string, tolerations []api.Toleration) {
func printPodTolerationsMultiline(w PrefixWriter, title string, tolerations []api.Toleration) {
printTolerationsMultilineWithIndent(w, "", title, "\t", tolerations)
}
// printTolerationsMultilineWithIndent prints multiple tolerations with a user-defined alignment.
func printTolerationsMultilineWithIndent(w *PrefixWriter, initialIndent, title, innerIndent string, tolerations []api.Toleration) {
func printTolerationsMultilineWithIndent(w PrefixWriter, initialIndent, title, innerIndent string, tolerations []api.Toleration) {
w.Write(LEVEL_0, "%s%s:%s", initialIndent, title, innerIndent)
if tolerations == nil || len(tolerations) == 0 {
@ -3059,18 +3074,18 @@ func versionedClientsetForDeployment(internalClient clientset.Interface) version
var maxAnnotationLen = 200
// printAnnotationsMultilineWithFilter prints filtered multiple annotations with a proper alignment.
func printAnnotationsMultilineWithFilter(w *PrefixWriter, title string, annotations map[string]string, skip sets.String) {
func printAnnotationsMultilineWithFilter(w PrefixWriter, title string, annotations map[string]string, skip sets.String) {
printAnnotationsMultilineWithIndent(w, "", title, "\t", annotations, skip)
}
// printAnnotationsMultiline prints multiple annotations with a proper alignment.
func printAnnotationsMultiline(w *PrefixWriter, title string, annotations map[string]string) {
func printAnnotationsMultiline(w PrefixWriter, title string, annotations map[string]string) {
printAnnotationsMultilineWithIndent(w, "", title, "\t", annotations, sets.NewString())
}
// printAnnotationsMultilineWithIndent prints multiple annotations with a user-defined alignment.
// If annotation string is too long, we omit chars more than 200 length.
func printAnnotationsMultilineWithIndent(w *PrefixWriter, initialIndent, title, innerIndent string, annotations map[string]string, skip sets.String) {
func printAnnotationsMultilineWithIndent(w PrefixWriter, initialIndent, title, innerIndent string, annotations map[string]string, skip sets.String) {
w.Write(LEVEL_0, "%s%s:%s", initialIndent, title, innerIndent)

View File

@ -402,7 +402,7 @@ func TestDescribeContainers(t *testing.T) {
ContainerStatuses: []api.ContainerStatus{testCase.status},
},
}
writer := &PrefixWriter{out}
writer := NewPrefixWriter(out)
describeContainers("Containers", pod.Spec.Containers, pod.Status.ContainerStatuses, EnvValueRetriever(&pod), writer, "")
output := out.String()
for _, expected := range testCase.expectedElements {
@ -1297,7 +1297,7 @@ func TestPrintLabelsMultiline(t *testing.T) {
}
for i, testCase := range testCases {
out := new(bytes.Buffer)
writer := &PrefixWriter{out}
writer := NewPrefixWriter(out)
printAnnotationsMultiline(writer, "Annotations", testCase.annotations)
output := out.String()
if output != testCase.expectPrint {