mirror of
https://github.com/project-zot/zot.git
synced 2026-06-16 20:38:08 +08:00
refactor(cli): remove old cli commands (#1756)
Signed-off-by: Laurentiu Niculae <niculae.laurentiu1@gmail.com>
This commit is contained in:
+33
-343
@@ -38,8 +38,6 @@ type SearchService interface { //nolint:interfacebloat
|
||||
digest string) (*common.ImagesForDigest, error)
|
||||
getCveByImageGQL(ctx context.Context, config searchConfig, username, password,
|
||||
imageName string, searchedCVE string) (*cveResult, error)
|
||||
getImagesByCveIDGQL(ctx context.Context, config searchConfig, username, password string,
|
||||
digest string) (*common.ImagesForCve, error)
|
||||
getTagsForCVEGQL(ctx context.Context, config searchConfig, username, password, repo,
|
||||
cveID string) (*common.ImagesForCve, error)
|
||||
getFixedTagsForCVEGQL(ctx context.Context, config searchConfig, username, password, imageName,
|
||||
@@ -55,24 +53,29 @@ type SearchService interface { //nolint:interfacebloat
|
||||
|
||||
getAllImages(ctx context.Context, config searchConfig, username, password string,
|
||||
channel chan stringResult, wtgrp *sync.WaitGroup)
|
||||
getCveByImage(ctx context.Context, config searchConfig, username, password, imageName, searchedCVE string,
|
||||
channel chan stringResult, wtgrp *sync.WaitGroup)
|
||||
getImagesByCveID(ctx context.Context, config searchConfig, username, password, cveid string,
|
||||
channel chan stringResult, wtgrp *sync.WaitGroup)
|
||||
getImagesByDigest(ctx context.Context, config searchConfig, username, password, digest string,
|
||||
channel chan stringResult, wtgrp *sync.WaitGroup)
|
||||
getFixedTagsForCVE(ctx context.Context, config searchConfig, username, password, imageName, cveid string,
|
||||
channel chan stringResult, wtgrp *sync.WaitGroup)
|
||||
getRepos(ctx context.Context, config searchConfig, username, password string,
|
||||
channel chan stringResult, wtgrp *sync.WaitGroup)
|
||||
getImageByName(ctx context.Context, config searchConfig, username, password, imageName string,
|
||||
channel chan stringResult, wtgrp *sync.WaitGroup)
|
||||
getImageByNameAndCVEID(ctx context.Context, config searchConfig, username, password, imageName, cveid string,
|
||||
channel chan stringResult, wtgrp *sync.WaitGroup)
|
||||
getReferrers(ctx context.Context, config searchConfig, username, password string, repo, digest string,
|
||||
) (referrersResult, error)
|
||||
}
|
||||
|
||||
type searchConfig struct {
|
||||
searchService SearchService
|
||||
servURL string
|
||||
user string
|
||||
outputFormat string
|
||||
verifyTLS bool
|
||||
fixedFlag bool
|
||||
verbose bool
|
||||
debug bool
|
||||
resultWriter io.Writer
|
||||
spinner spinnerState
|
||||
}
|
||||
|
||||
type searchService struct{}
|
||||
|
||||
func NewSearchService() SearchService {
|
||||
@@ -297,43 +300,6 @@ func (service searchService) getImagesForDigestGQL(ctx context.Context, config s
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (service searchService) getImagesByCveIDGQL(ctx context.Context, config searchConfig, username,
|
||||
password, cveID string,
|
||||
) (*common.ImagesForCve, error) {
|
||||
query := fmt.Sprintf(`
|
||||
{
|
||||
ImageListForCVE(id: "%s", requestedPage: {sortBy: ALPHABETIC_ASC}) {
|
||||
Results {
|
||||
RepoName Tag
|
||||
Digest
|
||||
MediaType
|
||||
Manifests {
|
||||
Digest
|
||||
ConfigDigest
|
||||
Size
|
||||
Platform {Os Arch}
|
||||
IsSigned
|
||||
Layers {Size Digest}
|
||||
LastUpdated
|
||||
}
|
||||
LastUpdated
|
||||
Size
|
||||
IsSigned
|
||||
}
|
||||
}
|
||||
}`,
|
||||
cveID)
|
||||
result := &common.ImagesForCve{}
|
||||
|
||||
err := service.makeGraphQLQuery(ctx, config, username, password, query, result)
|
||||
|
||||
if errResult := checkResultGraphQLQuery(ctx, err, result.Errors); errResult != nil {
|
||||
return nil, errResult
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (service searchService) getCveByImageGQL(ctx context.Context, config searchConfig, username, password,
|
||||
imageName, searchedCVE string,
|
||||
) (*cveResult, error) {
|
||||
@@ -443,7 +409,7 @@ func (service searchService) getFixedTagsForCVEGQL(ctx context.Context, config s
|
||||
func (service searchService) getReferrers(ctx context.Context, config searchConfig, username, password string,
|
||||
repo, digest string,
|
||||
) (referrersResult, error) {
|
||||
referrersEndpoint, err := combineServerAndEndpointURL(*config.servURL,
|
||||
referrersEndpoint, err := combineServerAndEndpointURL(config.servURL,
|
||||
fmt.Sprintf("/v2/%s/referrers/%s", repo, digest))
|
||||
if err != nil {
|
||||
if isContextDone(ctx) {
|
||||
@@ -454,8 +420,8 @@ func (service searchService) getReferrers(ctx context.Context, config searchConf
|
||||
}
|
||||
|
||||
referrerResp := &ispec.Index{}
|
||||
_, err = makeGETRequest(ctx, referrersEndpoint, username, password, *config.verifyTLS,
|
||||
*config.debug, &referrerResp, config.resultWriter)
|
||||
_, err = makeGETRequest(ctx, referrersEndpoint, username, password, config.verifyTLS,
|
||||
config.debug, &referrerResp, config.resultWriter)
|
||||
|
||||
if err != nil {
|
||||
if isContextDone(ctx) {
|
||||
@@ -505,7 +471,7 @@ func (service searchService) getAllImages(ctx context.Context, config searchConf
|
||||
|
||||
catalog := &catalogResponse{}
|
||||
|
||||
catalogEndPoint, err := combineServerAndEndpointURL(*config.servURL, fmt.Sprintf("%s%s",
|
||||
catalogEndPoint, err := combineServerAndEndpointURL(config.servURL, fmt.Sprintf("%s%s",
|
||||
constants.RoutePrefix, constants.ExtCatalogPrefix))
|
||||
if err != nil {
|
||||
if isContextDone(ctx) {
|
||||
@@ -516,8 +482,8 @@ func (service searchService) getAllImages(ctx context.Context, config searchConf
|
||||
return
|
||||
}
|
||||
|
||||
_, err = makeGETRequest(ctx, catalogEndPoint, username, password, *config.verifyTLS,
|
||||
*config.debug, catalog, config.resultWriter)
|
||||
_, err = makeGETRequest(ctx, catalogEndPoint, username, password, config.verifyTLS,
|
||||
config.debug, catalog, config.resultWriter)
|
||||
if err != nil {
|
||||
if isContextDone(ctx) {
|
||||
return
|
||||
@@ -551,7 +517,7 @@ func getImage(ctx context.Context, config searchConfig, username, password, imag
|
||||
|
||||
repo, imageTag := common.GetImageDirAndTag(imageName)
|
||||
|
||||
tagListEndpoint, err := combineServerAndEndpointURL(*config.servURL, fmt.Sprintf("/v2/%s/tags/list", repo))
|
||||
tagListEndpoint, err := combineServerAndEndpointURL(config.servURL, fmt.Sprintf("/v2/%s/tags/list", repo))
|
||||
if err != nil {
|
||||
if isContextDone(ctx) {
|
||||
return
|
||||
@@ -562,8 +528,8 @@ func getImage(ctx context.Context, config searchConfig, username, password, imag
|
||||
}
|
||||
|
||||
tagList := &tagListResp{}
|
||||
_, err = makeGETRequest(ctx, tagListEndpoint, username, password, *config.verifyTLS,
|
||||
*config.debug, &tagList, config.resultWriter)
|
||||
_, err = makeGETRequest(ctx, tagListEndpoint, username, password, config.verifyTLS,
|
||||
config.debug, &tagList, config.resultWriter)
|
||||
|
||||
if err != nil {
|
||||
if isContextDone(ctx) {
|
||||
@@ -598,79 +564,6 @@ func getImage(ctx context.Context, config searchConfig, username, password, imag
|
||||
}
|
||||
}
|
||||
|
||||
func (service searchService) getImagesByCveID(ctx context.Context, config searchConfig, username,
|
||||
password, cveid string, rch chan stringResult, wtgrp *sync.WaitGroup,
|
||||
) {
|
||||
defer wtgrp.Done()
|
||||
defer close(rch)
|
||||
|
||||
query := fmt.Sprintf(
|
||||
`{
|
||||
ImageListForCVE(id: "%s") {
|
||||
Results {
|
||||
RepoName Tag
|
||||
Digest
|
||||
MediaType
|
||||
Manifests {
|
||||
Digest
|
||||
ConfigDigest
|
||||
Size
|
||||
Platform {Os Arch}
|
||||
IsSigned
|
||||
Layers {Size Digest}
|
||||
LastUpdated
|
||||
}
|
||||
LastUpdated
|
||||
Size
|
||||
IsSigned
|
||||
}
|
||||
}
|
||||
}`,
|
||||
cveid)
|
||||
|
||||
result := &common.ImagesForCve{}
|
||||
|
||||
err := service.makeGraphQLQuery(ctx, config, username, password, query, result)
|
||||
if err != nil {
|
||||
if isContextDone(ctx) {
|
||||
return
|
||||
}
|
||||
rch <- stringResult{"", err}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if result.Errors != nil || err != nil {
|
||||
var errBuilder strings.Builder
|
||||
|
||||
for _, err := range result.Errors {
|
||||
fmt.Fprintln(&errBuilder, err.Message)
|
||||
}
|
||||
|
||||
if isContextDone(ctx) {
|
||||
return
|
||||
}
|
||||
rch <- stringResult{"", errors.New(errBuilder.String())} //nolint: goerr113
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
var localWg sync.WaitGroup
|
||||
|
||||
rlim := newSmoothRateLimiter(&localWg, rch)
|
||||
localWg.Add(1)
|
||||
|
||||
go rlim.startRateLimiter(ctx)
|
||||
|
||||
for _, image := range result.Results {
|
||||
localWg.Add(1)
|
||||
|
||||
go addManifestCallToPool(ctx, config, rlim, username, password, image.RepoName, image.Tag, rch, &localWg)
|
||||
}
|
||||
|
||||
localWg.Wait()
|
||||
}
|
||||
|
||||
func (service searchService) getImagesByDigest(ctx context.Context, config searchConfig, username,
|
||||
password string, digest string, rch chan stringResult, wtgrp *sync.WaitGroup,
|
||||
) {
|
||||
@@ -744,209 +637,6 @@ func (service searchService) getImagesByDigest(ctx context.Context, config searc
|
||||
localWg.Wait()
|
||||
}
|
||||
|
||||
func (service searchService) getImageByNameAndCVEID(ctx context.Context, config searchConfig, username,
|
||||
password, imageName, cveid string, rch chan stringResult, wtgrp *sync.WaitGroup,
|
||||
) {
|
||||
defer wtgrp.Done()
|
||||
defer close(rch)
|
||||
|
||||
query := fmt.Sprintf(
|
||||
`{
|
||||
ImageListForCVE(id: "%s") {
|
||||
Results {
|
||||
RepoName Tag
|
||||
Digest
|
||||
MediaType
|
||||
Manifests {
|
||||
Digest
|
||||
ConfigDigest
|
||||
Size
|
||||
Platform {Os Arch}
|
||||
IsSigned
|
||||
Layers {Size Digest}
|
||||
LastUpdated
|
||||
}
|
||||
LastUpdated
|
||||
Size
|
||||
IsSigned
|
||||
}
|
||||
}
|
||||
}`,
|
||||
cveid)
|
||||
|
||||
result := &common.ImagesForCve{}
|
||||
|
||||
err := service.makeGraphQLQuery(ctx, config, username, password, query, result)
|
||||
if err != nil {
|
||||
if isContextDone(ctx) {
|
||||
return
|
||||
}
|
||||
rch <- stringResult{"", err}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if result.Errors != nil {
|
||||
var errBuilder strings.Builder
|
||||
|
||||
for _, err := range result.Errors {
|
||||
fmt.Fprintln(&errBuilder, err.Message)
|
||||
}
|
||||
|
||||
if isContextDone(ctx) {
|
||||
return
|
||||
}
|
||||
rch <- stringResult{"", errors.New(errBuilder.String())} //nolint: goerr113
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
var localWg sync.WaitGroup
|
||||
|
||||
rlim := newSmoothRateLimiter(&localWg, rch)
|
||||
localWg.Add(1)
|
||||
|
||||
go rlim.startRateLimiter(ctx)
|
||||
|
||||
for _, image := range result.Results {
|
||||
if imageName != "" && !strings.EqualFold(imageName, image.RepoName) {
|
||||
continue
|
||||
}
|
||||
|
||||
localWg.Add(1)
|
||||
|
||||
go addManifestCallToPool(ctx, config, rlim, username, password, image.RepoName, image.Tag, rch, &localWg)
|
||||
}
|
||||
|
||||
localWg.Wait()
|
||||
}
|
||||
|
||||
func (service searchService) getCveByImage(ctx context.Context, config searchConfig, username, password,
|
||||
imageName, searchedCVE string, rch chan stringResult, wtgrp *sync.WaitGroup,
|
||||
) {
|
||||
defer wtgrp.Done()
|
||||
defer close(rch)
|
||||
|
||||
query := fmt.Sprintf(`{ CVEListForImage (image:"%s", searchedCVE:"%s")`+
|
||||
` { Tag CVEList { Id Title Severity Description `+
|
||||
`PackageList {Name InstalledVersion FixedVersion}} } }`, imageName, searchedCVE)
|
||||
result := &cveResult{}
|
||||
|
||||
err := service.makeGraphQLQuery(ctx, config, username, password, query, result)
|
||||
if err != nil {
|
||||
if isContextDone(ctx) {
|
||||
return
|
||||
}
|
||||
rch <- stringResult{"", err}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if result.Errors != nil {
|
||||
var errBuilder strings.Builder
|
||||
|
||||
for _, err := range result.Errors {
|
||||
fmt.Fprintln(&errBuilder, err.Message)
|
||||
}
|
||||
|
||||
if isContextDone(ctx) {
|
||||
return
|
||||
}
|
||||
rch <- stringResult{"", errors.New(errBuilder.String())} //nolint: goerr113
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
result.Data.CVEListForImage.CVEList = groupCVEsBySeverity(result.Data.CVEListForImage.CVEList)
|
||||
|
||||
str, err := result.string(*config.outputFormat)
|
||||
if err != nil {
|
||||
if isContextDone(ctx) {
|
||||
return
|
||||
}
|
||||
rch <- stringResult{"", err}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if isContextDone(ctx) {
|
||||
return
|
||||
}
|
||||
rch <- stringResult{str, nil}
|
||||
}
|
||||
|
||||
func (service searchService) getFixedTagsForCVE(ctx context.Context, config searchConfig,
|
||||
username, password, imageName, cveid string, rch chan stringResult, wtgrp *sync.WaitGroup,
|
||||
) {
|
||||
defer wtgrp.Done()
|
||||
defer close(rch)
|
||||
|
||||
query := fmt.Sprintf(`
|
||||
{
|
||||
ImageListWithCVEFixed (id: "%s", image: "%s") {
|
||||
Results {
|
||||
RepoName Tag
|
||||
Digest
|
||||
MediaType
|
||||
Manifests {
|
||||
Digest
|
||||
ConfigDigest
|
||||
Size
|
||||
Platform {Os Arch}
|
||||
IsSigned
|
||||
Layers {Size Digest}
|
||||
LastUpdated
|
||||
}
|
||||
LastUpdated
|
||||
Size
|
||||
IsSigned
|
||||
}
|
||||
}
|
||||
}`, cveid, imageName)
|
||||
|
||||
result := &common.ImageListWithCVEFixedResponse{}
|
||||
|
||||
err := service.makeGraphQLQuery(ctx, config, username, password, query, result)
|
||||
if err != nil {
|
||||
if isContextDone(ctx) {
|
||||
return
|
||||
}
|
||||
rch <- stringResult{"", err}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if result.Errors != nil {
|
||||
var errBuilder strings.Builder
|
||||
|
||||
for _, err := range result.Errors {
|
||||
fmt.Fprintln(&errBuilder, err.Message)
|
||||
}
|
||||
|
||||
if isContextDone(ctx) {
|
||||
return
|
||||
}
|
||||
rch <- stringResult{"", errors.New(errBuilder.String())} //nolint: goerr113
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
var localWg sync.WaitGroup
|
||||
|
||||
rlim := newSmoothRateLimiter(&localWg, rch)
|
||||
localWg.Add(1)
|
||||
|
||||
go rlim.startRateLimiter(ctx)
|
||||
|
||||
for _, img := range result.Results {
|
||||
localWg.Add(1)
|
||||
|
||||
go addManifestCallToPool(ctx, config, rlim, username, password, imageName, img.Tag, rch, &localWg)
|
||||
}
|
||||
|
||||
localWg.Wait()
|
||||
}
|
||||
|
||||
func groupCVEsBySeverity(cveList []cve) []cve {
|
||||
var (
|
||||
unknown = make([]cve, 0)
|
||||
@@ -1006,13 +696,13 @@ func (service searchService) makeGraphQLQuery(ctx context.Context,
|
||||
config searchConfig, username, password, query string,
|
||||
resultPtr interface{},
|
||||
) error {
|
||||
endPoint, err := combineServerAndEndpointURL(*config.servURL, constants.FullSearchPrefix)
|
||||
endPoint, err := combineServerAndEndpointURL(config.servURL, constants.FullSearchPrefix)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = makeGraphQLRequest(ctx, endPoint, query, username, password, *config.verifyTLS,
|
||||
*config.debug, resultPtr, config.resultWriter)
|
||||
err = makeGraphQLRequest(ctx, endPoint, query, username, password, config.verifyTLS,
|
||||
config.debug, resultPtr, config.resultWriter)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -1053,7 +743,7 @@ func addManifestCallToPool(ctx context.Context, config searchConfig, pool *reque
|
||||
) {
|
||||
defer wtgrp.Done()
|
||||
|
||||
manifestEndpoint, err := combineServerAndEndpointURL(*config.servURL,
|
||||
manifestEndpoint, err := combineServerAndEndpointURL(config.servURL,
|
||||
fmt.Sprintf("/v2/%s/manifests/%s", imageName, tagName))
|
||||
if err != nil {
|
||||
if isContextDone(ctx) {
|
||||
@@ -1121,7 +811,7 @@ func (cve cveResult) string(format string) (string, error) {
|
||||
case ymlFormat, yamlFormat:
|
||||
return cve.stringYAML()
|
||||
default:
|
||||
return "", ErrInvalidOutputFormat
|
||||
return "", zerr.ErrInvalidOutputFormat
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1180,7 +870,7 @@ func (ref referrersResult) string(format string, maxArtifactTypeLen int) (string
|
||||
case ymlFormat, yamlFormat:
|
||||
return ref.stringYAML()
|
||||
default:
|
||||
return "", ErrInvalidOutputFormat
|
||||
return "", zerr.ErrInvalidOutputFormat
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1244,7 +934,7 @@ func (repo repoStruct) string(format string, maxImgNameLen, maxTimeLen int, verb
|
||||
case ymlFormat, yamlFormat:
|
||||
return repo.stringYAML()
|
||||
default:
|
||||
return "", ErrInvalidOutputFormat
|
||||
return "", zerr.ErrInvalidOutputFormat
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1336,7 +1026,7 @@ func (img imageStruct) string(format string, maxImgNameLen, maxTagLen, maxPlatfo
|
||||
case ymlFormat, yamlFormat:
|
||||
return img.stringYAML()
|
||||
default:
|
||||
return "", ErrInvalidOutputFormat
|
||||
return "", zerr.ErrInvalidOutputFormat
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1663,7 +1353,7 @@ func (service searchService) getRepos(ctx context.Context, config searchConfig,
|
||||
|
||||
catalog := &catalogResponse{}
|
||||
|
||||
catalogEndPoint, err := combineServerAndEndpointURL(*config.servURL, fmt.Sprintf("%s%s",
|
||||
catalogEndPoint, err := combineServerAndEndpointURL(config.servURL, fmt.Sprintf("%s%s",
|
||||
constants.RoutePrefix, constants.ExtCatalogPrefix))
|
||||
if err != nil {
|
||||
if isContextDone(ctx) {
|
||||
@@ -1674,8 +1364,8 @@ func (service searchService) getRepos(ctx context.Context, config searchConfig,
|
||||
return
|
||||
}
|
||||
|
||||
_, err = makeGETRequest(ctx, catalogEndPoint, username, password, *config.verifyTLS,
|
||||
*config.debug, catalog, config.resultWriter)
|
||||
_, err = makeGETRequest(ctx, catalogEndPoint, username, password, config.verifyTLS,
|
||||
config.debug, catalog, config.resultWriter)
|
||||
if err != nil {
|
||||
if isContextDone(ctx) {
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user