aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTibor Frank <tifrank@cisco.com>2020-02-07 14:07:07 +0100
committerTibor Frank <tifrank@cisco.com>2020-02-10 10:55:38 +0000
commit8bb7c4f510ca7b02469a3d2f92592179e2ed8ea2 (patch)
tree786f33697595761eb633ce51f78c45a2185cf420
parent36118c00c21b9408a4409e2529131fbcbdc2ad0a (diff)
PAL: Latency by percentile
Change-Id: I413271f4b1fad801463fb7f8f16112aedc0d058b Signed-off-by: Tibor Frank <tifrank@cisco.com> (cherry picked from commit c1335b81c08aeeb5d45af39d45ce02dc1a7d4235)
-rw-r--r--docs/report/index.html.template1
-rw-r--r--docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/2n_clx.rst3
-rw-r--r--docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/2n_skx.rst3
-rw-r--r--docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_hsw.rst3
-rw-r--r--docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_skx.rst3
-rw-r--r--docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_tsh.rst3
-rw-r--r--docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/index.rst33
-rw-r--r--docs/report/vpp_performance_tests/index.rst1
-rw-r--r--resources/tools/presentation/generator_plots.py123
-rw-r--r--resources/tools/presentation/specification.yaml75
-rw-r--r--resources/tools/presentation/specification_parser.py7
11 files changed, 165 insertions, 90 deletions
diff --git a/docs/report/index.html.template b/docs/report/index.html.template
index cbbde1ed25..9541fa0e78 100644
--- a/docs/report/index.html.template
+++ b/docs/report/index.html.template
@@ -22,6 +22,7 @@ CSIT-2001
vpp_performance_tests/packet_latency_graphs/index
vpp_performance_tests/hdrh_packet_latency_graphs/index
vpp_performance_tests/hdrh_packet_latency_percentile_graphs/index
+ vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/index
vpp_performance_tests/soak_tests/index
vpp_performance_tests/reconf_tests/index
vpp_performance_tests/nf_service_density/index
diff --git a/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/2n_clx.rst b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/2n_clx.rst
new file mode 100644
index 0000000000..6667f9539a
--- /dev/null
+++ b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/2n_clx.rst
@@ -0,0 +1,3 @@
+2n-clx
+======
+
diff --git a/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/2n_skx.rst b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/2n_skx.rst
new file mode 100644
index 0000000000..61baf8fcbf
--- /dev/null
+++ b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/2n_skx.rst
@@ -0,0 +1,3 @@
+2n-skx
+======
+
diff --git a/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_hsw.rst b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_hsw.rst
new file mode 100644
index 0000000000..53c253c009
--- /dev/null
+++ b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_hsw.rst
@@ -0,0 +1,3 @@
+3n-hsw
+======
+
diff --git a/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_skx.rst b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_skx.rst
new file mode 100644
index 0000000000..60840bbb1e
--- /dev/null
+++ b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_skx.rst
@@ -0,0 +1,3 @@
+3n-skx
+======
+
diff --git a/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_tsh.rst b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_tsh.rst
new file mode 100644
index 0000000000..7fe42625f7
--- /dev/null
+++ b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_tsh.rst
@@ -0,0 +1,3 @@
+3n-tsh
+======
+
diff --git a/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/index.rst b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/index.rst
new file mode 100644
index 0000000000..1ffc2d6ed0
--- /dev/null
+++ b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/index.rst
@@ -0,0 +1,33 @@
+
+.. raw:: latex
+
+ \clearpage
+
+.. _VPP_HDRH_Packet_Latency_by_Percentile:
+
+Latency by Percentile Distribution
+==================================
+
+Latency results are generated from a single execution of NDRPDR discovery
+test across physical testbeds hosted LF FD.io labs: 3n-hsw, 2n-skx, 3n-
+skx, 3n-tsh, 2n-clx.
+
+.. note::
+
+ Test results have been generated by
+ `FD.io test executor vpp performance job 2n-skx`_,
+ `FD.io test executor vpp performance job 3n-skx`_,
+ `FD.io test executor vpp performance job 2n-skx`_,
+ `FD.io test executor vpp performance job 3n-hsw`_ and
+ `FD.io test executor vpp performance job 3n-tsh`_ with RF
+ result files csit-vpp-perf-|srelease|-\*.zip
+ `archived here <../../_static/archive/>`_.
+
+.. toctree::
+ :maxdepth: 3
+
+ 2n_skx
+ 3n_skx
+ 2n_clx
+ 3n_hsw
+ 3n_tsh
diff --git a/docs/report/vpp_performance_tests/index.rst b/docs/report/vpp_performance_tests/index.rst
index 042ee4fc24..52a9b19085 100644
--- a/docs/report/vpp_performance_tests/index.rst
+++ b/docs/report/vpp_performance_tests/index.rst
@@ -10,6 +10,7 @@ VPP Performance
packet_latency_graphs/index
hdrh_packet_latency_graphs/index
hdrh_packet_latency_percentile_graphs/index
+ hdrh_packet_latency_by_percentile_graphs/index
soak_tests/index
reconf_tests/index
nf_service_density/index
diff --git a/resources/tools/presentation/generator_plots.py b/resources/tools/presentation/generator_plots.py
index 729c2cc72c..285e7ab51d 100644
--- a/resources/tools/presentation/generator_plots.py
+++ b/resources/tools/presentation/generator_plots.py
@@ -40,7 +40,7 @@ COLORS = [u"SkyBlue", u"Olive", u"Purple", u"Coral", u"Indigo", u"Pink",
u"LightGreen", u"LightSeaGreen", u"LightSkyBlue", u"Maroon",
u"MediumSeaGreen", u"SeaGreen", u"LightSlateGrey"]
-REGEX_NIC = re.compile(r'\d*ge\dp\d\D*\d*-')
+REGEX_NIC = re.compile(r'(\d*ge\dp\d\D*\d*)-')
def generate_plots(spec, data):
@@ -199,9 +199,17 @@ def plot_hdrh_lat_by_percentile(plot, input_data):
f" Creating the data set for the {plot.get(u'type', u'')} "
f"{plot.get(u'title', u'')}."
)
- data = input_data.filter_tests_by_name(
- plot, params=[u"latency", u"throughput", u"parent", u"tags", u"type"])
- if data is None or len(data[0][0]) == 0:
+ if plot.get(u"include", None):
+ data = input_data.filter_tests_by_name(
+ plot,
+ params=[u"latency", u"throughput", u"parent", u"tags", u"type"]
+ )[0][0]
+ else:
+ job = list(plot[u"data"].keys())[0]
+ build = str(plot[u"data"][job][0])
+ data = input_data.tests(job, build)
+
+ if data is None or len(data) == 0:
logging.error(u"No data.")
return
@@ -209,64 +217,64 @@ def plot_hdrh_lat_by_percentile(plot, input_data):
u"LAT0",
u"PDR10",
u"PDR50",
- u"PDR90",
- u"NDR",
- u"PDR"
+ u"PDR90"
]
- for test in data[0][0]:
+ file_links = plot.get(u"output-file-links", None)
+ target_links = plot.get(u"target-links", None)
+
+ for test in data:
try:
if test[u"type"] not in (u"NDRPDR",):
logging.warning(f"Invalid test type: {test[u'type']}")
continue
name = re.sub(REGEX_NIC, u"", test[u"parent"].
replace(u'-ndrpdr', u'').replace(u'2n1l-', u''))
+ try:
+ nic = re.search(REGEX_NIC, test[u"parent"]).group(1)
+ except IndexError:
+ nic = u""
+ name_link = f"{nic}-{test[u'name']}"
- logging.info(f" Generating the graph: {name}")
-
- pdr = test[u"throughput"][u"PDR"][u"LOWER"]
- ndr = test[u"throughput"][u"NDR"][u"LOWER"]
+ logging.info(f" Generating the graph: {name_link}")
desc = {
- u"LAT0": u"No load",
- u"PDR10": f"10% PDR background traffic ({(pdr*1e-7):.2f}Mpps)",
- u"PDR50": f"50% PDR background traffic ({(pdr*5e-7):.2f}Mpps)",
- u"PDR90": f"90% PDR background traffic ({(pdr*9e-7):.2f}Mpps)",
- u"PDR": f"100% PDR background traffic ({(pdr*1e-6):.2f}Mpps)",
- u"NDR10": f"10% NDR background traffic ({(ndr*1e-7):.2f}Mpps)",
- u"NDR50": f"50% NDR background traffic ({(ndr*5e-7):.2f}Mpps)",
- u"NDR90": f"90% NDR background traffic ({(ndr*9e-7):.2f}Mpps)",
- u"NDR": f"100% NDR background traffic ({(ndr*1e-6):.2f}Mpps)"
+ u"LAT0": u"No-load.",
+ u"PDR10": u"Low-load, 10% PDR.",
+ u"PDR50": u"Mid-load, 50% PDR.",
+ u"PDR90": u"High-load, 90% PDR.",
+ u"PDR": u"Full-load, 100% PDR.",
+ u"NDR10": u"Low-load, 10% NDR.",
+ u"NDR50": u"Mid-load, 50% NDR.",
+ u"NDR90": u"High-load, 90% NDR.",
+ u"NDR": u"Full-load, 100% NDR."
}
- fig = make_subplots(
- rows=1,
- cols=2,
- column_widths=[0.5, 0.5],
- shared_xaxes=True,
- subplot_titles=(
- u"<b>Direction: W-E</b>",
- u"<b>Direction: E-W</b>"
- ),
- specs=[[{"type": "scatter"}, {"type": "scatter"}], ]
- )
+ fig = plgo.Figure()
layout = deepcopy(plot[u"layout"])
for color, graph in enumerate(graphs):
for idx, direction in enumerate((u"direction1", u"direction2")):
- xaxis = list()
- yaxis = list()
- hovertext = list()
+ xaxis = [0.0, ]
+ yaxis = [0.0, ]
+ hovertext = [
+ f"<b>{desc[graph]}</b><br>"
+ f"Direction: {(u'W-E', u'E-W')[idx % 2]}<br>"
+ f"Percentile: 0.0%<br>"
+ f"Latency: 0.0uSec"
+ ]
decoded = hdrh.histogram.HdrHistogram.decode(
test[u"latency"][graph][direction][u"hdrh"]
)
for item in decoded.get_recorded_iterator():
percentile = item.percentile_level_iterated_to
- xaxis.append((100.0 / (100.0 - percentile))
- if percentile != 100.0 else 1e6)
+ if percentile > 99.9:
+ continue
+ xaxis.append(percentile)
yaxis.append(item.value_iterated_to)
hovertext.append(
f"<b>{desc[graph]}</b><br>"
+ f"Direction: {(u'W-E', u'E-W')[idx % 2]}<br>"
f"Percentile: {percentile:.5f}%<br>"
f"Latency: {item.value_iterated_to}uSec"
)
@@ -279,46 +287,37 @@ def plot_hdrh_lat_by_percentile(plot, input_data):
legendgroup=desc[graph],
showlegend=bool(idx),
line=dict(
- color=COLORS[color]
+ color=COLORS[color],
+ dash=u"solid" if idx % 2 else u"dash"
),
hovertext=hovertext,
hoverinfo=u"text"
- ),
- row=1,
- col=idx + 1,
- )
- fig.update_xaxes(
- row=1,
- col=idx + 1,
- **layout[u"xaxis"]
- )
- fig.update_yaxes(
- row=1,
- col=idx + 1,
- **layout[u"yaxis"]
+ )
)
- try:
- del layout[u"xaxis"]
- except KeyError:
- pass
- try:
- del layout[u"yaxis"]
- except KeyError:
- pass
layout[u"title"][u"text"] = f"<b>Latency:</b> {name}"
fig.update_layout(layout)
# Create plot
- file_name = (f"{plot[u'output-file']}-"
- f"{name}"
- f"{plot.get(u'output-file-type', u'.html')}")
+ file_name = f"{plot[u'output-file']}-{name_link}.html"
logging.info(f" Writing file {file_name}")
try:
# Export Plot
ploff.plot(fig, show_link=False, auto_open=False,
filename=file_name)
+ # Add link to the file:
+ if file_links and target_links:
+ with open(file_links, u"a") as fw:
+ fw.write(
+ f"- `{name_link} "
+ f"<{target_links}/{file_name.split(u'/')[-1]}>`_\n"
+ )
+ except FileNotFoundError as err:
+ logging.error(
+ f"Not possible to write the link to the file "
+ f"{file_links}\n{err}"
+ )
except PlotlyError as err:
logging.error(f" Finished with error: {repr(err)}")
diff --git a/resources/tools/presentation/specification.yaml b/resources/tools/presentation/specification.yaml
index 7f4b1c135f..f58c4b9989 100644
--- a/resources/tools/presentation/specification.yaml
+++ b/resources/tools/presentation/specification.yaml
@@ -76,6 +76,9 @@
DIR[DTO,PERF,VPP,3N,DNV]: "{DIR[DTO]}/vpp_performance_operational_data_3n_dnv"
DIR[DTO,PERF,VPP,2N,DNV]: "{DIR[DTO]}/vpp_performance_operational_data_2n_dnv"
+ # Latencies:
+ DIR[LAT,VPP]: "{DIR[WORKING,SRC]}/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs"
+
# .css patch file to fix tables generated by Sphinx
DIR[CSS_PATCH_FILE]: "{DIR[STATIC]}/theme_overrides.css"
DIR[CSS_PATCH_FILE2]: "{DIR[WORKING,SRC,STATIC]}/theme_overrides.css"
@@ -26863,35 +26866,51 @@
################################################################################
- type: "plot"
- title: "Latency by percentile: 2n-skx-xxv710"
+ title: "Latency by percentile: 2n-skx"
algorithm: "plot_hdrh_lat_by_percentile"
- output-file: "{DIR[STATIC,VPP]}/2n-skx-xxv710-hdrh-lat-percentile"
+ output-file: "{DIR[STATIC,VPP]}/hdrh-lat-percentile-2n-skx"
+ output-file-links: "{DIR[LAT,VPP]}/2n_skx.rst"
+ target-links: "../../_static/vpp"
data: "plot-vpp-hdrh-lat-2n-skx"
- include:
- - "Tests.Vpp.Perf.Ip4.2N1L-25Ge2P1Xxv710-Dot1Q-Ip4Base-Ndrpdr.64B-2t1c-dot1q-ip4base-ndrpdr"
- - "Tests.Vpp.Perf.Ip4.2N1L-25Ge2P1Xxv710-Ethip4-Ip4Base-Ndrpdr.64B-2t1c-ethip4-ip4base-ndrpdr"
- - "Tests.Vpp.Perf.Ip4.2N1L-25Ge2P1Xxv710-Ethip4-Ip4Scale20K-Ndrpdr.64B-2t1c-ethip4-ip4scale20k-ndrpdr"
- - "Tests.Vpp.Perf.Ip4.2N1L-25Ge2P1Xxv710-Ethip4-Ip4Scale200K-Ndrpdr.64B-2t1c-ethip4-ip4scale200k-ndrpdr"
- - "Tests.Vpp.Perf.Ip4.2N1L-25Ge2P1Xxv710-Ethip4-Ip4Scale2M-Ndrpdr.64B-2t1c-ethip4-ip4scale2m-ndrpdr"
- - "Tests.Vpp.Perf.Container Memif.2N1L-25Ge2P1Xxv710-Eth-L2Xcbase-Eth-2Memif-1Dcr-Ndrpdr.64B-2t1c-eth-l2xcbase-eth-2memif-1dcr-ndrpdr"
- - "Tests.Vpp.Perf.Container Memif.2N1L-25Ge2P1Xxv710-Dot1Q-L2Bdbasemaclrn-Eth-2Memif-1Dcr-Ndrpdr.64B-2t1c-dot1q-l2bdbasemaclrn-eth-2memif-1dcr-ndrpdr"
- - "Tests.Vpp.Perf.Container Memif.2N1L-25Ge2P1Xxv710-Eth-L2Bdbasemaclrn-Eth-2Memif-1Dcr-Ndrpdr.64B-2t1c-eth-l2bdbasemaclrn-eth-2memif-1dcr-ndrpdr"
- - "Tests.Vpp.Perf.Container Memif.2N1L-25Ge2P1Xxv710-Ethip4-Ip4Base-Eth-2Memif-1Dcr-Ndrpdr.64B-2t1c-ethip4-ip4base-eth-2memif-1dcr-ndrpdr"
- - "Tests.Vpp.Perf.L2.2N1L-10Ge2P1X710-Avf-Eth-L2Xcbase-Ndrpdr.64B-2t1c-avf-eth-l2xcbase-ndrpdr"
- - "Tests.Vpp.Perf.L2.2N1L-10Ge2P1X710-Avf-Dot1Q-L2Bdbasemaclrn-Ndrpdr.64B-2t1c-avf-dot1q-l2bdbasemaclrn-ndrpdr"
- - "Tests.Vpp.Perf.L2.2N1L-10Ge2P1X710-Avf-Eth-L2Bdbasemaclrn-Ndrpdr.64B-2t1c-avf-eth-l2bdbasemaclrn-ndrpdr"
- - "Tests.Vpp.Perf.L2.2N1L-10Ge2P1X710-Dot1Q-L2Bdbasemaclrn-Ndrpdr.64B-2t1c-dot1q-l2bdbasemaclrn-ndrpdr"
- - "Tests.Vpp.Perf.L2.2N1L-10Ge2P1X710-Eth-L2Bdbasemaclrn-Ndrpdr.64B-2t1c-eth-l2bdbasemaclrn-ndrpdr"
- - "Tests.Vpp.Perf.L2.2N1L-10Ge2P1X710-Eth-L2Bdscale1Mmaclrn-Ndrpdr.64B-2t1c-eth-l2bdscale1mmaclrn-ndrpdr"
- - "Tests.Vpp.Perf.L2.25Ge2P1Xxv710-Eth-L2Bdbasemaclrn-Ndrpdr.64B-2t1c-eth-l2bdbasemaclrn-ndrpdr"
- - "Tests.Vpp.Perf.Vm Vhost.2N1L-25Ge2P1Xxv710-Eth-L2Xcbase-Eth-2Vhostvr1024-1Vm-Ndrpdr.64B-2t1c-eth-l2xcbase-eth-2vhostvr1024-1vm-ndrpdr"
- - "Tests.Vpp.Perf.Vm Vhost.2N1L-25Ge2P1Xxv710-Dot1Q-L2Bdbasemaclrn-Eth-2Vhostvr1024-1Vm-Ndrpdr.64B-2t1c-dot1q-l2bdbasemaclrn-eth-2vhostvr1024-1vm-ndrpdr"
- - "Tests.Vpp.Perf.Vm Vhost.2N1L-25Ge2P1Xxv710-Eth-L2Bdbasemaclrn-Eth-2Vhostvr1024-1Vm-Ndrpdr.64B-2t1c-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-ndrpdr"
- - "Tests.Vpp.Perf.Vm Vhost.2N1L-25Ge2P1Xxv710-Ethip4-Ip4Base-Eth-2Vhostvr1024-1Vm-Ndrpdr.64B-2t1c-ethip4-ip4base-eth-2vhostvr1024-1vm-ndrpdr"
- - "Tests.Vpp.Perf.Ip6.2N1L-25Ge2P1Xxv710-Dot1Q-Ip6Base-Ndrpdr.78B-2t1c-dot1q-ip6base-ndrpdr"
- - "Tests.Vpp.Perf.Ip6.2N1L-25Ge2P1Xxv710-Ethip6-Ip6Base-Ndrpdr.78B-2t1c-ethip6-ip6base-ndrpdr"
- - "Tests.Vpp.Perf.Ip6.2N1L-25Ge2P1Xxv710-Ethip6-Ip6Scale20K-Ndrpdr.78B-2t1c-ethip6-ip6scale20k-ndrpdr"
- - "Tests.Vpp.Perf.Ip6.2N1L-25Ge2P1Xxv710-Ethip6-Ip6Scale200K-Ndrpdr.78B-2t1c-ethip6-ip6scale200k-ndrpdr"
- - "Tests.Vpp.Perf.Ip6.2N1L-25Ge2P1Xxv710-Ethip6-Ip6Scale2M-Ndrpdr.78B-2t1c-ethip6-ip6scale2m-ndrpdr"
+ layout:
+ layout: "plot-hdrh-latency-by-percentile"
+
+- type: "plot"
+ title: "Latency by percentile: 3n-skx"
+ algorithm: "plot_hdrh_lat_by_percentile"
+ output-file: "{DIR[STATIC,VPP]}/hdrh-lat-percentile-3n-skx"
+ output-file-links: "{DIR[LAT,VPP]}/3n_skx.rst"
+ target-links: "../../_static/vpp"
+ data: "plot-vpp-hdrh-lat-3n-skx"
+ layout:
+ layout: "plot-hdrh-latency-by-percentile"
+
+- type: "plot"
+ title: "Latency by percentile: 2n-clx"
+ algorithm: "plot_hdrh_lat_by_percentile"
+ output-file: "{DIR[STATIC,VPP]}/hdrh-lat-percentile-2n-clx"
+ output-file-links: "{DIR[LAT,VPP]}/2n_clx.rst"
+ target-links: "../../_static/vpp"
+ data: "plot-vpp-hdrh-lat-2n-clx"
+ layout:
+ layout: "plot-hdrh-latency-by-percentile"
+
+- type: "plot"
+ title: "Latency by percentile: 3n-hsw"
+ algorithm: "plot_hdrh_lat_by_percentile"
+ output-file: "{DIR[STATIC,VPP]}/hdrh-lat-percentile-3n-hsw"
+ output-file-links: "{DIR[LAT,VPP]}/3n_hsw.rst"
+ target-links: "../../_static/vpp"
+ data: "plot-vpp-hdrh-lat-3n-hsw"
+ layout:
+ layout: "plot-hdrh-latency-by-percentile"
+
+- type: "plot"
+ title: "Latency by percentile: 3n-tsh"
+ algorithm: "plot_hdrh_lat_by_percentile"
+ output-file: "{DIR[STATIC,VPP]}/hdrh-lat-percentile-3n-tsh"
+ output-file-links: "{DIR[LAT,VPP]}/3n_tsh.rst"
+ target-links: "../../_static/vpp"
+ data: "plot-vpp-hdrh-lat-3n-tsh"
layout:
layout: "plot-hdrh-latency-by-percentile"
diff --git a/resources/tools/presentation/specification_parser.py b/resources/tools/presentation/specification_parser.py
index ef2fafccae..2360b78f2d 100644
--- a/resources/tools/presentation/specification_parser.py
+++ b/resources/tools/presentation/specification_parser.py
@@ -756,6 +756,13 @@ class Specification:
except KeyError:
pass
+ try:
+ element[u"output-file-links"] = self._replace_tags(
+ element[u"output-file-links"],
+ self._specification[u"environment"][u"paths"])
+ except KeyError:
+ pass
+
# Add data sets to the elements:
if isinstance(element.get(u"data", None), str):
data_set = element[u"data"]