Skip to content
This repository was archived by the owner on Mar 3, 2023. It is now read-only.

Commit 64e8167

Browse files
authored
Clean tracker top level code (#3602)
* Allow arbitrary whitespace in queries * DRY up Multiply/Divide/Subtract * use snake_case * code simplification
1 parent aa292ef commit 64e8167

31 files changed

+871
-1123
lines changed

heron/tools/tracker/src/python/config.py

+32-44
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
# under the License.
2020

2121
''' config.py '''
22+
import string
2223

2324
from heron.statemgrs.src.python.config import Config as StateMgrConfig
2425

@@ -33,6 +34,7 @@ class Config:
3334
Responsible for reading the yaml config file and
3435
exposing various tracker configs.
3536
"""
37+
FORMATTER_PARAMETERS = {"CLUSTER", "ENVIRON", "TOPOLOGY", "ROLE", "USER"}
3638

3739
def __init__(self, configs):
3840
self.configs = configs
@@ -48,65 +50,51 @@ def load_configs(self):
4850
for extra_link in self.configs[EXTRA_LINKS_KEY]:
4951
self.extra_links.append(self.validate_extra_link(extra_link))
5052

51-
def validate_extra_link(self, extra_link):
53+
def validate_extra_link(self, extra_link: dict) -> None:
5254
"""validate extra link"""
5355
if EXTRA_LINK_NAME_KEY not in extra_link or EXTRA_LINK_FORMATTER_KEY not in extra_link:
5456
raise Exception("Invalid extra.links format. " +
5557
"Extra link must include a 'name' and 'formatter' field")
5658

5759
self.validated_formatter(extra_link[EXTRA_LINK_FORMATTER_KEY])
58-
return extra_link
59-
60-
# pylint: disable=no-self-use
61-
def validated_formatter(self, url_format):
62-
"""validate visualization url format"""
63-
# We try to create a string by substituting all known
64-
# parameters. If an unknown parameter is present, an error
65-
# will be thrown
66-
valid_parameters = {
67-
"${CLUSTER}": "cluster",
68-
"${ENVIRON}": "environ",
69-
"${TOPOLOGY}": "topology",
70-
"${ROLE}": "role",
71-
"${USER}": "user",
72-
}
73-
dummy_formatted_url = url_format
74-
for key, value in list(valid_parameters.items()):
75-
dummy_formatted_url = dummy_formatted_url.replace(key, value)
7660

77-
# All $ signs must have been replaced
78-
if '$' in dummy_formatted_url:
79-
raise Exception("Invalid viz.url.format: %s" % (url_format))
61+
def validated_formatter(self, url_format: str) -> None:
62+
"""Check visualization url format has no unrecongnised parameters."""
63+
# collect the parameters which would be interpolated
64+
formatter_variables = set()
65+
class ValidationHelper:
66+
def __getitem__(self, key):
67+
formatter_variables.add(key)
68+
return ""
69+
70+
string.Template(url_format).safe_substitute(ValidationHelper())
8071

81-
# No error is thrown, so the format is valid.
82-
return url_format
72+
if not formatter_variables <= self.FORMATTER_PARAMETERS:
73+
raise Exception(f"Invalid viz.url.format: {url_format!r}")
8374

84-
def get_formatted_url(self, formatter, execution_state):
75+
@staticmethod
76+
def get_formatted_url(formatter: str, execution_state: dict) -> str:
8577
"""
86-
@param formatter: The template string to interpolate
87-
@param execution_state: The python dict representing JSON execution_state
88-
@return Formatted viz url
78+
Format a url string using values from the execution state.
79+
8980
"""
9081

91-
# Create the parameters based on execution state
92-
common_parameters = {
93-
"${CLUSTER}": execution_state.get("cluster", "${CLUSTER}"),
94-
"${ENVIRON}": execution_state.get("environ", "${ENVIRON}"),
95-
"${TOPOLOGY}": execution_state.get("jobname", "${TOPOLOGY}"),
96-
"${ROLE}": execution_state.get("role", "${ROLE}"),
97-
"${USER}": execution_state.get("submission_user", "${USER}"),
82+
subs = {
83+
var: execution_state[prop]
84+
for prop, var in (
85+
("cluster", "CLUSTER"),
86+
("environ", "ENVIRON"),
87+
("jobname", "TOPOLOGY"),
88+
("role", "ROLE"),
89+
("submission_user", "USER"))
90+
if prop in execution_state
9891
}
99-
100-
formatted_url = formatter
101-
102-
for key, value in list(common_parameters.items()):
103-
formatted_url = formatted_url.replace(key, value)
104-
105-
return formatted_url
92+
return string.Template(formatter).substitute(subs)
10693

10794
def __str__(self):
10895
return "".join((self.config_str(c) for c in self.configs[STATEMGRS_KEY]))
10996

110-
def config_str(self, config):
97+
@staticmethod
98+
def config_str(config):
11199
keys = ("type", "name", "hostport", "rootpath", "tunnelhost")
112-
return "".join("\t{}: {}\n".format(k, config[k]) for k in keys if k in config).rstrip()
100+
return "".join("\t{k}: {config[k]}\n" for k in keys if k in config).rstrip()

heron/tools/tracker/src/python/constants.py

-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
API_VERSION = ""
3434

3535

36-
3736
# Handler Constants
3837

3938
# Parameter Names

heron/tools/tracker/src/python/handlers/containerfilehandler.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def get(self):
6464
path = self.get_argument(constants.PARAM_PATH)
6565
offset = self.get_argument_offset()
6666
length = self.get_argument_length()
67-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
67+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
6868

6969
stmgr_id = "stmgr-" + container
7070
stmgr = topology_info["physical_plan"]["stmgrs"][stmgr_id]
@@ -111,7 +111,7 @@ def get(self):
111111
topology_name = self.get_argument_topology()
112112
container = self.get_argument(constants.PARAM_CONTAINER)
113113
path = self.get_argument(constants.PARAM_PATH)
114-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
114+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
115115

116116
stmgr_id = "stmgr-" + container
117117
stmgr = topology_info["physical_plan"]["stmgrs"][stmgr_id]
@@ -166,7 +166,7 @@ def get(self):
166166
topology_name = self.get_argument_topology()
167167
container = self.get_argument(constants.PARAM_CONTAINER)
168168
path = self.get_argument(constants.PARAM_PATH, default=".")
169-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
169+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
170170

171171
stmgr_id = "stmgr-" + str(container)
172172
stmgr = topology_info["physical_plan"]["stmgrs"][stmgr_id]

heron/tools/tracker/src/python/handlers/exceptionhandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def get(self):
5959
role = self.get_argument_role()
6060
topName = self.get_argument_topology()
6161
component = self.get_argument_component()
62-
topology = self.tracker.getTopologyByClusterRoleEnvironAndName(
62+
topology = self.tracker.get_topology(
6363
cluster, role, environ, topName)
6464
instances = self.get_arguments(constants.PARAM_INSTANCE)
6565
exceptions_logs = yield tornado.gen.Task(self.getComponentException,

heron/tools/tracker/src/python/handlers/exceptionsummaryhandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def get(self):
6060
role = self.get_argument_role()
6161
topology_name = self.get_argument_topology()
6262
component = self.get_argument_component()
63-
topology = self.tracker.getTopologyByClusterRoleEnvironAndName(
63+
topology = self.tracker.get_topology(
6464
cluster, role, environ, topology_name)
6565
instances = self.get_arguments(constants.PARAM_INSTANCE)
6666
exceptions_summary = yield tornado.gen.Task(self.getComponentExceptionSummary,

heron/tools/tracker/src/python/handlers/executionstatehandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def get(self):
5252
role = self.get_argument_role()
5353
environ = self.get_argument_environ()
5454
topology_name = self.get_argument_topology()
55-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
55+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
5656
execution_state = topology_info["execution_state"]
5757
self.write_success_response(execution_state)
5858
except Exception as e:

heron/tools/tracker/src/python/handlers/jmaphandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def get(self):
6565
environ = self.get_argument_environ()
6666
topology_name = self.get_argument_topology()
6767
instance = self.get_argument_instance()
68-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
68+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
6969
ret = yield self.runInstanceJmap(topology_info, instance)
7070
self.write_success_response(ret)
7171
except Exception as e:

heron/tools/tracker/src/python/handlers/jstackhandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def get(self):
6464
environ = self.get_argument_environ()
6565
topology_name = self.get_argument_topology()
6666
instance = self.get_argument_instance()
67-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
67+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
6868
ret = yield self.getInstanceJstack(topology_info, instance)
6969
self.write_success_response(ret)
7070
except Exception as e:

heron/tools/tracker/src/python/handlers/logicalplanhandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def get(self):
8484
role = self.get_argument_role()
8585
environ = self.get_argument_environ()
8686
topology_name = self.get_argument_topology()
87-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
87+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
8888
lplan = topology_info["logical_plan"]
8989

9090
# format the logical plan as required by the web (because of Ambrose)

heron/tools/tracker/src/python/handlers/memoryhistogramhandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def get(self):
6565
environ = self.get_argument_environ()
6666
topology_name = self.get_argument_topology()
6767
instance = self.get_argument_instance()
68-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
68+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
6969
ret = yield self.getInstanceMemoryHistogram(topology_info, instance)
7070
self.write_success_response(ret)
7171
except Exception as e:

heron/tools/tracker/src/python/handlers/metadatahandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def get(self):
6767
role = self.get_argument_role()
6868
environ = self.get_argument_environ()
6969
topology_name = self.get_argument_topology()
70-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
70+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
7171
metadata = topology_info["metadata"]
7272
self.write_success_response(metadata)
7373
except Exception as e:

heron/tools/tracker/src/python/handlers/metricshandler.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def get(self):
6464
component = self.get_argument_component()
6565
metric_names = self.get_required_arguments_metricnames()
6666

67-
topology = self.tracker.getTopologyByClusterRoleEnvironAndName(
67+
topology = self.tracker.get_topology(
6868
cluster, role, environ, topology_name)
6969

7070
interval = int(self.get_argument(constants.PARAM_INTERVAL, default=-1))
@@ -84,7 +84,7 @@ def get(self):
8484
def getComponentMetrics(self,
8585
tmaster,
8686
componentName,
87-
metricNames,
87+
metric_names,
8888
instances,
8989
interval,
9090
callback=None):
@@ -116,8 +116,8 @@ def getComponentMetrics(self,
116116
if len(instances) > 0:
117117
for instance in instances:
118118
metricRequest.instance_id.append(instance)
119-
for metricName in metricNames:
120-
metricRequest.metric.append(metricName)
119+
for metric_name in metric_names:
120+
metricRequest.metric.append(metric_name)
121121
metricRequest.interval = interval
122122

123123
# Serialize the metricRequest to send as a payload

heron/tools/tracker/src/python/handlers/metricsqueryhandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def get(self):
5858
role = self.get_argument_role()
5959
environ = self.get_argument_environ()
6060
topology_name = self.get_argument_topology()
61-
topology = self.tracker.getTopologyByClusterRoleEnvironAndName(
61+
topology = self.tracker.get_topology(
6262
cluster, role, environ, topology_name)
6363

6464
start_time = self.get_argument_starttime()

heron/tools/tracker/src/python/handlers/metricstimelinehandler.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@ def get(self):
6868
self.validateInterval(start_time, end_time)
6969
instances = self.get_arguments(constants.PARAM_INSTANCE)
7070

71-
topology = self.tracker.getTopologyByClusterRoleEnvironAndName(
71+
topology = self.tracker.get_topology(
7272
cluster, role, environ, topology_name)
73-
metrics = yield tornado.gen.Task(metricstimeline.getMetricsTimeline,
73+
metrics = yield tornado.gen.Task(metricstimeline.get_metrics_timeline,
7474
topology.tmaster, component, metric_names,
7575
instances, int(start_time), int(end_time))
7676
self.write_success_response(metrics)

heron/tools/tracker/src/python/handlers/packingplanhandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def get(self):
5353
role = self.get_argument_role()
5454
environ = self.get_argument_environ()
5555
topology_name = self.get_argument_topology()
56-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
56+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
5757
packing_plan = topology_info["packing_plan"]
5858
self.write_success_response(packing_plan)
5959
except Exception as e:

heron/tools/tracker/src/python/handlers/physicalplanhandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def get(self):
5353
role = self.get_argument_role()
5454
environ = self.get_argument_environ()
5555
topology_name = self.get_argument_topology()
56-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
56+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
5757
physical_plan = topology_info["physical_plan"]
5858
self.write_success_response(physical_plan)
5959
except Exception as e:

heron/tools/tracker/src/python/handlers/pidhandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def get(self):
8282
environ = self.get_argument_environ()
8383
topology_name = self.get_argument_topology()
8484
instance = self.get_argument_instance()
85-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
85+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
8686
result = yield getInstancePid(topology_info, instance)
8787
self.write_success_response(result)
8888
except Exception as e:

heron/tools/tracker/src/python/handlers/runtimestatehandler.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,10 @@ def get(self):
110110
role = self.get_argument_role()
111111
environ = self.get_argument_environ()
112112
topology_name = self.get_argument_topology()
113-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
113+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
114114
runtime_state = topology_info["runtime_state"]
115115
runtime_state["topology_version"] = topology_info["metadata"]["release_version"]
116-
topology = self.tracker.getTopologyByClusterRoleEnvironAndName(
116+
topology = self.tracker.get_topology(
117117
cluster, role, environ, topology_name)
118118
reg_summary = yield tornado.gen.Task(self.getStmgrsRegSummary, topology.tmaster)
119119
for stmgr, reg in list(reg_summary.items()):

heron/tools/tracker/src/python/handlers/schedulerlocationhandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def get(self):
5353
role = self.get_argument_role()
5454
environ = self.get_argument_environ()
5555
topology_name = self.get_argument_topology()
56-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
56+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
5757
scheduler_location = topology_info["scheduler_location"]
5858
self.write_success_response(scheduler_location)
5959
except Exception as e:

heron/tools/tracker/src/python/handlers/stateshandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ def get(self):
9090
if environ not in ret[cluster]:
9191
ret[cluster][environ] = {}
9292
try:
93-
topology_info = self.tracker.getTopologyInfo(topology.name, cluster, role, environ)
93+
topology_info = self.tracker.get_topology_info(topology.name, cluster, role, environ)
9494
if topology_info and "execution_state" in topology_info:
9595
ret[cluster][environ][topology.name] = topology_info["execution_state"]
9696
except Exception:

heron/tools/tracker/src/python/handlers/topologyconfighandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def get(self):
5353
role = self.get_argument_role()
5454
environ = self.get_argument_environ()
5555
topology_name = self.get_argument_topology()
56-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
56+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
5757
config = topology_info["physical_plan"]["config"]
5858
self.write_success_response(config)
5959
except Exception as e:

heron/tools/tracker/src/python/handlers/topologyhandler.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def get(self):
5454
role = self.get_argument_role()
5555
environ = self.get_argument_environ()
5656
topology_name = self.get_argument_topology()
57-
topology_info = self.tracker.getTopologyInfo(topology_name, cluster, role, environ)
57+
topology_info = self.tracker.get_topology_info(topology_name, cluster, role, environ)
5858
self.write_success_response(topology_info)
5959
except Exception as e:
6060
Log.debug(traceback.format_exc())

0 commit comments

Comments
 (0)