clearml/trains/utilities/check_updates.py
2020-06-11 21:15:40 +03:00

76 lines
2.5 KiB
Python

from __future__ import absolute_import, division, print_function
import json
import os
import requests
from ..backend_api.session import Session
from ..backend_config import EnvEntry
from .version import Version
class CheckPackageUpdates(object):
_package_version_checked = False
@classmethod
def check_new_package_available(cls, only_once=False):
"""
:return: True, if there is a newer package in PyPI.
"""
if only_once and cls._package_version_checked:
return None
# noinspection PyBroadException
try:
cls._package_version_checked = True
client, version = Session._client[0]
version = Version(version)
is_demo = 'https://demoapi.trains.allegro.ai/'.startswith(Session.get_api_server_host())
update_server_releases = requests.get(
'https://updates.trains.allegro.ai/updates',
json={"demo": is_demo,
"versions": {c: str(v) for c, v in Session._client},
"CI": str(os.environ.get('CI', ''))},
timeout=3.0
)
if update_server_releases.ok:
update_server_releases = update_server_releases.json()
else:
return None
client_answer = update_server_releases.get(client, {})
if "version" not in client_answer:
return None
# do not output upgrade message if we are running inside a CI process.
if EnvEntry("CI", type=bool, ignore_errors=True).get():
return None
latest_version = Version(client_answer["version"])
if version >= latest_version:
return None
not_patch_upgrade = latest_version.release[:2] == version.release[:2]
return str(latest_version), not_patch_upgrade, client_answer.get("description").split("\r\n")
except Exception:
return None
@staticmethod
def get_version_from_updates_server(cur_version):
"""
Get the latest version for trains from updates server
:param cur_version: The current running version of trains
:type cur_version: Version
"""
try:
_ = requests.get('https://updates.trains.allegro.ai/updates',
data=json.dumps({"versions": {"trains": str(cur_version)}}),
timeout=1.0)
return
except Exception:
pass