Commit e9ed3dc7 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

WebUI component:

- Corrected logic, form and page to manage/monitor load-gen component
parent 8416bab4
Loading
Loading
Loading
Loading
+5 −8
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ from flask_wtf import FlaskForm
from wtforms import BooleanField, FloatField, IntegerField, StringField, SubmitField
from wtforms.validators import DataRequired, NumberRange

class LoadGenStartForm(FlaskForm):
class LoadGenForm(FlaskForm):
    num_requests = IntegerField('Num Requests', default=100, validators=[DataRequired(), NumberRange(min=0)])
    num_generated = IntegerField('Num Generated', default=0, render_kw={'readonly': True})

@@ -36,10 +36,7 @@ class LoadGenStartForm(FlaskForm):
    record_to_dlt = BooleanField('Record to DLT', default=False)
    dlt_domain_id = StringField('DLT Domain Id', default='')

    infinite_loop = BooleanField('Infinite Loop', default=False, render_kw={'readonly': True})
    running = BooleanField('Running', default=False, render_kw={'readonly': True})
    infinite_loop = BooleanField('Infinite Loop', default=False, render_kw={'disabled': True})
    running = BooleanField('Running', default=False, render_kw={'disabled': True})

    submit = SubmitField('Start')

class LoadGenStopForm(FlaskForm):
    submit = SubmitField('Stop')
    submit = SubmitField('Start/Stop')
+81 −68
Original line number Diff line number Diff line
@@ -12,102 +12,115 @@
# See the License for the specific language governing permissions and
# limitations under the License.

from flask import render_template, Blueprint, flash
from typing import Any, Optional
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 .forms import LoadGenStartForm, LoadGenStopForm
from .forms import LoadGenForm

load_gen = Blueprint('load_gen', __name__, url_prefix='/load_gen')

def make_read_only(field, readonly : bool) -> None:
def set_properties(field, data : Any, readonly : Optional[bool] = None, disabled : Optional[bool] = None) -> None:
    if not hasattr(field, 'render_kw'):
        field.render_kw = dict(readonly=readonly)
        field.render_kw = dict()
    elif field.render_kw is None:
        field.render_kw = dict(readonly=readonly)
    else:
        field.render_kw = dict()

    if readonly is not None:
        field.render_kw['readonly'] = readonly
    if disabled is not None:
        field.render_kw['disabled'] = disabled

    if (readonly is not None and readonly) or (disabled is not None and disabled):
        field.data = data

@load_gen.route('home', methods=['GET', 'POST'])
@load_gen.route('home', methods=['GET'])
def home():
    load_gen_client = LoadGeneratorClient()

    form_start = LoadGenStartForm()
    form_stop = LoadGenStopForm()
    load_gen_client.connect()
    status = load_gen_client.GetStatus(Empty())
    load_gen_client.close()

    request_types = status.parameters.request_types
    _request_type_service_l2nm = RequestTypeEnum.REQUESTTYPE_SERVICE_L2NM in request_types
    _request_type_service_l3nm = RequestTypeEnum.REQUESTTYPE_SERVICE_L3NM in request_types
    _request_type_service_mw   = RequestTypeEnum.REQUESTTYPE_SERVICE_MW   in request_types
    _request_type_service_tapi = RequestTypeEnum.REQUESTTYPE_SERVICE_TAPI in request_types
    _request_type_slice_l2nm   = RequestTypeEnum.REQUESTTYPE_SLICE_L2NM   in request_types
    _request_type_slice_l3nm   = RequestTypeEnum.REQUESTTYPE_SLICE_L3NM   in request_types

    _offered_load       = round(status.parameters.offered_load       , ndigits=4)
    _holding_time       = round(status.parameters.holding_time       , ndigits=4)
    _inter_arrival_time = round(status.parameters.inter_arrival_time , ndigits=4)

    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.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)
    set_properties(form.request_type_service_l2nm, _request_type_service_l2nm     , disabled=status.running)
    set_properties(form.request_type_service_l3nm, _request_type_service_l3nm     , disabled=status.running)
    set_properties(form.request_type_service_mw  , _request_type_service_mw       , disabled=status.running)
    set_properties(form.request_type_service_tapi, _request_type_service_tapi     , disabled=status.running)
    set_properties(form.request_type_slice_l2nm  , _request_type_slice_l2nm       , disabled=status.running)
    set_properties(form.request_type_slice_l3nm  , _request_type_slice_l3nm       , disabled=status.running)
    set_properties(form.num_generated            , status.num_generated           , disabled=True)
    set_properties(form.infinite_loop            , status.infinite_loop           , disabled=True)
    set_properties(form.running                  , status.running                 , disabled=True)

    if form_start.validate_on_submit():
    form.submit.label.text = 'Stop' if status.running else 'Start'
    form_action = url_for('load_gen.stop') if status.running else url_for('load_gen.start')
    return render_template('load_gen/home.html', form=form, form_action=form_action)

