import os
import re
import socket
+import time
from multiprocessing.dummy import Pool as ThreadPool
-from time import sleep
import docker
import requests
while retries < 20:
try:
r = _request_get(self._docker_base + "/" + combined_repo_name + "/tags")
- sleep(0.5)
- break
+ if r.status_code == 429:
+ # Docker returns 429 if we access it too fast too many times.
+ # If it happends, delay 60 seconds, and try again, up to 19 times.
+ log.debug(
+ "Too many docker gets too fast, wait 1 min: {}, repo {}".format(retries, combined_repo_name)
+ )
+ time.sleep(60)
+ retries = retries + 1
+ else:
+ break
except requests.HTTPError as excinfo:
log.debug("Fetching Docker Hub tags. {}".format(excinfo))
retries = retries + 1
assert len(test_tags.invalid) == len(answer_invalid_tags)
+def test_docker_tag_err_429_class(responses, mocker):
+ """Test DockerTagClass"""
+ mocker.patch("time.sleep", return_value=None)
+ org = "onap"
+ repo = "base-sdc-sanity"
+ repo_from_file = False
+ url = "https://registry.hub.docker.com/v1/repositories/onap/base-sdc-sanity/tags"
+ answer = """[{"layer": "", "name": "latest"},
+ {"layer": "", "name": "1.3.0"},
+ {"layer": "", "name": "1.3.1"},
+ {"layer": "", "name": "1.4.0"},
+ {"layer": "", "name": "1.4.1"},
+ {"layer": "", "name": "v1.0.0"}]
+ """
+ answer_429 = '{"detail": "Rate limit exceeded", "error": false}"'
+ answer_valid_tags = ["1.3.0", "1.3.1", "1.4.0", "1.4.1"]
+ answer_invalid_tags = ["latest", "v1.0.0"]
+ rdh.initialize(org)
+
+ # Do 19 failed and next one should work
+ for k in range(19):
+ responses.add(responses.GET, url, body=answer_429, status=429)
+ responses.add(responses.GET, url, body=answer, status=200)
+ test_tags = rdh.DockerTagClass(org, repo, repo_from_file)
+ assert len(test_tags.valid) == len(answer_valid_tags)
+ assert len(test_tags.invalid) == len(answer_invalid_tags)
+
+ # Do 20 failed, and all failes
+ for k in range(20):
+ responses.add(responses.GET, url, body=answer_429, status=429)
+ with pytest.raises(requests.HTTPError):
+ test_tags = rdh.DockerTagClass(org, repo, repo_from_file)
+
+
def test_tag_class_repository_exist():
"""Test TagClass"""
org = "onap"