@@ -23,6 +23,7 @@ import (
23
23
"io"
24
24
"io/ioutil"
25
25
"sort"
26
+ "strings"
26
27
27
28
"github.com/lithammer/dedent"
28
29
"github.com/pkg/errors"
@@ -31,10 +32,14 @@ import (
31
32
"k8s.io/klog"
32
33
33
34
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
35
+ "k8s.io/apimachinery/pkg/runtime"
36
+ "k8s.io/cli-runtime/pkg/genericclioptions"
34
37
clientset "k8s.io/client-go/kubernetes"
35
38
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
36
39
kubeadmscheme "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme"
37
40
kubeadmapiv1beta2 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2"
41
+ outputapischeme "k8s.io/kubernetes/cmd/kubeadm/app/apis/output/scheme"
42
+ outputapiv1alpha1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/output/v1alpha1"
38
43
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
39
44
phaseutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases"
40
45
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
@@ -45,6 +50,7 @@ import (
45
50
"k8s.io/kubernetes/cmd/kubeadm/app/phases/uploadconfig"
46
51
configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config"
47
52
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
53
+ "k8s.io/kubernetes/cmd/kubeadm/app/util/output"
48
54
utilruntime "k8s.io/kubernetes/cmd/kubeadm/app/util/runtime"
49
55
utilsexec "k8s.io/utils/exec"
50
56
)
@@ -527,6 +533,8 @@ func NewCmdConfigImagesList(out io.Writer, mockK8sVersion *string) *cobra.Comman
527
533
externalcfg .KubernetesVersion = * mockK8sVersion
528
534
}
529
535
536
+ outputFlags := output .NewOutputFlags (& imageTextPrintFlags {}).WithTypeSetter (outputapischeme .Scheme ).WithDefaultOutput (output .TextOutput )
537
+
530
538
cmd := & cobra.Command {
531
539
Use : "list" ,
532
540
Short : "Print a list of images kubeadm will use. The configuration file is used in case any images or image repositories are customized" ,
@@ -536,14 +544,20 @@ func NewCmdConfigImagesList(out io.Writer, mockK8sVersion *string) *cobra.Comman
536
544
return err
537
545
}
538
546
547
+ printer , err := outputFlags .ToPrinter ()
548
+ if err != nil {
549
+ return err
550
+ }
551
+
539
552
imagesList , err := NewImagesList (cfgPath , externalcfg )
540
553
if err != nil {
541
554
return err
542
555
}
543
556
544
- return imagesList .Run (out )
557
+ return imagesList .Run (out , printer )
545
558
},
546
559
}
560
+ outputFlags .AddFlags (cmd )
547
561
AddImagesCommonConfigFlags (cmd .PersistentFlags (), externalcfg , & cfgPath , & featureGatesString )
548
562
return cmd
549
563
}
@@ -572,11 +586,39 @@ type ImagesList struct {
572
586
cfg * kubeadmapi.InitConfiguration
573
587
}
574
588
589
+ // imageTextPrinter prints image info in a text form
590
+ type imageTextPrinter struct {
591
+ output.TextPrinter
592
+ }
593
+
594
+ // PrintObj is an implementation of ResourcePrinter.PrintObj for plain text output
595
+ func (itp * imageTextPrinter ) PrintObj (obj runtime.Object , writer io.Writer ) error {
596
+ var err error
597
+ if imgs , ok := obj .(* outputapiv1alpha1.Images ); ok {
598
+ _ , err = fmt .Fprintln (writer , strings .Join (imgs .Images , "\n " ))
599
+ } else {
600
+ err = errors .New ("unexpected object type" )
601
+ }
602
+ return err
603
+ }
604
+
605
+ // imageTextPrintFlags provides flags necessary for printing image in a text form.
606
+ type imageTextPrintFlags struct {}
607
+
608
+ // ToPrinter returns kubeadm printer for the text output format
609
+ func (ipf * imageTextPrintFlags ) ToPrinter (outputFormat string ) (output.Printer , error ) {
610
+ if outputFormat == output .TextOutput {
611
+ return & imageTextPrinter {}, nil
612
+ }
613
+ return nil , genericclioptions.NoCompatiblePrinterError {OutputFormat : & outputFormat , AllowedFormats : []string {output .TextOutput }}
614
+ }
615
+
575
616
// Run runs the images command and writes the result to the io.Writer passed in
576
- func (i * ImagesList ) Run (out io.Writer ) error {
617
+ func (i * ImagesList ) Run (out io.Writer , printer output. Printer ) error {
577
618
imgs := images .GetControlPlaneImages (& i .cfg .ClusterConfiguration )
578
- for _ , img := range imgs {
579
- fmt .Fprintln (out , img )
619
+
620
+ if err := printer .PrintObj (& outputapiv1alpha1.Images {Images : imgs }, out ); err != nil {
621
+ return errors .Wrap (err , "unable to print images" )
580
622
}
581
623
582
624
return nil
0 commit comments