Skip to content

Commit 5bd719b

Browse files
authored
Merge pull request kubernetes#86810 from bart0sh/PR0087-kubeadm-output-images
kubeadm config images list: implement structured output
2 parents ea5cef1 + a31ccc7 commit 5bd719b

File tree

9 files changed

+287
-6
lines changed

9 files changed

+287
-6
lines changed

cmd/kubeadm/app/apis/output/register.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ func Resource(resource string) schema.GroupResource {
4747
func addKnownTypes(scheme *runtime.Scheme) error {
4848
scheme.AddKnownTypes(SchemeGroupVersion,
4949
&BootstrapToken{},
50+
&Images{},
5051
)
5152
return nil
5253
}

cmd/kubeadm/app/apis/output/types.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,12 @@ type BootstrapToken struct {
3131

3232
kubeadmapiv1beta2.BootstrapToken
3333
}
34+
35+
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
36+
37+
// Images represents information for the output produced by 'kubeadm config images list'
38+
type Images struct {
39+
metav1.TypeMeta
40+
41+
Images []string
42+
}

cmd/kubeadm/app/apis/output/v1alpha1/register.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ func Resource(resource string) schema.GroupResource {
5959
func addKnownTypes(scheme *runtime.Scheme) error {
6060
scheme.AddKnownTypes(SchemeGroupVersion,
6161
&BootstrapToken{},
62+
&Images{},
6263
)
6364
metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
6465
return nil

cmd/kubeadm/app/apis/output/v1alpha1/types.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,12 @@ type BootstrapToken struct {
3131

3232
kubeadmapiv1beta2.BootstrapToken
3333
}
34+
35+
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
36+
37+
// Images represents information for the output produced by 'kubeadm config images list'
38+
type Images struct {
39+
metav1.TypeMeta `json:",inline"`
40+
41+
Images []string `json:"images"`
42+
}

cmd/kubeadm/app/apis/output/v1alpha1/zz_generated.conversion.go

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/kubeadm/app/apis/output/v1alpha1/zz_generated.deepcopy.go

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/kubeadm/app/apis/output/zz_generated.deepcopy.go

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/kubeadm/app/cmd/config.go

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"io"
2424
"io/ioutil"
2525
"sort"
26+
"strings"
2627

2728
"github.com/lithammer/dedent"
2829
"github.com/pkg/errors"
@@ -31,10 +32,14 @@ import (
3132
"k8s.io/klog"
3233

3334
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
35+
"k8s.io/apimachinery/pkg/runtime"
36+
"k8s.io/cli-runtime/pkg/genericclioptions"
3437
clientset "k8s.io/client-go/kubernetes"
3538
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
3639
kubeadmscheme "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme"
3740
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"
3843
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
3944
phaseutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases"
4045
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
@@ -45,6 +50,7 @@ import (
4550
"k8s.io/kubernetes/cmd/kubeadm/app/phases/uploadconfig"
4651
configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config"
4752
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
53+
"k8s.io/kubernetes/cmd/kubeadm/app/util/output"
4854
utilruntime "k8s.io/kubernetes/cmd/kubeadm/app/util/runtime"
4955
utilsexec "k8s.io/utils/exec"
5056
)
@@ -527,6 +533,8 @@ func NewCmdConfigImagesList(out io.Writer, mockK8sVersion *string) *cobra.Comman
527533
externalcfg.KubernetesVersion = *mockK8sVersion
528534
}
529535

536+
outputFlags := output.NewOutputFlags(&imageTextPrintFlags{}).WithTypeSetter(outputapischeme.Scheme).WithDefaultOutput(output.TextOutput)
537+
530538
cmd := &cobra.Command{
531539
Use: "list",
532540
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
536544
return err
537545
}
538546

547+
printer, err := outputFlags.ToPrinter()
548+
if err != nil {
549+
return err
550+
}
551+
539552
imagesList, err := NewImagesList(cfgPath, externalcfg)
540553
if err != nil {
541554
return err
542555
}
543556

544-
return imagesList.Run(out)
557+
return imagesList.Run(out, printer)
545558
},
546559
}
560+
outputFlags.AddFlags(cmd)
547561
AddImagesCommonConfigFlags(cmd.PersistentFlags(), externalcfg, &cfgPath, &featureGatesString)
548562
return cmd
549563
}
@@ -572,11 +586,39 @@ type ImagesList struct {
572586
cfg *kubeadmapi.InitConfiguration
573587
}
574588

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+
575616
// 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 {
577618
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")
580622
}
581623

582624
return nil

0 commit comments

Comments
 (0)