Skip to content
Snippets Groups Projects
Commit 04a4f930 authored by Pablo Armingol's avatar Pablo Armingol
Browse files

pre merge code clean up

parent 4c1fc533
No related branches found
No related tags found
2 merge requests!142Release TeraFlowSDN 2.1,!104OpenConfig driver multivendor & ACLs
Showing
with 10 additions and 2418 deletions
#!/bin/bash
# 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.
########################################################################################################################
# Read deployment settings
########################################################################################################################
# ----- TeraFlowSDN ------------------------------------------------------------
# If not already set, set the URL of the Docker registry where the images will be uploaded to.
# By default, assume internal MicroK8s registry is used.
export TFS_REGISTRY_IMAGES=${TFS_REGISTRY_IMAGES:-"http://localhost:32000/tfs/"}
# If not already set, set the list of components, separated by spaces, you want to build images for, and deploy.
# By default, only basic components are deployed
export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device service compute webui"}
# If not already set, set the tag you want to use for your images.
export TFS_IMAGE_TAG=${TFS_IMAGE_TAG:-"dev"}
# If not already set, set the name of the Kubernetes namespace to deploy TFS to.
export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"}
# If not already set, set additional manifest files to be applied after the deployment
export TFS_EXTRA_MANIFESTS=${TFS_EXTRA_MANIFESTS:-""}
# If not already set, set the new Grafana admin password
export TFS_GRAFANA_PASSWORD=${TFS_GRAFANA_PASSWORD:-"admin123+"}
# If not already set, disable skip-build flag to rebuild the Docker images.
# If TFS_SKIP_BUILD is "YES", the containers are not rebuilt-retagged-repushed and existing ones are used.
export TFS_SKIP_BUILD=${TFS_SKIP_BUILD:-""}
# ----- CockroachDB ------------------------------------------------------------
# If not already set, set the namespace where CockroackDB will be deployed.
export CRDB_NAMESPACE=${CRDB_NAMESPACE:-"crdb"}
# If not already set, set the external port CockroackDB Postgre SQL interface will be exposed to.
export CRDB_EXT_PORT_SQL=${CRDB_EXT_PORT_SQL:-"26257"}
# If not already set, set the external port CockroackDB HTTP Mgmt GUI interface will be exposed to.
export CRDB_EXT_PORT_HTTP=${CRDB_EXT_PORT_HTTP:-"8081"}
# If not already set, set the database username to be used by Context.
export CRDB_USERNAME=${CRDB_USERNAME:-"tfs"}
# If not already set, set the database user's password to be used by Context.
export CRDB_PASSWORD=${CRDB_PASSWORD:-"tfs123"}
# If not already set, set the database name to be used by Context.
export CRDB_DATABASE=${CRDB_DATABASE:-"tfs"}
# If not already set, set CockroachDB installation mode. Accepted values are: 'single' and 'cluster'.
# "YES", the database pointed by variable CRDB_NAMESPACE will be dropped while
# checking/deploying CockroachDB.
# - If CRDB_DEPLOY_MODE is "single", CockroachDB is deployed in single node mode. It is convenient for
# development and testing purposes and should fit in a VM. IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS.
# - If CRDB_DEPLOY_MODE is "cluster", CockroachDB is deployed in cluster mode, and an entire CockroachDB cluster
# with 3 replicas and version v22.2 (set by default) will be deployed. It is convenient for production and
# provides scalability features. If you are deploying for production, also read the following link providing
# details on deploying CockroachDB for production environments:
# Ref: https://www.cockroachlabs.com/docs/stable/recommended-production-settings.html
export CRDB_DEPLOY_MODE=${CRDB_DEPLOY_MODE:-"single"}
# If not already set, disable flag for dropping database, if it exists.
# WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE DATABASE INFORMATION!
# If CRDB_DROP_DATABASE_IF_EXISTS is "YES", the database pointed by variable CRDB_NAMESPACE will be dropped while
# checking/deploying CockroachDB.
export CRDB_DROP_DATABASE_IF_EXISTS=${CRDB_DROP_DATABASE_IF_EXISTS:-""}
# If not already set, disable flag for re-deploying CockroachDB from scratch.
# WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE DATABASE INFORMATION!
# WARNING: THE REDEPLOY MIGHT TAKE FEW MINUTES TO COMPLETE GRACEFULLY IN CLUSTER MODE
# If CRDB_REDEPLOY is "YES", the database will be dropped while checking/deploying CockroachDB.
export CRDB_REDEPLOY=${CRDB_REDEPLOY:-""}
# ----- NATS -------------------------------------------------------------------
# If not already set, set the namespace where NATS will be deployed.
export NATS_NAMESPACE=${NATS_NAMESPACE:-"nats"}
# If not already set, set the external port NATS Client interface will be exposed to.
export NATS_EXT_PORT_CLIENT=${NATS_EXT_PORT_CLIENT:-"4222"}
# If not already set, set the external port NATS HTTP Mgmt GUI interface will be exposed to.
export NATS_EXT_PORT_HTTP=${NATS_EXT_PORT_HTTP:-"8222"}
# If not already set, disable flag for re-deploying NATS from scratch.
# WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE MESSAGE BROKER INFORMATION!
# If NATS_REDEPLOY is "YES", the message broker will be dropped while checking/deploying NATS.
export NATS_REDEPLOY=${NATS_REDEPLOY:-""}
# ----- QuestDB ----------------------------------------------------------------
# If not already set, set the namespace where QuestDB will be deployed.
export QDB_NAMESPACE=${QDB_NAMESPACE:-"qdb"}
# If not already set, set the external port QuestDB Postgre SQL interface will be exposed to.
export QDB_EXT_PORT_SQL=${QDB_EXT_PORT_SQL:-"8812"}
# If not already set, set the external port QuestDB Influx Line Protocol interface will be exposed to.
export QDB_EXT_PORT_ILP=${QDB_EXT_PORT_ILP:-"9009"}
# If not already set, set the external port QuestDB HTTP Mgmt GUI interface will be exposed to.
export QDB_EXT_PORT_HTTP=${QDB_EXT_PORT_HTTP:-"9000"}
# If not already set, set the database username to be used for QuestDB.
export QDB_USERNAME=${QDB_USERNAME:-"admin"}
# If not already set, set the database user's password to be used for QuestDB.
export QDB_PASSWORD=${QDB_PASSWORD:-"quest"}
# If not already set, set the table name to be used by Monitoring for KPIs.
export QDB_TABLE_MONITORING_KPIS=${QDB_TABLE_MONITORING_KPIS:-"tfs_monitoring_kpis"}
# If not already set, set the table name to be used by Slice for plotting groups.
export QDB_TABLE_SLICE_GROUPS=${QDB_TABLE_SLICE_GROUPS:-"tfs_slice_groups"}
# If not already set, disable flag for dropping tables if they exist.
# WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE TABLE INFORMATION!
# If QDB_DROP_TABLES_IF_EXIST is "YES", the tables pointed by variables
# QDB_TABLE_MONITORING_KPIS and QDB_TABLE_SLICE_GROUPS will be dropped while
# checking/deploying QuestDB.
export QDB_DROP_TABLES_IF_EXIST=${QDB_DROP_TABLES_IF_EXIST:-""}
# If not already set, disable flag for re-deploying QuestDB from scratch.
# WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE DATABASE INFORMATION!
# If QDB_REDEPLOY is "YES", the database will be dropped while checking/deploying QuestDB.
export QDB_REDEPLOY=${QDB_REDEPLOY:-""}
# ----- K8s Observability ------------------------------------------------------
# If not already set, set the external port Prometheus Mgmt HTTP GUI interface will be exposed to.
export PROM_EXT_PORT_HTTP=${PROM_EXT_PORT_HTTP:-"9090"}
# If not already set, set the external port Grafana HTTP Dashboards will be exposed to.
export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"}
########################################################################################################################
# Automated steps start here
########################################################################################################################
# Deploy CockroachDB
./deploy/crdb.sh
# Deploy NATS
./deploy/nats.sh
# Deploy QuestDB
./deploy/qdb.sh
# Expose Dashboard
./deploy/expose_dashboard.sh
# Deploy TeraFlowSDN
./deploy/tfs.sh
# Show deploy summary
./deploy/show.sh
echo "Done!"
...@@ -39,7 +39,7 @@ spec: ...@@ -39,7 +39,7 @@ spec:
- containerPort: 9192 - containerPort: 9192
env: env:
- name: LOG_LEVEL - name: LOG_LEVEL
value: "DEBUG" value: "INFO"
readinessProbe: readinessProbe:
exec: exec:
command: ["/bin/grpc_health_probe", "-addr=:2020"] command: ["/bin/grpc_health_probe", "-addr=:2020"]
......
...@@ -36,7 +36,7 @@ spec: ...@@ -36,7 +36,7 @@ spec:
- containerPort: 9192 - containerPort: 9192
env: env:
- name: LOG_LEVEL - name: LOG_LEVEL
value: "DEBUG" value: "INFO"
readinessProbe: readinessProbe:
exec: exec:
command: ["/bin/grpc_health_probe", "-addr=:10020"] command: ["/bin/grpc_health_probe", "-addr=:10020"]
......
...@@ -36,7 +36,7 @@ spec: ...@@ -36,7 +36,7 @@ spec:
- containerPort: 9192 - containerPort: 9192
env: env:
- name: LOG_LEVEL - name: LOG_LEVEL
value: "DEBUG" value: "INFO"
readinessProbe: readinessProbe:
exec: exec:
command: ["/bin/grpc_health_probe", "-addr=:3030"] command: ["/bin/grpc_health_probe", "-addr=:3030"]
......
...@@ -57,7 +57,7 @@ export CRDB_DATABASE="tfs" ...@@ -57,7 +57,7 @@ export CRDB_DATABASE="tfs"
export CRDB_DEPLOY_MODE="single" export CRDB_DEPLOY_MODE="single"
# Disable flag for dropping database, if it exists. # Disable flag for dropping database, if it exists.
export CRDB_DROP_DATABASE_IF_EXISTS="YES" export CRDB_DROP_DATABASE_IF_EXISTS=""
# Disable flag for re-deploying CockroachDB from scratch. # Disable flag for re-deploying CockroachDB from scratch.
export CRDB_REDEPLOY="" export CRDB_REDEPLOY=""
...@@ -90,7 +90,7 @@ export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis" ...@@ -90,7 +90,7 @@ export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis"
export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups" export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups"
# Disable flag for dropping tables if they exist. # Disable flag for dropping tables if they exist.
export QDB_DROP_TABLES_IF_EXIST="YES" export QDB_DROP_TABLES_IF_EXIST=""
# Disable flag for re-deploying QuestDB from scratch. # Disable flag for re-deploying QuestDB from scratch.
export QDB_REDEPLOY="" export QDB_REDEPLOY=""
...@@ -17,4 +17,3 @@ Flask-WTF==1.0.0 ...@@ -17,4 +17,3 @@ Flask-WTF==1.0.0
flask-healthz==0.0.3 flask-healthz==0.0.3
flask-unittest==0.1.2 flask-unittest==0.1.2
lorem-text==2.1 lorem-text==2.1
APScheduler==3.8.1
...@@ -16,7 +16,6 @@ import json ...@@ -16,7 +16,6 @@ import json
from typing import List, Tuple, Union from typing import List, Tuple, Union
from flask import Flask, request, session from flask import Flask, request, session
from flask_healthz import healthz, HealthError from flask_healthz import healthz, HealthError
from common.tools.grpc.Tools import grpc_message_to_json
from context.client.ContextClient import ContextClient from context.client.ContextClient import ContextClient
from device.client.DeviceClient import DeviceClient from device.client.DeviceClient import DeviceClient
...@@ -101,7 +100,6 @@ def create_app(use_config=None, web_app_root=None): ...@@ -101,7 +100,6 @@ def create_app(use_config=None, web_app_root=None):
app.jinja_env.globals.update({ # pylint: disable=no-member app.jinja_env.globals.update({ # pylint: disable=no-member
'enumerate' : enumerate, 'enumerate' : enumerate,
'grpc_message_to_json': grpc_message_to_json,
'json_to_list' : json_to_list, 'json_to_list' : json_to_list,
'round' : round, 'round' : round,
'get_working_context' : get_working_context, 'get_working_context' : get_working_context,
......
<!--
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 %}
<!--
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 [L2VPN]</h1>
<form method="POST" action="{{ url_for('service.add_configure_L2VPN') }}">
<fieldset>
<div class="row mb-3">
{{ form_l2vpn.hidden_tag() }}
</div>
{% if form_l2vpn.l2vpn_params is not none %}
<h3>Generic Service Parameters</h3>
<div class="row mb-3">
{{ form_l2vpn.service_name.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l2vpn.service_name.errors %}
{{ form_l2vpn.service_name(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.service_name.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.service_name(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l2vpn.service_type.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l2vpn.service_type.errors %}
{{ form_l2vpn.service_type(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.service_type.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.service_type(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l2vpn.service_device_1.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.service_device_1.errors %}
{{ form_l2vpn.service_device_1(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.service_device_1.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.service_device_1(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_l2vpn.service_device_2.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.service_device_2.errors %}
{{ form_l2vpn.service_device_2(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.service_device_2.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.service_device_2(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l2vpn.service_endpoint_1.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.service_endpoint_1.errors %}
{{ form_l2vpn.service_endpoint_1(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.service_endpoint_1.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.service_endpoint_1(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_l2vpn.service_endpoint_2.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.service_endpoint_2.errors %}
{{ form_l2vpn.service_endpoint_2(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.service_endpoint_2.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.service_endpoint_2(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<h3>Generic Service Constraints</h3>
<div class="row mb-3">
{{ form_l2vpn.service_capacity.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l2vpn.service_capacity.errors %}
{{ form_l2vpn.service_capacity(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.service_capacity.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.service_capacity(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l2vpn.service_latency.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l2vpn.service_latency.errors %}
{{ form_l2vpn.service_latency(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.service_latency.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.service_latency(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l2vpn.service_availability.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l2vpn.service_availability.errors %}
{{ form_l2vpn.service_availability(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.service_availability.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.service_availability(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l2vpn.service_isolation.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l2vpn.service_isolation.errors %}
{{ form_l2vpn.service_isolation(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.service_isolation.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.service_isolation(class="form-control") }}
{% endif %}
</div>
</div>
</br>
<h3>Specific Service Parameters</h3>
</br>
<h4>Network Instance (NI) Parameters</h4>
<div class="row mb-3">
{{ form_l2vpn.NI_name.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l2vpn.NI_name.errors %}
{{ form_l2vpn.NI_name(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.NI_name.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.NI_name(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l2vpn.NI_mtu.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l2vpn.NI_mtu.errors %}
{{ form_l2vpn.NI_mtu(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.NI_mtu.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.NI_mtu(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l2vpn.NI_description.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l2vpn.NI_description.errors %}
{{ form_l2vpn.NI_description(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.NI_description.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.NI_description(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l2vpn.Device_1_NI_remote_system.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.Device_1_NI_remote_system.errors %}
{{ form_l2vpn.Device_1_NI_remote_system(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.Device_1_NI_remote_system.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.Device_1_NI_remote_system(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_l2vpn.Device_2_NI_remote_system.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.Device_2_NI_remote_system.errors %}
{{ form_l2vpn.Device_2_NI_remote_system(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.Device_2_NI_remote_system.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.Device_2_NI_remote_system(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l2vpn.Device_1_NI_VC_ID.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.Device_1_NI_VC_ID.errors %}
{{ form_l2vpn.Device_1_NI_VC_ID(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.Device_1_NI_VC_ID.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.Device_1_NI_VC_ID(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_l2vpn.Device_2_NI_VC_ID.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.Device_2_NI_VC_ID.errors %}
{{ form_l2vpn.Device_2_NI_VC_ID(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.Device_2_NI_VC_ID.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.Device_2_NI_VC_ID(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l2vpn.Device_1_NI_connection_point.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.Device_1_NI_connection_point.errors %}
{{ form_l2vpn.Device_1_NI_connection_point(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.Device_1_NI_connection_point.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.Device_1_NI_connection_point(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_l2vpn.Device_2_NI_connection_point.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.Device_2_NI_connection_point.errors %}
{{ form_l2vpn.Device_2_NI_connection_point(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.Device_2_NI_connection_point.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.Device_2_NI_connection_point(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<h4>Interface Parameters</h4>
<div class="row mb-3">
{{ form_l2vpn.Device_1_IF_index.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.Device_1_IF_index.errors %}
{{ form_l2vpn.Device_1_IF_index(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.Device_1_IF_index.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.Device_1_IF_index(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_l2vpn.Device_2_IF_index.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.Device_2_IF_index.errors %}
{{ form_l2vpn.Device_2_IF_index(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.Device_2_IF_index.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.Device_2_IF_index(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l2vpn.Device_1_IF_vlan_id.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.Device_1_IF_vlan_id.errors %}
{{ form_l2vpn.Device_1_IF_vlan_id(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.Device_1_IF_vlan_id.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.Device_1_IF_vlan_id(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_l2vpn.Device_2_IF_vlan_id.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.Device_2_IF_vlan_id.errors %}
{{ form_l2vpn.Device_2_IF_vlan_id(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.Device_2_IF_vlan_id.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.Device_2_IF_vlan_id(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l2vpn.Device_1_IF_mtu.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.Device_1_IF_mtu.errors %}
{{ form_l2vpn.Device_1_IF_mtu(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.Device_1_IF_mtu.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.Device_1_IF_mtu(class="form-control") }}
{% endif %}
</div>
{{ form_l2vpn.Device_2_IF_mtu.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.Device_2_IF_mtu.errors %}
{{ form_l2vpn.Device_2_IF_mtu(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.Device_2_IF_mtu.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.Device_2_IF_mtu(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l2vpn.Device_1_IF_description.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.Device_1_IF_description.errors %}
{{ form_l2vpn.Device_1_IF_description(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.Device_1_IF_description.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.Device_1_IF_description(class="form-control") }}
{% endif %}
</div>
{{ form_l2vpn.Device_2_IF_description.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l2vpn.Device_2_IF_description.errors %}
{{ form_l2vpn.Device_2_IF_description(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l2vpn.Device_2_IF_description.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l2vpn.Device_2_IF_description(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>
</div>
</fieldset>
</form>
{% endblock %}
\ No newline at end of file
<!--
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 [L3VPN]</h1>
<form method="POST" action="{{ url_for('service.add_configure_L3VPN') }}">
<fieldset>
<div class="row mb-3">
{{ form_l3vpn.hidden_tag() }}
</div>
{% if form_l3vpn.l3vpn_params is not none %}
<h3>Generic Service Parameters</h3>
<div class="row mb-3">
{{ form_l3vpn.service_name.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.service_name.errors %}
{{ form_l3vpn.service_name(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.service_name.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.service_name(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.service_type.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.service_type.errors %}
{{ form_l3vpn.service_type(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.service_type.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.service_type(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.service_device_1.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.service_device_1.errors %}
{{ form_l3vpn.service_device_1(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.service_device_1.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.service_device_1(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_l3vpn.service_device_2.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.service_device_2.errors %}
{{ form_l3vpn.service_device_2(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.service_device_2.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.service_device_2(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.service_endpoint_1.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.service_endpoint_1.errors %}
{{ form_l3vpn.service_endpoint_1(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.service_endpoint_1.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.service_endpoint_1(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_l3vpn.service_endpoint_2.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.service_endpoint_2.errors %}
{{ form_l3vpn.service_endpoint_2(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.service_endpoint_2.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.service_endpoint_2(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<h3>Generic Service Constraints</h3>
<div class="row mb-3">
{{ form_l3vpn.service_capacity.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.service_capacity.errors %}
{{ form_l3vpn.service_capacity(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.service_capacity.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.service_capacity(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.service_latency.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.service_latency.errors %}
{{ form_l3vpn.service_latency(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.service_latency.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.service_latency(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.service_availability.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.service_availability.errors %}
{{ form_l3vpn.service_availability(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.service_availability.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.service_availability(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.service_isolation.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.service_isolation.errors %}
{{ form_l3vpn.service_isolation(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.service_isolation.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.service_isolation(class="form-control") }}
{% endif %}
</div>
</div>
</br>
<h3>Specific Service Parameters</h3>
</br>
<h4>Network Instance Parameters</h4>
<div class="row mb-3">
{{ form_l3vpn.NI_name.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.NI_name.errors %}
{{ form_l3vpn.NI_name(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.NI_name.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.NI_name(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.NI_route_distinguisher.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.NI_route_distinguisher.errors %}
{{ form_l3vpn.NI_route_distinguisher(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.NI_route_distinguisher.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.NI_route_distinguisher(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.NI_protocol.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.NI_protocol.errors %}
{{ form_l3vpn.NI_protocol(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.NI_protocol.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.NI_protocol(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.NI_as.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.NI_as.errors %}
{{ form_l3vpn.NI_as(class="form-control is-invalid", placeholder="Mandatory if BGP protocol is selected") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.NI_as.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.NI_as(class="form-control", placeholder="Mandatory if BGP protocol is selected") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.NI_address_family.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.NI_address_family.errors %}
{{ form_l3vpn.NI_address_family(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.NI_address_family.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.NI_address_family(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.NI_default_import_policy.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.NI_default_import_policy.errors %}
{{ form_l3vpn.NI_default_import_policy(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.NI_default_import_policy.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.NI_default_import_policy(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.NI_import_policy.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.NI_import_policy.errors %}
{{ form_l3vpn.NI_import_policy(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.NI_import_policy.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.NI_import_policy(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.NI_export_policy.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.NI_export_policy.errors %}
{{ form_l3vpn.NI_export_policy(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.NI_export_policy.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.NI_export_policy(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.NI_router_id.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.NI_router_id.errors %}
{{ form_l3vpn.NI_router_id(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.NI_router_id.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.NI_router_id(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.NI_description.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form_l3vpn.NI_description.errors %}
{{ form_l3vpn.NI_description(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.NI_description.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.NI_description(class="form-control") }}
{% endif %}
</div>
</div>
<h4>Interface Parameters</h4>
<div class="row mb-3">
{{ form_l3vpn.Device_1_IF_index.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.Device_1_IF_index.errors %}
{{ form_l3vpn.Device_1_IF_index(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.Device_1_IF_index.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.Device_1_IF_index(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_l3vpn.Device_2_IF_index.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.Device_2_IF_index.errors %}
{{ form_l3vpn.Device_2_IF_index(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.Device_2_IF_index.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.Device_2_IF_index(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.Device_1_IF_vlan_id.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.Device_1_IF_vlan_id.errors %}
{{ form_l3vpn.Device_1_IF_vlan_id(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.Device_1_IF_vlan_id.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.Device_1_IF_vlan_id(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_l3vpn.Device_2_IF_vlan_id.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.Device_2_IF_vlan_id.errors %}
{{ form_l3vpn.Device_2_IF_vlan_id(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.Device_2_IF_vlan_id.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.Device_2_IF_vlan_id(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.Device_1_IF_address_ip.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.Device_1_IF_address_ip.errors %}
{{ form_l3vpn.Device_1_IF_address_ip(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.Device_1_IF_address_ip.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.Device_1_IF_address_ip(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_l3vpn.Device_2_IF_address_ip.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.Device_2_IF_address_ip.errors %}
{{ form_l3vpn.Device_2_IF_address_ip(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.Device_2_IF_address_ip.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.Device_2_IF_address_ip(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.Device_1_IF_address_prefix.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.Device_1_IF_address_prefix.errors %}
{{ form_l3vpn.Device_1_IF_address_prefix(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.Device_1_IF_address_prefix.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.Device_1_IF_address_prefix(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
{{ form_l3vpn.Device_2_IF_address_prefix.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.Device_2_IF_address_prefix.errors %}
{{ form_l3vpn.Device_2_IF_address_prefix(class="form-control is-invalid", placeholder="Mandatory") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.Device_2_IF_address_prefix.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.Device_2_IF_address_prefix(class="form-control", placeholder="Mandatory") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.Device_1_IF_mtu.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.Device_1_IF_mtu.errors %}
{{ form_l3vpn.Device_1_IF_mtu(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.Device_1_IF_mtu.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.Device_1_IF_mtu(class="form-control") }}
{% endif %}
</div>
{{ form_l3vpn.Device_2_IF_mtu.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.Device_2_IF_mtu.errors %}
{{ form_l3vpn.Device_2_IF_mtu(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.Device_2_IF_mtu.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.Device_2_IF_mtu(class="form-control") }}
{% endif %}
</div>
</div>
<div class="row mb-3">
{{ form_l3vpn.Device_1_IF_description.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.Device_1_IF_description.errors %}
{{ form_l3vpn.Device_1_IF_description(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.Device_1_IF_description.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.Device_1_IF_description(class="form-control") }}
{% endif %}
</div>
{{ form_l3vpn.Device_2_IF_description.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-4">
{% if form_l3vpn.Device_2_IF_description.errors %}
{{ form_l3vpn.Device_2_IF_description(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form_l3vpn.Device_2_IF_description.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form_l3vpn.Device_2_IF_description(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>
</div>
</fieldset>
</form>
{% endblock %}
\ No newline at end of file
...@@ -215,69 +215,6 @@ ...@@ -215,69 +215,6 @@
</td> </td>
</tr> </tr>
{% endif %} {% 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 %} {% endfor %}
</tbody> </tbody>
</table> </table>
......
...@@ -19,13 +19,13 @@ ...@@ -19,13 +19,13 @@
{% block content %} {% block content %}
<h1>Services</h1> <h1>Services</h1>
<div class="row"> <!-- Button for adding a New Service --> <div class="row">
<div class="col"> <!-- <div class="col">
<a href="{{ url_for('service.add_configure') }}" class="btn btn-primary" style="margin-bottom: 10px;"> <a href="{{ url_for('service.add') }}" class="btn btn-primary" style="margin-bottom: 10px;">
<i class="bi bi-plus"></i> <i class="bi bi-plus"></i>
Add New Service Add New Service
</a> </a>
</div> </div> -->
<!-- Only display XR service addition button if there are XR constellations. Otherwise it might confuse <!-- 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. --> user, as other service types do not have GUI to add service yet. -->
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
<div class="col"> <div class="col">
{{ services | length }} services found in context <i>{{ session['context_uuid'] }}</i> {{ services | length }} services found in context <i>{{ session['context_uuid'] }}</i>
</div> </div>
<!-- <div class="col"> Search engine for a service in the table of services <!-- <div class="col">
<form> <form>
<div class="input-group"> <div class="input-group">
<input type="text" aria-label="Search" placeholder="Search..." class="form-control"/> <input type="text" aria-label="Search" placeholder="Search..." class="form-control"/>
......
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