# Copyright 2016 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Module for constructing links to AFE pages. This module defines a class for the URL construction logic to loosen the coupling and make it easier to test, but also defines module functions for convenience and normal usage. While there is a root_url property exposed, please refrain from using it to construct URLs and instead add a suitable method to AfeUrls. """ import logging import urllib import urlparse import sys import common from autotest_lib.client.common_lib import global_config logger = logging.getLogger(__name__) class AfeUrls(object): """Class for getting AFE URLs.""" def __init__(self, root_url): """Initialize instance. @param root_url: AFE root URL. """ self._root_url_parts = urlparse.urlsplit(root_url) _DEFAULT_URL = 'http://%s/afe/' def __hash__(self): return hash(self.root_url) def __eq__(self, other): if isinstance(other, type(self)): return self.root_url == other.root_url else: return NotImplemented @classmethod def from_hostname(cls, hostname): """Create AfeUrls given only a hostname, assuming default URL path. @param hostname: Hostname of AFE. @returns: AfeUrls instance. """ return cls(cls._DEFAULT_URL % (hostname,)) def _geturl(self, params): """Get AFE URL. All AFE URLs have the format: http://host/afe/#param1=val1¶m2=val2 This function constructs such a URL given a mapping of parameters. @param params: Mapping of URL parameters. @returns: URL string. """ scheme, netloc, path, query, _fragment = self._root_url_parts fragment = urllib.urlencode(params) return urlparse.SplitResult( scheme, netloc, path, query, fragment).geturl() @property def root_url(self): """Canonical root URL. Note that this may not be the same as the URL passed into the constructor, due to canonicalization. """ return self._root_url_parts.geturl() def get_host_url(self, host_id): """Get AFE URL for the given host. @param host_id: Host id. @returns: URL string. """ return self._geturl({'tab_id': 'view_host', 'object_id': host_id}) _CONFIG = global_config.global_config _HOSTNAME = _CONFIG.get_config_value('SERVER', 'hostname') if not _HOSTNAME: logger.critical('[SERVER] hostname missing from the config file.') sys.exit(1) _singleton_afe_urls = AfeUrls.from_hostname(_HOSTNAME) ROOT_URL = _singleton_afe_urls.root_url get_host_url = _singleton_afe_urls.get_host_url