Files
WddSuperAgent/agent-operator/image/HarborOperator.go
2025-03-27 16:09:20 +08:00

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
}