[agent-go]-简化Agent 剔除Harbor K8s Image相关的内容
This commit is contained in:
@@ -1,413 +1,414 @@
|
||||
package a_executor
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"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"`
|
||||
|
||||
TargetHarborClient *apiv2.RESTClient
|
||||
|
||||
SourceHarborClient *apiv2.RESTClient
|
||||
}
|
||||
|
||||
// NewHarborOperator 返回一个带有默认HarborAdminPass的HarborOperator实例
|
||||
func NewHarborOperator() *HarborOperator {
|
||||
return &HarborOperator{
|
||||
HarborPort: "8033",
|
||||
HarborAdminUser: "admin", // 设置默认值
|
||||
HarborAdminPass: "V2ryStr@ngPss", // 设置默认值
|
||||
}
|
||||
}
|
||||
|
||||
// HarborOperatorCache 饿汉式单例
|
||||
var HarborOperatorCache = NewHarborOperator()
|
||||
var OctopusReplicationPolicyName = "octopus-sync-replication"
|
||||
|
||||
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
|
||||
case "SYNC_STATUS_HARBOR":
|
||||
resultOk, resultLog = hOp.SyncStatusExec(funcArgs)
|
||||
break
|
||||
}
|
||||
|
||||
return resultOk, resultLog
|
||||
}
|
||||
|
||||
func (hOp *HarborOperator) CreateProjectExec(funcArgs []string) (bool, []string) {
|
||||
|
||||
if hOp.TargetHarborClient == nil {
|
||||
|
||||
ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true)
|
||||
if !ok {
|
||||
return false, []string{
|
||||
"[Harbor Create Project] - Error !",
|
||||
}
|
||||
}
|
||||
hOp.TargetHarborClient = createClient
|
||||
}
|
||||
client := hOp.TargetHarborClient
|
||||
|
||||
// create project
|
||||
// 定义你想要创建的仓库(项目)的详细信息
|
||||
|
||||
log.Debug("[Harbor Create Project] - create project !")
|
||||
needToCreateProjectNameList := []string{"cmii", "rancher"}
|
||||
// 使用客户端创建项目
|
||||
ctx := context.Background()
|
||||
for _, projectName := range needToCreateProjectNameList {
|
||||
|
||||
log.DebugF("start to create proect => %s", projectName)
|
||||
projectReq := &model.ProjectReq{
|
||||
ProjectName: projectName, // 仓库名称
|
||||
Metadata: &model.ProjectMetadata{
|
||||
Public: "true", // 是否是公开的
|
||||
},
|
||||
}
|
||||
|
||||
exists, _ := client.ProjectExists(ctx, projectName)
|
||||
if !exists {
|
||||
|
||||
err := client.NewProject(ctx, projectReq)
|
||||
if err != nil {
|
||||
errorLog := fmt.Sprintf("Error creating project %s: %s\n", projectName, err.Error())
|
||||
return false, []string{errorLog}
|
||||
}
|
||||
}
|
||||
|
||||
log.DebugF("[Harbor Create Project] - Project %s already exists ! continue ", projectName)
|
||||
|
||||
}
|
||||
|
||||
successLog := "[Harbor CreateProjectExec] - Project Create Success !"
|
||||
log.Info(successLog)
|
||||
|
||||
return true, []string{successLog}
|
||||
}
|
||||
|
||||
// todo refresh HarborClient不一定有端口
|
||||
func (hOp *HarborOperator) CheckAndBuildHarborClient(targetHarborHost string, targetHarborPort string, isTarget bool) (bool, *apiv2.RESTClient) {
|
||||
|
||||
log.InfoF("[Harbor Client Create] - start to create harbor client %s", targetHarborHost)
|
||||
|
||||
if targetHarborPort == "" {
|
||||
targetHarborPort = hOp.HarborPort
|
||||
}
|
||||
|
||||
if isTarget {
|
||||
hOp.TargetHarborHost = "http://" + targetHarborHost + ":" + targetHarborPort + "/api/"
|
||||
log.DebugF("[Harbor Client Create] - harbor host is => %s", hOp.TargetHarborHost)
|
||||
} else {
|
||||
hOp.SourceHarborHost = "http://" + targetHarborHost + ":" + targetHarborPort + "/api/"
|
||||
log.DebugF("[Harbor Client Create] - harbor host is => %s", hOp.SourceHarborHost)
|
||||
}
|
||||
|
||||
// check connection
|
||||
var client *apiv2.RESTClient
|
||||
var err error
|
||||
if isTarget {
|
||||
client, err = apiv2.NewRESTClientForHost(hOp.TargetHarborHost, hOp.HarborAdminUser, hOp.HarborAdminPass, nil)
|
||||
} else {
|
||||
client, err = apiv2.NewRESTClientForHost(hOp.SourceHarborHost, hOp.HarborAdminUser, hOp.HarborAdminPass, nil)
|
||||
}
|
||||
if err != nil {
|
||||
errorLog := fmt.Sprintf("Error creating REST client: %s\n", err.Error())
|
||||
log.Error(errorLog)
|
||||
return false, nil
|
||||
}
|
||||
|
||||
return true, client
|
||||
}
|
||||
|
||||
func (hOp *HarborOperator) ListProjectExec(funcArgs []string) (bool, []string) {
|
||||
|
||||
if hOp.TargetHarborClient == nil {
|
||||
ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true)
|
||||
if !ok {
|
||||
return false, []string{
|
||||
"[Harbor Create Project ] - Error !",
|
||||
}
|
||||
}
|
||||
hOp.TargetHarborClient = createClient
|
||||
}
|
||||
client := hOp.TargetHarborClient
|
||||
|
||||
// 使用客户端列出所有项目
|
||||
ctx := context.Background()
|
||||
projects, err := client.ListProjects(ctx, "")
|
||||
if err != nil {
|
||||
fmt.Printf("Error listing projects: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// 打印所有项目的信息
|
||||
for _, project := range projects {
|
||||
fmt.Printf("Project ID: %d, Name: %s, Public: %v\n", project.ProjectID, project.Name, project.Metadata.Public)
|
||||
}
|
||||
|
||||
marshal, _ := json.Marshal(projects)
|
||||
|
||||
return true, []string{
|
||||
fmt.Sprintf("List Projects of %s ", hOp.TargetHarborHost),
|
||||
string(marshal),
|
||||
}
|
||||
}
|
||||
|
||||
func (hOp *HarborOperator) SyncProjectExec(funcArgs []string) (bool, []string) {
|
||||
|
||||
if hOp.TargetHarborClient == nil {
|
||||
ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true)
|
||||
if !ok {
|
||||
return false, []string{
|
||||
"[Harbor Sync Project ] - Error !",
|
||||
}
|
||||
}
|
||||
hOp.TargetHarborClient = createClient
|
||||
}
|
||||
targetClient := hOp.TargetHarborClient
|
||||
|
||||
if hOp.SourceHarborClient == nil {
|
||||
realHost := funcArgs[1]
|
||||
realPort := ""
|
||||
if strings.Contains(funcArgs[1], ":") {
|
||||
split := strings.Split(funcArgs[1], ":")
|
||||
realHost = split[0]
|
||||
realPort = split[1]
|
||||
}
|
||||
ok, createClient := hOp.CheckAndBuildHarborClient(realHost, realPort, false)
|
||||
if !ok {
|
||||
return false, []string{
|
||||
"[Harbor Sync Project ] - Error !",
|
||||
}
|
||||
}
|
||||
hOp.SourceHarborClient = createClient
|
||||
}
|
||||
|
||||
needToSynchronizedProject := funcArgs[2]
|
||||
log.InfoF("[Harbor Sync Project ] - start to sync harbor project => %s", needToSynchronizedProject)
|
||||
|
||||
log.DebugF("[Harbor Sync Project ] - start to check projects all exists!")
|
||||
ctx := context.Background()
|
||||
|
||||
// check both source and target harbor project exists
|
||||
needToCreateProjectNameList := []string{"rancher", "cmii"}
|
||||
|
||||
for _, projectName := range needToCreateProjectNameList {
|
||||
syncNotExistHarborProjectError := []string{
|
||||
"[Harbor Sync Project ] - project not exists !",
|
||||
}
|
||||
exists, _ := targetClient.ProjectExists(ctx, projectName)
|
||||
if !exists {
|
||||
return false, append(syncNotExistHarborProjectError, "targetClient")
|
||||
}
|
||||
}
|
||||
|
||||
OctopusSourceHarborName := "octopus-source"
|
||||
|
||||
// add source registry to destination harbor
|
||||
log.InfoF("[Harbor Sync Project ] - start to create source harbor endpoints => %s", hOp.SourceHarborHost)
|
||||
|
||||
log.Debug("[Harbor Sync Project ] - start to delete exist replication policy !")
|
||||
policies, _ := targetClient.ListReplicationPolicies(ctx)
|
||||
if policies != nil {
|
||||
for _, policy := range policies {
|
||||
if policy.Name == OctopusReplicationPolicyName {
|
||||
err := targetClient.DeleteReplicationPolicyByID(ctx, policy.ID)
|
||||
if err != nil {
|
||||
log.ErrorF("[Harbor Sync Project ] - delete exists replication policy failed ! => %v ", policy)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
log.Debug("[Harbor Sync Project ] - start to delete exist exist harbor endpoints !")
|
||||
exitRegistry, _ := targetClient.GetRegistryByName(ctx, OctopusSourceHarborName)
|
||||
if exitRegistry != nil {
|
||||
log.Debug("[Harbor Sync Project ] - source endpoints already exists ! delete it !")
|
||||
err := targetClient.DeleteRegistryByID(ctx, exitRegistry.ID)
|
||||
if err != nil {
|
||||
log.ErrorF("[Harbor Sync Project ] - source endpoints delete failed ! => %v ", exitRegistry)
|
||||
}
|
||||
}
|
||||
|
||||
// todo cqga failed
|
||||
octopusSourceRegistry := &model.Registry{
|
||||
Credential: &model.RegistryCredential{
|
||||
AccessKey: "admin",
|
||||
AccessSecret: "V2ryStr@ngPss",
|
||||
Type: "basic",
|
||||
},
|
||||
Insecure: true,
|
||||
Name: OctopusSourceHarborName, // 源 Harbor 实例的注册表 ID,通常为 0
|
||||
Type: "harbor",
|
||||
URL: strings.Split(hOp.SourceHarborHost, "/api")[0],
|
||||
}
|
||||
err := targetClient.NewRegistry(ctx, octopusSourceRegistry)
|
||||
if err != nil {
|
||||
sprintf := fmt.Sprintf("[SyncProjectExec] - source endpoints create failed ! => %s", err.Error())
|
||||
log.Error(sprintf)
|
||||
return false, []string{sprintf}
|
||||
}
|
||||
|
||||
// get the real one for it's ID
|
||||
realOctopusSourceRegistry, err := targetClient.GetRegistryByName(ctx, OctopusSourceHarborName)
|
||||
if err != nil {
|
||||
sprintf := fmt.Sprintf("[SyncProjectExec] - get target registry id failed ! => %s", err.Error())
|
||||
log.Error(sprintf)
|
||||
return false, []string{sprintf}
|
||||
}
|
||||
|
||||
// 创建复制策略
|
||||
octopusReplicationPolicy := &model.ReplicationPolicy{
|
||||
CopyByChunk: nil,
|
||||
Deletion: false,
|
||||
Description: "",
|
||||
DestNamespace: "", // 可以指定目标 Harbor 中的特定项目,如果为空,则使用源项目名称
|
||||
DestNamespaceReplaceCount: nil,
|
||||
SrcRegistry: &model.Registry{
|
||||
ID: realOctopusSourceRegistry.ID,
|
||||
},
|
||||
DestRegistry: &model.Registry{
|
||||
ID: 0,
|
||||
},
|
||||
Enabled: true,
|
||||
Filters: []*model.ReplicationFilter{
|
||||
{
|
||||
Type: "name",
|
||||
Value: needToSynchronizedProject + "/**",
|
||||
},
|
||||
},
|
||||
ID: 0,
|
||||
Name: OctopusReplicationPolicyName,
|
||||
Override: true,
|
||||
ReplicateDeletion: false,
|
||||
Speed: nil,
|
||||
Trigger: &model.ReplicationTrigger{
|
||||
Type: "manual", // 可以是 "manual", "scheduled", 或 "event_based"
|
||||
// 如果是 "scheduled",还需要设置 Cron 表达式
|
||||
// TriggerSettings: &model.TriggerSettings{Cron: "0 * * * *"},
|
||||
},
|
||||
}
|
||||
|
||||
// 在源 Harbor 中创建复制策略
|
||||
log.InfoF("[Harbor Sync Project ] - Start To Sync Project => %s !", needToSynchronizedProject)
|
||||
|
||||
err = targetClient.NewReplicationPolicy(ctx, octopusReplicationPolicy.DestRegistry, octopusReplicationPolicy.SrcRegistry, octopusReplicationPolicy.Deletion, octopusReplicationPolicy.Override, octopusReplicationPolicy.Enabled, octopusReplicationPolicy.Filters, octopusReplicationPolicy.Trigger, octopusReplicationPolicy.DestNamespace, octopusReplicationPolicy.Name, octopusReplicationPolicy.Name)
|
||||
|
||||
if err != nil {
|
||||
syncErrorMessage := fmt.Sprintf("[Harbor Sync Project ] - Sync Project [ %s ] Failed ! Error is => %s\n", needToSynchronizedProject, err.Error())
|
||||
log.Error(syncErrorMessage)
|
||||
return false, []string{
|
||||
syncErrorMessage,
|
||||
}
|
||||
}
|
||||
|
||||
realOctopusReplicationPolicy, err := targetClient.GetReplicationPolicyByName(ctx, OctopusReplicationPolicyName)
|
||||
if err != nil {
|
||||
return false, []string{
|
||||
"[Harbor Sync Project ] - failed to get the realOctopusReplicationPolicy!",
|
||||
err.Error(),
|
||||
}
|
||||
}
|
||||
|
||||
err = targetClient.TriggerReplicationExecution(ctx, &model.StartReplicationExecution{
|
||||
PolicyID: realOctopusReplicationPolicy.ID,
|
||||
})
|
||||
if err != nil {
|
||||
return false, []string{
|
||||
"[ Harbor Sync Project ] - failed to start the harbor sync execution !",
|
||||
err.Error(),
|
||||
}
|
||||
}
|
||||
|
||||
return true, []string{
|
||||
fmt.Sprintf("[ Harbor Sync Project ] - sync project [ %s ] started !", needToSynchronizedProject),
|
||||
}
|
||||
}
|
||||
|
||||
func (hOp *HarborOperator) SyncStatusExec(funcArgs []string) (bool, []string) {
|
||||
|
||||
if hOp.TargetHarborClient == nil {
|
||||
ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true)
|
||||
if !ok {
|
||||
return false, []string{
|
||||
"[ Sync Status ] - Error !",
|
||||
}
|
||||
}
|
||||
hOp.TargetHarborClient = createClient
|
||||
}
|
||||
targetClient := hOp.TargetHarborClient
|
||||
|
||||
ctx := context.Background()
|
||||
// check replication policy exists
|
||||
|
||||
replicationPolicy, err := targetClient.GetReplicationPolicyByName(ctx, OctopusReplicationPolicyName)
|
||||
if err != nil {
|
||||
return false, []string{
|
||||
"[ Sync Status ] - get replication error !",
|
||||
err.Error(),
|
||||
}
|
||||
}
|
||||
|
||||
// list execution status
|
||||
replicationExecutions, err := targetClient.ListReplicationExecutions(ctx, &replicationPolicy.ID, nil, nil)
|
||||
if err != nil {
|
||||
return false, []string{
|
||||
"[ Sync Status ] - replication has no sync work !",
|
||||
err.Error(),
|
||||
}
|
||||
}
|
||||
|
||||
// find the newest one only have one here
|
||||
for _, execution := range replicationExecutions {
|
||||
if !strings.HasPrefix(execution.Status, "Succeed") {
|
||||
bytes, _ := json.Marshal(execution)
|
||||
log.InfoF("[sync status]- status are => %v", string(bytes))
|
||||
// report status
|
||||
return false, []string{
|
||||
fmt.Sprintf("[sync status] - not complete ! progress is => %s %%",
|
||||
strconv.FormatFloat(float64(execution.Succeed)/float64(execution.Total)*100, 'f', 2, 64)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true, []string{
|
||||
"[sync status]- sync completed !",
|
||||
}
|
||||
}
|
||||
|
||||
func (hOp *HarborOperator) Command(baseFuncName string, funcArgs ...string) []string {
|
||||
|
||||
return nil
|
||||
}
|
||||
//
|
||||
//import (
|
||||
// "context"
|
||||
// "encoding/json"
|
||||
// "fmt"
|
||||
// "os"
|
||||
// "strconv"
|
||||
// "strings"
|
||||
//
|
||||
// "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"`
|
||||
//
|
||||
// TargetHarborClient *apiv2.RESTClient
|
||||
//
|
||||
// SourceHarborClient *apiv2.RESTClient
|
||||
//}
|
||||
//
|
||||
//// NewHarborOperator 返回一个带有默认HarborAdminPass的HarborOperator实例
|
||||
//func NewHarborOperator() *HarborOperator {
|
||||
// return &HarborOperator{
|
||||
// HarborPort: "8033",
|
||||
// HarborAdminUser: "admin", // 设置默认值
|
||||
// HarborAdminPass: "V2ryStr@ngPss", // 设置默认值
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//// HarborOperatorCache 饿汉式单例
|
||||
//var HarborOperatorCache = NewHarborOperator()
|
||||
//var OctopusReplicationPolicyName = "octopus-sync-replication"
|
||||
//
|
||||
//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
|
||||
// case "SYNC_STATUS_HARBOR":
|
||||
// resultOk, resultLog = hOp.SyncStatusExec(funcArgs)
|
||||
// break
|
||||
// }
|
||||
//
|
||||
// return resultOk, resultLog
|
||||
//}
|
||||
//
|
||||
//func (hOp *HarborOperator) CreateProjectExec(funcArgs []string) (bool, []string) {
|
||||
//
|
||||
// if hOp.TargetHarborClient == nil {
|
||||
//
|
||||
// ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true)
|
||||
// if !ok {
|
||||
// return false, []string{
|
||||
// "[Harbor Create Project] - Error !",
|
||||
// }
|
||||
// }
|
||||
// hOp.TargetHarborClient = createClient
|
||||
// }
|
||||
// client := hOp.TargetHarborClient
|
||||
//
|
||||
// // create project
|
||||
// // 定义你想要创建的仓库(项目)的详细信息
|
||||
//
|
||||
// log.Debug("[Harbor Create Project] - create project !")
|
||||
// needToCreateProjectNameList := []string{"cmii", "rancher"}
|
||||
// // 使用客户端创建项目
|
||||
// ctx := context.Background()
|
||||
// for _, projectName := range needToCreateProjectNameList {
|
||||
//
|
||||
// log.DebugF("start to create proect => %s", projectName)
|
||||
// projectReq := &model.ProjectReq{
|
||||
// ProjectName: projectName, // 仓库名称
|
||||
// Metadata: &model.ProjectMetadata{
|
||||
// Public: "true", // 是否是公开的
|
||||
// },
|
||||
// }
|
||||
//
|
||||
// exists, _ := client.ProjectExists(ctx, projectName)
|
||||
// if !exists {
|
||||
//
|
||||
// err := client.NewProject(ctx, projectReq)
|
||||
// if err != nil {
|
||||
// errorLog := fmt.Sprintf("Error creating project %s: %s\n", projectName, err.Error())
|
||||
// return false, []string{errorLog}
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// log.DebugF("[Harbor Create Project] - Project %s already exists ! continue ", projectName)
|
||||
//
|
||||
// }
|
||||
//
|
||||
// successLog := "[Harbor CreateProjectExec] - Project Create Success !"
|
||||
// log.Info(successLog)
|
||||
//
|
||||
// return true, []string{successLog}
|
||||
//}
|
||||
//
|
||||
//// todo refresh HarborClient不一定有端口
|
||||
//func (hOp *HarborOperator) CheckAndBuildHarborClient(targetHarborHost string, targetHarborPort string, isTarget bool) (bool, *apiv2.RESTClient) {
|
||||
//
|
||||
// log.InfoF("[Harbor Client Create] - start to create harbor client %s", targetHarborHost)
|
||||
//
|
||||
// if targetHarborPort == "" {
|
||||
// targetHarborPort = hOp.HarborPort
|
||||
// }
|
||||
//
|
||||
// if isTarget {
|
||||
// hOp.TargetHarborHost = "http://" + targetHarborHost + ":" + targetHarborPort + "/api/"
|
||||
// log.DebugF("[Harbor Client Create] - harbor host is => %s", hOp.TargetHarborHost)
|
||||
// } else {
|
||||
// hOp.SourceHarborHost = "http://" + targetHarborHost + ":" + targetHarborPort + "/api/"
|
||||
// log.DebugF("[Harbor Client Create] - harbor host is => %s", hOp.SourceHarborHost)
|
||||
// }
|
||||
//
|
||||
// // check connection
|
||||
// var client *apiv2.RESTClient
|
||||
// var err error
|
||||
// if isTarget {
|
||||
// client, err = apiv2.NewRESTClientForHost(hOp.TargetHarborHost, hOp.HarborAdminUser, hOp.HarborAdminPass, nil)
|
||||
// } else {
|
||||
// client, err = apiv2.NewRESTClientForHost(hOp.SourceHarborHost, hOp.HarborAdminUser, hOp.HarborAdminPass, nil)
|
||||
// }
|
||||
// if err != nil {
|
||||
// errorLog := fmt.Sprintf("Error creating REST client: %s\n", err.Error())
|
||||
// log.Error(errorLog)
|
||||
// return false, nil
|
||||
// }
|
||||
//
|
||||
// return true, client
|
||||
//}
|
||||
//
|
||||
//func (hOp *HarborOperator) ListProjectExec(funcArgs []string) (bool, []string) {
|
||||
//
|
||||
// if hOp.TargetHarborClient == nil {
|
||||
// ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true)
|
||||
// if !ok {
|
||||
// return false, []string{
|
||||
// "[Harbor Create Project ] - Error !",
|
||||
// }
|
||||
// }
|
||||
// hOp.TargetHarborClient = createClient
|
||||
// }
|
||||
// client := hOp.TargetHarborClient
|
||||
//
|
||||
// // 使用客户端列出所有项目
|
||||
// ctx := context.Background()
|
||||
// projects, err := client.ListProjects(ctx, "")
|
||||
// if err != nil {
|
||||
// fmt.Printf("Error listing projects: %v\n", err)
|
||||
// os.Exit(1)
|
||||
// }
|
||||
//
|
||||
// // 打印所有项目的信息
|
||||
// for _, project := range projects {
|
||||
// fmt.Printf("Project ID: %d, Name: %s, Public: %v\n", project.ProjectID, project.Name, project.Metadata.Public)
|
||||
// }
|
||||
//
|
||||
// marshal, _ := json.Marshal(projects)
|
||||
//
|
||||
// return true, []string{
|
||||
// fmt.Sprintf("List Projects of %s ", hOp.TargetHarborHost),
|
||||
// string(marshal),
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//func (hOp *HarborOperator) SyncProjectExec(funcArgs []string) (bool, []string) {
|
||||
//
|
||||
// if hOp.TargetHarborClient == nil {
|
||||
// ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true)
|
||||
// if !ok {
|
||||
// return false, []string{
|
||||
// "[Harbor Sync Project ] - Error !",
|
||||
// }
|
||||
// }
|
||||
// hOp.TargetHarborClient = createClient
|
||||
// }
|
||||
// targetClient := hOp.TargetHarborClient
|
||||
//
|
||||
// if hOp.SourceHarborClient == nil {
|
||||
// realHost := funcArgs[1]
|
||||
// realPort := ""
|
||||
// if strings.Contains(funcArgs[1], ":") {
|
||||
// split := strings.Split(funcArgs[1], ":")
|
||||
// realHost = split[0]
|
||||
// realPort = split[1]
|
||||
// }
|
||||
// ok, createClient := hOp.CheckAndBuildHarborClient(realHost, realPort, false)
|
||||
// if !ok {
|
||||
// return false, []string{
|
||||
// "[Harbor Sync Project ] - Error !",
|
||||
// }
|
||||
// }
|
||||
// hOp.SourceHarborClient = createClient
|
||||
// }
|
||||
//
|
||||
// needToSynchronizedProject := funcArgs[2]
|
||||
// log.InfoF("[Harbor Sync Project ] - start to sync harbor project => %s", needToSynchronizedProject)
|
||||
//
|
||||
// log.DebugF("[Harbor Sync Project ] - start to check projects all exists!")
|
||||
// ctx := context.Background()
|
||||
//
|
||||
// // check both source and target harbor project exists
|
||||
// needToCreateProjectNameList := []string{"rancher", "cmii"}
|
||||
//
|
||||
// for _, projectName := range needToCreateProjectNameList {
|
||||
// syncNotExistHarborProjectError := []string{
|
||||
// "[Harbor Sync Project ] - project not exists !",
|
||||
// }
|
||||
// exists, _ := targetClient.ProjectExists(ctx, projectName)
|
||||
// if !exists {
|
||||
// return false, append(syncNotExistHarborProjectError, "targetClient")
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// OctopusSourceHarborName := "octopus-source"
|
||||
//
|
||||
// // add source registry to destination harbor
|
||||
// log.InfoF("[Harbor Sync Project ] - start to create source harbor endpoints => %s", hOp.SourceHarborHost)
|
||||
//
|
||||
// log.Debug("[Harbor Sync Project ] - start to delete exist replication policy !")
|
||||
// policies, _ := targetClient.ListReplicationPolicies(ctx)
|
||||
// if policies != nil {
|
||||
// for _, policy := range policies {
|
||||
// if policy.Name == OctopusReplicationPolicyName {
|
||||
// err := targetClient.DeleteReplicationPolicyByID(ctx, policy.ID)
|
||||
// if err != nil {
|
||||
// log.ErrorF("[Harbor Sync Project ] - delete exists replication policy failed ! => %v ", policy)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// log.Debug("[Harbor Sync Project ] - start to delete exist exist harbor endpoints !")
|
||||
// exitRegistry, _ := targetClient.GetRegistryByName(ctx, OctopusSourceHarborName)
|
||||
// if exitRegistry != nil {
|
||||
// log.Debug("[Harbor Sync Project ] - source endpoints already exists ! delete it !")
|
||||
// err := targetClient.DeleteRegistryByID(ctx, exitRegistry.ID)
|
||||
// if err != nil {
|
||||
// log.ErrorF("[Harbor Sync Project ] - source endpoints delete failed ! => %v ", exitRegistry)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // todo cqga failed
|
||||
// octopusSourceRegistry := &model.Registry{
|
||||
// Credential: &model.RegistryCredential{
|
||||
// AccessKey: "admin",
|
||||
// AccessSecret: "V2ryStr@ngPss",
|
||||
// Type: "basic",
|
||||
// },
|
||||
// Insecure: true,
|
||||
// Name: OctopusSourceHarborName, // 源 Harbor 实例的注册表 ID,通常为 0
|
||||
// Type: "harbor",
|
||||
// URL: strings.Split(hOp.SourceHarborHost, "/api")[0],
|
||||
// }
|
||||
// err := targetClient.NewRegistry(ctx, octopusSourceRegistry)
|
||||
// if err != nil {
|
||||
// sprintf := fmt.Sprintf("[SyncProjectExec] - source endpoints create failed ! => %s", err.Error())
|
||||
// log.Error(sprintf)
|
||||
// return false, []string{sprintf}
|
||||
// }
|
||||
//
|
||||
// // get the real one for it's ID
|
||||
// realOctopusSourceRegistry, err := targetClient.GetRegistryByName(ctx, OctopusSourceHarborName)
|
||||
// if err != nil {
|
||||
// sprintf := fmt.Sprintf("[SyncProjectExec] - get target registry id failed ! => %s", err.Error())
|
||||
// log.Error(sprintf)
|
||||
// return false, []string{sprintf}
|
||||
// }
|
||||
//
|
||||
// // 创建复制策略
|
||||
// octopusReplicationPolicy := &model.ReplicationPolicy{
|
||||
// CopyByChunk: nil,
|
||||
// Deletion: false,
|
||||
// Description: "",
|
||||
// DestNamespace: "", // 可以指定目标 Harbor 中的特定项目,如果为空,则使用源项目名称
|
||||
// DestNamespaceReplaceCount: nil,
|
||||
// SrcRegistry: &model.Registry{
|
||||
// ID: realOctopusSourceRegistry.ID,
|
||||
// },
|
||||
// DestRegistry: &model.Registry{
|
||||
// ID: 0,
|
||||
// },
|
||||
// Enabled: true,
|
||||
// Filters: []*model.ReplicationFilter{
|
||||
// {
|
||||
// Type: "name",
|
||||
// Value: needToSynchronizedProject + "/**",
|
||||
// },
|
||||
// },
|
||||
// ID: 0,
|
||||
// Name: OctopusReplicationPolicyName,
|
||||
// Override: true,
|
||||
// ReplicateDeletion: false,
|
||||
// Speed: nil,
|
||||
// Trigger: &model.ReplicationTrigger{
|
||||
// Type: "manual", // 可以是 "manual", "scheduled", 或 "event_based"
|
||||
// // 如果是 "scheduled",还需要设置 Cron 表达式
|
||||
// // TriggerSettings: &model.TriggerSettings{Cron: "0 * * * *"},
|
||||
// },
|
||||
// }
|
||||
//
|
||||
// // 在源 Harbor 中创建复制策略
|
||||
// log.InfoF("[Harbor Sync Project ] - Start To Sync Project => %s !", needToSynchronizedProject)
|
||||
//
|
||||
// err = targetClient.NewReplicationPolicy(ctx, octopusReplicationPolicy.DestRegistry, octopusReplicationPolicy.SrcRegistry, octopusReplicationPolicy.Deletion, octopusReplicationPolicy.Override, octopusReplicationPolicy.Enabled, octopusReplicationPolicy.Filters, octopusReplicationPolicy.Trigger, octopusReplicationPolicy.DestNamespace, octopusReplicationPolicy.Name, octopusReplicationPolicy.Name)
|
||||
//
|
||||
// if err != nil {
|
||||
// syncErrorMessage := fmt.Sprintf("[Harbor Sync Project ] - Sync Project [ %s ] Failed ! Error is => %s\n", needToSynchronizedProject, err.Error())
|
||||
// log.Error(syncErrorMessage)
|
||||
// return false, []string{
|
||||
// syncErrorMessage,
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// realOctopusReplicationPolicy, err := targetClient.GetReplicationPolicyByName(ctx, OctopusReplicationPolicyName)
|
||||
// if err != nil {
|
||||
// return false, []string{
|
||||
// "[Harbor Sync Project ] - failed to get the realOctopusReplicationPolicy!",
|
||||
// err.Error(),
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// err = targetClient.TriggerReplicationExecution(ctx, &model.StartReplicationExecution{
|
||||
// PolicyID: realOctopusReplicationPolicy.ID,
|
||||
// })
|
||||
// if err != nil {
|
||||
// return false, []string{
|
||||
// "[ Harbor Sync Project ] - failed to start the harbor sync execution !",
|
||||
// err.Error(),
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// return true, []string{
|
||||
// fmt.Sprintf("[ Harbor Sync Project ] - sync project [ %s ] started !", needToSynchronizedProject),
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//func (hOp *HarborOperator) SyncStatusExec(funcArgs []string) (bool, []string) {
|
||||
//
|
||||
// if hOp.TargetHarborClient == nil {
|
||||
// ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true)
|
||||
// if !ok {
|
||||
// return false, []string{
|
||||
// "[ Sync Status ] - Error !",
|
||||
// }
|
||||
// }
|
||||
// hOp.TargetHarborClient = createClient
|
||||
// }
|
||||
// targetClient := hOp.TargetHarborClient
|
||||
//
|
||||
// ctx := context.Background()
|
||||
// // check replication policy exists
|
||||
//
|
||||
// replicationPolicy, err := targetClient.GetReplicationPolicyByName(ctx, OctopusReplicationPolicyName)
|
||||
// if err != nil {
|
||||
// return false, []string{
|
||||
// "[ Sync Status ] - get replication error !",
|
||||
// err.Error(),
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // list execution status
|
||||
// replicationExecutions, err := targetClient.ListReplicationExecutions(ctx, &replicationPolicy.ID, nil, nil)
|
||||
// if err != nil {
|
||||
// return false, []string{
|
||||
// "[ Sync Status ] - replication has no sync work !",
|
||||
// err.Error(),
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // find the newest one only have one here
|
||||
// for _, execution := range replicationExecutions {
|
||||
// if !strings.HasPrefix(execution.Status, "Succeed") {
|
||||
// bytes, _ := json.Marshal(execution)
|
||||
// log.InfoF("[sync status]- status are => %v", string(bytes))
|
||||
// // report status
|
||||
// return false, []string{
|
||||
// fmt.Sprintf("[sync status] - not complete ! progress is => %s %%",
|
||||
// strconv.FormatFloat(float64(execution.Succeed)/float64(execution.Total)*100, 'f', 2, 64)),
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// return true, []string{
|
||||
// "[sync status]- sync completed !",
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//func (hOp *HarborOperator) Command(baseFuncName string, funcArgs ...string) []string {
|
||||
//
|
||||
// return nil
|
||||
//}
|
||||
|
||||
Reference in New Issue
Block a user