github.com/alibaba/sealer@v0.8.6-0.20220430115802-37a2bdaa8173/sealer/cmd/images.go (about)

     1  // Copyright © 2021 Alibaba Group Holding Ltd.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package cmd
    16  
    17  import (
    18  	"fmt"
    19  	"sort"
    20  	"strings"
    21  
    22  	"github.com/alibaba/sealer/pkg/image/reference"
    23  
    24  	"github.com/olekukonko/tablewriter"
    25  	"github.com/spf13/cobra"
    26  
    27  	"github.com/alibaba/sealer/common"
    28  	"github.com/alibaba/sealer/pkg/image"
    29  )
    30  
    31  const (
    32  	imageID           = "IMAGE ID"
    33  	imageName         = "IMAGE NAME"
    34  	imageCreate       = "CREATE"
    35  	imageSize         = "SIZE"
    36  	imageArch         = "ARCH"
    37  	imageVariant      = "VARIANT"
    38  	timeDefaultFormat = "2006-01-02 15:04:05"
    39  )
    40  
    41  var listCmd = &cobra.Command{
    42  	Use:     "images",
    43  	Short:   "list all cluster images",
    44  	Args:    cobra.NoArgs,
    45  	Example: `sealer images`,
    46  	RunE: func(cmd *cobra.Command, args []string) error {
    47  
    48  		ims, err := image.NewImageMetadataService()
    49  		if err != nil {
    50  			return err
    51  		}
    52  
    53  		imageMetadataMap, err := ims.List()
    54  		if err != nil {
    55  			return err
    56  		}
    57  
    58  		var summaries = make(ManifestList, 0, len(imageMetadataMap))
    59  
    60  		for name, manifestList := range imageMetadataMap {
    61  			for _, m := range manifestList.Manifests {
    62  				displayName := name
    63  				create := m.CREATED.Format(timeDefaultFormat)
    64  				size := formatSize(m.SIZE)
    65  				named, err := reference.ParseToNamed(name)
    66  				if err != nil {
    67  					return err
    68  				}
    69  
    70  				if reference.IsDefaultDomain(named.Domain()) {
    71  					displayName = named.RepoTag()
    72  					splits := strings.Split(displayName, "/")
    73  					if reference.IsDefaultRepo(splits[0]) {
    74  						displayName = splits[1]
    75  					}
    76  				}
    77  
    78  				summaries = append(summaries, ManifestDescriptor{
    79  					imageName:    displayName,
    80  					imageID:      m.ID,
    81  					imageArch:    m.Platform.Architecture,
    82  					imageVariant: m.Platform.Variant,
    83  					imageCreate:  create,
    84  					imageSize:    size})
    85  			}
    86  		}
    87  
    88  		sort.Sort(sort.Reverse(summaries))
    89  
    90  		table := tablewriter.NewWriter(common.StdOut)
    91  		table.SetHeader([]string{imageName, imageID, imageArch, imageVariant, imageCreate, imageSize})
    92  
    93  		for _, md := range summaries {
    94  			table.Append([]string{md.imageName, md.imageID, md.imageArch, md.imageVariant, md.imageCreate, md.imageSize})
    95  		}
    96  
    97  		table.Render()
    98  		return nil
    99  	},
   100  }
   101  
   102  type ManifestDescriptor struct {
   103  	imageName, imageID, imageArch, imageVariant, imageCreate, imageSize string
   104  }
   105  
   106  type ManifestList []ManifestDescriptor
   107  
   108  func (r ManifestList) Len() int           { return len(r) }
   109  func (r ManifestList) Swap(i, j int)      { r[i], r[j] = r[j], r[i] }
   110  func (r ManifestList) Less(i, j int) bool { return r[i].imageCreate < r[j].imageCreate }
   111  
   112  func init() {
   113  	rootCmd.AddCommand(listCmd)
   114  }
   115  
   116  func formatSize(size int64) (Size string) {
   117  	if size < 1024 {
   118  		Size = fmt.Sprintf("%.2fB", float64(size)/float64(1))
   119  	} else if size < (1024 * 1024) {
   120  		Size = fmt.Sprintf("%.2fKB", float64(size)/float64(1024))
   121  	} else if size < (1024 * 1024 * 1024) {
   122  		Size = fmt.Sprintf("%.2fMB", float64(size)/float64(1024*1024))
   123  	} else {
   124  		Size = fmt.Sprintf("%.2fGB", float64(size)/float64(1024*1024*1024))
   125  	}
   126  	return
   127  }