@load_gen.route('start', methods=['POST'])
def start():
    form = LoadGenForm()
    if form.validate_on_submit():
        try:
            load_gen_params = Parameters()
        load_gen_params.num_requests       = form_start.num_requests.data
        load_gen_params.offered_load       = form_start.offered_load.data
        load_gen_params.holding_time       = form_start.holding_time.data
        load_gen_params.inter_arrival_time = form_start.inter_arrival_time.data
        load_gen_params.do_teardown        = form_start.do_teardown.data
            load_gen_params.num_requests       = form.num_requests.data
            load_gen_params.offered_load       = form.offered_load.data
            load_gen_params.holding_time       = form.holding_time.data
            load_gen_params.inter_arrival_time = form.inter_arrival_time.data
            load_gen_params.do_teardown        = form.do_teardown.data
            load_gen_params.dry_mode           = False
        load_gen_params.record_to_dlt      = form_start.record_to_dlt.data
        load_gen_params.dlt_domain_id      = form_start.dlt_domain_id.data
            load_gen_params.record_to_dlt      = form.record_to_dlt.data
            load_gen_params.dlt_domain_id      = form.dlt_domain_id.data

            del load_gen_params.request_types[:] # pylint: disable=no-member
            request_types = list()
        if form_start.request_type_service_l2nm.data: request_types.append(RequestTypeEnum.REQUESTTYPE_SERVICE_L2NM)
        if form_start.request_type_service_l3nm.data: request_types.append(RequestTypeEnum.REQUESTTYPE_SERVICE_L3NM)
        if form_start.request_type_service_mw  .data: request_types.append(RequestTypeEnum.REQUESTTYPE_SERVICE_MW  )
        if form_start.request_type_service_tapi.data: request_types.append(RequestTypeEnum.REQUESTTYPE_SERVICE_TAPI)
        if form_start.request_type_slice_l2nm  .data: request_types.append(RequestTypeEnum.REQUESTTYPE_SLICE_L2NM  )
        if form_start.request_type_slice_l3nm  .data: request_types.append(RequestTypeEnum.REQUESTTYPE_SLICE_L3NM  )
            if form.request_type_service_l2nm.data: request_types.append(RequestTypeEnum.REQUESTTYPE_SERVICE_L2NM)
            if form.request_type_service_l3nm.data: request_types.append(RequestTypeEnum.REQUESTTYPE_SERVICE_L3NM)
            if form.request_type_service_mw  .data: request_types.append(RequestTypeEnum.REQUESTTYPE_SERVICE_MW  )
            if form.request_type_service_tapi.data: request_types.append(RequestTypeEnum.REQUESTTYPE_SERVICE_TAPI)
            if form.request_type_slice_l2nm  .data: request_types.append(RequestTypeEnum.REQUESTTYPE_SLICE_L2NM  )
            if form.request_type_slice_l3nm  .data: request_types.append(RequestTypeEnum.REQUESTTYPE_SLICE_L3NM  )
            load_gen_params.request_types.extend(request_types) # pylint: disable=no-member

        try:
            load_gen_client = LoadGeneratorClient()
            load_gen_client.connect()
            load_gen_client.Start(load_gen_params)
            load_gen_client.close()
            flash('Load Generator Started.', 'success')
        except Exception as e: # pylint: disable=broad-except
            flash('Problem starting Load Generator. {:s}'.format(str(e)), 'danger')
    return redirect(url_for('load_gen.home'))

    if form_stop.validate_on_submit():
