def unarchive(byte_array: bytes, directory: Text) -> Text: """Tries to unpack a byte array interpreting it as an archive. Tries to use tar first to unpack, if that fails, zip will be used.""" try: tar = tarfile.open(fileobj=IOReader(byte_array)) tar.extractall(directory) tar.close() return directory except tarfile.TarError: zip_ref = zipfile.ZipFile(IOReader(byte_array)) zip_ref.extractall(directory) zip_ref.close() return directory
def _pull_model_and_fingerprint(model_server: EndpointConfig, model_directory: Text, fingerprint: Optional[Text] ) -> Optional[Text]: """Queries the model server and returns the value of the response's <ETag> header which contains the model hash.""" header = {"If-None-Match": fingerprint} try: logger.debug("Requesting model from server {}..." "".format(model_server.url)) response = model_server.request(method="GET", headers=header, timeout=DEFAULT_REQUEST_TIMEOUT) except RequestException as e: logger.warning("Tried to fetch model from server, but couldn't reach " "server. We'll retry later... Error: {}." "".format(e)) return None if response.status_code in [204, 304]: logger.debug("Model server returned {} status code, indicating " "that no new model is available. " "Current fingerprint: {}" "".format(response.status_code, fingerprint)) return response.headers.get("ETag") elif response.status_code == 404: logger.debug("Model server didn't find a model for our request. " "Probably no one did train a model for the project " "and tag combination yet.") return None elif response.status_code != 200: logger.warning("Tried to fetch model from server, but server response " "status code is {}. We'll retry later..." "".format(response.status_code)) return None zip_ref = zipfile.ZipFile(IOReader(response.content)) zip_ref.extractall(model_directory) logger.debug("Unzipped model to {}" "".format(os.path.abspath(model_directory))) # get the new fingerprint return response.headers.get("ETag")