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 }