@load_gen.route('stop', methods=['POST'])
def stop():
    form = LoadGenForm()
    if form.validate_on_submit():
        try:
            load_gen_client = LoadGeneratorClient()
            load_gen_client.connect()
            load_gen_client.Stop(Empty())
            load_gen_client.close()
            flash('Load Generator Stopped.', 'success')
        except Exception as e: # pylint: disable=broad-except
            flash('Problem stopping Load Generator. {:s}'.format(str(e)), 'danger')

    load_gen_client.connect()
    status = load_gen_client.GetStatus(Empty())
    load_gen_client.close()

    form_start.num_requests      .default = status.parameters.num_requests
    form_start.offered_load      .default = status.parameters.offered_load
    form_start.holding_time      .default = status.parameters.holding_time
    form_start.inter_arrival_time.default = status.parameters.inter_arrival_time
    form_start.do_teardown       .default = status.parameters.do_teardown
    form_start.record_to_dlt     .default = status.parameters.record_to_dlt
    form_start.dlt_domain_id     .default = status.parameters.dlt_domain_id
    form_start.num_generated     .default = status.num_generated
    form_start.infinite_loop     .default = status.infinite_loop
    form_start.running           .default = status.running

    request_types = status.parameters.request_types
    form_start.request_type_service_l2nm.default = RequestTypeEnum.REQUESTTYPE_SERVICE_L2NM in request_types
    form_start.request_type_service_l3nm.default = RequestTypeEnum.REQUESTTYPE_SERVICE_L3NM in request_types
    form_start.request_type_service_mw  .default = RequestTypeEnum.REQUESTTYPE_SERVICE_MW   in request_types
    form_start.request_type_service_tapi.default = RequestTypeEnum.REQUESTTYPE_SERVICE_TAPI in request_types
    form_start.request_type_slice_l2nm  .default = RequestTypeEnum.REQUESTTYPE_SLICE_L2NM   in request_types
    form_start.request_type_slice_l3nm  .default = RequestTypeEnum.REQUESTTYPE_SLICE_L3NM   in request_types

    make_read_only(form_start.num_requests             , status.running)
    make_read_only(form_start.offered_load             , status.running)
    make_read_only(form_start.holding_time             , status.running)
    make_read_only(form_start.inter_arrival_time       , status.running)
    make_read_only(form_start.do_teardown              , status.running)
    make_read_only(form_start.record_to_dlt            , status.running)
    make_read_only(form_start.dlt_domain_id            , status.running)
    make_read_only(form_start.request_type_service_l2nm, status.running)
    make_read_only(form_start.request_type_service_l3nm, status.running)
    make_read_only(form_start.request_type_service_mw  , status.running)
    make_read_only(form_start.request_type_service_tapi, status.running)
    make_read_only(form_start.request_type_slice_l2nm  , status.running)
    make_read_only(form_start.request_type_slice_l3nm  , status.running)

    return render_template('load_gen/home.html', form_start=form_start, form_stop=form_stop, is_running=status.running)
    return redirect(url_for('load_gen.home'))
+43 −58
Original line number Diff line number Diff line
@@ -20,36 +20,34 @@
    <h1>Load Generator</h1>
    <br />

    <form id="load_gen_start" method="POST">
        {% if not is_running %}
        {{ form_start.hidden_tag() }}
        {% endif %}
    <form id="load_gen_form" method="POST" action="{{ form_action }}">
        {{ form.hidden_tag() }}
        <fieldset>
            <div class="row mb-3">
                {{ form_start.num_requests.label(class="col-sm-2 col-form-label") }}
                {{ form.num_requests.label(class="col-sm-2 col-form-label") }}
                <div class="col-sm-10">
                    {% if form_start.num_requests.errors %}
                        {{ form_start.num_requests(class="form-control is-invalid") }}
                    {% if form.num_requests.errors %}
                        {{ form.num_requests(class="form-control is-invalid") }}
                        <div class="invalid-feedback">
                            {% for error in form_start.num_requests.errors %}<span>{{ error }}</span>{% endfor %}
                            {% for error in form.num_requests.errors %}<span>{{ error }}</span>{% endfor %}
                        </div>
                    {% else %}
                        {{ form_start.num_requests(class="form-control") }}
                        {{ form.num_requests(class="form-control") }}
                    {% endif %}
                </div>
            </div>
            <br />

            <div class="row mb-3">
                {{ form_start.num_generated.label(class="col-sm-2 col-form-label") }}
                {{ form.num_generated.label(class="col-sm-2 col-form-label") }}
                <div class="col-sm-10">
                    {% if form_start.num_generated.errors %}
                        {{ form_start.num_generated(class="form-control is-invalid") }}
                    {% if form.num_generated.errors %}
                        {{ form.num_generated(class="form-control is-invalid") }}
                        <div class="invalid-feedback">
                            {% for error in form_start.num_generated.errors %}<span>{{ error }}</span>{% endfor %}
                            {% for error in form.num_generated.errors %}<span>{{ error }}</span>{% endfor %}
                        </div>
                    {% else %}
                        {{ form_start.num_generated(class="form-control") }}
                        {{ form.num_generated(class="form-control") }}
                    {% endif %}
                </div>
            </div>
