# Copyright (c) 2022 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
"""
import plotly.graph_objects as go
import pandas as pd
import re
from datetime import datetime
from dash import no_update
def trending_tput(data: pd.DataFrame, sel:dict, layout: dict, start: datetime,
end: datetime):
"""
"""
if not sel:
return no_update, no_update
def _generate_trace(ttype: str, name: str, df: pd.DataFrame,
start: datetime, end: datetime):
value = {
"mrr": "result_receive_rate_rate_avg",
"ndr": "result_ndr_lower_rate_value",
"pdr": "result_pdr_lower_rate_value"
}
unit = {
"mrr": "result_receive_rate_rate_unit",
"ndr": "result_ndr_lower_rate_unit",
"pdr": "result_pdr_lower_rate_unit"
}
x_axis = [
d for d in df["start_time"] if d >= start and d <= end
]
hover_txt = list()
for _, row in df.iterrows():
hover_itm = (
f"date: "
f"{row['start_time'].strftime('%d-%m-%Y %H:%M:%S')}
"
f"average [{row[unit[ttype]]}]: "
f"{row[value[ttype]]}
"
f"{row['dut_type']}-ref: {row['dut_version']}
"
f"csit-ref: {row['job']}/{row['build']}"
)
if ttype == "mrr":
stdev = (
f"stdev [{row['result_receive_rate_rate_unit']}]: "
f"{row['result_receive_rate_rate_stdev']}
"
)
else:
stdev = ""
hover_itm = hover_itm.replace("", stdev)
hover_txt.append(hover_itm)
return go.Scatter(
x=x_axis,
y=df[value[ttype]],
name=name,
mode="markers+lines",
text=hover_txt,
hoverinfo=u"text+name"
)
# Generate graph:
fig = go.Figure()
for itm in sel:
phy = itm["phy"].split("-")
if len(phy) == 4:
topo, arch, nic, drv = phy
if drv in ("dpdk", "ixgbe"):
drv = ""
else:
drv += "-"
else:
continue
cadence = \
"weekly" if (arch == "aws" or itm["testtype"] != "mrr") else "daily"
sel_topo_arch = (
f"csit-vpp-perf-"
f"{itm['testtype'] if itm['testtype'] == 'mrr' else 'ndrpdr'}-"
f"{cadence}-master-{topo}-{arch}"
)
df_sel = data.loc[(data["job"] == sel_topo_arch)]
regex = (
f"^.*{nic}.*\.{itm['framesize']}-{itm['core']}-{drv}{itm['test']}-"
f"{'mrr' if itm['testtype'] == 'mrr' else 'ndrpdr'}$"
)
df = df_sel.loc[
df_sel["test_id"].apply(
lambda x: True if re.search(regex, x) else False
)
].sort_values(by="start_time", ignore_index=True)
name = (
f"{itm['phy']}-{itm['framesize']}-{itm['core']}-"
f"{itm['test']}-{itm['testtype']}"
)
fig.add_trace(_generate_trace(itm['testtype'], name, df, start, end))
style={
"vertical-align": "top",
"display": "inline-block",
"width": "80%",
"padding": "5px"
}
layout = layout.get("plot-trending", dict())
fig.update_layout(layout)
return fig, style