mirror of
				https://github.com/1Panel-dev/KubePi.git
				synced 2025-11-01 02:52:40 +08:00 
			
		
		
		
	feat: 镜像仓库增加harbor类型
This commit is contained in:
		| @@ -3,23 +3,25 @@ package imagerepo | |||||||
| import "github.com/KubeOperator/kubepi/pkg/util/imagerepo/repos" | import "github.com/KubeOperator/kubepi/pkg/util/imagerepo/repos" | ||||||
|  |  | ||||||
| type RepoClient interface { | type RepoClient interface { | ||||||
| 	Auth() error | 	//Auth() error | ||||||
| 	ListRepos() ([]string, error) | 	ListRepos() ([]string, error) | ||||||
|  | 	ListImages(repository string) (images []string, err error) | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewClient(config Config) RepoClient { | func NewClient(config Config) RepoClient { | ||||||
| 	switch config.Type { | 	switch config.Type { | ||||||
| 	case "Nexus": | 	case "Nexus": | ||||||
| 		return repos.NewNexusClient(config.EndPoint, config.Credential.Username, config.Credential.Password, config.DownloadUrl) | 		return repos.NewNexusClient(config.EndPoint, config.Credential.Username, config.Credential.Password) | ||||||
|  | 	case "Harbor": | ||||||
|  | 		return repos.NewHarborClient(config.EndPoint, config.Credential.Username, config.Credential.Password) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| type Config struct { | type Config struct { | ||||||
| 	Type        string | 	Type        string | ||||||
| 	EndPoint    string | 	EndPoint    string | ||||||
| 	DownloadUrl string | 	//DownloadUrl string | ||||||
| 	Credential  Credential | 	Credential  Credential | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -27,3 +29,4 @@ type Credential struct { | |||||||
| 	Username string | 	Username string | ||||||
| 	Password string | 	Password string | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,4 +18,33 @@ func TestNexus(t *testing.T) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		fmt.Println(err) | 		fmt.Println(err) | ||||||
| 	} | 	} | ||||||
|  | 	images,err := client.ListImages("docker-hub-proxy") | ||||||
|  | 	if err != nil { | ||||||
|  | 		fmt.Println(err) | ||||||
|  | 	} | ||||||
|  | 	fmt.Println(images) | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestHarbor(t *testing.T)  { | ||||||
|  | 	client := NewClient(Config{ | ||||||
|  | 		Type: "Harbor", | ||||||
|  | 		EndPoint: "http://172.16.10.188", | ||||||
|  | 		Credential: Credential{ | ||||||
|  | 			Username: "zhengkun", | ||||||
|  | 			Password: "Calong@2015", | ||||||
|  | 		}, | ||||||
|  | 	}) | ||||||
|  | 	repos,err := client.ListRepos() | ||||||
|  | 	if err != nil { | ||||||
|  | 		fmt.Println(err) | ||||||
|  | 	} | ||||||
|  | 	fmt.Println(repos) | ||||||
|  | 	images,err := client.ListImages("kubeapp") | ||||||
|  | 	if err != nil { | ||||||
|  | 		fmt.Println(err) | ||||||
|  | 	} | ||||||
|  | 	fmt.Println(images) | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										82
									
								
								pkg/util/imagerepo/repos/harbor.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								pkg/util/imagerepo/repos/harbor.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | |||||||
|  | package repos | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"fmt" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	baseUrl       = "api/v2.0" | ||||||
|  | 	projectUrl    = baseUrl + "/projects" | ||||||
|  | 	repositoryUrl = "/repositories" | ||||||
|  | 	artifactUrl = "/artifacts" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func NewHarborClient(endpoint, username, password string) *harborClient { | ||||||
|  | 	return &harborClient{ | ||||||
|  | 		EndPoint: endpoint, | ||||||
|  | 		HttpClient: &HttpClient{ | ||||||
|  | 			Username: username, | ||||||
|  | 			Password: password, | ||||||
|  | 			Host:     endpoint, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type harborClient struct { | ||||||
|  | 	EndPoint   string | ||||||
|  | 	HttpClient *HttpClient | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type  artifacts struct { | ||||||
|  | 	Type string | ||||||
|  | 	Tags []NameResult | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *harborClient) ListRepos() (names []string, err error) { | ||||||
|  | 	body, _, err1 := c.HttpClient.Get(projectUrl) | ||||||
|  | 	if err1 != nil { | ||||||
|  | 		err = err1 | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var result []NameResult | ||||||
|  | 	if err = json.Unmarshal(body, &result); err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	for _, r := range result { | ||||||
|  | 		names = append(names, r.Name) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *harborClient) ListImages(project string) (images []string, err error) { | ||||||
|  | 	repoUrl := fmt.Sprintf("%s/%s/%s", projectUrl, project, repositoryUrl) | ||||||
|  | 	body, _, err1 := c.HttpClient.Get(repoUrl) | ||||||
|  | 	if err1 != nil { | ||||||
|  | 		err = err1 | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var result []NameResult | ||||||
|  | 	if err = json.Unmarshal(body, &result); err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	for _, r := range result { | ||||||
|  | 		repoName := strings.Replace(r.Name,project+"/","",-1) | ||||||
|  | 		body, _, err2 := c.HttpClient.Get(fmt.Sprintf("%s/%s/%s", repoUrl, repoName, artifactUrl)) | ||||||
|  | 		if err2 != nil { | ||||||
|  | 			err = err2 | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		var artifacts []artifacts | ||||||
|  | 		if err = json.Unmarshal(body, &artifacts); err != nil { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		for _,art := range artifacts { | ||||||
|  | 			for _,tag := range art.Tags { | ||||||
|  | 				images = append(images, r.Name+":"+tag.Name) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
| @@ -14,6 +14,11 @@ type HttpClient struct { | |||||||
| 	Host string | 	Host string | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type NameResult struct { | ||||||
|  | 	Name    string | ||||||
|  | 	Version string | ||||||
|  | } | ||||||
|  |  | ||||||
| func (h *HttpClient) NewRequest(method,endpoint string) (request *http.Request, err error) { | func (h *HttpClient) NewRequest(method,endpoint string) (request *http.Request, err error) { | ||||||
| 	url := fmt.Sprintf("%s/%s", h.Host, endpoint) | 	url := fmt.Sprintf("%s/%s", h.Host, endpoint) | ||||||
| 	request, err = http.NewRequest(method, url, nil) | 	request, err = http.NewRequest(method, url, nil) | ||||||
|   | |||||||
| @@ -2,19 +2,20 @@ package repos | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
|  | 	"fmt" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const ( | const ( | ||||||
| 	BaseUrl      = "service/rest" | 	BaseUrl      = "service/rest" | ||||||
| 	RepoUrl      = BaseUrl + "/v1/repositories" | 	RepoUrl      = BaseUrl + "/v1/repositories" | ||||||
|  | 	ComponentUrl = BaseUrl + "/v1/components?repository=" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func NewNexusClient(endpoint, username, password, downloadUrl string) *nexusClient { | func NewNexusClient(endpoint, username, password string) *nexusClient { | ||||||
| 	return &nexusClient{ | 	return &nexusClient{ | ||||||
| 		Username:    username, | 		Username:    username, | ||||||
| 		EndPoint:    endpoint, | 		EndPoint:    endpoint, | ||||||
| 		Password:    password, | 		Password:    password, | ||||||
| 		DownloadUrl: downloadUrl, |  | ||||||
| 		HttpClient: &HttpClient{ | 		HttpClient: &HttpClient{ | ||||||
| 			Username: username, | 			Username: username, | ||||||
| 			Password: password, | 			Password: password, | ||||||
| @@ -27,12 +28,11 @@ type nexusClient struct { | |||||||
| 	Username    string | 	Username    string | ||||||
| 	Password    string | 	Password    string | ||||||
| 	EndPoint    string | 	EndPoint    string | ||||||
| 	DownloadUrl string |  | ||||||
| 	HttpClient  *HttpClient | 	HttpClient  *HttpClient | ||||||
| } | } | ||||||
|  |  | ||||||
| type NameResult struct { | type ItemResult struct { | ||||||
| 	Name string | 	Items []NameResult | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *nexusClient) Auth() error { | func (c *nexusClient) Auth() error { | ||||||
| @@ -54,3 +54,20 @@ func (c *nexusClient) ListRepos() (names []string, err error) { | |||||||
| 	} | 	} | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (c *nexusClient) ListImages(repository string) (images []string, err error) { | ||||||
|  | 	body, _, err1 := c.HttpClient.Get(fmt.Sprintf("%s%s", ComponentUrl, repository)) | ||||||
|  | 	fmt.Println(fmt.Sprintf("%s%s", ComponentUrl, repository)) | ||||||
|  | 	if err1 != nil { | ||||||
|  | 		err = err1 | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var result ItemResult | ||||||
|  | 	if err = json.Unmarshal(body, &result); err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	for _, r := range result.Items { | ||||||
|  | 		images = append(images, r.Name+":"+r.Version) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|   | |||||||
| @@ -19,6 +19,8 @@ | |||||||
|       </el-table-column> |       </el-table-column> | ||||||
|       <el-table-column :label="$t('business.image_repos.endpoint')" prop="endPoint" min-width="100" fix> |       <el-table-column :label="$t('business.image_repos.endpoint')" prop="endPoint" min-width="100" fix> | ||||||
|       </el-table-column> |       </el-table-column> | ||||||
|  |       <el-table-column :label="$t('business.image_repos.repo')" prop="repoName" min-width="100" fix> | ||||||
|  |       </el-table-column> | ||||||
|       <el-table-column :label="$t('commons.table.created_time')" min-width="100" fix> |       <el-table-column :label="$t('commons.table.created_time')" min-width="100" fix> | ||||||
|         <template v-slot:default="{row}"> |         <template v-slot:default="{row}"> | ||||||
|           {{ row.createAt | ageFormat }} |           {{ row.createAt | ageFormat }} | ||||||
|   | |||||||
| @@ -122,8 +122,11 @@ export default { | |||||||
|       ) |       ) | ||||||
|     }, |     }, | ||||||
|     list () { |     list () { | ||||||
|  |       this.loading = true | ||||||
|       listInternalRepos(this.form).then(res => { |       listInternalRepos(this.form).then(res => { | ||||||
|         this.repos = res.data |         this.repos = res.data | ||||||
|  |       }).finally(() => { | ||||||
|  |         this.loading = false | ||||||
|       }) |       }) | ||||||
|     }, |     }, | ||||||
|     onCancel () { |     onCancel () { | ||||||
|   | |||||||
| @@ -187,6 +187,17 @@ const message = { | |||||||
|             operation: "Operation", |             operation: "Operation", | ||||||
|             operation_domain: "Resource", |             operation_domain: "Resource", | ||||||
|             specific_information: "Informations" |             specific_information: "Informations" | ||||||
|  |         }, | ||||||
|  |         image_repos: { | ||||||
|  |           list: "Mirror Warehouse", | ||||||
|  |           name: "Name", | ||||||
|  |           endpoint: "Address", | ||||||
|  |           downloadUrl: "Mirror download URL", | ||||||
|  |           username: "Username", | ||||||
|  |           password: "Password", | ||||||
|  |           type: "Type", | ||||||
|  |           repo: "Mirror Library", | ||||||
|  |           load_repo: "Load image library", | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 wangzhengkun
					wangzhengkun