#!/usr/bin/env python3
from osmo_gsm_tester.testenv import *
import os

# Overlay suite-specific templates folder if it exists
if os.path.isdir(os.path.join(os.path.dirname(__file__), 'templates')):
  tenv.set_overlay_template_dir(os.path.join(os.path.dirname(__file__), 'templates'))

# Retrieve the number of physical ue from the test suite configuration.
test_config = tenv.config_test_specific()
nof_ue = int(test_config.get("nof_physical_ue", 1))

print(f'Number of physical ue: {nof_ue}')

ue_li = []

# Get the ue from the test configuration.
for n in range(0, nof_ue):
  ue_li.append(tenv.modem())
  print(f'ue index{n}: {ue_li[n]}')

epc = tenv.epc()
enb = tenv.enb()

iperf3srv = []
for n in range(0, nof_ue):
  iperf3srv.append(tenv.iperf3srv({'addr': epc.tun_addr()}))
  iperf3srv[n].set_run_node(epc.run_node())
  iperf3srv[n].set_port(iperf3srv[n].DEFAULT_SRV_PORT + n)

# Set the iperf clients in the ue.
iperf3cli = []
for n in range(0, nof_ue):
  iperf3cli.append(iperf3srv[n].create_client())
  iperf3cli[n].set_run_node(ue_li[n].run_node())

for n in range(0, nof_ue):
  epc.subscriber_add(ue_li[n])
epc.start()

enb.ue_add(ue_li[0])
enb.start(epc)

print('waiting for ENB to connect to EPC...')
wait(epc.enb_is_connected, enb)
print('ENB is connected to EPC')

for n in range(0, nof_ue):
  ue_li[n].connect(enb)

for n in range(0, nof_ue):
  iperf3srv[n].start()

proc_li = []

# Attach all the ue's.
for n in range(0, nof_ue):
  max_rate = enb.ue_max_rate(downlink=False, num_carriers=ue_li[n].num_carriers)
  client = iperf3cli[n].prepare_test_proc(iperf3cli[n].DIR_UL, ue_li[n].netns(), bitrate=max_rate)
  print(f'Iperf client type: {type(client)}')
  proc_li.append(client)

for n in range(0, nof_ue):
  print(f'waiting for UE {n} to attach...')
  wait(ue_li[n].is_registered)
  print(f'UE {n} is attached')

# Execute the iperfs and wait for its finish.
try:
  for proc in proc_li:
    proc.launch()
  for proc in proc_li:
    proc.wait()
except Exception as e:
  for proc in proc_li:
    try:
      proc.terminate()
    except Exception:
      print("Exception while terminanting process %r" % repr(process))
  raise e

for n in range(0, nof_ue):
  iperf3cli[n].print_results()
  iperf3srv[n].print_results(iperf3cli[n].proto() == iperf3cli[n].PROTO_UDP)

# 80% of the maximum rate for half of the test duration
out = ''
for n in range(0, nof_ue):
  half_duration = int(round(iperf3cli[n].time_sec() / 2))
  max_rate = enb.ue_max_rate(downlink=False, num_carriers=ue_li[n].num_carriers)
  res_str = ue_li[n].verify_metric(max_rate * 0.8, operation='max_rolling_avg', metric='ul_brate', criterion='gt', window=half_duration)
  print(res_str)
  out += res_str
  if n != nof_ue - 1:
    out += '\n'

test.set_report_stdout(out)
