# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
#
# 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.
import os
from typing import Dict, List, Tuple
from common.Constants import DEFAULT_CONTEXT_UUID, DEFAULT_TOPOLOGY_UUID
from common.tools.object_factory.Context import json_context, json_context_id
from common.tools.object_factory.Device import (
json_device_connect_rules, json_device_emulated_connect_rules, json_device_emulated_packet_router_disabled,
json_device_connect_rules, json_device_id, json_device_p4_disabled,
json_device_emulated_tapi_disabled, json_device_id, json_device_packetrouter_disabled, json_device_tapi_disabled)
from common.tools.object_factory.ConfigRule import (
json_config_rule_set, json_config_rule_delete)
from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_id
from common.tools.object_factory.Link import json_link, json_link_id
from common.tools.object_factory.Topology import json_topology, json_topology_id
from common.proto.kpi_sample_types_pb2 import KpiSampleType
# ----- Context --------------------------------------------------------------------------------------------------------
CONTEXT_ID = json_context_id(DEFAULT_CONTEXT_UUID)
CONTEXT = json_context(DEFAULT_CONTEXT_UUID)
# ----- Topology -------------------------------------------------------------------------------------------------------
TOPOLOGY_ID = json_topology_id(DEFAULT_TOPOLOGY_UUID, context_id=CONTEXT_ID)
TOPOLOGY = json_topology(DEFAULT_TOPOLOGY_UUID, context_id=CONTEXT_ID)
# ----- Monitoring Samples ---------------------------------------------------------------------------------------------
PACKET_PORT_SAMPLE_TYPES = [
KpiSampleType.KPISAMPLETYPE_PACKETS_TRANSMITTED,
KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED,
KpiSampleType.KPISAMPLETYPE_BYTES_TRANSMITTED,
KpiSampleType.KPISAMPLETYPE_BYTES_RECEIVED,
]
# ----- Device Credentials and Settings --------------------------------------------------------------------------------
# ----- Devices --------------------------------------------------------------------------------------------------------
CUR_PATH = os.path.dirname(os.path.abspath(__file__))
DEVICE_SW1_UUID = 'SW1'
DEVICE_SW1_TIMEOUT = 60
DEVICE_SW1_ID = json_device_id(DEVICE_SW1_UUID)
DEVICE_SW1 = json_device_p4_disabled(DEVICE_SW1_UUID)
DEVICE_SW1_DPID = 1
DEVICE_SW1_NAME = DEVICE_SW1_UUID
DEVICE_SW1_IP_ADDR = 'localhost'
DEVICE_SW1_PORT = '50001'
DEVICE_SW1_VENDOR = 'Open Networking Foundation'
DEVICE_SW1_HW_VER = 'BMv2 simple_switch'
DEVICE_SW1_SW_VER = 'Stratum'
DEVICE_SW1_BIN_PATH = '/root/p4/bmv2.json'
DEVICE_SW1_INFO_PATH = '/root/p4/p4info.txt'
DEVICE_SW1_CONNECT_RULES = json_device_connect_rules(
DEVICE_SW1_IP_ADDR,
DEVICE_SW1_PORT,
{
'id': DEVICE_SW1_DPID,
'name': DEVICE_SW1_NAME,
'vendor': DEVICE_SW1_VENDOR,
'hw_ver': DEVICE_SW1_HW_VER,
'sw_ver': DEVICE_SW1_SW_VER,
'timeout': DEVICE_SW1_TIMEOUT,
'p4bin': DEVICE_SW1_BIN_PATH,
'p4info': DEVICE_SW1_INFO_PATH
}
)
DEVICE_SW2_UUID = 'SW2'
DEVICE_SW2_TIMEOUT = 60
DEVICE_SW2_ID = json_device_id(DEVICE_SW2_UUID)
DEVICE_SW2 = json_device_p4_disabled(DEVICE_SW2_UUID)
DEVICE_SW2_DPID = 1
DEVICE_SW2_NAME = DEVICE_SW2_UUID
DEVICE_SW2_IP_ADDR = 'localhost'
DEVICE_SW2_PORT = '50002'
DEVICE_SW2_VENDOR = 'Open Networking Foundation'
DEVICE_SW2_HW_VER = 'BMv2 simple_switch'
DEVICE_SW2_SW_VER = 'Stratum'
DEVICE_SW2_BIN_PATH = '/root/p4/bmv2.json'
DEVICE_SW2_INFO_PATH = '/root/p4/p4info.txt'
DEVICE_SW2_CONNECT_RULES = json_device_connect_rules(
DEVICE_SW2_IP_ADDR,
DEVICE_SW2_PORT,
{
'id': DEVICE_SW2_DPID,
'name': DEVICE_SW2_NAME,
'vendor': DEVICE_SW2_VENDOR,
'hw_ver': DEVICE_SW2_HW_VER,
'sw_ver': DEVICE_SW2_SW_VER,
'timeout': DEVICE_SW2_TIMEOUT,
'p4bin': DEVICE_SW2_BIN_PATH,
'p4info': DEVICE_SW2_INFO_PATH
}
)
################################## TABLE ENTRIES ##################################
DEVICE_SW1_CONFIG_TABLE_ENTRIES = [
json_config_rule_set(
'table',
{
'table-name': 'IngressPipeImpl.l2_exact_table',
'match-fields': [
{
'match-field': 'hdr.ethernet.dst_addr',
'match-value': 'aa:bb:cc:dd:ee:11'
}
],
'action-name': 'IngressPipeImpl.set_egress_port',
'action-params': [
{
'action-param': 'port_num',
'action-value': '1'
}
]
}
),
json_config_rule_set(
'table',
{
'table-name': 'IngressPipeImpl.l2_exact_table',
'match-fields': [
{
'match-field': 'hdr.ethernet.dst_addr',
'match-value': 'aa:bb:cc:dd:ee:22'
}
],
'action-name': 'IngressPipeImpl.set_egress_port',
'action-params': [
{
'action-param': 'port_num',
'action-value': '2'
}
]
}
)
]
DEVICE_SW2_CONFIG_TABLE_ENTRIES = DEVICE_SW1_CONFIG_TABLE_ENTRIES
"""
DEVICE_SW1_CONFIG_TABLE_ENTRIES = [
json_config_rule_set(
'table',
{
'table-name': 'IngressPipeImpl.l2_ternary_table',
'match-fields': [
{
'match-field': 'hdr.ethernet.dst_addr',
'match-value': 'aa:bb:cc:dd:ee:11 &&& ff:ff:ff:ff:ff:ff'
}
],
'action-name': 'IngressPipeImpl.set_egress_port',
'action-params': [
{
'action-param': 'port_num',
'action-value': '1'
}
],
'priority': 1
}
),
json_config_rule_set(
'table',
{
'table-name': 'IngressPipeImpl.l2_ternary_table',
'match-fields': [
{
'match-field': 'hdr.ethernet.dst_addr',
'match-value': 'aa:bb:cc:dd:ee:22 &&& ff:ff:ff:ff:ff:ff'
}
],
'action-name': 'IngressPipeImpl.set_egress_port',
'action-params': [
{
'action-param': 'port_num',
'action-value': '2'
}
],
'priority': 1
}
),
]
"""
################################## TABLE DECONF ##################################
DEVICE_SW1_DECONF_TABLE_ENTRIES = [
json_config_rule_delete(
'table',
{
'table-name': 'IngressPipeImpl.l2_exact_table',
'match-fields': [
{
'match-field': 'hdr.ethernet.dst_addr',
'match-value': 'aa:bb:cc:dd:ee:11'
}
],
'action-name': 'IngressPipeImpl.set_egress_port',
'action-params': [
{
'action-param': 'port_num',
'action-value': '1'
}
]
}
),
json_config_rule_delete(
'table',
{
'table-name': 'IngressPipeImpl.l2_exact_table',
'match-fields': [
{
'match-field': 'hdr.ethernet.dst_addr',
'match-value': 'aa:bb:cc:dd:ee:22'
}
],
'action-name': 'IngressPipeImpl.set_egress_port',
'action-params': [
{
'action-param': 'port_num',
'action-value': '2'
}
]
}
)
]
DEVICE_SW2_DECONF_TABLE_ENTRIES = DEVICE_SW1_DECONF_TABLE_ENTRIES
"""
DEVICE_SW1_DECONF_TABLE_ENTRIES = [
json_config_rule_delete(
'table',
{
'table-name': 'IngressPipeImpl.l2_ternary_table',
'match-fields': [
{
'match-field': 'hdr.ethernet.dst_addr',
'match-value': 'aa:bb:cc:dd:ee:11 &&& ff:ff:ff:ff:ff:ff'
}
],
'action-name': 'IngressPipeImpl.set_egress_port',
'action-params': [
{
'action-param': 'port_num',
'action-value': '1'
}
],
'priority': 1
}
),
json_config_rule_delete(
'table',
{
'table-name': 'IngressPipeImpl.l2_ternary_table',
'match-fields': [
{
'match-field': 'hdr.ethernet.dst_addr',
'match-value': 'aa:bb:cc:dd:ee:22 &&& ff:ff:ff:ff:ff:ff'
}
],
'action-name': 'IngressPipeImpl.set_egress_port',
'action-params': [
{
'action-param': 'port_num',
'action-value': '2'
}
],
'priority': 1
}
),
]
"""
# ----- Links ----------------------------------------------------------------------------------------------------------
# ----- WIM Service Settings -------------------------------------------------------------------------------------------
# ----- Object Collections ---------------------------------------------------------------------------------------------
CONTEXTS = [CONTEXT]
TOPOLOGIES = [TOPOLOGY]
DEVICES = [
(DEVICE_SW1, DEVICE_SW1_CONNECT_RULES, DEVICE_SW1_CONFIG_TABLE_ENTRIES, DEVICE_SW1_DECONF_TABLE_ENTRIES),
(DEVICE_SW2, DEVICE_SW2_CONNECT_RULES, DEVICE_SW2_CONFIG_TABLE_ENTRIES, DEVICE_SW2_DECONF_TABLE_ENTRIES),
]
LINKS = []