def get_software_version_data(software, version): """ Asynchronously fetches the known data about the given software version from the master. :param str software: The name of the software to get data for :param str version: The name of the version to get data for :return: Returns information about the given software version from the master """ url = "{master_api}/software/{software}/versions/{version}".\ format(master_api=config.get("master_api"), software=software, version=version) while True: try: response = yield get_direct(url) except Exception as error: delay = http_retry_delay() logger.error( "Failed to get data about software %s, version %s: %r. Will " "retry in %s seconds.", software, version, error, delay) deferred = Deferred() reactor.callLater(delay, deferred.callback, None) yield deferred else: if response.code == OK: data = yield treq.json_content(response) returnValue(data) elif response.code >= INTERNAL_SERVER_ERROR: delay = http_retry_delay() logger.warning( "Could not get data for software %s, version %s, server " "responded with INTERNAL_SERVER_ERROR. Retrying in %s " "seconds.", software, version, delay) deferred = Deferred() reactor.callLater(delay, deferred.callback, None) yield deferred elif response.code == NOT_FOUND: logger.error("Got 404 NOT FOUND from server on getting data " "for software %s, version %s", software, version) raise VersionNotFound("This software version was not found or " "has no discovery code.") else: logger.error( "Failed to get data for software %s, version %s: " "Unexpected status from server %s", software, version, response.code) raise Exception("Unknown return code from master: %s" % response.code)
def get(self, url, **kwargs): return get_direct(self.get_url(url), **kwargs)
def __call__(self, *args, **kwargs): self.hits += 1 if self.hits < 2: raise Exception("Fail!") return get_direct(*args, **kwargs)