Commit 4b5eff48 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

WebUI component:

- Added parametrization of availability, capacity and latency constraints in Load Generator dashboard
parent d3350bae
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+10 −1
Original line number Diff line number Diff line
@@ -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)
+16 −0
Original line number Diff line number Diff line
@@ -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)
+45 −0
Original line number Diff line number Diff line
@@ -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/>