Skip to content

Commit 0f8626b

Browse files
authored
Merge pull request #6 from wu0407/optimization
优化处理效率
2 parents 6eaddde + a919c85 commit 0f8626b

File tree

12 files changed

+790
-273
lines changed

12 files changed

+790
-273
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
_output/*
22
*.yaml
33
ccr_to_tcr_rules
4-
4+
.vscode/*
5+
image-transfer

configs/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ var (
4141

4242
const (
4343
maxRatelimit int = 30000
44-
maxRoutineNums int = 10
44+
maxRoutineNums int = 50
4545
)
4646

4747
// Configs struct save of all config

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ require (
88
github.com/docker/docker v1.13.1 // indirect
99
github.com/emicklei/go-restful v2.15.0+incompatible
1010
github.com/gorilla/mux v1.8.0 // indirect
11+
github.com/opencontainers/go-digest v1.0.0
1112
github.com/pkg/errors v0.9.1
1213
github.com/skipor/goenv v0.0.0-20170219222015-cf3a15e6b664
1314
github.com/spf13/cobra v1.1.1

go.sum

Lines changed: 0 additions & 50 deletions
Large diffs are not rendered by default.

pkg/apis/ccrapis/ccrapi.go

Lines changed: 44 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,9 @@
1919
package ccrapis
2020

2121
import (
22-
"encoding/json"
23-
"fmt"
24-
"io/ioutil"
2522
"net/http"
2623
"strings"
24+
"sync"
2725

2826
"github.com/pkg/errors"
2927
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
@@ -40,7 +38,8 @@ type CCRAPIClient struct {
4038
url string
4139
}
4240

43-
var regionPrefix = map[string]string{
41+
// RegionPrefix is map tencent cloud region to ccr domain prefix
42+
var RegionPrefix = map[string]string{
4443
"ap-guangzhou": "ccr",
4544
"ap-shanghai": "ccr",
4645
"ap-nanjing": "ccr",
@@ -101,6 +100,7 @@ func (ai *CCRAPIClient) GetAllNamespaceByName(secret map[string]configs.Secret,
101100
for _, ns := range resp.Response.Data.NamespaceInfo {
102101
nsList = append(nsList, *ns.Namespace)
103102
}
103+
log.Debugf("ccr namespace offset %d limit %d resp is %s", offset, limit, resp.ToJsonString())
104104

105105
if int64(count) >= namespaceCount {
106106
break
@@ -114,73 +114,59 @@ func (ai *CCRAPIClient) GetAllNamespaceByName(secret map[string]configs.Secret,
114114

115115
}
116116

117-
//GenerateAllCcrRules generate all ccr rules
118-
func (ai *CCRAPIClient) GenerateAllCcrRules(secret map[string]configs.Secret, ccrRegion string,
119-
failedNsList []string, tcrRegion string, tcrName string) (map[string]string, error) {
120-
121-
rulesMap := make(map[string]string)
122-
117+
//GetAllCcrRepo get all ccr repo send to repoChan
118+
func (ai *CCRAPIClient) GetAllCcrRepo(secret map[string]configs.Secret, ccrRegion string,
119+
failedNsList []string, tcrRegion string, tcrName string, repoChan chan string, toltalCount int64) error {
123120
secretID, secretKey, err := GetCcrSecret(secret)
124-
125121
if err != nil {
126-
log.Errorf("GetCcrSecret error: ", err)
127-
return rulesMap, err
122+
log.Errorf("GetCcrSecret error: %s", err)
123+
return err
128124
}
129125

130126
offset := int64(0)
131-
count := 0
132127
limit := int64(100)
133-
134-
for {
135-
resp, err := ai.DescribeRepositoryOwnerPersonal(secretID, secretKey, ccrRegion, offset, limit)
136-
if err != nil {
137-
log.Errorf("get ccr repo error, ", err)
138-
return rulesMap, err
139-
}
140-
repoCount := *resp.Response.Data.TotalCount
141-
count += len(resp.Response.Data.RepoInfo)
142-
143-
for _, repo := range resp.Response.Data.RepoInfo {
144-
ns := strings.Split(*repo.RepoName, "/")[0]
145-
if len(failedNsList) == 0 || !utils.IsContain(failedNsList, ns) {
146-
tags, err := ai.getRepoTags(secretID, secretKey, ccrRegion, *repo.RepoName)
147-
if err != nil {
148-
return nil, err
149-
}
150-
if len(tags) == 0 {
151-
continue
152-
}
153-
tagStr := strings.Join(tags, ",")
154-
source := fmt.Sprintf("%s%s%s:%s", regionPrefix[ccrRegion], ".ccs.tencentyun.com/", *repo.RepoName, tagStr)
155-
target := tcrName + ".tencentcloudcr.com/" + *repo.RepoName
156-
rulesMap[target] = source
157-
}
158-
}
159-
160-
if int64(count) >= repoCount {
161-
break
162-
} else {
163-
offset += limit
164-
}
165-
166-
}
167-
168-
jsonStr, err := json.Marshal(rulesMap)
169-
if err != nil {
170-
log.Errorf("Marshal ccr rules map error %v, ", err)
128+
maxGorutineNum := 5
129+
page := toltalCount/limit
130+
if toltalCount%limit >0 {
131+
page++
171132
}
133+
wg := sync.WaitGroup{}
134+
defer close(repoChan)
135+
leakCh := make(chan struct{}, maxGorutineNum)
136+
wg.Add(1)
172137
go func() {
173-
err = ioutil.WriteFile("./ccr_to_tcr_rules", []byte(jsonStr), 0666)
174-
if err != nil {
175-
log.Errorf("WriteFile ccr rules error %v, ", err)
138+
defer wg.Done()
139+
for i := 0; i < maxGorutineNum; i++ {
140+
leakCh <- struct{}{}
176141
}
177142
}()
178143

179-
return rulesMap, nil
180-
144+
for j :=int64(0);j< page;j++ {
145+
wg.Add(1)
146+
<-leakCh
147+
go func(n int64) {
148+
defer wg.Done()
149+
offset = n*limit
150+
resp, err := ai.DescribeRepositoryOwnerPersonal(secretID, secretKey, ccrRegion, offset, limit)
151+
if err != nil {
152+
log.Errorf("get ccr repo offset %d limit %d error, %s", offset, limit, err)
153+
return
154+
}
155+
for _, repo := range resp.Response.Data.RepoInfo {
156+
ns := strings.Split(*repo.RepoName, "/")[0]
157+
if len(failedNsList) == 0 || !utils.IsContain(failedNsList, ns) {
158+
repoChan <- *repo.RepoName
159+
}
160+
}
161+
leakCh <- struct{}{}
162+
}(j)
163+
}
164+
wg.Wait()
165+
return nil
181166
}
182167

183-
func (ai *CCRAPIClient) getRepoTags(secretID, secretKey, ccrRegion, repoName string) ([]string, error) {
168+
// GetRepoTags get ccr repo tags
169+
func (ai *CCRAPIClient) GetRepoTags(secretID, secretKey, ccrRegion, repoName string) ([]string, error) {
184170

185171
offset := int64(0)
186172
count := int64(0)

pkg/apis/tcrapis/tcrapi.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ func (ai *TCRAPIClient) GetAllNamespaceByName(secret map[string]configs.Secret,
7777
log.Errorf("DescribeNamespaces error, ", err)
7878
return nsList, tcrID, err
7979
}
80+
log.Debugf("tcr namespace offset %d limit %d resp is %s", offset, limit, resp.ToJsonString())
8081
namespaceCount := *resp.Response.TotalCount
8182
count += len(resp.Response.NamespaceList)
8283
for _, ns := range resp.Response.NamespaceList {
@@ -204,3 +205,73 @@ func GetTcrSecret(secret map[string]configs.Secret) (string, string, error) {
204205

205206
return secretID, secretKey, nil
206207
}
208+
209+
// DescribeImages get the images list of tcr repo
210+
func (ai *TCRAPIClient) DescribeImages(secretID, secretKey, region, registryID, nsName, repositoryName string, offset, limit int64) (*tcr.DescribeImagesResponse, error) {
211+
credential := common.NewCredential(
212+
secretID,
213+
secretKey,
214+
)
215+
cpf := profile.NewClientProfile()
216+
cpf.HttpProfile.Endpoint = "tcr.tencentcloudapi.com"
217+
client, _ := tcr.NewClient(credential, region, cpf)
218+
219+
request := tcr.NewDescribeImagesRequest()
220+
request.RegistryId = common.StringPtr(registryID)
221+
request.NamespaceName = common.StringPtr(nsName)
222+
request.RepositoryName = common.StringPtr(repositoryName)
223+
request.Limit = common.Int64Ptr(limit)
224+
request.Offset = common.Int64Ptr(offset)
225+
226+
response, err := client.DescribeImages(request)
227+
228+
if err != nil {
229+
log.Errorf("An error has returned: %s", err)
230+
return nil, err
231+
}
232+
return response, nil
233+
}
234+
235+
// GetRepoTags get tcr repo tag list
236+
func (ai *TCRAPIClient) GetRepoTags(secretID, secretKey, region, tcrName, nsName, repositoryName, instanceName string) ([]string, error) {
237+
var tags []string
238+
239+
tcrID := instanceName
240+
if tcrID == "" {
241+
//get tcrId by tcr name
242+
filterValues := []string{tcrName}
243+
resp, err := ai.DescribeInstances(secretID, secretKey, region, 0, 100, "RegistryName", filterValues)
244+
if err != nil {
245+
log.Errorf("DescribeInstances error, %s", err)
246+
return tags, err
247+
}
248+
249+
tcrID = *resp.Response.Registries[0].RegistryId
250+
}
251+
252+
// tcr offset means page number, currently :(
253+
offset := int64(1)
254+
count := 0
255+
limit := int64(100)
256+
257+
for {
258+
resp, err := ai.DescribeImages(secretID, secretKey, region, tcrID, nsName, repositoryName, offset, limit)
259+
if err != nil {
260+
log.Errorf("DescribeImages error, %s", err)
261+
return tags, err
262+
}
263+
tagsCount := *resp.Response.TotalCount
264+
count += len(resp.Response.ImageInfoList)
265+
for _, tagInfo := range resp.Response.ImageInfoList {
266+
tags = append(tags, *tagInfo.ImageVersion)
267+
}
268+
269+
log.Debugf("tcr get tag repo %s/%s offset %d, limit %d, total count %d, current count %d, resp %v", nsName, repositoryName, offset, limit, tagsCount, count, resp.ToJsonString())
270+
if int64(count) >= tagsCount {
271+
break
272+
} else {
273+
offset++
274+
}
275+
}
276+
return tags, nil
277+
}

pkg/image-transfer/options/config.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ type ConfigOptions struct {
3636
TCRRegion string
3737
TCRName string
3838
SecretFile string
39-
39+
// if target tag is exist override it
40+
TagExistOverridden bool
4041
}
4142

4243
// NewConfigOptions creates a NewConfigOptions object with default
@@ -67,7 +68,7 @@ func (o *ConfigOptions) AddFlags(fs *pflag.FlagSet) {
6768
"default destinate namespace when destinate namespace is not" +
6869
" given in the config file, can also be set with DEFAULT_NAMESPACE environment value")
6970
fs.IntVar(&o.RoutineNums, "routines", 5,
70-
"number of goroutines, default value is 5, max routines is 10")
71+
"number of goroutines, default value is 5, max routines is 50")
7172
fs.IntVar(&o.RetryNums, "retry", 2,
7273
"number of retries, default value is 2")
7374
fs.IntVar(&o.QPS, "qps", 100,
@@ -82,4 +83,5 @@ func (o *ConfigOptions) AddFlags(fs *pflag.FlagSet) {
8283
"tcr name. this flag is used when flag ccrToTcr=true")
8384
fs.StringVar(&o.SecretFile, "secretFile", o.SecretFile,
8485
"Tencent Cloud secretId 、secretKey for access ccr and tcr. this flag is used when flag ccrToTcr=true")
86+
fs.BoolVar(&o.TagExistOverridden, "tag-exist-overridden", true, "if target tag is exist, override it")
8587
}

0 commit comments

Comments
 (0)