xref: /aosp_15_r20/external/autotest/server/afe_urls.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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&param2=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