@@ -58,58 +56,58 @@
            <div class="row mb-3">
                <div class="col-sm-2 col-form-label">Service Types:</div>
                <div class="col-sm-10">
                    {{ form_start.request_type_slice_l2nm   }} {{ form_start.request_type_slice_l2nm  .label(class="col-sm-3 col-form-label") }}
                    {{ form_start.request_type_slice_l3nm   }} {{ form_start.request_type_slice_l3nm  .label(class="col-sm-3 col-form-label") }}
                    {{ form.request_type_slice_l2nm   }} {{ form.request_type_slice_l2nm  .label(class="col-sm-3 col-form-label") }}
                    {{ form.request_type_slice_l3nm   }} {{ form.request_type_slice_l3nm  .label(class="col-sm-3 col-form-label") }}
                    <br/>
                    {{ form_start.request_type_service_l2nm }} {{ form_start.request_type_service_l2nm.label(class="col-sm-3 col-form-label") }}
                    {{ form_start.request_type_service_l3nm }} {{ form_start.request_type_service_l3nm.label(class="col-sm-3 col-form-label") }}
                    {{ form.request_type_service_l2nm }} {{ form.request_type_service_l2nm.label(class="col-sm-3 col-form-label") }}
                    {{ form.request_type_service_l3nm }} {{ form.request_type_service_l3nm.label(class="col-sm-3 col-form-label") }}
                    <br/>
                    {{ form_start.request_type_service_mw   }} {{ form_start.request_type_service_mw  .label(class="col-sm-3 col-form-label") }}
                    {{ form_start.request_type_service_tapi }} {{ form_start.request_type_service_tapi.label(class="col-sm-3 col-form-label") }}
                    {{ form.request_type_service_mw   }} {{ form.request_type_service_mw  .label(class="col-sm-3 col-form-label") }}
                    {{ form.request_type_service_tapi }} {{ form.request_type_service_tapi.label(class="col-sm-3 col-form-label") }}
                </div>
            </div>
            <br />

            <div class="row mb-3">
                {{ form_start.offered_load.label(class="col-sm-2 col-form-label") }}
                {{ form.offered_load.label(class="col-sm-2 col-form-label") }}
                <div class="col-sm-10">
                    {% if form_start.offered_load.errors %}
                        {{ form_start.offered_load(class="form-control is-invalid") }}
                    {% if form.offered_load.errors %}
                        {{ form.offered_load(class="form-control is-invalid") }}
                        <div class="invalid-feedback">
                            {% for error in form_start.offered_load.errors %}<span>{{ error }}</span>{% endfor %}
                            {% for error in form.offered_load.errors %}<span>{{ error }}</span>{% endfor %}
                        </div>
                    {% else %}
                        {{ form_start.offered_load(class="form-control") }}
                        {{ form.offered_load(class="form-control") }}
                    {% endif %}
                </div>
            </div>
            <br />

            <div class="row mb-3">
                {{ form_start.holding_time.label(class="col-sm-2 col-form-label") }}
                {{ form.holding_time.label(class="col-sm-2 col-form-label") }}
                <div class="col-sm-10">
                    {% if form_start.holding_time.errors %}
                        {{ form_start.holding_time(class="form-control is-invalid") }}
                    {% if form.holding_time.errors %}
                        {{ form.holding_time(class="form-control is-invalid") }}
                        <div class="invalid-feedback">
                            {% for error in form_start.holding_time.errors %}<span>{{ error }}</span>{% endfor %}
                            {% for error in form.holding_time.errors %}<span>{{ error }}</span>{% endfor %}
                        </div>
                    {% else %}
                        {{ form_start.holding_time(class="form-control") }}
                        {{ form.holding_time(class="form-control") }}
                    {% endif %}
                </div>
            </div>
            <br />

            <div class="row mb-3">
                {{ form_start.inter_arrival_time.label(class="col-sm-2 col-form-label") }}
                {{ form.inter_arrival_time.label(class="col-sm-2 col-form-label") }}
                <div class="col-sm-10">
                    {% if form_start.inter_arrival_time.errors %}
                        {{ form_start.inter_arrival_time(class="form-control is-invalid") }}
                    {% if form.inter_arrival_time.errors %}
                        {{ form.inter_arrival_time(class="form-control is-invalid") }}
                        <div class="invalid-feedback">
                            {% for error in form_start.inter_arrival_time.errors %}<span>{{ error }}</span>{% endfor %}
                            {% for error in form.inter_arrival_time.errors %}<span>{{ error }}</span>{% endfor %}
                        </div>
                    {% else %}
                        {{ form_start.inter_arrival_time(class="form-control") }}
                        {{ form.inter_arrival_time(class="form-control") }}
                    {% endif %}
                </div>
            </div>
