1*9c5db199SXin Li# Lint as: python2, python3 2*9c5db199SXin Li# Copyright 2016 The Chromium Authors. All rights reserved. 3*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 4*9c5db199SXin Li# found in the LICENSE file. 5*9c5db199SXin Li 6*9c5db199SXin Li"""Module for constructing links to AFE pages. 7*9c5db199SXin Li 8*9c5db199SXin LiThis module defines a class for the URL construction logic to loosen the 9*9c5db199SXin Licoupling and make it easier to test, but also defines module functions for 10*9c5db199SXin Liconvenience and normal usage. 11*9c5db199SXin Li 12*9c5db199SXin LiWhile there is a root_url property exposed, please refrain from using it to 13*9c5db199SXin Liconstruct URLs and instead add a suitable method to AfeUrls. 14*9c5db199SXin Li 15*9c5db199SXin Li""" 16*9c5db199SXin Li 17*9c5db199SXin Liimport logging 18*9c5db199SXin Lifrom six.moves import urllib 19*9c5db199SXin Liimport six.moves.urllib.parse 20*9c5db199SXin Liimport sys 21*9c5db199SXin Li 22*9c5db199SXin Liimport common 23*9c5db199SXin Lifrom autotest_lib.client.common_lib import global_config 24*9c5db199SXin Li 25*9c5db199SXin Lilogger = logging.getLogger(__name__) 26*9c5db199SXin Li 27*9c5db199SXin Li 28*9c5db199SXin Liclass AfeUrls(object): 29*9c5db199SXin Li 30*9c5db199SXin Li """Class for getting AFE URLs.""" 31*9c5db199SXin Li 32*9c5db199SXin Li def __init__(self, root_url): 33*9c5db199SXin Li """Initialize instance. 34*9c5db199SXin Li 35*9c5db199SXin Li @param root_url: AFE root URL. 36*9c5db199SXin Li 37*9c5db199SXin Li """ 38*9c5db199SXin Li self._root_url_parts = six.moves.urllib.parse.urlsplit(root_url) 39*9c5db199SXin Li 40*9c5db199SXin Li _DEFAULT_URL = 'http://%s/afe/' 41*9c5db199SXin Li 42*9c5db199SXin Li def __hash__(self): 43*9c5db199SXin Li return hash(self.root_url) 44*9c5db199SXin Li 45*9c5db199SXin Li def __eq__(self, other): 46*9c5db199SXin Li if isinstance(other, type(self)): 47*9c5db199SXin Li return self.root_url == other.root_url 48*9c5db199SXin Li else: 49*9c5db199SXin Li return NotImplemented 50*9c5db199SXin Li 51*9c5db199SXin Li @classmethod 52*9c5db199SXin Li def from_hostname(cls, hostname): 53*9c5db199SXin Li """Create AfeUrls given only a hostname, assuming default URL path. 54*9c5db199SXin Li 55*9c5db199SXin Li @param hostname: Hostname of AFE. 56*9c5db199SXin Li @returns: AfeUrls instance. 57*9c5db199SXin Li 58*9c5db199SXin Li """ 59*9c5db199SXin Li return cls(cls._DEFAULT_URL % (hostname,)) 60*9c5db199SXin Li 61*9c5db199SXin Li def _geturl(self, params): 62*9c5db199SXin Li """Get AFE URL. 63*9c5db199SXin Li 64*9c5db199SXin Li All AFE URLs have the format: 65*9c5db199SXin Li 66*9c5db199SXin Li http://host/afe/#param1=val1¶m2=val2 67*9c5db199SXin Li 68*9c5db199SXin Li This function constructs such a URL given a mapping of parameters. 69*9c5db199SXin Li 70*9c5db199SXin Li @param params: Mapping of URL parameters. 71*9c5db199SXin Li @returns: URL string. 72*9c5db199SXin Li 73*9c5db199SXin Li """ 74*9c5db199SXin Li scheme, netloc, path, query, _fragment = self._root_url_parts 75*9c5db199SXin Li fragment = urllib.parse.urlencode(params) 76*9c5db199SXin Li return six.moves.urllib.parse.SplitResult( 77*9c5db199SXin Li scheme, netloc, path, query, fragment).geturl() 78*9c5db199SXin Li 79*9c5db199SXin Li @property 80*9c5db199SXin Li def root_url(self): 81*9c5db199SXin Li """Canonical root URL. 82*9c5db199SXin Li 83*9c5db199SXin Li Note that this may not be the same as the URL passed into the 84*9c5db199SXin Li constructor, due to canonicalization. 85*9c5db199SXin Li 86*9c5db199SXin Li """ 87*9c5db199SXin Li return self._root_url_parts.geturl() 88*9c5db199SXin Li 89*9c5db199SXin Li def get_host_url(self, host_id): 90*9c5db199SXin Li """Get AFE URL for the given host. 91*9c5db199SXin Li 92*9c5db199SXin Li @param host_id: Host id. 93*9c5db199SXin Li @returns: URL string. 94*9c5db199SXin Li 95*9c5db199SXin Li """ 96*9c5db199SXin Li return self._geturl({'tab_id': 'view_host', 'object_id': host_id}) 97*9c5db199SXin Li 98*9c5db199SXin Li 99*9c5db199SXin Li_CONFIG = global_config.global_config 100*9c5db199SXin Li_HOSTNAME = _CONFIG.get_config_value('SERVER', 'hostname') 101*9c5db199SXin Liif not _HOSTNAME: 102*9c5db199SXin Li logger.critical('[SERVER] hostname missing from the config file.') 103*9c5db199SXin Li sys.exit(1) 104*9c5db199SXin Li 105*9c5db199SXin Li_singleton_afe_urls = AfeUrls.from_hostname(_HOSTNAME) 106*9c5db199SXin LiROOT_URL = _singleton_afe_urls.root_url 107*9c5db199SXin Liget_host_url = _singleton_afe_urls.get_host_url 108