Merge pull request #3834 from pypeclub/bugfix/OP-3961_Ftrack-selfdeploy-server-recognition

Ftrack: Url validation does not require ftrackapp
This commit is contained in:
Jakub Trllo 2022-09-13 15:19:09 +02:00 committed by GitHub
commit 6dd1ea21ff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 94 additions and 84 deletions

View file

@ -1,9 +1,13 @@
from .ftrack_module import (
FtrackModule,
FTRACK_MODULE_DIR
FTRACK_MODULE_DIR,
resolve_ftrack_url,
)
__all__ = (
"FtrackModule",
"FTRACK_MODULE_DIR"
"FTRACK_MODULE_DIR",
"resolve_ftrack_url",
)

View file

@ -6,14 +6,16 @@ import platform
import click
from openpype.modules import OpenPypeModule
from openpype_interfaces import (
from openpype.modules.interfaces import (
ITrayModule,
IPluginPaths,
ISettingsChangeListener
)
from openpype.settings import SaveWarningExc
from openpype.lib import Logger
FTRACK_MODULE_DIR = os.path.dirname(os.path.abspath(__file__))
_URL_NOT_SET = object()
class FtrackModule(
@ -28,17 +30,8 @@ class FtrackModule(
ftrack_settings = settings[self.name]
self.enabled = ftrack_settings["enabled"]
# Add http schema
ftrack_url = ftrack_settings["ftrack_server"].strip("/ ")
if ftrack_url:
if "http" not in ftrack_url:
ftrack_url = "https://" + ftrack_url
# Check if "ftrack.app" is part os url
if "ftrackapp.com" not in ftrack_url:
ftrack_url = ftrack_url + ".ftrackapp.com"
self.ftrack_url = ftrack_url
self._settings_ftrack_url = ftrack_settings["ftrack_server"]
self._ftrack_url = _URL_NOT_SET
current_dir = os.path.dirname(os.path.abspath(__file__))
low_platform = platform.system().lower()
@ -70,6 +63,16 @@ class FtrackModule(
self.timers_manager_connector = None
self._timers_manager_module = None
def get_ftrack_url(self):
if self._ftrack_url is _URL_NOT_SET:
self._ftrack_url = resolve_ftrack_url(
self._settings_ftrack_url,
logger=self.log
)
return self._ftrack_url
ftrack_url = property(get_ftrack_url)
def get_global_environments(self):
"""Ftrack's global environments."""
return {
@ -479,6 +482,51 @@ class FtrackModule(
click_group.add_command(cli_main)
def _check_ftrack_url(url):
import requests
try:
result = requests.get(url, allow_redirects=False)
except requests.exceptions.RequestException:
return False
if (result.status_code != 200 or "FTRACK_VERSION" not in result.headers):
return False
return True
def resolve_ftrack_url(url, logger=None):
"""Checks if Ftrack server is responding."""
if logger is None:
logger = Logger.get_logger(__name__)
url = url.strip("/ ")
if not url:
logger.error("Ftrack URL is not set!")
return None
if not url.startswith("http"):
url = "https://" + url
ftrack_url = None
if not url.endswith("ftrackapp.com"):
ftrackapp_url = url + ".ftrackapp.com"
if _check_ftrack_url(ftrackapp_url):
ftrack_url = ftrackapp_url
if not ftrack_url and _check_ftrack_url(url):
ftrack_url = url
if ftrack_url:
logger.debug("Ftrack server \"{}\" is accessible.".format(ftrack_url))
else:
logger.error("Ftrack server \"{}\" is not accessible!".format(url))
return ftrack_url
@click.group(FtrackModule.name, help="Ftrack module related commands.")
def cli_main():
pass

View file

@ -1,8 +1,6 @@
from .ftrack_server import FtrackServer
from .lib import check_ftrack_url
__all__ = (
"FtrackServer",
"check_ftrack_url"
)

View file

@ -20,9 +20,11 @@ from openpype.lib import (
get_openpype_version,
get_build_version,
)
from openpype_modules.ftrack import FTRACK_MODULE_DIR
from openpype_modules.ftrack import (
FTRACK_MODULE_DIR,
resolve_ftrack_url,
)
from openpype_modules.ftrack.lib import credentials
from openpype_modules.ftrack.ftrack_server.lib import check_ftrack_url
from openpype_modules.ftrack.ftrack_server import socket_thread
@ -114,7 +116,7 @@ def legacy_server(ftrack_url):
while True:
if not ftrack_accessible:
ftrack_accessible = check_ftrack_url(ftrack_url)
ftrack_accessible = resolve_ftrack_url(ftrack_url)
# Run threads only if Ftrack is accessible
if not ftrack_accessible and not printed_ftrack_error:
@ -257,7 +259,7 @@ def main_loop(ftrack_url):
while True:
# Check if accessible Ftrack and Mongo url
if not ftrack_accessible:
ftrack_accessible = check_ftrack_url(ftrack_url)
ftrack_accessible = resolve_ftrack_url(ftrack_url)
if not mongo_accessible:
mongo_accessible = check_mongo_url(mongo_uri)
@ -441,7 +443,7 @@ def run_event_server(
os.environ["CLOCKIFY_API_KEY"] = clockify_api_key
# Check url regex and accessibility
ftrack_url = check_ftrack_url(ftrack_url)
ftrack_url = resolve_ftrack_url(ftrack_url)
if not ftrack_url:
print('Exiting! < Please enter Ftrack server url >')
return 1

View file

@ -26,45 +26,12 @@ except ImportError:
from openpype_modules.ftrack.lib import get_ftrack_event_mongo_info
from openpype.client import OpenPypeMongoConnection
from openpype.api import Logger
from openpype.lib import Logger
TOPIC_STATUS_SERVER = "openpype.event.server.status"
TOPIC_STATUS_SERVER_RESULT = "openpype.event.server.status.result"
def check_ftrack_url(url, log_errors=True, logger=None):
"""Checks if Ftrack server is responding"""
if logger is None:
logger = Logger.get_logger(__name__)
if not url:
logger.error("Ftrack URL is not set!")
return None
url = url.strip('/ ')
if 'http' not in url:
if url.endswith('ftrackapp.com'):
url = 'https://' + url
else:
url = 'https://{0}.ftrackapp.com'.format(url)
try:
result = requests.get(url, allow_redirects=False)
except requests.exceptions.RequestException:
if log_errors:
logger.error("Entered Ftrack URL is not accesible!")
return False
if (result.status_code != 200 or 'FTRACK_VERSION' not in result.headers):
if log_errors:
logger.error("Entered Ftrack URL is not accesible!")
return False
logger.debug("Ftrack server {} is accessible.".format(url))
return url
class SocketBaseEventHub(ftrack_api.event.hub.EventHub):
hearbeat_msg = b"hearbeat"

View file

@ -19,11 +19,8 @@ from openpype.client.operations import (
CURRENT_PROJECT_SCHEMA,
CURRENT_PROJECT_CONFIG_SCHEMA,
)
from openpype.api import (
Logger,
get_anatomy_settings
)
from openpype.lib import ApplicationManager
from openpype.settings import get_anatomy_settings
from openpype.lib import ApplicationManager, Logger
from openpype.pipeline import AvalonMongoDB, schema
from .constants import CUST_ATTR_ID_KEY, FPS_KEYS

View file

@ -6,22 +6,18 @@ import threading
from Qt import QtCore, QtWidgets, QtGui
import ftrack_api
from ..ftrack_server.lib import check_ftrack_url
from ..ftrack_server import socket_thread
from ..lib import credentials
from ..ftrack_module import FTRACK_MODULE_DIR
from . import login_dialog
from openpype import resources
from openpype.lib import Logger
log = Logger.get_logger("FtrackModule")
from openpype_modules.ftrack import resolve_ftrack_url, FTRACK_MODULE_DIR
from openpype_modules.ftrack.ftrack_server import socket_thread
from openpype_modules.ftrack.lib import credentials
from . import login_dialog
class FtrackTrayWrapper:
def __init__(self, module):
self.module = module
self.log = Logger.get_logger(self.__class__.__name__)
self.thread_action_server = None
self.thread_socket_server = None
@ -62,19 +58,19 @@ class FtrackTrayWrapper:
if validation:
self.widget_login.set_credentials(ft_user, ft_api_key)
self.module.set_credentials_to_env(ft_user, ft_api_key)
log.info("Connected to Ftrack successfully")
self.log.info("Connected to Ftrack successfully")
self.on_login_change()
return validation
if not validation and ft_user and ft_api_key:
log.warning(
self.log.warning(
"Current Ftrack credentials are not valid. {}: {} - {}".format(
str(os.environ.get("FTRACK_SERVER")), ft_user, ft_api_key
)
)
log.info("Please sign in to Ftrack")
self.log.info("Please sign in to Ftrack")
self.bool_logged = False
self.show_login_widget()
self.set_menu_visibility()
@ -104,7 +100,7 @@ class FtrackTrayWrapper:
self.action_credentials.setIcon(self.icon_not_logged)
self.action_credentials.setToolTip("Logged out")
log.info("Logged out of Ftrack")
self.log.info("Logged out of Ftrack")
self.bool_logged = False
self.set_menu_visibility()
@ -126,10 +122,6 @@ class FtrackTrayWrapper:
ftrack_url = self.module.ftrack_url
os.environ["FTRACK_SERVER"] = ftrack_url
parent_file_path = os.path.dirname(
os.path.dirname(os.path.realpath(__file__))
)
min_fail_seconds = 5
max_fail_count = 3
wait_time_after_max_fail = 10
@ -154,17 +146,19 @@ class FtrackTrayWrapper:
# Main loop
while True:
if not self.bool_action_server_running:
log.debug("Action server was pushed to stop.")
self.log.debug("Action server was pushed to stop.")
break
# Check if accessible Ftrack and Mongo url
if not ftrack_accessible:
ftrack_accessible = check_ftrack_url(ftrack_url)
ftrack_accessible = resolve_ftrack_url(ftrack_url)
# Run threads only if Ftrack is accessible
if not ftrack_accessible:
if not printed_ftrack_error:
log.warning("Can't access Ftrack {}".format(ftrack_url))
self.log.warning(
"Can't access Ftrack {}".format(ftrack_url)
)
if self.thread_socket_server is not None:
self.thread_socket_server.stop()
@ -191,7 +185,7 @@ class FtrackTrayWrapper:
self.set_menu_visibility()
elif failed_count == max_fail_count:
log.warning((
self.log.warning((
"Action server failed {} times."
" I'll try to run again {}s later"
).format(
@ -243,10 +237,10 @@ class FtrackTrayWrapper:
self.thread_action_server.join()
self.thread_action_server = None
log.info("Ftrack action server was forced to stop")
self.log.info("Ftrack action server was forced to stop")
except Exception:
log.warning(
self.log.warning(
"Error has happened during Killing action server",
exc_info=True
)
@ -343,7 +337,7 @@ class FtrackTrayWrapper:
self.thread_timer = None
except Exception as e:
log.error("During Killing Timer event server: {0}".format(e))
self.log.error("During Killing Timer event server: {0}".format(e))
def changed_user(self):
self.stop_action_server()