in api/model/traffic/heron.py [0:0]
def get(self, topology_id) -> Tuple[Dict[str, Any], int]:
# Make sure we have the args we need
errors: List[Dict[str, str]] = []
if "cluster" not in request.args:
errors.append({"type": "MissingParameter",
"error": "'cluster' parameter should be supplied"})
if "environ" not in request.args:
errors.append({"type": "MissingParameter",
"error": "'environ' parameter should be supplied"})
if "model" not in request.args:
errors.append({"type": "MissingParameter",
"error": ("At least one 'model' parameter should "
"be supplied. Supply 'all' to run all "
"configured models")})
# Return useful errors to the client if any parameters are missing
if errors:
return {"errors": errors}, 400
LOG.info("Traffic prediction requested for Heron topology: %s on "
"cluster: %s in environment: %s", topology_id,
request.args["cluster"], request.args["environ"])
# Make sure we have a current graph representing the physical plan for
# the topology
try:
graph_check(self.graph_client, self.model_config, self.tracker_url,
request.args["cluster"], request.args["environ"],
topology_id)
except Exception as err:
LOG.error("Error running graph check for topology: %s -> %s",
topology_id, str(err))
errors.append({"topology": topology_id,
"type": str(type(err)),
"error": str(err)})
return {"errors": errors}, 400
output: Dict[str, Any] = {}
output["errors"] = {}
output["results"] = {}
if "all" in request.args.getlist("model"):
LOG.info("Running all configured Heron traffic performance models")
models = self.models.keys()
else:
models = request.args.getlist("model")
# Convert the request.args to a dict suitable for passing as **kwargs
model_kwargs: Dict[str, Any] = \
utils.convert_wimd_to_dict(request.args)
# Remove the models list from the kwargs as it is only needed by this
# method, same with topology_id, cluster and environ values
model_kwargs.pop("model")
model_kwargs.pop("cluster")
model_kwargs.pop("environ")
output = {}
for model_name in models:
LOG.info("Running traffic performance model %s", model_name)
model: HeronTrafficModel = self.models[model_name]
try:
results: Dict[str, Any] = model.predict_traffic(
topology_id=topology_id,
cluster=request.args.get("cluster"),
environ=request.args.get("environ"),
**model_kwargs)
except Exception as err:
LOG.error("Error running model: %s -> %s", model.name,
str(err))
errors.append({"model": model.name, "type": str(type(err)),
"error": str(err)})
else:
output[model_name] = results
if errors:
return {"errors": errors}, 500
return output, 200