Files
ProjectOctopus/agent-go/executor/HarborExecutor.go
2023-11-09 10:34:30 +08:00

126 lines
3.2 KiB
Go

package executor
import (
"context"
"fmt"
"github.com/mittwald/goharbor-client/v5/apiv2"
"github.com/mittwald/goharbor-client/v5/apiv2/model"
"net"
)
type HarborOperator struct {
SourceHarborHost string `json:"sourceHarborHost,omitempty"`
TargetHarborHost string `json:"targetHarborHost,omitempty"`
HarborPort string `json:"harborPort,omitempty"`
HarborAdminUser string `json:"harborAdminUser,omitempty"`
HarborAdminPass string `json:"harborAdminPass,omitempty"`
}
// NewHarborOperator 返回一个带有默认HarborAdminPass的HarborOperator实例
func NewHarborOperator() *HarborOperator {
return &HarborOperator{
HarborPort: "8033",
HarborAdminUser: "admin", // 设置默认值
HarborAdminPass: "V2ryStr@ngPss", // 设置默认值
}
}
// HarborOperatorCache 饿汉式单例
var HarborOperatorCache = NewHarborOperator()
func (hOp *HarborOperator) Exec(baseFuncName string, funcArgs ...string) (bool, []string) {
// 参见 HarborFunctionEnum
resultOk := true
var resultLog []string
switch baseFuncName {
case "CREATE_PROJECT":
resultOk, resultLog = hOp.CreateProjectExec(funcArgs)
break
case "LIST_PROJECT":
resultOk, resultLog = hOp.ListProjectExec(funcArgs)
break
case "SYNC_PROJECT_BETWEEN_HARBOR":
resultOk, resultLog = hOp.SyncProjectExec(funcArgs)
break
}
return resultOk, resultLog
}
func (hOp *HarborOperator) CreateProjectExec(funcArgs []string) (bool, []string) {
targetHarborHost := funcArgs[0]
parseIP := net.ParseIP(targetHarborHost)
if parseIP != nil {
return false, []string{
"[Harbor CreateProjectExec] - ip format is wrong!",
}
}
hOp.TargetHarborHost = string(parseIP) + ":" + hOp.HarborPort
// check connection
client, err := apiv2.NewRESTClientForHost(hOp.TargetHarborHost, hOp.HarborAdminUser, hOp.HarborAdminPass, nil)
if err != nil {
errorLog := fmt.Sprintf("Error creating REST client: %v\n", err)
log.Error(errorLog)
return false, []string{errorLog}
}
// check project exists
// create project
// 定义你想要创建的仓库(项目)的详细信息
cmiiProject := &model.ProjectReq{
ProjectName: "cmii", // 仓库名称
Metadata: &model.ProjectMetadata{
Public: "true", // 是否是公开的
},
}
rancherProject := &model.ProjectReq{
ProjectName: "rancher", // 仓库名称
Metadata: &model.ProjectMetadata{
Public: "true", // 是否是公开的
},
}
// 使用客户端创建项目
ctx := context.Background()
err = client.NewProject(ctx, cmiiProject)
if err != nil {
errorLog := fmt.Sprintf("Error creating project: %v\n", err)
return false, []string{errorLog}
}
err = client.NewProject(ctx, rancherProject)
if err != nil {
errorLog := fmt.Sprintf("Error creating project: %v\n", err)
return false, []string{errorLog}
}
successLog := "[Harbor CreateProjectExec] - Project Create Success !"
log.Info(successLog)
return true, []string{successLog}
}
func (hOp *HarborOperator) ListProjectExec(funcArgs []string) (bool, []string) {
return true, nil
}
func (hOp *HarborOperator) SyncProjectExec(funcArgs []string) (bool, []string) {
return true, nil
}
func (hOp *HarborOperator) Command(baseFuncName string, funcArgs ...string) []string {
return nil
}