Skip to content
Snippets Groups Projects
Commit b6ba15c1 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

Merge branch 'feat/tid-webui-service-mgmt' into 'develop'

WebUI Service creation

Closes #109

See merge request !130
parents f8d064b0 a1e32d0a
No related branches found
No related tags found
2 merge requests!235Release TeraFlowSDN 3.0,!130WebUI Service creation
Showing
with 2876 additions and 40 deletions
......@@ -17,4 +17,4 @@ Flask-WTF==1.0.0
flask-healthz==0.0.3
flask-unittest==0.1.2
lorem-text==2.1
werkzeug==2.3.7
\ No newline at end of file
werkzeug==2.3.7
......@@ -16,6 +16,7 @@ import json
from typing import List, Tuple, Union
from flask import Flask, request, session
from flask_healthz import healthz, HealthError
from common.tools.grpc.Tools import grpc_message_to_json
from context.client.ContextClient import ContextClient
from device.client.DeviceClient import DeviceClient
......@@ -100,6 +101,7 @@ def create_app(use_config=None, web_app_root=None):
app.jinja_env.globals.update({ # pylint: disable=no-member
'enumerate' : enumerate,
'grpc_message_to_json': grpc_message_to_json,
'json_to_list' : json_to_list,
'round' : round,
'get_working_context' : get_working_context,
......
This diff is collapsed.
This diff is collapsed.
<!--
Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
{% extends 'base.html' %}
{% block content %}
<h1>Add New Service</h1>
<form method="POST" action="{{ url_for('service.add_configure') }}">
<fieldset>
<div class="row mb-3">
{{ form_1.hidden_tag() }}
</div>
<div class="row mb-3">
{{ form_1.service_type.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_1.service_type.errors %}
{{ form_1.service_type(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_1.service_type.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_1.service_type(class="form-control") }}
{% endif %}
</div>
</div>
<button type="submit" class="btn btn-primary">
<i class="bi bi-plus-circle-fill"></i>
{{ submit_text }}
</button>
<button type="button" class="btn btn-block btn-secondary" onclick="javascript: history.back()">
<i class="bi bi-box-arrow-in-left"></i>
Cancel
</button>
</div>
</fieldset>
</form>
{% endblock %}
<!--
Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
{% extends 'base.html' %}
{% block content %}
<h1>Add New Service [ACL-IPV4]</h1>
<form method="POST" action="{{ url_for('service.add_configure_ACL_IPV4') }}">
<fieldset>
<div class="row mb-3">
{{ form_acl.hidden_tag() }}
</div>
<h3>Generic Service Parameters</h3>
{% if form_acl.acl_params is not none %}
<div class="row mb-3">
{{ form_acl.service_name.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_name.errors %}
{{ form_acl.service_name(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_name.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_name(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_type.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_type.errors %}
{{ form_acl.service_type(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_type.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_type(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_device_1.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_acl.service_device_1.errors %}
{{ form_acl.service_device_1(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_device_1.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_device_1(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_acl.service_device_2.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_acl.service_device_2.errors %}
{{ form_acl.service_device_2(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_device_2.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_device_2(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_endpoint_1.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_acl.service_endpoint_1.errors %}
{{ form_acl.service_endpoint_1(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_endpoint_1.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_endpoint_1(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_acl.service_endpoint_2.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_acl.service_endpoint_2.errors %}
{{ form_acl.service_endpoint_2(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_endpoint_2.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_endpoint_2(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
</br>
<h3>Generic Service Constraints</h3>
<div class="row mb-3">
{{ form_acl.service_capacity.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_capacity.errors %}
{{ form_acl.service_capacity(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.service_capacity.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_capacity(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_latency.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_latency.errors %}
{{ form_acl.service_latency(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.service_latency.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_latency(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_availability.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_availability.errors %}
{{ form_acl.service_availability(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.service_availability.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_availability(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_isolation.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_isolation.errors %}
{{ form_acl.service_isolation(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.service_isolation.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_isolation(class="form-control") }}
{% endif %}
</div>
</div>
</br>
<h3>Specific Service Parameters</h3>
</br>
<h4>Generic ACL Parameters</h4>
<div class="row mb-3">
{{ form_acl.name.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.name.errors %}
{{ form_acl.name(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.name.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.name(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.type.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.type.errors %}
{{ form_acl.type(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.type.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.type(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.sequence_id.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.sequence_id.errors %}
{{ form_acl.sequence_id(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.sequence_id.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.sequence_id(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.forwarding_action.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.forwarding_action.errors %}
{{ form_acl.forwarding_action(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.forwarding_action.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.forwarding_action(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.log_action.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.log_action.errors %}
{{ form_acl.log_action(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.log_action.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.log_action(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.traffic_flow.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.traffic_flow.errors %}
{{ form_acl.traffic_flow(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.traffic_flow.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.traffic_flow(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.interface.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.interface.errors %}
{{ form_acl.interface(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.interface.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.interface(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.subinterface.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.subinterface.errors %}
{{ form_acl.subinterface(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.subinterface.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.subinterface(class="form-control") }}
{% endif %}
</div>
</div>
</br>
<h4>Specific ACL_IPV4 Parameters</h4>
<div class="row mb-3">
{{ form_acl.source_address.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.source_address.errors %}
{{ form_acl.source_address(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.source_address.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.source_address(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.destination_address.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.destination_address.errors %}
{{ form_acl.destination_address(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.destination_address.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.destination_address(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.protocol.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.protocol.errors %}
{{ form_acl.protocol(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.protocol.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.protocol(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.hop_limit.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.hop_limit.errors %}
{{ form_acl.hop_limit(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.hop_limit.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.hop_limit(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.dscp.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.dscp.errors %}
{{ form_acl.dscp(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.dscp.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.dscp(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.source_port.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.source_port.errors %}
{{ form_acl.source_port(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.source_port.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.source_port(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.destination_port.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.destination_port.errors %}
{{ form_acl.destination_port(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.destination_port.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.destination_port(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.tcp_flags.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.tcp_flags.errors %}
{{ form_acl.tcp_flags(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.tcp_flags.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.tcp_flags(class="form-control") }}
{% endif %}
</div>
</div>
{% endif %}
<button type="submit" class="btn btn-primary">
<i class="bi bi-plus-circle-fill"></i>
{{ submit_text }}
</button>
<button type="button" class="btn btn-block btn-secondary" onclick="javascript: history.back()">
<i class="bi bi-box-arrow-in-left"></i>
Cancel
</button>
</fieldset>
</form>
{% endblock %}
<!--
Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
{% extends 'base.html' %}
{% block content %}
<h1>Add New Service [ACL-IPV6]</h1>
<form method="POST" action="{{ url_for('service.add_configure_ACL_IPV6') }}">
<fieldset>
<div class="row mb-3">
{{ form_acl.hidden_tag() }}
</div>
<h3>Generic Service Parameters</h3>
{% if form_acl.acl_params is not none %}
<div class="row mb-3">
{{ form_acl.service_name.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_name.errors %}
{{ form_acl.service_name(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_name.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_name(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_type.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_type.errors %}
{{ form_acl.service_type(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_type.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_type(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_device_1.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_acl.service_device_1.errors %}
{{ form_acl.service_device_1(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_device_1.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_device_1(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_acl.service_device_2.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_acl.service_device_2.errors %}
{{ form_acl.service_device_2(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_device_2.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_device_2(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_endpoint_1.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_acl.service_endpoint_1.errors %}
{{ form_acl.service_endpoint_1(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_endpoint_1.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_endpoint_1(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_acl.service_endpoint_2.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_acl.service_endpoint_2.errors %}
{{ form_acl.service_endpoint_2(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_endpoint_2.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_endpoint_2(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
</br>
<h3>Generic Service Constraints</h3>
<div class="row mb-3">
{{ form_acl.service_capacity.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_capacity.errors %}
{{ form_acl.service_capacity(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.service_capacity.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_capacity(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_latency.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_latency.errors %}
{{ form_acl.service_latency(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.service_latency.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_latency(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_availability.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_availability.errors %}
{{ form_acl.service_availability(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.service_availability.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_availability(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_isolation.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_isolation.errors %}
{{ form_acl.service_isolation(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.service_isolation.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_isolation(class="form-control") }}
{% endif %}
</div>
</div>
</br>
<h3>Specific Service Parameters</h3>
</br>
<h4>Generic ACL Parameters</h4>
<div class="row mb-3">
{{ form_acl.name.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.name.errors %}
{{ form_acl.name(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.name.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.name(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.type.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.type.errors %}
{{ form_acl.type(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.type.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.type(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.sequence_id.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.sequence_id.errors %}
{{ form_acl.sequence_id(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.sequence_id.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.sequence_id(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.forwarding_action.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.forwarding_action.errors %}
{{ form_acl.forwarding_action(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.forwarding_action.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.forwarding_action(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.log_action.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.log_action.errors %}
{{ form_acl.log_action(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.log_action.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.log_action(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.traffic_flow.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.traffic_flow.errors %}
{{ form_acl.traffic_flow(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.traffic_flow.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.traffic_flow(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.interface.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.interface.errors %}
{{ form_acl.interface(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.interface.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.interface(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.subinterface.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.subinterface.errors %}
{{ form_acl.subinterface(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.subinterface.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.subinterface(class="form-control") }}
{% endif %}
</div>
</div>
</br>
<h4>Specific ACL_IPV6 Parameters</h4>
<div class="row mb-3">
{{ form_acl.source_address.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.source_address.errors %}
{{ form_acl.source_address(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.source_address.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.source_address(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.destination_address.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.destination_address.errors %}
{{ form_acl.destination_address(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.destination_address.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.destination_address(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.protocol.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.protocol.errors %}
{{ form_acl.protocol(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.protocol.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.protocol(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.hop_limit.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.hop_limit.errors %}
{{ form_acl.hop_limit(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.hop_limit.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.hop_limit(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.dscp.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.dscp.errors %}
{{ form_acl.dscp(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.dscp.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.dscp(class="form-control") }}
{% endif %}
</div>
</div>
{% endif %}
<button type="submit" class="btn btn-primary">
<i class="bi bi-plus-circle-fill"></i>
{{ submit_text }}
</button>
<button type="button" class="btn btn-block btn-secondary" onclick="javascript: history.back()">
<i class="bi bi-box-arrow-in-left"></i>
Cancel
</button>
</fieldset>
</form>
{% endblock %}
<!--
Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
{% extends 'base.html' %}
{% block content %}
<h1>Add New Service [ACL-L2]</h1>
<form method="POST" action="{{ url_for('service.add_configure_ACL_L2') }}">
<fieldset>
<div class="row mb-3">
{{ form_acl.hidden_tag() }}
</div>
<h3>Generic Service Parameters</h3>
{% if form_acl.acl_params is not none %}
<div class="row mb-3">
{{ form_acl.service_name.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_name.errors %}
{{ form_acl.service_name(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_name.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_name(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_type.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_type.errors %}
{{ form_acl.service_type(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_type.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_type(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_device_1.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_acl.service_device_1.errors %}
{{ form_acl.service_device_1(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_device_1.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_device_1(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_acl.service_device_2.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_acl.service_device_2.errors %}
{{ form_acl.service_device_2(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_device_2.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_device_2(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_endpoint_1.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_acl.service_endpoint_1.errors %}
{{ form_acl.service_endpoint_1(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_endpoint_1.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_endpoint_1(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_acl.service_endpoint_2.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_acl.service_endpoint_2.errors %}
{{ form_acl.service_endpoint_2(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.service_endpoint_2.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_endpoint_2(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
</br>
<h3>Generic Service Constraints</h3>
<div class="row mb-3">
{{ form_acl.service_capacity.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_capacity.errors %}
{{ form_acl.service_capacity(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.service_capacity.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_capacity(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_latency.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_latency.errors %}
{{ form_acl.service_latency(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.service_latency.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_latency(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_availability.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_availability.errors %}
{{ form_acl.service_availability(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.service_availability.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_availability(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.service_isolation.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.service_isolation.errors %}
{{ form_acl.service_isolation(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.service_isolation.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.service_isolation(class="form-control") }}
{% endif %}
</div>
</div>
</br>
<h3>Specific Service Parameters</h3>
</br>
<h4>Generic ACL Parameters</h4>
<div class="row mb-3">
{{ form_acl.name.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.name.errors %}
{{ form_acl.name(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.name.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.name(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.type.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.type.errors %}
{{ form_acl.type(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.type.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.type(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.sequence_id.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.sequence_id.errors %}
{{ form_acl.sequence_id(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.sequence_id.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.sequence_id(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.forwarding_action.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.forwarding_action.errors %}
{{ form_acl.forwarding_action(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.forwarding_action.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.forwarding_action(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.log_action.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.log_action.errors %}
{{ form_acl.log_action(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.log_action.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.log_action(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.traffic_flow.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.traffic_flow.errors %}
{{ form_acl.traffic_flow(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.traffic_flow.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.traffic_flow(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.interface.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.interface.errors %}
{{ form_acl.interface(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_acl.interface.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.interface(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.subinterface.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.subinterface.errors %}
{{ form_acl.subinterface(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.subinterface.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.subinterface(class="form-control") }}
{% endif %}
</div>
</div>
</br>
<h4>Specific ACL_L2 Parameters</h4>
<div class="row mb-3">
{{ form_acl.source_mac.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.source_mac.errors %}
{{ form_acl.source_mac(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.source_mac.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.source_mac(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_acl.destination_mac.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_acl.destination_mac.errors %}
{{ form_acl.destination_mac(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_acl.destination_mac.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_acl.destination_mac(class="form-control") }}
{% endif %}
</div>
</div>
{% endif %}
<button type="submit" class="btn btn-primary">
<i class="bi bi-plus-circle-fill"></i>
{{ submit_text }}
</button>
<button type="button" class="btn btn-block btn-secondary" onclick="javascript: history.back()">
<i class="bi bi-box-arrow-in-left"></i>
Cancel
</button>
</fieldset>
</form>
{% endblock %}
This diff is collapsed.
This diff is collapsed.
......@@ -26,15 +26,8 @@
Back to service list
</button>
</div>
<!--
<div class="col-sm-3">
<a id="update" class="btn btn-secondary" href="#">
<i class="bi bi-pencil-square"></i>
Update
</a>
</div>-->
<div class="col-sm-3">
<!-- <button type="button" class="btn btn-danger"><i class="bi bi-x-square"></i>Delete service</button> -->
<button type="button" class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#deleteModal">
<i class="bi bi-x-square"></i>
Delete service
......@@ -224,6 +217,69 @@
</td>
</tr>
{% endif %}
{% if config.WhichOneof('config_rule') == 'acl' %}
<tr>
<td>
{% if config.acl %}
{% set endpoint_id = config.acl.endpoint_id %}
{% set rule_set_name = config.acl.rule_set.name %}
/device[{{ endpoint_id.device_id.device_uuid.uuid }}]/endpoint[{{ endpoint_id.endpoint_uuid.uuid }}]/acl_ruleset[{{ rule_set_name }}]
{% endif %}
</td>
<td>
<ul>
{% if config.acl.rule_set.name %}
<li><b>name: </b>{{ config.acl.rule_set.name }}</li>
{% endif %}
{% if config.acl.rule_set.type %}
<li><b>type: </b>{{ type[config.acl.rule_set.type] }}</li>
{% endif %}
{% if config.acl.rule_set.description %}
<li><b>description: </b>{{ config.acl.rule_set.description }}</li>
{% endif %}
{% if config.acl.rule_set.user_id %}
<li><b>user_id: </b>{{ config.acl.rule_set.user_id }}</li>
{% endif %}
{% for entry in config.acl.rule_set.entries %}
{% if entry.description %}
<li><b>entry {{ entry.sequence_id }} description: </b>{{ entry.description }}</li>
{% endif %}
{% if entry.match.protocol %}
<li><b>entry {{ entry.sequence_id }} protocol: </b>{{ entry.match.protocol }}</li>
{% endif %}
{% if entry.match.dscp %}
<li><b>entry {{ entry.sequence_id }} dscp:</b>{{ entry.match.dscp }}</li>
{% endif %}
{% if entry.match.src_address %}
<li><b>entry {{ entry.sequence_id }} src_address: </b>{{ entry.match.src_address }}</li>
{% endif %}
{% if entry.match.dst_address %}
<li><b>entry {{ entry.sequence_id }} dst_address: </b>{{ entry.match.dst_address }}</li>
{% endif %}
{% if entry.match.src_port %}
<li><b>entry {{ entry.sequence_id }} src_port: </b>{{ entry.match.src_port }}</li>
{% endif %}
{% if entry.match.dst_port %}
<li><b>entry {{ entry.sequence_id }} dst_port: </b>{{ entry.match.dst_port }}</li>
{% endif %}
{% if entry.match.start_mpls_label %}
<li><b>entry {{ entry.sequence_id }} start mpls label: </b>{{ entry.match.start_mpls_label }}</li>
{% endif %}
{% if entry.match.end_mpls_label %}
<li><b>entry {{ entry.sequence_id }} end mpls label: </b> {{ entry.match.end_mpls_label }}</li>
{% endif %}
{% if entry.action.forward_action %}
<li><b>entry {{ entry.sequence_id }} forward_action: </b>{{ f_action[entry.action.forward_action] }}</li>
{% endif %}
{% if entry.action.log_action %}
<li><b>entry {{ entry.sequence_id }} log_action: </b>{{l_action[entry.action.log_action] }}</li>
{% endif %}
{% endfor %}
</ul>
</td>
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>
......
......@@ -20,15 +20,13 @@
<h1>Services</h1>
<div class="row">
<!-- <div class="col">
<a href="{{ url_for('service.add') }}" class="btn btn-primary" style="margin-bottom: 10px;">
<div class="col">
<a href="{{ url_for('service.add_configure') }}" class="btn btn-primary" style="margin-bottom: 10px;">
<i class="bi bi-plus"></i>
Add New Service
</a>
</div> -->
</div>
<!-- Only display XR service addition button if there are XR constellations. Otherwise it might confuse
user, as other service types do not have GUI to add service yet. -->
{% if "DEVICEDRIVER_XR" in active_drivers %}
<div class="col">
<a href="{{ url_for('service.add_xr') }}" class="btn btn-primary" style="margin-bottom: 10px;">
......@@ -41,17 +39,8 @@
<div class="col">
{{ services | length }} services found in context <i>{{ session['context_uuid'] }}</i>
</div>
<!-- <div class="col">
<form>
<div class="input-group">
<input type="text" aria-label="Search" placeholder="Search..." class="form-control"/>
<button type="submit" class="btn btn-primary">Search</button>
</div>
</form>
</div> -->
</div>
<table class="table table-striped table-hover">
<thead>
<tr>
......@@ -68,9 +57,7 @@
{% for service in services %}
<tr>
<td>
<!-- <a href="{{ url_for('service.detail', service_uuid=service.service_id.service_uuid.uuid) }}"> -->
{{ service.service_id.service_uuid.uuid }}
<!-- </a> -->
</td>
<td>
{{ service.name }}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment