166 lines
4.5 KiB
Go
166 lines
4.5 KiB
Go
package image
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"github.com/mittwald/goharbor-client/v5/apiv2"
|
|
"github.com/mittwald/goharbor-client/v5/apiv2/model"
|
|
"strings"
|
|
)
|
|
|
|
type HarborOperator struct {
|
|
HarborHost string
|
|
HarborPort string
|
|
HarborUser string
|
|
HarborPass string
|
|
HarborClient *apiv2.RESTClient
|
|
}
|
|
|
|
var LocalHarborOperator = newDefaultInstance
|
|
|
|
func newDefaultInstance() {
|
|
|
|
}
|
|
|
|
const (
|
|
DefaultHarborPort = "8033"
|
|
DefaultHarborUser = "admin"
|
|
DefaultHarborPass = "V2ryStr@ngPss"
|
|
)
|
|
|
|
func (op *HarborOperator) BuildOperator() (bool, error) {
|
|
if op.HarborPort != "" {
|
|
op.HarborHost = op.HarborHost + ":" + op.HarborPort
|
|
}
|
|
if !strings.HasSuffix(op.HarborHost, "/api/") {
|
|
op.HarborHost = op.HarborHost + "/api/"
|
|
}
|
|
log.InfoF("[Harbor Client Create] - start to create harbor client %s", op.HarborHost)
|
|
|
|
if op.HarborUser == "" {
|
|
op.HarborUser = DefaultHarborUser
|
|
}
|
|
if op.HarborPass == "" {
|
|
op.HarborPass = DefaultHarborPass
|
|
}
|
|
|
|
// check connection
|
|
|
|
client, err := apiv2.NewRESTClientForHost(op.HarborHost, op.HarborUser, op.HarborPass, nil)
|
|
if err != nil {
|
|
errorLog := fmt.Sprintf("Error creating REST client: %s\n", err.Error())
|
|
log.Error(errorLog)
|
|
return false, err
|
|
}
|
|
|
|
op.HarborClient = client
|
|
|
|
return true, nil
|
|
}
|
|
|
|
func (op *HarborOperator) RepoListAll(projectName string) []*model.Repository {
|
|
|
|
listRepositories, err := op.HarborClient.ListRepositories(context.TODO(), projectName)
|
|
if err != nil {
|
|
log.ErrorF("RepoListAll error is %s", err.Error())
|
|
return nil
|
|
}
|
|
return listRepositories
|
|
}
|
|
|
|
// RepoAllCmiiImage 返回没有前缀的内容 cmii-uav-user
|
|
func (op *HarborOperator) RepoAllCmiiImage() (repoNameList []string) {
|
|
|
|
listAll := op.RepoListAll("cmii")
|
|
for _, repository := range listAll {
|
|
prefix := strings.TrimPrefix(repository.Name, "cmii/")
|
|
if strings.HasPrefix(prefix, "cmii") {
|
|
repoNameList = append(repoNameList, prefix)
|
|
}
|
|
}
|
|
|
|
// 返回没有
|
|
return repoNameList
|
|
}
|
|
|
|
func (op *HarborOperator) ArtifactListAll(projectName, repoName string) []*model.Artifact {
|
|
listArtifacts, err := op.HarborClient.ListArtifacts(context.TODO(), projectName, repoName)
|
|
if err != nil {
|
|
log.ErrorF("ArtifactListAll error is %s", err.Error())
|
|
return nil
|
|
}
|
|
return listArtifacts
|
|
}
|
|
|
|
func (op *HarborOperator) ArtifactListOne(projectName, repoName, artifactReference string) *model.Artifact {
|
|
artifact, err := op.HarborClient.GetArtifact(context.TODO(), projectName, repoName, artifactReference)
|
|
if err != nil {
|
|
log.ErrorF("ArtifactListOne error is %s", err.Error())
|
|
return nil
|
|
}
|
|
return artifact
|
|
}
|
|
|
|
func (op *HarborOperator) ArtifactDeleteOne(projectName, repoName, artifactReference string) bool {
|
|
err := op.HarborClient.DeleteArtifact(context.TODO(), projectName, repoName, artifactReference)
|
|
if err != nil {
|
|
log.ErrorF("ArtifactDeleteOne error is %s", err.Error())
|
|
return false
|
|
}
|
|
log.InfoF("ArtifactDeleteOne of %s %s %s is success", projectName, repoName, artifactReference)
|
|
return true
|
|
}
|
|
|
|
func (op *HarborOperator) RepoListOne(projectName, repoName string) *model.Repository {
|
|
|
|
repository, err := op.HarborClient.GetRepository(context.TODO(), projectName, repoName)
|
|
if err != nil {
|
|
log.ErrorF("RepoListOne error is %s", err.Error())
|
|
return nil
|
|
}
|
|
|
|
return repository
|
|
}
|
|
|
|
// CmiiTagFilter 根据tag前缀 找到所有的cmii tag
|
|
func (op *HarborOperator) CmiiTagFilter(tagPrefix string) (allCmiiImageList []string) {
|
|
|
|
repoNameList := op.RepoAllCmiiImage() // all cmii repo name
|
|
|
|
for _, cmiiRepo := range repoNameList {
|
|
// cmii-uav-user
|
|
artifactList := op.ArtifactListAll("cmii", cmiiRepo)
|
|
for _, artifact := range artifactList {
|
|
// list all artifact of cmii-uav-user
|
|
for _, tag := range artifact.Tags {
|
|
if strings.HasPrefix(tag.Name, tagPrefix) {
|
|
// tag has prefix 5.4.0-123 5.4.0-123-123
|
|
allCmiiImageList = append(allCmiiImageList, cmiiRepo+":"+tag.Name)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return allCmiiImageList
|
|
}
|
|
|
|
func (op *HarborOperator) ArtifactDeleteFromNameTagList(projectName string, nameTagList []string) (errorDeleteList []string) {
|
|
for _, nameTag := range nameTagList {
|
|
split := strings.Split(nameTag, ":")
|
|
if len(split) != 2 {
|
|
log.ErrorF("ArtifactDeleteFromNameTagList error is %s", nameTag)
|
|
errorDeleteList = append(errorDeleteList, nameTag)
|
|
continue
|
|
}
|
|
|
|
repoName := split[0]
|
|
tagName := split[1]
|
|
if !op.ArtifactDeleteOne(projectName, repoName, tagName) {
|
|
log.ErrorF("ArtifactDeleteFromNameTagList error is %s %s %s", projectName, repoName, tagName)
|
|
errorDeleteList = append(errorDeleteList, nameTag)
|
|
}
|
|
}
|
|
|
|
return errorDeleteList
|
|
}
|