diff --git a/src/webui/service/load_gen/forms.py b/src/webui/service/load_gen/forms.py index 911d28e44cba83bec050e7588d94734a5d22ce27..4e0020b04f33152de382f5b93af9735f8d737f92 100644 --- a/src/webui/service/load_gen/forms.py +++ b/src/webui/service/load_gen/forms.py @@ -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}) @@ -29,17 +29,14 @@ class LoadGenStartForm(FlaskForm): offered_load = FloatField('Offered Load [Erlang]', default=50, validators=[NumberRange(min=0.0)]) 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)]) + inter_arrival_time = FloatField('Inter Arrival Time [seconds]', default=0, validators=[NumberRange(min=0.0)]) do_teardown = BooleanField('Do Teardown', default=True) 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') diff --git a/src/webui/service/load_gen/routes.py b/src/webui/service/load_gen/routes.py index ab1733013c1ecf8f72a0bde78871918222055668..5f47f06b0ff59ad1383aab94caa41adc08440c87 100644 --- a/src/webui/service/load_gen/routes.py +++ b/src/webui/service/load_gen/routes.py @@ -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) - if form_start.validate_on_submit(): - 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.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 + 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) - 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 ) - load_gen_params.request_types.extend(request_types) # pylint: disable=no-member + 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.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.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.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 + + 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')) diff --git a/src/webui/service/templates/load_gen/home.html b/src/webui/service/templates/load_gen/home.html index 684e60ed5223bca7ea5abfdfc3b7c3cea0cb0388..d58f42601925ca438ab9d9f20b32f94960b5cada 100644 --- a/src/webui/service/templates/load_gen/home.html +++ b/src/webui/service/templates/load_gen/home.html @@ -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 %}