package executor import ( "context" "fmt" "net" "github.com/mittwald/goharbor-client/v5/apiv2" "github.com/mittwald/goharbor-client/v5/apiv2/model" ) 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{ fmt.Sprintf("[Harbor CreateProjectExec] - ip format is wrong! parseIP is => %s ", parseIP), } } hOp.TargetHarborHost = "http://" + targetHarborHost + ":" + hOp.HarborPort + "/api" log.DebugF("[Harbor CreateProjectExec] - harbor host is => %s", hOp.TargetHarborHost) // check connection client, err := apiv2.NewRESTClientForHost(hOp.TargetHarborHost, hOp.HarborAdminUser, hOp.HarborAdminPass, nil) if err != nil { errorLog := fmt.Sprintf("Error creating REST client: %s\n", err.Error()) 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: %s\n", err.Error()) return false, []string{errorLog} } err = client.NewProject(ctx, rancherProject) if err != nil { errorLog := fmt.Sprintf("Error creating project: %s\n", err.Error()) 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 }