@@ -117,7 +115,7 @@

            <div class="row mb-3">
                <div class="col-sm-10">
                    {{ form_start.do_teardown }} {{ form_start.do_teardown.label(class="col-sm-3 col-form-label") }}<br/>
                    {{ form.do_teardown }} {{ form.do_teardown.label(class="col-sm-3 col-form-label") }}<br/>
                </div>
            </div>
            <br />
@@ -125,15 +123,15 @@
            <div class="row mb-3">
                <div class="col-sm-2 col-form-label">DLT Settings:</div>
                <div class="col-sm-10">
                    {{ form_start.record_to_dlt }} {{ form_start.record_to_dlt.label(class="col-sm-3 col-form-label") }} <br/>
                    {{ form_start.dlt_domain_id.label(class="col-sm-2 col-form-label") }}
                    {% if form_start.dlt_domain_id.errors %}
                        {{ form_start.dlt_domain_id(class="form-control is-invalid") }}
                    {{ form.record_to_dlt }} {{ form.record_to_dlt.label(class="col-sm-3 col-form-label") }} <br/>
                    {{ form.dlt_domain_id.label(class="col-sm-2 col-form-label") }}
                    {% if form.dlt_domain_id.errors %}
                        {{ form.dlt_domain_id(class="form-control is-invalid") }}
                        <div class="invalid-feedback">
                            {% for error in form_start.dlt_domain_id.errors %}<span>{{ error }}</span>{% endfor %}
                            {% for error in form.dlt_domain_id.errors %}<span>{{ error }}</span>{% endfor %}
                        </div>
                    {% else %}
                        {{ form_start.dlt_domain_id(class="form-control") }}
                        {{ form.dlt_domain_id(class="form-control") }}
                    {% endif %}
                </div>
            </div>
@@ -142,29 +140,16 @@
            <div class="row mb-3">
                <div class="col-sm-2 col-form-label">Status:</div>
                <div class="col-sm-10">
                    {{ form_start.infinite_loop }} {{ form_start.infinite_loop.label(class="col-sm-3 col-form-label") }}
                    {{ form_start.running }} {{ form_start.running.label(class="col-sm-3 col-form-label") }}
                    {{ form.infinite_loop }} {{ form.infinite_loop.label(class="col-sm-3 col-form-label") }}
                    {{ form.running }} {{ form.running.label(class="col-sm-3 col-form-label") }}
                </div>
            </div>
            <br />

            {% if not is_running %}
            <div class="d-grid gap-2 d-md-flex justify-content-md-start">
                {{ form_start.submit(class="btn btn-primary") }}
                {{ form.submit(class="btn btn-primary") }}
            </div>
            {% endif %}
        </fieldset>
    </form>

    {% if is_running %}
    <form id="load_gen_stop" method="POST">
        {{ form_stop.hidden_tag() }}
        <fieldset>
            <div class="d-grid gap-2 d-md-flex justify-content-md-start">
                {{ form_stop.submit(class="btn btn-primary") }}
            </div>
        </fieldset>
    </form>
    {% endif %}

{% endblock %}