1919package ccrapis
2020
2121import (
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 )
0 commit comments