in tools/release/adot-operator-images-mirror/mirror.go [153:200]
func (m *mirror) getTagResponse(url string) error {
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return err
}
res, err := httpClient.Do(req)
if err != nil {
log.Printf("Failed to get %s, retrying", url)
return err
} else if res.StatusCode == http.StatusTooManyRequests {
sleepTime := getSleepTime(res.Header.Get("X-RateLimit-Reset"), time.Now())
log.Printf("Rate limited on %s, sleeping for %s", url, sleepTime)
time.Sleep(sleepTime)
return fmt.Errorf("encounter error: too many requests")
} else if res.StatusCode < 200 || res.StatusCode >= 300 {
return fmt.Errorf("get %s failed with %d, retrying", url, res.StatusCode)
} else {
defer res.Body.Close()
// Decode the response and add the tags to remoteTags field of mirror struct.
var allTags []RepositoryTag
dc := json.NewDecoder(res.Body)
switch m.sourceRepo.Host {
case quay:
var tags QuayTagsResponse
if err := dc.Decode(&tags); err != nil {
return err
}
allTags = append(allTags, tags.Tags...)
case gcr:
var tags GCRTagsResponse
if err := dc.Decode(&tags); err != nil {
return err
}
for _, tag := range tags.Tags {
allTags = append(allTags, RepositoryTag{
Name: tag,
})
}
}
m.remoteTags = allTags
return nil
}
}