1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
# Copyright (c) 2018 Cisco and/or its affiliates.
# 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.
"""IPFIX setup library"""
from resources.libraries.python.topology import Topology
from resources.libraries.python.VatExecutor import VatTerminal
class IPFIXSetup(object):
"""Class contains methods for seting up IPFIX reporting on DUTs."""
def __init__(self):
"""Initializer."""
pass
@staticmethod
def setup_ipfix_exporter(node, collector, source, fib=None, mtu=None,
interval=None):
"""Setup an IPFIX exporter on node to export collected flow data.
:param node: DUT node.
:param collector: IP address of flow data collector.
:param source: IP address of local interface to send flow data from.
:param fib: fib table ID.
:param mtu: Maximum transfer unit of path to collector.
:param interval: Frequency of sending template packets, in seconds.
:type node: dict
:type collector: str
:type source: str
:type fib: int
:type mtu: int
:type interval: int
"""
fib = "vrf_id {0}".format(fib) if fib else ''
mtu = "path_mtu {0}".format(mtu) if mtu else ''
interval = "template_interval {0}".format(interval) if interval else ''
with VatTerminal(node, json_param=False) as vat:
vat.vat_terminal_exec_cmd_from_template('ipfix_exporter_set.vat',
collector=collector,
source=source,
fib=fib,
mtu=mtu,
interval=interval)
@staticmethod
def assign_interface_to_flow_table(node, interface, table_id,
ip_version='ip4'):
"""Assigns a VPP interface to the specified classify table for IPFIX
flow data collection.
:param node: DUT node.
:param interface: An interface on the DUT node.
:param table_id: ID of a classify table.
:param ip_version: Version of IP protocol. Valid options are ip4, ip6.
:type node: dict
:type interface: str or int
:type table_id: int
:type ip_version: str
"""
if isinstance(interface, basestring):
sw_if_index = Topology.get_interface_sw_index(node, interface)
elif isinstance(interface, int):
sw_if_index = interface
else:
raise TypeError
table = "{0}-table {1}".format(ip_version, table_id)
with VatTerminal(node, json_param=False) as vat:
vat.vat_terminal_exec_cmd_from_template(
"ipfix_interface_enable.vat",
interface=sw_if_index,
table=table,
delete='')
@staticmethod
def set_ipfix_stream(node, domain=None, src_port=None):
"""Set an IPFIX export stream. Can be used to break up IPFIX reports
into separate reporting domains.
:param node: DUT node.
:param domain: Desired index number of exporting domain.
:param src_port: Source port to use when sending IPFIX packets. Default
is the standard IPFIX port 4739.
:type node: dict
:type domain: int
:type src_port: int
"""
domain = "domain {0}".format(domain) if domain else ''
src_port = "src_port {0}".format(src_port) if src_port else ''
with VatTerminal(node, json_param=False) as vat:
vat.vat_terminal_exec_cmd_from_template("ipfix_stream_set.vat",
domain=domain,
src_port=src_port)
@staticmethod
def assign_classify_table_to_exporter(node, table_id, ip_version='ip4'):
"""Assign a classify table to an IPFIX exporter. Classified packets will
be included in the IPFIX flow report.
:param node: DUT node.
:param table_id: ID of a classify table.
:param ip_version: Version of IP protocol. Valid options are ip4, ip6.
:type node: dict
:type table_id: int
:type ip_version: str
"""
with VatTerminal(node, json_param=False) as vat:
vat.vat_terminal_exec_cmd_from_template("ipfix_table_add.vat",
table=table_id,
ip_version=ip_version,
add_del='add')
|