diff --git a/src/webui/Dockerfile b/src/webui/Dockerfile index 7c718890fcf3f07b32f66eca2ecab41f2eb30fbb..2a1510954dbd2a9b0817f94145baaa22ac9d3a3f 100644 --- a/src/webui/Dockerfile +++ b/src/webui/Dockerfile @@ -79,6 +79,7 @@ COPY --chown=webui:webui src/device/__init__.py device/__init__.py COPY --chown=webui:webui src/device/client/. device/client/ COPY --chown=webui:webui src/load_generator/__init__.py load_generator/__init__.py COPY --chown=webui:webui src/load_generator/client/. load_generator/client/ +COPY --chown=webui:webui src/load_generator/tools/. load_generator/tools/ COPY --chown=webui:webui src/service/__init__.py service/__init__.py COPY --chown=webui:webui src/service/client/. service/client/ COPY --chown=webui:webui src/slice/__init__.py slice/__init__.py diff --git a/src/webui/service/load_gen/forms.py b/src/webui/service/load_gen/forms.py index 4e0020b04f33152de382f5b93af9735f8d737f92..6e56a4f393061445d68196514b16dbb2c504672e 100644 --- a/src/webui/service/load_gen/forms.py +++ b/src/webui/service/load_gen/forms.py @@ -14,7 +14,12 @@ from flask_wtf import FlaskForm from wtforms import BooleanField, FloatField, IntegerField, StringField, SubmitField -from wtforms.validators import DataRequired, NumberRange +from wtforms.validators import DataRequired, NumberRange, Regexp +from load_generator.tools.ListScalarRange import RE_SCALAR_RANGE_LIST + +DEFAULT_AVAILABILITY = '0.0..99.9999' +DEFAULT_CAPACITY_GBPS = '0.1..100.00' #'10, 40, 50, 100, 400' +DEFAULT_E2E_LATENCY_MS = '5.0..100.00' class LoadGenForm(FlaskForm): num_requests = IntegerField('Num Requests', default=100, validators=[DataRequired(), NumberRange(min=0)]) @@ -31,6 +36,10 @@ class LoadGenForm(FlaskForm): holding_time = FloatField('Holding Time [seconds]', default=10, validators=[NumberRange(min=0.0)]) inter_arrival_time = FloatField('Inter Arrival Time [seconds]', default=0, validators=[NumberRange(min=0.0)]) + availability = FloatField('Availability [%]', default=DEFAULT_AVAILABILITY, validators=[Regexp(RE_SCALAR_RANGE_LIST)]) + capacity_gbps = FloatField('Capacity [Gbps]', default=DEFAULT_CAPACITY_GBPS, validators=[Regexp(RE_SCALAR_RANGE_LIST)]) + e2e_latency_ms = FloatField('E2E Latency [ms]', default=DEFAULT_E2E_LATENCY_MS, validators=[Regexp(RE_SCALAR_RANGE_LIST)]) + do_teardown = BooleanField('Do Teardown', default=True) record_to_dlt = BooleanField('Record to DLT', default=False) diff --git a/src/webui/service/load_gen/routes.py b/src/webui/service/load_gen/routes.py index 5f47f06b0ff59ad1383aab94caa41adc08440c87..0b863aa8c853023de4a0a5269fbabee7ba4a5f2a 100644 --- a/src/webui/service/load_gen/routes.py +++ b/src/webui/service/load_gen/routes.py @@ -17,6 +17,7 @@ from flask import redirect, render_template, Blueprint, flash, url_for from common.proto.context_pb2 import Empty from common.proto.load_generator_pb2 import Parameters, RequestTypeEnum from load_generator.client.LoadGeneratorClient import LoadGeneratorClient +from load_generator.tools.ListScalarRange import list_scalar_range__to__grpc, parse_list_scalar_range from .forms import LoadGenForm load_gen = Blueprint('load_gen', __name__, url_prefix='/load_gen') @@ -55,11 +56,18 @@ def home(): _holding_time = round(status.parameters.holding_time , ndigits=4) _inter_arrival_time = round(status.parameters.inter_arrival_time , ndigits=4) + _availability = str(status.parameters.availability ).replace(' ', '') + _capacity_gbps = str(status.parameters.capacity_gbps ).replace(' ', '') + _e2e_latency_ms = str(status.parameters.e2e_latency_ms).replace(' ', '') + form = LoadGenForm() set_properties(form.num_requests , status.parameters.num_requests , readonly=status.running) set_properties(form.offered_load , _offered_load , readonly=status.running) set_properties(form.holding_time , _holding_time , readonly=status.running) set_properties(form.inter_arrival_time , _inter_arrival_time , readonly=status.running) + set_properties(form.availability , _availability , readonly=status.running) + set_properties(form.capacity_gbps , _capacity_gbps , readonly=status.running) + set_properties(form.e2e_latency_ms , _e2e_latency_ms , readonly=status.running) set_properties(form.do_teardown , status.parameters.do_teardown , disabled=status.running) set_properties(form.record_to_dlt , status.parameters.record_to_dlt, disabled=status.running) set_properties(form.dlt_domain_id , status.parameters.dlt_domain_id, readonly=status.running) @@ -82,6 +90,10 @@ def start(): form = LoadGenForm() if form.validate_on_submit(): try: + _availability = parse_list_scalar_range(form.availability.data ) + _capacity_gbps = parse_list_scalar_range(form.capacity_gbps.data ) + _e2e_latency_ms = parse_list_scalar_range(form.e2e_latency_ms.data) + load_gen_params = Parameters() load_gen_params.num_requests = form.num_requests.data load_gen_params.offered_load = form.offered_load.data @@ -92,6 +104,10 @@ def start(): load_gen_params.record_to_dlt = form.record_to_dlt.data load_gen_params.dlt_domain_id = form.dlt_domain_id.data + list_scalar_range__to__grpc(_availability, load_gen_params.availability ) # pylint: disable=no-member + list_scalar_range__to__grpc(_capacity_gbps, load_gen_params.capacity_gbps ) # pylint: disable=no-member + list_scalar_range__to__grpc(_e2e_latency_ms, load_gen_params.e2e_latency_ms) # pylint: disable=no-member + del load_gen_params.request_types[:] # pylint: disable=no-member request_types = list() if form.request_type_service_l2nm.data: request_types.append(RequestTypeEnum.REQUESTTYPE_SERVICE_L2NM) diff --git a/src/webui/service/templates/load_gen/home.html b/src/webui/service/templates/load_gen/home.html index d58f42601925ca438ab9d9f20b32f94960b5cada..371d6916131722e4c624acf4595aad1ce239f506 100644 --- a/src/webui/service/templates/load_gen/home.html +++ b/src/webui/service/templates/load_gen/home.html @@ -113,6 +113,51 @@ </div> <br /> + <div class="row mb-3"> + {{ form.availability.label(class="col-sm-2 col-form-label") }} + <div class="col-sm-10"> + {% if form.availability.errors %} + {{ form.availability(class="form-control is-invalid") }} + <div class="invalid-feedback"> + {% for error in form.availability.errors %}<span>{{ error }}</span>{% endfor %} + </div> + {% else %} + {{ form.availability(class="form-control") }} + {% endif %} + </div> + </div> + <br /> + + <div class="row mb-3"> + {{ form.capacity_gbps.label(class="col-sm-2 col-form-label") }} + <div class="col-sm-10"> + {% if form.capacity_gbps.errors %} + {{ form.capacity_gbps(class="form-control is-invalid") }} + <div class="invalid-feedback"> + {% for error in form.capacity_gbps.errors %}<span>{{ error }}</span>{% endfor %} + </div> + {% else %} + {{ form.capacity_gbps(class="form-control") }} + {% endif %} + </div> + </div> + <br /> + + <div class="row mb-3"> + {{ form.e2e_latency_ms.label(class="col-sm-2 col-form-label") }} + <div class="col-sm-10"> + {% if form.e2e_latency_ms.errors %} + {{ form.e2e_latency_ms(class="form-control is-invalid") }} + <div class="invalid-feedback"> + {% for error in form.e2e_latency_ms.errors %}<span>{{ error }}</span>{% endfor %} + </div> + {% else %} + {{ form.e2e_latency_ms(class="form-control") }} + {% endif %} + </div> + </div> + <br /> + <div class="row mb-3"> <div class="col-sm-10"> {{ form.do_teardown }} {{ form.do_teardown.label(class="col-sm-3 col-form-label") }}<br/>