zotregistry.dev/zot@v1.4.4-0.20240314164342-eec277e14d20/pkg/cli/client/image_sub_cmd.go (about)

     1  //go:build search
     2  // +build search
     3  
     4  package client
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"github.com/spf13/cobra"
    10  
    11  	zerr "zotregistry.dev/zot/errors"
    12  	zcommon "zotregistry.dev/zot/pkg/common"
    13  )
    14  
    15  func NewImageListCommand(searchService SearchService) *cobra.Command {
    16  	imageListSortFlag := ImageListSortFlag(SortByAlphabeticAsc)
    17  
    18  	cmd := &cobra.Command{
    19  		Use:   "list",
    20  		Short: "List all images",
    21  		Long:  "List all images",
    22  		Args:  cobra.NoArgs,
    23  		RunE: func(cmd *cobra.Command, args []string) error {
    24  			searchConfig, err := GetSearchConfigFromFlags(cmd, searchService)
    25  			if err != nil {
    26  				return err
    27  			}
    28  
    29  			if err := CheckExtEndPointQuery(searchConfig, ImageListQuery()); err == nil {
    30  				return SearchAllImagesGQL(searchConfig)
    31  			}
    32  
    33  			return SearchAllImages(searchConfig)
    34  		},
    35  	}
    36  
    37  	cmd.Flags().Var(&imageListSortFlag, SortByFlag,
    38  		fmt.Sprintf("Options for sorting the output: [%s]", ImageListSortOptionsStr()))
    39  
    40  	return cmd
    41  }
    42  
    43  func NewImageCVEListCommand(searchService SearchService) *cobra.Command {
    44  	var (
    45  		searchedCVEID   string
    46  		cveListSortFlag = CVEListSortFlag(SortBySeverity)
    47  	)
    48  
    49  	cmd := &cobra.Command{
    50  		Use:   "cve [repo]|[repo-name:tag]|[repo-name@digest]",
    51  		Short: "List all CVE's of the image",
    52  		Long:  "List all CVE's of the image",
    53  		Args:  OneImageWithRefArg,
    54  		RunE: func(cmd *cobra.Command, args []string) error {
    55  			searchConfig, err := GetSearchConfigFromFlags(cmd, searchService)
    56  			if err != nil {
    57  				return err
    58  			}
    59  
    60  			if err := CheckExtEndPointQuery(searchConfig, CVEListForImageQuery()); err == nil {
    61  				image := args[0]
    62  
    63  				return SearchCVEForImageGQL(searchConfig, image, searchedCVEID)
    64  			} else {
    65  				return err
    66  			}
    67  		},
    68  	}
    69  
    70  	cmd.Flags().StringVar(&searchedCVEID, SearchedCVEID, "", "Search for a specific CVE by name/id")
    71  	cmd.Flags().Var(&cveListSortFlag, SortByFlag,
    72  		fmt.Sprintf("Options for sorting the output: [%s]", CVEListSortOptionsStr()))
    73  
    74  	return cmd
    75  }
    76  
    77  func NewImageDerivedCommand(searchService SearchService) *cobra.Command {
    78  	imageListSortFlag := ImageListSortFlag(SortByAlphabeticAsc)
    79  
    80  	cmd := &cobra.Command{
    81  		Use:   "derived [repo-name:tag]|[repo-name@digest]",
    82  		Short: "List images that are derived from given image",
    83  		Long:  "List images that are derived from given image",
    84  		Args:  OneImageWithRefArg,
    85  		RunE: func(cmd *cobra.Command, args []string) error {
    86  			searchConfig, err := GetSearchConfigFromFlags(cmd, searchService)
    87  			if err != nil {
    88  				return err
    89  			}
    90  
    91  			if err := CheckExtEndPointQuery(searchConfig, DerivedImageListQuery()); err == nil {
    92  				return SearchDerivedImageListGQL(searchConfig, args[0])
    93  			} else {
    94  				return err
    95  			}
    96  		},
    97  	}
    98  
    99  	cmd.Flags().Var(&imageListSortFlag, SortByFlag,
   100  		fmt.Sprintf("Options for sorting the output: [%s]", ImageListSortOptionsStr()))
   101  
   102  	return cmd
   103  }
   104  
   105  func NewImageBaseCommand(searchService SearchService) *cobra.Command {
   106  	imageListSortFlag := ImageListSortFlag(SortByAlphabeticAsc)
   107  
   108  	cmd := &cobra.Command{
   109  		Use:   "base [repo-name:tag]|[repo-name@digest]",
   110  		Short: "List images that are base for the given image",
   111  		Long:  "List images that are base for the given image",
   112  		Args:  OneImageWithRefArg,
   113  		RunE: func(cmd *cobra.Command, args []string) error {
   114  			searchConfig, err := GetSearchConfigFromFlags(cmd, searchService)
   115  			if err != nil {
   116  				return err
   117  			}
   118  
   119  			if err := CheckExtEndPointQuery(searchConfig, BaseImageListQuery()); err == nil {
   120  				return SearchBaseImageListGQL(searchConfig, args[0])
   121  			} else {
   122  				return err
   123  			}
   124  		},
   125  	}
   126  
   127  	cmd.Flags().Var(&imageListSortFlag, SortByFlag,
   128  		fmt.Sprintf("Options for sorting the output: [%s]", ImageListSortOptionsStr()))
   129  
   130  	return cmd
   131  }
   132  
   133  func NewImageDigestCommand(searchService SearchService) *cobra.Command {
   134  	imageListSortFlag := ImageListSortFlag(SortByAlphabeticAsc)
   135  
   136  	cmd := &cobra.Command{
   137  		Use:   "digest [digest]",
   138  		Short: "List images that contain a blob(manifest, config or layer) with the given digest",
   139  		Long:  "List images that contain a blob(manifest, config or layer) with the given digest",
   140  		Example: `zli image digest 8a1930f0
   141  zli image digest sha256:8a1930f0...`,
   142  		Args: cobra.ExactArgs(1),
   143  		RunE: func(cmd *cobra.Command, args []string) error {
   144  			searchConfig, err := GetSearchConfigFromFlags(cmd, searchService)
   145  			if err != nil {
   146  				return err
   147  			}
   148  
   149  			if err := CheckExtEndPointQuery(searchConfig, ImageListForDigestQuery()); err == nil {
   150  				return SearchImagesForDigestGQL(searchConfig, args[0])
   151  			} else {
   152  				return err
   153  			}
   154  		},
   155  	}
   156  
   157  	cmd.Flags().Var(&imageListSortFlag, SortByFlag,
   158  		fmt.Sprintf("Options for sorting the output: [%s]", ImageListSortOptionsStr()))
   159  
   160  	return cmd
   161  }
   162  
   163  func NewImageNameCommand(searchService SearchService) *cobra.Command {
   164  	imageListSortFlag := ImageListSortFlag(SortByAlphabeticAsc)
   165  
   166  	cmd := &cobra.Command{
   167  		Use:   "name [repo:tag]",
   168  		Short: "List image details by name",
   169  		Long:  "List image details by name",
   170  		Args: func(cmd *cobra.Command, args []string) error {
   171  			if err := cobra.ExactArgs(1)(cmd, args); err != nil {
   172  				return err
   173  			}
   174  
   175  			image := args[0]
   176  
   177  			if dir, _ := zcommon.GetImageDirAndTag(image); dir == "" {
   178  				return zerr.ErrInvalidRepoRefFormat
   179  			}
   180  
   181  			return nil
   182  		},
   183  		RunE: func(cmd *cobra.Command, args []string) error {
   184  			searchConfig, err := GetSearchConfigFromFlags(cmd, searchService)
   185  			if err != nil {
   186  				return err
   187  			}
   188  
   189  			if err := CheckExtEndPointQuery(searchConfig, ImageListQuery()); err == nil {
   190  				return SearchImageByNameGQL(searchConfig, args[0])
   191  			}
   192  
   193  			return SearchImageByName(searchConfig, args[0])
   194  		},
   195  	}
   196  
   197  	cmd.Flags().Var(&imageListSortFlag, SortByFlag,
   198  		fmt.Sprintf("Options for sorting the output: [%s]", ImageListSortOptionsStr()))
   199  
   200  	return cmd
   201  }