mirror of
https://github.com/goharbor/harbor
synced 2025-04-14 16:15:53 +00:00
refactor get tag API
This commit is contained in:
parent
2006466814
commit
c8802f05ad
|
@ -58,6 +58,11 @@ type repoResp struct {
|
|||
UpdateTime time.Time `json:"update_time"`
|
||||
}
|
||||
|
||||
type detailedTagResp struct {
|
||||
Tag string `json:"tag"`
|
||||
Manifest interface{} `json:"manifest"`
|
||||
}
|
||||
|
||||
// Get ...
|
||||
func (ra *RepositoryAPI) Get() {
|
||||
projectID, err := ra.GetInt64("project_id")
|
||||
|
@ -259,6 +264,7 @@ func (ra *RepositoryAPI) GetTags() {
|
|||
if len(repoName) == 0 {
|
||||
ra.CustomAbort(http.StatusBadRequest, "repo_name is nil")
|
||||
}
|
||||
detail := ra.GetString("detail") == "1" || ra.GetString("detail") == "true"
|
||||
|
||||
projectName, _ := utils.ParseRepository(repoName)
|
||||
project, err := dao.GetProjectByName(projectName)
|
||||
|
@ -294,8 +300,34 @@ func (ra *RepositoryAPI) GetTags() {
|
|||
ra.CustomAbort(regErr.StatusCode, regErr.Detail)
|
||||
}
|
||||
|
||||
ra.Data["json"] = tags
|
||||
if !detail {
|
||||
ra.Data["json"] = tags
|
||||
ra.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
result := []detailedTagResp{}
|
||||
|
||||
for _, tag := range tags {
|
||||
manifest, err := getManifest(client, tag, "v1")
|
||||
if err != nil {
|
||||
if regErr, ok := err.(*registry_error.Error); ok {
|
||||
ra.CustomAbort(regErr.StatusCode, regErr.Detail)
|
||||
}
|
||||
|
||||
log.Errorf("failed to get manifest of %s:%s: %v", repoName, tag, err)
|
||||
ra.CustomAbort(http.StatusInternalServerError, "internal error")
|
||||
}
|
||||
|
||||
result = append(result, detailedTagResp{
|
||||
Tag: tag,
|
||||
Manifest: manifest,
|
||||
})
|
||||
}
|
||||
|
||||
ra.Data["json"] = result
|
||||
ra.ServeJSON()
|
||||
|
||||
}
|
||||
|
||||
func listTag(client *registry.Repository) ([]string, error) {
|
||||
|
@ -312,6 +344,8 @@ func listTag(client *registry.Repository) ([]string, error) {
|
|||
regErr.StatusCode == http.StatusNotFound {
|
||||
return tags, nil
|
||||
}
|
||||
|
||||
return nil, err
|
||||
}
|
||||
|
||||
tags = append(tags, ts...)
|
||||
|
@ -362,6 +396,22 @@ func (ra *RepositoryAPI) GetManifests() {
|
|||
ra.CustomAbort(http.StatusInternalServerError, "internal error")
|
||||
}
|
||||
|
||||
manifest, err := getManifest(rc, tag, version)
|
||||
if err != nil {
|
||||
if regErr, ok := err.(*registry_error.Error); ok {
|
||||
ra.CustomAbort(regErr.StatusCode, regErr.Detail)
|
||||
}
|
||||
|
||||
log.Errorf("error occurred while getting manifest of %s:%s: %v", repoName, tag, err)
|
||||
ra.CustomAbort(http.StatusInternalServerError, "internal error")
|
||||
}
|
||||
|
||||
ra.Data["json"] = manifest
|
||||
ra.ServeJSON()
|
||||
}
|
||||
|
||||
func getManifest(client *registry.Repository,
|
||||
tag, version string) (interface{}, error) {
|
||||
result := struct {
|
||||
Manifest interface{} `json:"manifest"`
|
||||
Config interface{} `json:"config,omitempty" `
|
||||
|
@ -375,43 +425,34 @@ func (ra *RepositoryAPI) GetManifests() {
|
|||
mediaTypes = append(mediaTypes, schema2.MediaTypeManifest)
|
||||
}
|
||||
|
||||
_, mediaType, payload, err := rc.PullManifest(tag, mediaTypes)
|
||||
_, mediaType, payload, err := client.PullManifest(tag, mediaTypes)
|
||||
if err != nil {
|
||||
if regErr, ok := err.(*registry_error.Error); ok {
|
||||
ra.CustomAbort(regErr.StatusCode, regErr.Detail)
|
||||
}
|
||||
|
||||
log.Errorf("error occurred while getting manifest of %s:%s: %v", repoName, tag, err)
|
||||
ra.CustomAbort(http.StatusInternalServerError, "internal error")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
manifest, _, err := registry.UnMarshal(mediaType, payload)
|
||||
if err != nil {
|
||||
log.Errorf("an error occurred while parsing manifest of %s:%s: %v", repoName, tag, err)
|
||||
ra.CustomAbort(http.StatusInternalServerError, "")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result.Manifest = manifest
|
||||
|
||||
deserializedmanifest, ok := manifest.(*schema2.DeserializedManifest)
|
||||
if ok {
|
||||
_, data, err := rc.PullBlob(deserializedmanifest.Target().Digest.String())
|
||||
_, data, err := client.PullBlob(deserializedmanifest.Target().Digest.String())
|
||||
if err != nil {
|
||||
log.Errorf("failed to get config of manifest %s:%s: %v", repoName, tag, err)
|
||||
ra.CustomAbort(http.StatusInternalServerError, "")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
b, err := ioutil.ReadAll(data)
|
||||
if err != nil {
|
||||
log.Errorf("failed to read config of manifest %s:%s: %v", repoName, tag, err)
|
||||
ra.CustomAbort(http.StatusInternalServerError, "")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result.Config = string(b)
|
||||
}
|
||||
|
||||
ra.Data["json"] = result
|
||||
ra.ServeJSON()
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (ra *RepositoryAPI) initRepositoryClient(repoName string) (r *registry.Repository, err error) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user